blob: 70bc9e0ed73b6908be78bf80883bef0012719fed [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);");
Daniel Jasper04468962013-01-18 10:56:38 +00004560}
4561
Daniel Jasperde5c2072012-12-24 00:13:23 +00004562TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4563 verifyFormat(
4564 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004565 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004566 verifyFormat(
4567 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4568 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4569
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004570 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004571 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004572 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4573 " ccccccccccccccccccccccccc) {\n}");
4574
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004575 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004576 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004577 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4578 " ccccccccccccccccccccccccc) {\n}");
4579
Daniel Jasperde5c2072012-12-24 00:13:23 +00004580 verifyFormat(
4581 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004582 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004583 verifyFormat(
4584 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4585 " ccccccccccccccccccccccccc) {\n}");
4586
Daniel Jasper400adc62013-02-08 15:28:42 +00004587 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4588 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4589 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4590 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004591 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4592 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4593 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4594 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4595
Daniel Jasper400adc62013-02-08 15:28:42 +00004596 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4597 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4598 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004599 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4600 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4601 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004602}
4603
Daniel Jasper43b65482013-01-23 12:27:43 +00004604TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004605 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004606 "unsigned Cost =\n"
4607 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4608 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004609 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004610 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4611 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004612
4613 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004614 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4615 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004616 verifyFormat("unsigned OriginalStartColumn =\n"
4617 " SourceMgr.getSpellingColumnNumber(\n"
4618 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4619 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004620}
4621
Francois Ferrand9976efa2017-05-22 08:28:17 +00004622TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
4623 FormatStyle Style = getLLVMStyle();
4624 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4625 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
4626 Style);
4627
4628 Style.PenaltyBreakAssignment = 20;
4629 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4630 " cccccccccccccccccccccccccc;",
4631 Style);
4632}
4633
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004634TEST_F(FormatTest, AlignsAfterAssignments) {
4635 verifyFormat(
4636 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004637 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004638 verifyFormat(
4639 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004640 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004641 verifyFormat(
4642 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004643 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004644 verifyFormat(
4645 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004646 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004647 verifyFormat(
4648 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4649 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4650 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004651}
4652
4653TEST_F(FormatTest, AlignsAfterReturn) {
4654 verifyFormat(
4655 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4656 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4657 verifyFormat(
4658 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4659 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004660 verifyFormat(
4661 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004662 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004663 verifyFormat(
4664 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004665 " aaaaaaaaaaaaaaaaaaaaaa());");
4666 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4667 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4668 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4669 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4670 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004671 verifyFormat("return\n"
4672 " // true if code is one of a or b.\n"
4673 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004674}
4675
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004676TEST_F(FormatTest, AlignsAfterOpenBracket) {
4677 verifyFormat(
4678 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4679 " aaaaaaaaa aaaaaaa) {}");
4680 verifyFormat(
4681 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4682 " aaaaaaaaaaa aaaaaaaaa);");
4683 verifyFormat(
4684 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4685 " aaaaaaaaaaaaaaaaaaaaa));");
4686 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004687 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004688 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4689 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4690 Style);
4691 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4692 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4693 Style);
4694 verifyFormat("SomeLongVariableName->someFunction(\n"
4695 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4696 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004697 verifyFormat(
4698 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4699 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4700 Style);
4701 verifyFormat(
4702 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4703 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4704 Style);
4705 verifyFormat(
4706 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4707 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4708 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004709
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004710 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4711 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4712 " b));",
4713 Style);
4714
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004715 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4716 Style.BinPackArguments = false;
4717 Style.BinPackParameters = false;
4718 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4719 " aaaaaaaaaaa aaaaaaaa,\n"
4720 " aaaaaaaaa aaaaaaa,\n"
4721 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4722 Style);
4723 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4724 " aaaaaaaaaaa aaaaaaaaa,\n"
4725 " aaaaaaaaaaa aaaaaaaaa,\n"
4726 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4727 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004728 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4729 " aaaaaaaaaaaaaaa,\n"
4730 " aaaaaaaaaaaaaaaaaaaaa,\n"
4731 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004732 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004733 verifyFormat(
4734 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4735 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4736 Style);
4737 verifyFormat(
4738 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4739 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4740 Style);
4741 verifyFormat(
4742 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4743 " aaaaaaaaaaaaaaaaaaaaa(\n"
4744 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4745 " aaaaaaaaaaaaaaaa);",
4746 Style);
4747 verifyFormat(
4748 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4749 " aaaaaaaaaaaaaaaaaaaaa(\n"
4750 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4751 " aaaaaaaaaaaaaaaa);",
4752 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004753}
4754
Daniel Jasper3219e432014-12-02 13:24:51 +00004755TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4756 FormatStyle Style = getLLVMStyleWithColumns(40);
4757 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4758 " bbbbbbbbbbbbbbbbbbbbbb);",
4759 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004760 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004761 Style.AlignOperands = false;
4762 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4763 " bbbbbbbbbbbbbbbbbbbbbb);",
4764 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004765 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004766 Style.AlignOperands = true;
4767 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4768 " bbbbbbbbbbbbbbbbbbbbbb);",
4769 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004770 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004771 Style.AlignOperands = false;
4772 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4773 " bbbbbbbbbbbbbbbbbbbbbb);",
4774 Style);
4775}
4776
Daniel Jasper399d24b2013-01-09 07:06:56 +00004777TEST_F(FormatTest, BreaksConditionalExpressions) {
4778 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004779 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4780 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4781 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4782 verifyFormat(
4783 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004784 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4785 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004786 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004787 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4788 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4789 verifyFormat(
4790 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004791 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4792 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004793 verifyFormat(
4794 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4795 " : aaaaaaaaaaaaa);");
4796 verifyFormat(
4797 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004798 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004799 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4800 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004801 verifyFormat(
4802 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4803 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4804 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004805 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4806 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4807 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4808 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4809 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4810 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4811 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4812 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4813 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4814 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4815 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4816 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004817 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4818 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4819 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4820 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4821 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004822 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4823 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4824 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004825 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4826 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4827 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4828 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004829 verifyFormat(
4830 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4831 " ? aaaaaaaaaaaaaaa\n"
4832 " : aaaaaaaaaaaaaaa;");
4833 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004834 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004835 " ? b\n"
4836 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004837 verifyFormat("return aaaa == bbbb\n"
4838 " // comment\n"
4839 " ? aaaa\n"
4840 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004841 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004842 " format(TheLine.First,\n"
4843 " IndentForLevel[TheLine.Level] >= 0\n"
4844 " ? IndentForLevel[TheLine.Level]\n"
4845 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004846 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004847 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004848 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4849 " ? aaaaaaaaaaaaaaa\n"
4850 " : bbbbbbbbbbbbbbb //\n"
4851 " ? ccccccccccccccc\n"
4852 " : ddddddddddddddd;");
4853 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4854 " ? aaaaaaaaaaaaaaa\n"
4855 " : (bbbbbbbbbbbbbbb //\n"
4856 " ? ccccccccccccccc\n"
4857 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004858 verifyFormat(
4859 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4860 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4861 " aaaaaaaaaaaaaaaaaaaaa +\n"
4862 " aaaaaaaaaaaaaaaaaaaaa\n"
4863 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004864 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004865 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4866 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4867 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004868
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004869 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004870 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004871 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004872 "void f() {\n"
4873 " g(aaa,\n"
4874 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4875 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4876 " ? aaaaaaaaaaaaaaa\n"
4877 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004878 "}",
4879 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004880 verifyFormat(
4881 "void f() {\n"
4882 " g(aaa,\n"
4883 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4884 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4885 " ?: aaaaaaaaaaaaaaa);\n"
4886 "}",
4887 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004888
4889 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4890 " // comment.\n"
4891 " ccccccccccccccccccccccccccccccccccccccc\n"
4892 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4893 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004894
4895 // Assignments in conditional expressions. Apparently not uncommon :-(.
4896 verifyFormat("return a != b\n"
4897 " // comment\n"
4898 " ? a = b\n"
4899 " : a = b;");
4900 verifyFormat("return a != b\n"
4901 " // comment\n"
4902 " ? a = a != b\n"
4903 " // comment\n"
4904 " ? a = b\n"
4905 " : a\n"
4906 " : a;\n");
4907 verifyFormat("return a != b\n"
4908 " // comment\n"
4909 " ? a\n"
4910 " : a = a != b\n"
4911 " // comment\n"
4912 " ? a = b\n"
4913 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004914}
4915
Daniel Jasper165b29e2013-11-08 00:57:11 +00004916TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4917 FormatStyle Style = getLLVMStyle();
4918 Style.BreakBeforeTernaryOperators = false;
4919 Style.ColumnLimit = 70;
4920 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004921 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4922 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4923 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4924 Style);
4925 verifyFormat(
4926 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004927 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4928 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004929 Style);
4930 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004931 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4932 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4933 Style);
4934 verifyFormat(
4935 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004936 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4937 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004938 Style);
4939 verifyFormat(
4940 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4941 " aaaaaaaaaaaaa);",
4942 Style);
4943 verifyFormat(
4944 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4945 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4946 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4947 " aaaaaaaaaaaaa);",
4948 Style);
4949 verifyFormat(
4950 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4951 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4952 " aaaaaaaaaaaaa);",
4953 Style);
4954 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4955 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4956 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4957 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4958 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4959 Style);
4960 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4961 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4962 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4963 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4964 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4965 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4966 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4967 Style);
4968 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4969 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4970 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4971 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4972 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4973 Style);
4974 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4975 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4976 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4977 Style);
4978 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00004979 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00004980 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4981 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4982 Style);
4983 verifyFormat(
4984 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4985 " aaaaaaaaaaaaaaa :\n"
4986 " aaaaaaaaaaaaaaa;",
4987 Style);
4988 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4989 " aaaaaaaaa ?\n"
4990 " b :\n"
4991 " c);",
4992 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00004993 verifyFormat("unsigned Indent =\n"
4994 " format(TheLine.First,\n"
4995 " IndentForLevel[TheLine.Level] >= 0 ?\n"
4996 " IndentForLevel[TheLine.Level] :\n"
4997 " TheLine * 2,\n"
4998 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4999 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005000 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5001 " aaaaaaaaaaaaaaa :\n"
5002 " bbbbbbbbbbbbbbb ? //\n"
5003 " ccccccccccccccc :\n"
5004 " ddddddddddddddd;",
5005 Style);
5006 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5007 " aaaaaaaaaaaaaaa :\n"
5008 " (bbbbbbbbbbbbbbb ? //\n"
5009 " ccccccccccccccc :\n"
5010 " ddddddddddddddd);",
5011 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00005012 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5013 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
5014 " ccccccccccccccccccccccccccc;",
5015 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00005016 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5017 " aaaaa :\n"
5018 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
5019 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005020}
5021
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005022TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
5023 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
5024 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
5025 verifyFormat("bool a = true, b = false;");
5026
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005027 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005028 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005029 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00005030 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005031 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00005032 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005033 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00005034 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00005035 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
5036 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
5037 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5038 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
5039 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
5040 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005041
Daniel Jasperbea1ab42015-03-01 18:55:26 +00005042 FormatStyle Style = getGoogleStyle();
5043 Style.PointerAlignment = FormatStyle::PAS_Left;
5044 Style.DerivePointerAlignment = false;
5045 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5046 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
5047 " *b = bbbbbbbbbbbbbbbbbbb;",
5048 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00005049 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5050 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
5051 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00005052 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00005053 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005054}
5055
Nico Weber4a5030c2013-01-12 01:28:06 +00005056TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
5057 verifyFormat("arr[foo ? bar : baz];");
5058 verifyFormat("f()[foo ? bar : baz];");
5059 verifyFormat("(a + b)[foo ? bar : baz];");
5060 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
5061}
5062
Daniel Jasperf7935112012-12-03 18:12:45 +00005063TEST_F(FormatTest, AlignsStringLiterals) {
5064 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
5065 " \"short literal\");");
5066 verifyFormat(
5067 "looooooooooooooooooooooooongFunction(\n"
5068 " \"short literal\"\n"
5069 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005070 verifyFormat("someFunction(\"Always break between multi-line\"\n"
5071 " \" string literals\",\n"
5072 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005073 EXPECT_EQ("fun + \"1243\" /* comment */\n"
5074 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005075 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00005076 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005077 getLLVMStyleWithColumns(28)));
5078 EXPECT_EQ(
5079 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
5080 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
5081 " \"aaaaaaaaaaaaaaaa\";",
5082 format("aaaaaa ="
5083 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
5084 "aaaaaaaaaaaaaaaaaaaaa\" "
5085 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005086 verifyFormat("a = a + \"a\"\n"
5087 " \"a\"\n"
5088 " \"a\";");
5089 verifyFormat("f(\"a\", \"b\"\n"
5090 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005091
5092 verifyFormat(
5093 "#define LL_FORMAT \"ll\"\n"
5094 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
5095 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00005096
5097 verifyFormat("#define A(X) \\\n"
5098 " \"aaaaa\" #X \"bbbbbb\" \\\n"
5099 " \"ccccc\"",
5100 getLLVMStyleWithColumns(23));
5101 verifyFormat("#define A \"def\"\n"
5102 "f(\"abc\" A \"ghi\"\n"
5103 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005104
5105 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005106 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005107 verifyFormat("#define A(X) \\\n"
5108 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
5109 " L\"ccccc\"",
5110 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00005111
5112 verifyFormat("f(@\"a\"\n"
5113 " @\"b\");");
5114 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00005115 " @\"b\"\n"
5116 " @\"c\";");
5117 verifyFormat("NSString s = @\"a\"\n"
5118 " \"b\"\n"
5119 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00005120}
5121
Zachary Turner448592e2015-12-18 22:20:15 +00005122TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005123 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005124 // No declarations or definitions should be moved to own line.
5125 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
5126 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005127 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005128 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005129 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005130 "int f() { return 1; }\n"
5131 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005132 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00005133
5134 // All declarations and definitions should have the return type moved to its
5135 // own
5136 // line.
5137 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
5138 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005139 " int\n"
5140 " f() {\n"
5141 " return 1;\n"
5142 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005143 " int\n"
5144 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005145 "};\n"
5146 "int\n"
5147 "f() {\n"
5148 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005149 "}\n"
5150 "int\n"
5151 "g();\n",
5152 Style);
5153
5154 // Top-level definitions, and no kinds of declarations should have the
5155 // return type moved to its own line.
5156 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
5157 verifyFormat("class B {\n"
5158 " int f() { return 1; }\n"
5159 " int g();\n"
5160 "};\n"
5161 "int\n"
5162 "f() {\n"
5163 " return 1;\n"
5164 "}\n"
5165 "int g();\n",
5166 Style);
5167
5168 // Top-level definitions and declarations should have the return type moved
5169 // to its own line.
5170 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
5171 verifyFormat("class C {\n"
5172 " int f() { return 1; }\n"
5173 " int g();\n"
5174 "};\n"
5175 "int\n"
5176 "f() {\n"
5177 " return 1;\n"
5178 "}\n"
5179 "int\n"
5180 "g();\n",
5181 Style);
5182
5183 // All definitions should have the return type moved to its own line, but no
5184 // kinds of declarations.
5185 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5186 verifyFormat("class D {\n"
5187 " int\n"
5188 " f() {\n"
5189 " return 1;\n"
5190 " }\n"
5191 " int g();\n"
5192 "};\n"
5193 "int\n"
5194 "f() {\n"
5195 " return 1;\n"
5196 "}\n"
5197 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005198 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005199 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005200 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005201 " return \"\";\n"
5202 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005203 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005204 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005205 verifyFormat("template <class T>\n"
5206 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005207 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005208 " return NULL;\n"
5209 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005210 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005211 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00005212 verifyFormat("class C {\n"
5213 " int\n"
5214 " operator+() {\n"
5215 " return 1;\n"
5216 " }\n"
5217 " int\n"
5218 " operator()() {\n"
5219 " return 1;\n"
5220 " }\n"
5221 "};\n",
5222 Style);
5223 verifyFormat("void\n"
5224 "A::operator()() {}\n"
5225 "void\n"
5226 "A::operator>>() {}\n"
5227 "void\n"
5228 "A::operator+() {}\n",
5229 Style);
5230 verifyFormat("void *operator new(std::size_t s);", // No break here.
5231 Style);
5232 verifyFormat("void *\n"
5233 "operator new(std::size_t s) {}",
5234 Style);
5235 verifyFormat("void *\n"
5236 "operator delete[](void *ptr) {}",
5237 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005238 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005239 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005240 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005241 "{\n"
5242 " return \"\";\n"
5243 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005244 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005245 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005246 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005247 "T *\n" // Problem here: no line break
5248 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005249 "{\n"
5250 " return NULL;\n"
5251 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005252 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005253 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005254}
5255
Alexander Kornienko58611712013-07-04 12:02:44 +00005256TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5257 FormatStyle NoBreak = getLLVMStyle();
5258 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5259 FormatStyle Break = getLLVMStyle();
5260 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005261 verifyFormat("aaaa = \"bbbb\"\n"
5262 " \"cccc\";",
5263 NoBreak);
5264 verifyFormat("aaaa =\n"
5265 " \"bbbb\"\n"
5266 " \"cccc\";",
5267 Break);
5268 verifyFormat("aaaa(\"bbbb\"\n"
5269 " \"cccc\");",
5270 NoBreak);
5271 verifyFormat("aaaa(\n"
5272 " \"bbbb\"\n"
5273 " \"cccc\");",
5274 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005275 verifyFormat("aaaa(qqq, \"bbbb\"\n"
5276 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005277 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005278 verifyFormat("aaaa(qqq,\n"
5279 " \"bbbb\"\n"
5280 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005281 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005282 verifyFormat("aaaa(qqq,\n"
5283 " L\"bbbb\"\n"
5284 " L\"cccc\");",
5285 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005286 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5287 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005288 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005289 verifyFormat("string s = someFunction(\n"
5290 " \"abc\"\n"
5291 " \"abc\");",
5292 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005293
Daniel Jasper3251fff2014-06-10 06:27:23 +00005294 // As we break before unary operators, breaking right after them is bad.
5295 verifyFormat("string foo = abc ? \"x\"\n"
5296 " \"blah blah blah blah blah blah\"\n"
5297 " : \"y\";",
5298 Break);
5299
Daniel Jasperc834c702013-07-17 15:38:19 +00005300 // Don't break if there is no column gain.
5301 verifyFormat("f(\"aaaa\"\n"
5302 " \"bbbb\");",
5303 Break);
5304
5305 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005306 EXPECT_EQ("x = \"a\\\n"
5307 "b\\\n"
5308 "c\";",
5309 format("x = \"a\\\n"
5310 "b\\\n"
5311 "c\";",
5312 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005313 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005314 " \"a\\\n"
5315 "b\\\n"
5316 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005317 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005318 "b\\\n"
5319 "c\";",
5320 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005321
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00005322 EXPECT_EQ("NSString *const kString =\n"
5323 " @\"aaaa\"\n"
5324 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005325 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005326 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005327 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005328
5329 Break.ColumnLimit = 0;
5330 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005331}
5332
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005333TEST_F(FormatTest, AlignsPipes) {
5334 verifyFormat(
5335 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5336 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5337 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5338 verifyFormat(
5339 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5340 " << aaaaaaaaaaaaaaaaaaaa;");
5341 verifyFormat(
5342 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5343 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5344 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005345 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5346 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5347 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005348 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5349 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5350 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5351 verifyFormat(
5352 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5353 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5354 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005355 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5356 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5357 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5358 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005359 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5360 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005361 verifyFormat(
5362 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5363 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00005364 verifyFormat(
5365 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
5366 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005367
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005368 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5369 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005370 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5371 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5372 " aaaaaaaaaaaaaaaaaaaaa)\n"
5373 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005374 verifyFormat("LOG_IF(aaa == //\n"
5375 " bbb)\n"
5376 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005377
Daniel Jasper467ddb12013-08-12 12:58:05 +00005378 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005379 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5380 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005381 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5382 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5383 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005384 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5385 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005386 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5387 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5388 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5389 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5390 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5391 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5392 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005393
Daniel Jasperc238c872013-04-02 14:33:13 +00005394 verifyFormat(
5395 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5396 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005397
5398 // Incomplete string literal.
5399 EXPECT_EQ("llvm::errs() << \"\n"
5400 " << a;",
5401 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005402
5403 verifyFormat("void f() {\n"
5404 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5405 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5406 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005407
5408 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005409 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5410 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5411 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005412
5413 // Handle '\n'.
5414 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5415 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5416 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5417 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5418 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5419 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5420 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005421}
5422
Daniel Jasper7209bb92016-12-13 11:16:42 +00005423TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5424 verifyFormat("return out << \"somepacket = {\\n\"\n"
5425 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5426 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5427 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5428 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5429 " << \"}\";");
5430
5431 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5432 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5433 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5434 verifyFormat(
5435 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5436 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5437 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5438 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5439 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5440 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5441 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5442 verifyFormat(
5443 "void f() {\n"
5444 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5445 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5446 "}");
5447
5448 // Breaking before the first "<<" is generally not desirable.
5449 verifyFormat(
5450 "llvm::errs()\n"
5451 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5452 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5453 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5454 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5455 getLLVMStyleWithColumns(70));
5456 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5457 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5458 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5459 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5460 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5461 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5462 getLLVMStyleWithColumns(70));
5463
5464 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5465 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5466 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5467 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5468 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5469 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005470 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5471 " (aaaa + aaaa);",
5472 getLLVMStyleWithColumns(40));
5473 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5474 " (aaaaaaa + aaaaa));",
5475 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005476 verifyFormat(
5477 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5478 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5479 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005480}
5481
Daniel Jasperf7935112012-12-03 18:12:45 +00005482TEST_F(FormatTest, UnderstandsEquals) {
5483 verifyFormat(
5484 "aaaaaaaaaaaaaaaaa =\n"
5485 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5486 verifyFormat(
5487 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005488 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005489 verifyFormat(
5490 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005491 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005492 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005493 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5494 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005495
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005496 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5497 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005498}
5499
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005500TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005501 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5502 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005503
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005504 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5505 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005506
5507 verifyFormat(
5508 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5509 " Parameter2);");
5510
5511 verifyFormat(
5512 "ShortObject->shortFunction(\n"
5513 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5514 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5515
5516 verifyFormat("loooooooooooooongFunction(\n"
5517 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5518
5519 verifyFormat(
5520 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5521 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5522
Daniel Jasper687af3b2013-02-14 14:26:07 +00005523 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5524 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005525 verifyFormat("void f() {\n"
5526 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5527 " .Times(2)\n"
5528 " .WillRepeatedly(Return(SomeValue));\n"
5529 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005530 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5531 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005532 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005533 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5534 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005535 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005536 verifyFormat("void f() {\n"
5537 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5538 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5539 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005540 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5541 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5542 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5543 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5544 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005545 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5546 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5547 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5548 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5549 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005550
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005551 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005552 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005553 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005554 verifyFormat(
5555 "aaaaaaaaaaa->aaaaaaaaa(\n"
5556 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5557 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005558
5559 verifyFormat(
5560 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5561 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005562 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5563 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5564 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5565 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005566
Daniel Jasper9b334242013-03-15 14:57:30 +00005567 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005568 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5569 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005570
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005571 FormatStyle NoBinPacking = getLLVMStyle();
5572 NoBinPacking.BinPackParameters = false;
5573 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5574 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5575 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5576 " aaaaaaaaaaaaaaaaaaa,\n"
5577 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5578 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005579
5580 // If there is a subsequent call, change to hanging indentation.
5581 verifyFormat(
5582 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5583 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5584 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5585 verifyFormat(
5586 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5587 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005588 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5589 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5590 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5591 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5592 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5593 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005594}
5595
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005596TEST_F(FormatTest, WrapsTemplateDeclarations) {
5597 verifyFormat("template <typename T>\n"
5598 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005599 verifyFormat("template <typename T>\n"
5600 "// T should be one of {A, B}.\n"
5601 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005602 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005603 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005604 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005605 verifyFormat("template <typename T>\n"
5606 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5607 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005608 verifyFormat(
5609 "template <typename T>\n"
5610 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5611 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005612 verifyFormat(
5613 "template <typename T>\n"
5614 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5615 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5616 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005617 verifyFormat("template <typename T>\n"
5618 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005619 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005620 verifyFormat(
5621 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5622 " typename T4 = char>\n"
5623 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005624 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5625 " template <typename> class cccccccccccccccccccccc,\n"
5626 " typename ddddddddddddd>\n"
5627 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005628 verifyFormat(
5629 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5630 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005631
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005632 verifyFormat("void f() {\n"
5633 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5634 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5635 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005636
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005637 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005638 verifyFormat("template <typename T> void f();");
5639 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005640 verifyFormat(
5641 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5642 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5643 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5644 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5645 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5646 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5647 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5648 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005649 EXPECT_EQ("static_cast<A< //\n"
5650 " B> *>(\n"
5651 "\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00005652 ");",
Daniel Jasperfcfac102014-07-15 09:00:34 +00005653 format("static_cast<A<//\n"
5654 " B>*>(\n"
5655 "\n"
5656 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005657 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5658 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005659
5660 FormatStyle AlwaysBreak = getLLVMStyle();
Francois Ferrand58e6fe52018-05-16 08:25:03 +00005661 AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005662 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5663 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5664 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5665 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5666 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5667 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5668 verifyFormat("template <template <typename> class Fooooooo,\n"
5669 " template <typename> class Baaaaaaar>\n"
5670 "struct C {};",
5671 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005672 verifyFormat("template <typename T> // T can be A, B or C.\n"
5673 "struct C {};",
5674 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005675 verifyFormat("template <enum E> class A {\n"
5676 "public:\n"
5677 " E *f();\n"
5678 "};");
Francois Ferrand58e6fe52018-05-16 08:25:03 +00005679
5680 FormatStyle NeverBreak = getLLVMStyle();
5681 NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No;
5682 verifyFormat("template <typename T> class C {};", NeverBreak);
5683 verifyFormat("template <typename T> void f();", NeverBreak);
5684 verifyFormat("template <typename T> void f() {}", NeverBreak);
5685 verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",
5686 NeverBreak);
5687 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5688 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5689 " ccccccccccccccccccccccccccccccccccccccccccccccc);",
5690 NeverBreak);
5691 verifyFormat("template <template <typename> class Fooooooo,\n"
5692 " template <typename> class Baaaaaaar>\n"
5693 "struct C {};",
5694 NeverBreak);
5695 verifyFormat("template <typename T> // T can be A, B or C.\n"
5696 "struct C {};",
5697 NeverBreak);
5698 verifyFormat("template <enum E> class A {\n"
5699 "public:\n"
5700 " E *f();\n"
5701 "};", NeverBreak);
5702 NeverBreak.PenaltyBreakTemplateDeclaration = 100;
5703 verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",
5704 NeverBreak);
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005705}
5706
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005707TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) {
5708 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
5709 Style.ColumnLimit = 60;
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005710 EXPECT_EQ("// Baseline - no comments.\n"
5711 "template <\n"
5712 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
5713 "void f() {}",
5714 format("// Baseline - no comments.\n"
5715 "template <\n"
5716 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
5717 "void f() {}",
5718 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005719
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005720 EXPECT_EQ("template <\n"
5721 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5722 "void f() {}",
5723 format("template <\n"
5724 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5725 "void f() {}",
5726 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005727
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005728 EXPECT_EQ(
5729 "template <\n"
5730 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
5731 "void f() {}",
5732 format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
5733 "void f() {}",
5734 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005735
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005736 EXPECT_EQ(
5737 "template <\n"
5738 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5739 " // multiline\n"
5740 "void f() {}",
5741 format("template <\n"
5742 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5743 " // multiline\n"
5744 "void f() {}",
5745 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005746
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005747 EXPECT_EQ(
5748 "template <typename aaaaaaaaaa<\n"
5749 " bbbbbbbbbbbb>::value> // trailing loooong\n"
5750 "void f() {}",
5751 format(
5752 "template <\n"
5753 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n"
5754 "void f() {}",
5755 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005756}
5757
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00005758TEST_F(FormatTest, WrapsTemplateParameters) {
5759 FormatStyle Style = getLLVMStyle();
5760 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5761 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5762 verifyFormat(
5763 "template <typename... a> struct q {};\n"
5764 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5765 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5766 " y;",
5767 Style);
5768 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5769 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5770 verifyFormat(
5771 "template <typename... a> struct r {};\n"
5772 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5773 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5774 " y;",
5775 Style);
5776 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5777 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5778 verifyFormat(
5779 "template <typename... a> struct s {};\n"
5780 "extern s<\n"
5781 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5782 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5783 " y;",
5784 Style);
5785 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5786 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5787 verifyFormat(
5788 "template <typename... a> struct t {};\n"
5789 "extern t<\n"
5790 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5791 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5792 " y;",
5793 Style);
5794}
5795
Daniel Jasper45797022013-01-25 10:57:27 +00005796TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5797 verifyFormat(
5798 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5799 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5800 verifyFormat(
5801 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5802 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5803 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5804
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005805 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005806 verifyFormat(
5807 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5808 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005809 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005810
Daniel Jasper45797022013-01-25 10:57:27 +00005811 verifyFormat(
5812 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005813 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005814
5815 // Breaking at nested name specifiers is generally not desirable.
5816 verifyFormat(
5817 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5818 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005819
5820 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005821 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5822 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5823 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005824 " aaaaaaaaaaaaaaaaaaaaa);",
5825 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005826
5827 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5828 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5829 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005830}
5831
Daniel Jasperf7935112012-12-03 18:12:45 +00005832TEST_F(FormatTest, UnderstandsTemplateParameters) {
5833 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005834 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005835 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5836 verifyFormat("bool x = a < 1 || 2 > a;");
5837 verifyFormat("bool x = 5 < f<int>();");
5838 verifyFormat("bool x = f<int>() > 5;");
5839 verifyFormat("bool x = 5 < a<int>::x;");
5840 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5841 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5842
5843 verifyGoogleFormat("A<A<int>> a;");
5844 verifyGoogleFormat("A<A<A<int>>> a;");
5845 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005846 verifyGoogleFormat("A<A<int> > a;");
5847 verifyGoogleFormat("A<A<A<int> > > a;");
5848 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005849 verifyGoogleFormat("A<::A<int>> a;");
5850 verifyGoogleFormat("A<::A> a;");
5851 verifyGoogleFormat("A< ::A> a;");
5852 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005853 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5854 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005855 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5856 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005857 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5858 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005859
Nico Weber7533b4d2014-09-24 17:17:32 +00005860 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5861
Daniel Jasperf7935112012-12-03 18:12:45 +00005862 verifyFormat("test >> a >> b;");
5863 verifyFormat("test << a >> b;");
5864
5865 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005866 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005867 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005868 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5869 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005870 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005871 verifyFormat("f(a.operator()<A>());");
5872 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5873 " .template operator()<A>());",
5874 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005875
5876 // Not template parameters.
5877 verifyFormat("return a < b && c > d;");
5878 verifyFormat("void f() {\n"
5879 " while (a < b && c > d) {\n"
5880 " }\n"
5881 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005882 verifyFormat("template <typename... Types>\n"
5883 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005884
5885 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5886 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5887 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005888 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005889 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005890 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005891}
5892
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005893TEST_F(FormatTest, BitshiftOperatorWidth) {
5894 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5895 " bar */",
5896 format("int a=1<<2; /* foo\n"
5897 " bar */"));
5898
5899 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5900 " bar */",
5901 format("int b =256>>1 ; /* foo\n"
5902 " bar */"));
5903}
5904
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005905TEST_F(FormatTest, UnderstandsBinaryOperators) {
5906 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005907 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005908}
5909
5910TEST_F(FormatTest, UnderstandsPointersToMembers) {
5911 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005912 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005913 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005914 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005915 verifyFormat("void f() {\n"
5916 " (a->*f)();\n"
5917 " a->*x;\n"
5918 " (a.*f)();\n"
5919 " ((*a).*f)();\n"
5920 " a.*x;\n"
5921 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005922 verifyFormat("void f() {\n"
5923 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5924 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5925 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005926 verifyFormat(
5927 "(aaaaaaaaaa->*bbbbbbb)(\n"
5928 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005929 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005930 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005931 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005932}
5933
Daniel Jasper8dd40472012-12-21 09:41:31 +00005934TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005935 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005936 verifyFormat("f(-1, -2, -3);");
5937 verifyFormat("a[-1] = 5;");
5938 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005939 verifyFormat("if (i == -1) {\n}");
5940 verifyFormat("if (i != -1) {\n}");
5941 verifyFormat("if (i > -1) {\n}");
5942 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005943 verifyFormat("++(a->f());");
5944 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005945 verifyFormat("(a->f())++;");
5946 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005947 verifyFormat("if (!(a->f())) {\n}");
Krasimir Georgiev446d6ec2018-03-06 13:56:28 +00005948 verifyFormat("if (!+i) {\n}");
5949 verifyFormat("~&a;");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005950
5951 verifyFormat("a-- > b;");
5952 verifyFormat("b ? -a : c;");
5953 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005954 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005955 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005956 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005957
5958 verifyFormat("return -1;");
5959 verifyFormat("switch (a) {\n"
5960 "case -1:\n"
5961 " break;\n"
5962 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005963 verifyFormat("#define X -1");
5964 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005965
Chandler Carruthf8b72662014-03-02 12:37:31 +00005966 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5967 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005968
5969 verifyFormat("int a = /* confusing comment */ -1;");
5970 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5971 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005972}
5973
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005974TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005975 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005976 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005977 "}");
5978 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005979 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005980 verifyFormat("*aaa = aaaaaaa( // break\n"
5981 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005982}
5983
Daniel Jasper8863ada2013-08-26 08:10:17 +00005984TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005985 verifyFormat("bool operator<();");
5986 verifyFormat("bool operator>();");
5987 verifyFormat("bool operator=();");
5988 verifyFormat("bool operator==();");
5989 verifyFormat("bool operator!=();");
5990 verifyFormat("int operator+();");
5991 verifyFormat("int operator++();");
Daniel Jasperbbf5f4e2017-11-06 12:11:51 +00005992 verifyFormat("int operator++(int) volatile noexcept;");
Daniel Jasper804a2762016-01-09 15:56:40 +00005993 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005994 verifyFormat("bool operator();");
5995 verifyFormat("bool operator()();");
5996 verifyFormat("bool operator[]();");
5997 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005998 verifyFormat("operator int();");
5999 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006000 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006001 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006002 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006003 verifyFormat("void *operator new(std::size_t size);");
6004 verifyFormat("void *operator new[](std::size_t size);");
6005 verifyFormat("void operator delete(void *ptr);");
6006 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00006007 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
6008 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00006009 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00006010 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006011
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006012 verifyFormat(
6013 "ostream &operator<<(ostream &OutputStream,\n"
6014 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00006015 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
6016 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
6017 " return left.group < right.group;\n"
6018 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00006019 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00006020 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006021
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006022 verifyGoogleFormat("operator void*();");
6023 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00006024 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00006025
6026 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00006027 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
6028 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006029}
6030
Daniel Jasper1c220482015-02-25 10:30:06 +00006031TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00006032 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
6033 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
6034 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
6035 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
6036 verifyFormat("Deleted &operator=(const Deleted &) &;");
6037 verifyFormat("Deleted &operator=(const Deleted &) &&;");
6038 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
6039 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
6040 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
6041 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
6042 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00006043 verifyFormat("void Fn(T const &) const &;");
6044 verifyFormat("void Fn(T const volatile &&) const volatile &&;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00006045 verifyFormat("template <typename T>\n"
6046 "void F(T) && = delete;",
6047 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00006048
Daniel Jasperaf642c62015-08-25 13:40:51 +00006049 FormatStyle AlignLeft = getLLVMStyle();
6050 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00006051 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00006052 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
6053 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
6054 AlignLeft);
6055 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
6056 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006057 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
6058 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
6059 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
6060 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00006061 verifyFormat("void Fn(T const&) const&;", AlignLeft);
6062 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00006063
6064 FormatStyle Spaces = getLLVMStyle();
6065 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006066 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
6067 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
6068 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
6069 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006070
6071 Spaces.SpacesInCStyleCastParentheses = false;
6072 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006073 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
6074 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
6075 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
6076 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006077}
6078
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006079TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00006080 verifyFormat("void f() {\n"
6081 " A *a = new A;\n"
6082 " A *a = new (placement) A;\n"
6083 " delete a;\n"
6084 " delete (A *)a;\n"
6085 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00006086 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6087 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00006088 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6089 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6090 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00006091 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006092}
6093
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006094TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006095 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006096 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006097 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006098 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006099 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006100 verifyIndependentOfContext("int a = b * 10;");
6101 verifyIndependentOfContext("int a = 10 * b;");
6102 verifyIndependentOfContext("int a = b * c;");
6103 verifyIndependentOfContext("int a += b * c;");
6104 verifyIndependentOfContext("int a -= b * c;");
6105 verifyIndependentOfContext("int a *= b * c;");
6106 verifyIndependentOfContext("int a /= b * c;");
6107 verifyIndependentOfContext("int a = *b;");
6108 verifyIndependentOfContext("int a = *b * c;");
6109 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00006110 verifyIndependentOfContext("int a = b * (10);");
6111 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006112 verifyIndependentOfContext("return 10 * b;");
6113 verifyIndependentOfContext("return *b * *c;");
6114 verifyIndependentOfContext("return a & ~b;");
6115 verifyIndependentOfContext("f(b ? *c : *d);");
6116 verifyIndependentOfContext("int a = b ? *c : *d;");
6117 verifyIndependentOfContext("*b = a;");
6118 verifyIndependentOfContext("a * ~b;");
6119 verifyIndependentOfContext("a * !b;");
6120 verifyIndependentOfContext("a * +b;");
6121 verifyIndependentOfContext("a * -b;");
6122 verifyIndependentOfContext("a * ++b;");
6123 verifyIndependentOfContext("a * --b;");
6124 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00006125 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006126 verifyIndependentOfContext("f() * b;");
6127 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006128 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006129 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00006130 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006131 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00006132 verifyIndependentOfContext("return sizeof(int **);");
6133 verifyIndependentOfContext("return sizeof(int ******);");
6134 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00006135 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006136 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00006137 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00006138 verifyGoogleFormat("return sizeof(int**);");
6139 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
6140 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006141 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00006142 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00006143 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00006144 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00006145 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00006146 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00006147 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00006148 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00006149 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00006150 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00006151 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00006152 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00006153 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00006154 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00006155 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00006156 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00006157 verifyFormat("void f(const MyOverride &override);");
6158 verifyFormat("void f(const MyFinal &final);");
6159 verifyIndependentOfContext("bool a = f() && override.f();");
6160 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00006161
Daniel Jasper5b49f472013-01-23 12:10:53 +00006162 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00006163
Daniel Jasper5b49f472013-01-23 12:10:53 +00006164 verifyIndependentOfContext("A<int *> a;");
6165 verifyIndependentOfContext("A<int **> a;");
6166 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00006167 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006168 verifyIndependentOfContext(
6169 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006170 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00006171 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00006172 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00006173 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00006174 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00006175
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00006176 verifyFormat(
6177 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6178 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6179
Daniel Jasper1f5d6372016-06-13 14:45:12 +00006180 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00006181 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00006182 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006183 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00006184 verifyGoogleFormat("A<int*> a;");
6185 verifyGoogleFormat("A<int**> a;");
6186 verifyGoogleFormat("A<int*, int*> a;");
6187 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006188 verifyGoogleFormat("f(b ? *c : *d);");
6189 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00006190 verifyGoogleFormat("Type* t = **x;");
6191 verifyGoogleFormat("Type* t = *++*x;");
6192 verifyGoogleFormat("*++*x;");
6193 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
6194 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006195 verifyGoogleFormat(
6196 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00006197 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00006198 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
6199 verifyGoogleFormat("template <typename T>\n"
6200 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00006201
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006202 FormatStyle Left = getLLVMStyle();
6203 Left.PointerAlignment = FormatStyle::PAS_Left;
6204 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00006205 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00006206 verifyFormat("return *this += 1;", Left);
Manuel Klimek06b575c2017-07-17 15:27:53 +00006207 verifyFormat("throw *x;", Left);
Krasimir Georgiev9b5a89b2017-08-14 11:06:07 +00006208 verifyFormat("delete *x;", Left);
6209 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
6210 verifyFormat("[](const decltype(*a)* ptr) {}", Left);
6211 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006212
Daniel Jasper5b49f472013-01-23 12:10:53 +00006213 verifyIndependentOfContext("a = *(x + y);");
6214 verifyIndependentOfContext("a = &(x + y);");
6215 verifyIndependentOfContext("*(x + y).call();");
6216 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006217 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00006218
Daniel Jasper5b49f472013-01-23 12:10:53 +00006219 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00006220 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00006221 "int *MyValues = {\n"
6222 " *A, // Operator detection might be confused by the '{'\n"
6223 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00006224 "};");
Nico Weber80a82762013-01-17 17:17:19 +00006225
Daniel Jasper5b49f472013-01-23 12:10:53 +00006226 verifyIndependentOfContext("if (int *a = &b)");
6227 verifyIndependentOfContext("if (int &a = *b)");
6228 verifyIndependentOfContext("if (a & b[i])");
6229 verifyIndependentOfContext("if (a::b::c::d & b[i])");
6230 verifyIndependentOfContext("if (*b[i])");
6231 verifyIndependentOfContext("if (int *a = (&b))");
6232 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00006233 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00006234 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00006235 verifyFormat("void f() {\n"
6236 " for (const int &v : Values) {\n"
6237 " }\n"
6238 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006239 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
6240 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00006241 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00006242
Daniel Jaspera98da3d2013-11-07 19:56:07 +00006243 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006244 verifyFormat("#define MACRO \\\n"
6245 " int *i = a * b; \\\n"
6246 " void f(a *b);",
6247 getLLVMStyleWithColumns(19));
6248
Daniel Jasper97b89482013-03-13 07:49:51 +00006249 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006250 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006251 verifyIndependentOfContext("T **t = new T *;");
6252 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00006253 verifyGoogleFormat("A = new SomeType*[Length]();");
6254 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006255 verifyGoogleFormat("T** t = new T*;");
6256 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006257
Daniel Jaspera65e8872014-03-25 10:52:45 +00006258 verifyFormat("STATIC_ASSERT((a & b) == 0);");
6259 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006260 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006261 "typename t::if<x && y>::type f() {}");
6262 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006263 verifyFormat("vector<int *> v;");
6264 verifyFormat("vector<int *const> v;");
6265 verifyFormat("vector<int *const **const *> v;");
6266 verifyFormat("vector<int *volatile> v;");
6267 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006268 verifyFormat("foo<b && false>();");
6269 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00006270 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00006271 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006272 "template <class T, class = typename std::enable_if<\n"
6273 " std::is_integral<T>::value &&\n"
6274 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
6275 "void F();",
6276 getLLVMStyleWithColumns(70));
6277 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00006278 "template <class T,\n"
6279 " class = typename std::enable_if<\n"
6280 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006281 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
6282 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006283 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00006284 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006285 verifyFormat(
6286 "template <class T,\n"
6287 " class = typename ::std::enable_if<\n"
6288 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6289 "void F();",
6290 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006291
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006292 verifyIndependentOfContext("MACRO(int *i);");
6293 verifyIndependentOfContext("MACRO(auto *a);");
6294 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00006295 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00006296 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00006297 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006298 // FIXME: Is there a way to make this work?
6299 // verifyIndependentOfContext("MACRO(A *a);");
6300
Daniel Jasper32ccb032014-06-23 07:36:18 +00006301 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00006302 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00006303
Daniel Jasper866468a2014-04-14 13:15:29 +00006304 EXPECT_EQ("#define OP(x) \\\n"
6305 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6306 " return s << a.DebugString(); \\\n"
6307 " }",
6308 format("#define OP(x) \\\n"
6309 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6310 " return s << a.DebugString(); \\\n"
6311 " }",
6312 getLLVMStyleWithColumns(50)));
6313
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006314 // FIXME: We cannot handle this case yet; we might be able to figure out that
6315 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00006316 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00006317
6318 FormatStyle PointerMiddle = getLLVMStyle();
6319 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6320 verifyFormat("delete *x;", PointerMiddle);
6321 verifyFormat("int * x;", PointerMiddle);
Ben Hamilton9dc78162018-04-03 14:07:11 +00006322 verifyFormat("int *[] x;", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006323 verifyFormat("template <int * y> f() {}", PointerMiddle);
6324 verifyFormat("int * f(int * a) {}", PointerMiddle);
6325 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6326 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6327 verifyFormat("A<int *> a;", PointerMiddle);
6328 verifyFormat("A<int **> a;", PointerMiddle);
6329 verifyFormat("A<int *, int *> a;", PointerMiddle);
Ben Hamilton9dc78162018-04-03 14:07:11 +00006330 verifyFormat("A<int *[]> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006331 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6332 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006333 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006334
6335 // Member function reference qualifiers aren't binary operators.
6336 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006337 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006338 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006339 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006340 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006341 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006342}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006343
Daniel Jasperee6d6502013-07-17 20:25:02 +00006344TEST_F(FormatTest, UnderstandsAttributes) {
6345 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006346 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6347 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006348 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006349 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006350 verifyFormat("__attribute__((nodebug)) void\n"
6351 "foo() {}\n",
6352 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006353}
6354
Ben Hamiltonb060ad82018-03-12 15:42:38 +00006355TEST_F(FormatTest, UnderstandsSquareAttributes) {
6356 verifyFormat("SomeType s [[unused]] (InitValue);");
6357 verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
6358 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
6359 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
6360 verifyFormat("void f() [[deprecated(\"so sorry\")]];");
6361 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6362 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Manuel Klimekd0f3fe52018-04-11 14:51:54 +00006363
6364 // Make sure we do not mistake attributes for array subscripts.
6365 verifyFormat("int a() {}\n"
6366 "[[unused]] int b() {}\n");
6367
6368 // On the other hand, we still need to correctly find array subscripts.
6369 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];");
6370
6371 // Make sure we do not parse attributes as lambda introducers.
6372 FormatStyle MultiLineFunctions = getLLVMStyle();
6373 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
6374 verifyFormat("[[unused]] int b() {\n"
6375 " return 42;\n"
6376 "}\n",
6377 MultiLineFunctions);
Ben Hamiltonb060ad82018-03-12 15:42:38 +00006378}
6379
Daniel Jasper10cd5812013-05-06 06:35:44 +00006380TEST_F(FormatTest, UnderstandsEllipsis) {
6381 verifyFormat("int printf(const char *fmt, ...);");
6382 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006383 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6384
6385 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006386 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006387 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006388}
6389
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006390TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006391 EXPECT_EQ("int *a;\n"
6392 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006393 "int *a;",
6394 format("int *a;\n"
6395 "int* a;\n"
6396 "int *a;",
6397 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006398 EXPECT_EQ("int* a;\n"
6399 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006400 "int* a;",
6401 format("int* a;\n"
6402 "int* a;\n"
6403 "int *a;",
6404 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006405 EXPECT_EQ("int *a;\n"
6406 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006407 "int *a;",
6408 format("int *a;\n"
6409 "int * a;\n"
6410 "int * a;",
6411 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006412 EXPECT_EQ("auto x = [] {\n"
6413 " int *a;\n"
6414 " int *a;\n"
6415 " int *a;\n"
6416 "};",
6417 format("auto x=[]{int *a;\n"
6418 "int * a;\n"
6419 "int * a;};",
6420 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006421}
6422
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006423TEST_F(FormatTest, UnderstandsRvalueReferences) {
6424 verifyFormat("int f(int &&a) {}");
6425 verifyFormat("int f(int a, char &&b) {}");
6426 verifyFormat("void f() { int &&a = b; }");
6427 verifyGoogleFormat("int f(int a, char&& b) {}");
6428 verifyGoogleFormat("void f() { int&& a = b; }");
6429
Daniel Jasper1eff9082013-05-27 16:36:33 +00006430 verifyIndependentOfContext("A<int &&> a;");
6431 verifyIndependentOfContext("A<int &&, int &&> a;");
6432 verifyGoogleFormat("A<int&&> a;");
6433 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006434
6435 // Not rvalue references:
6436 verifyFormat("template <bool B, bool C> class A {\n"
6437 " static_assert(B && C, \"Something is wrong\");\n"
6438 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006439 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6440 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006441 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006442}
6443
Manuel Klimekc1237a82013-01-23 14:08:21 +00006444TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6445 verifyFormat("void f() {\n"
6446 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006447 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006448 "}",
6449 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006450}
6451
Daniel Jasperef906a92013-01-13 08:01:36 +00006452TEST_F(FormatTest, FormatsCasts) {
6453 verifyFormat("Type *A = static_cast<Type *>(P);");
6454 verifyFormat("Type *A = (Type *)P;");
6455 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6456 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006457 verifyFormat("int a = (int)2.0f;");
6458 verifyFormat("x[(int32)y];");
6459 verifyFormat("x = (int32)y;");
6460 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6461 verifyFormat("int a = (int)*b;");
6462 verifyFormat("int a = (int)2.0f;");
6463 verifyFormat("int a = (int)~0;");
6464 verifyFormat("int a = (int)++a;");
6465 verifyFormat("int a = (int)sizeof(int);");
6466 verifyFormat("int a = (int)+2;");
6467 verifyFormat("my_int a = (my_int)2.0f;");
6468 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006469 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006470 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006471 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006472 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006473 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006474
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006475 verifyFormat("void f() { my_int a = (my_int)*b; }");
6476 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6477 verifyFormat("my_int a = (my_int)~0;");
6478 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006479 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006480 verifyFormat("my_int a = (my_int)1;");
6481 verifyFormat("my_int a = (my_int *)1;");
6482 verifyFormat("my_int a = (const my_int)-1;");
6483 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006484 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006485 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006486 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006487 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006488
6489 // FIXME: single value wrapped with paren will be treated as cast.
6490 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006491
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006492 verifyFormat("{ (void)F; }");
6493
Daniel Jasper998cabc2013-07-18 14:46:07 +00006494 // Don't break after a cast's
6495 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6496 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6497 " bbbbbbbbbbbbbbbbbbbbbb);");
6498
Daniel Jasperef906a92013-01-13 08:01:36 +00006499 // These are not casts.
6500 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006501 verifyFormat("f(foo)->b;");
6502 verifyFormat("f(foo).b;");
6503 verifyFormat("f(foo)(b);");
6504 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006505 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006506 verifyFormat("(*funptr)(foo)[4];");
6507 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006508 verifyFormat("void f(int *);");
6509 verifyFormat("void f(int *) = 0;");
6510 verifyFormat("void f(SmallVector<int>) {}");
6511 verifyFormat("void f(SmallVector<int>);");
6512 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006513 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006514 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006515 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006516 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6517 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006518 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006519
Daniel Jasperba0bda92013-02-23 08:07:18 +00006520 // These are not casts, but at some point were confused with casts.
6521 verifyFormat("virtual void foo(int *) override;");
6522 verifyFormat("virtual void foo(char &) const;");
6523 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006524 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006525 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006526 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006527 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006528
6529 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6530 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006531 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006532 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006533 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6534 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6535 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006536}
6537
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006538TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006539 verifyFormat("A<bool()> a;");
6540 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006541 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006542 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006543 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006544 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006545 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006546 verifyFormat("template <class CallbackClass>\n"
6547 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006548
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006549 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6550 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006551 verifyGoogleFormat(
6552 "template <class CallbackClass>\n"
6553 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006554
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006555 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006556 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006557 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006558 verifyFormat("some_var = function(*some_pointer_var)[0];");
6559 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006560 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006561 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00006562 verifyFormat("std::function<\n"
6563 " LooooooooooongTemplatedType<\n"
6564 " SomeType>*(\n"
6565 " LooooooooooooooooongType type)>\n"
6566 " function;",
6567 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006568}
6569
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006570TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6571 verifyFormat("A (*foo_)[6];");
6572 verifyFormat("vector<int> (*foo_)[6];");
6573}
6574
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006575TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6576 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6577 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6578 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6579 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006580 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6581 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006582
6583 // Different ways of ()-initializiation.
6584 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6585 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6586 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6587 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6588 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6589 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006590 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6591 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00006592
6593 // Lambdas should not confuse the variable declaration heuristic.
6594 verifyFormat("LooooooooooooooooongType\n"
6595 " variable(nullptr, [](A *a) {});",
6596 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006597}
6598
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006599TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006600 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006601 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006602 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006603 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006604 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006605 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006606 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6607 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006608 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6609 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006610 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6611 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006612 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6613 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006614 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6615 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006616 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6617 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6618 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6619 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006620 FormatStyle Indented = getLLVMStyle();
6621 Indented.IndentWrappedFunctionNames = true;
6622 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6623 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6624 Indented);
6625 verifyFormat(
6626 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6627 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6628 Indented);
6629 verifyFormat(
6630 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6631 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6632 Indented);
6633 verifyFormat(
6634 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6635 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6636 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006637
6638 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006639 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6640 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6641 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006642
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006643 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006644 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006645 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006646 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6647 " SourceLocation L, IdentifierIn *II,\n"
6648 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006649 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006650 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006651 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006652 " const SomeType<string, SomeOtherTemplateParameter>\n"
6653 " &ReallyReallyLongParameterName,\n"
6654 " const SomeType<string, SomeOtherTemplateParameter>\n"
6655 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006656 verifyFormat("template <typename A>\n"
6657 "SomeLoooooooooooooooooooooongType<\n"
6658 " typename some_namespace::SomeOtherType<A>::Type>\n"
6659 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006660
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006661 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006662 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6663 " aaaaaaaaaaaaaaaaaaaaaaa;");
6664 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006665 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6666 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006667 verifyGoogleFormat(
6668 "some_namespace::LongReturnType\n"
6669 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006670 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006671
6672 verifyGoogleFormat("template <typename T>\n"
6673 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006674 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006675 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6676 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006677
6678 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006679 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6680 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006681 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6682 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6683 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6684 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6685 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6686 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6687 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006688
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00006689 verifyFormat("template <typename T> // Templates on own line.\n"
6690 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006691 "MyFunction(int a);",
6692 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00006693}
6694
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006695TEST_F(FormatTest, FormatsArrays) {
6696 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6697 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006698 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6699 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006700 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6701 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006702 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6703 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6704 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6705 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6706 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6707 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6708 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6709 verifyFormat(
6710 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6711 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6712 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006713 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6714 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006715
6716 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6717 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006718 verifyFormat(
6719 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6720 " .aaaaaaa[0]\n"
6721 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006722 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006723
6724 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006725
6726 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6727 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006728}
6729
Daniel Jaspere9de2602012-12-06 09:56:08 +00006730TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6731 verifyFormat("(a)->b();");
6732 verifyFormat("--a;");
6733}
6734
Daniel Jasper8b529712012-12-04 13:02:32 +00006735TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006736 verifyFormat("#include <string>\n"
6737 "#include <a/b/c.h>\n"
6738 "#include \"a/b/string\"\n"
6739 "#include \"string.h\"\n"
6740 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006741 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006742 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006743 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006744 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006745 "#include \"some long include\" // with a comment\n"
Manuel Klimek45ab5592017-11-14 09:19:53 +00006746 "#include \"some very long include path\"\n"
6747 "#include <some/very/long/include/path>\n",
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006748 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006749 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6750 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006751
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006752 verifyFormat("#import <string>");
6753 verifyFormat("#import <a/b/c.h>");
6754 verifyFormat("#import \"a/b/string\"");
6755 verifyFormat("#import \"string.h\"");
6756 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006757 verifyFormat("#if __has_include(<strstream>)\n"
6758 "#include <strstream>\n"
6759 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006760
Daniel Jasper343643b2014-08-13 08:29:18 +00006761 verifyFormat("#define MY_IMPORT <a/b>");
6762
Nico Weber21088802017-02-10 19:36:52 +00006763 verifyFormat("#if __has_include(<a/b>)");
6764 verifyFormat("#if __has_include_next(<a/b>)");
6765 verifyFormat("#define F __has_include(<a/b>)");
6766 verifyFormat("#define F __has_include_next(<a/b>)");
6767
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006768 // Protocol buffer definition or missing "#".
6769 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6770 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006771
6772 FormatStyle Style = getLLVMStyle();
6773 Style.AlwaysBreakBeforeMultilineStrings = true;
6774 Style.ColumnLimit = 0;
6775 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006776
6777 // But 'import' might also be a regular C++ namespace.
6778 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6779 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006780}
6781
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006782//===----------------------------------------------------------------------===//
6783// Error recovery tests.
6784//===----------------------------------------------------------------------===//
6785
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006786TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006787 FormatStyle NoBinPacking = getLLVMStyle();
6788 NoBinPacking.BinPackParameters = false;
6789 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6790 " double *min_x,\n"
6791 " double *max_x,\n"
6792 " double *min_y,\n"
6793 " double *max_y,\n"
6794 " double *min_z,\n"
6795 " double *max_z, ) {}",
6796 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006797}
6798
Daniel Jasper83a54d22013-01-10 09:26:47 +00006799TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006800 verifyFormat("void f() { return; }\n42");
6801 verifyFormat("void f() {\n"
6802 " if (0)\n"
6803 " return;\n"
6804 "}\n"
6805 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006806 verifyFormat("void f() { return }\n42");
6807 verifyFormat("void f() {\n"
6808 " if (0)\n"
6809 " return\n"
6810 "}\n"
6811 "42");
6812}
6813
6814TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6815 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6816 EXPECT_EQ("void f() {\n"
6817 " if (a)\n"
6818 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006819 "}",
6820 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006821 EXPECT_EQ("namespace N {\n"
6822 "void f()\n"
6823 "}",
6824 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006825 EXPECT_EQ("namespace N {\n"
6826 "void f() {}\n"
6827 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006828 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006829 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006830}
6831
Daniel Jasper2df93312013-01-09 10:16:05 +00006832TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6833 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006834 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006835 " b;",
6836 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006837 verifyFormat("function(\n"
6838 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006839 " LoooooooooooongArgument);\n",
6840 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006841}
6842
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006843TEST_F(FormatTest, IncorrectAccessSpecifier) {
6844 verifyFormat("public:");
6845 verifyFormat("class A {\n"
6846 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006847 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006848 "};");
6849 verifyFormat("public\n"
6850 "int qwerty;");
6851 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006852 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006853 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006854 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006855 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006856 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006857}
Daniel Jasperf7935112012-12-03 18:12:45 +00006858
Daniel Jasper291f9362013-03-20 15:58:10 +00006859TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6860 verifyFormat("{");
6861 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006862 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006863}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006864
Krasimir Georgiev067ec702018-05-22 11:44:03 +00006865TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) {
6866 // Found by oss-fuzz:
6867 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212
6868 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
6869 Style.ColumnLimit = 60;
6870 verifyNoCrash(
6871 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20"
6872 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20"
6873 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a",
6874 Style);
6875}
6876
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006877TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006878 verifyFormat("do {\n}");
6879 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006880 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006881 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006882 "wheeee(fun);");
6883 verifyFormat("do {\n"
6884 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006885 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006886}
6887
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006888TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006889 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006890 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006891 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006892 verifyFormat("while {\n foo;\n foo();\n}");
6893 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006894}
6895
Daniel Jasperc0880a92013-01-04 18:52:56 +00006896TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006897 verifyIncompleteFormat("namespace {\n"
6898 "class Foo { Foo (\n"
6899 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00006900 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006901}
6902
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006903TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006904 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006905 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6906 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006907 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006908
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006909 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006910 " {\n"
6911 " breakme(\n"
6912 " qwe);\n"
6913 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006914 format("{\n"
6915 " {\n"
6916 " breakme(qwe);\n"
6917 "}\n",
6918 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006919}
6920
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006921TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006922 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006923 " avariable,\n"
6924 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006925 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006926}
6927
Manuel Klimek762dd182013-01-21 10:07:49 +00006928TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006929 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006930}
6931
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006932TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006933 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006934 verifyFormat("vector<int> x{\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006935 " 1,\n"
6936 " 2,\n"
6937 " 3,\n"
6938 " 4,\n"
Daniel Jaspera125d532014-03-21 12:38:57 +00006939 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006940 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6941 verifyFormat("f({1, 2});");
6942 verifyFormat("auto v = Foo{-1};");
6943 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6944 verifyFormat("Class::Class : member{1, 2, 3} {}");
6945 verifyFormat("new vector<int>{1, 2, 3};");
6946 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006947 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006948 verifyFormat("return {arg1, arg2};");
6949 verifyFormat("return {arg1, SomeType{parameter}};");
6950 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6951 verifyFormat("new T{arg1, arg2};");
6952 verifyFormat("f(MyMap[{composite, key}]);");
6953 verifyFormat("class Class {\n"
6954 " T member = {arg1, arg2};\n"
6955 "};");
6956 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00006957 verifyFormat("const struct A a = {.a = 1, .b = 2};");
6958 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006959 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6960 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006961
Daniel Jasper438059e2014-05-22 12:11:13 +00006962 verifyFormat("int foo(int i) { return fo1{}(i); }");
6963 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006964 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006965 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006966 verifyFormat("Node n{1, Node{1000}, //\n"
6967 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006968 verifyFormat("Aaaa aaaaaaa{\n"
6969 " {\n"
6970 " aaaa,\n"
6971 " },\n"
6972 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006973 verifyFormat("class C : public D {\n"
6974 " SomeClass SC{2};\n"
6975 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006976 verifyFormat("class C : public A {\n"
6977 " class D : public B {\n"
6978 " void f() { int i{2}; }\n"
6979 " };\n"
6980 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006981 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006982
Francois Ferrandf92f8062018-05-16 08:03:52 +00006983 // Avoid breaking between equal sign and opening brace
6984 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle();
6985 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200;
6986 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n"
6987 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n"
6988 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n"
6989 " {\"ccccccccccccccccccccc\", 2}};",
6990 AvoidBreakingFirstArgument);
6991
Francois Ferrandd2130f52017-06-30 20:00:02 +00006992 // Binpacking only if there is no trailing comma
6993 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
6994 " cccccccccc, dddddddddd};",
6995 getLLVMStyleWithColumns(50));
6996 verifyFormat("const Aaaaaa aaaaa = {\n"
6997 " aaaaaaaaaaa,\n"
6998 " bbbbbbbbbbb,\n"
6999 " ccccccccccc,\n"
7000 " ddddddddddd,\n"
7001 "};", getLLVMStyleWithColumns(50));
7002
Daniel Jaspere4ada022016-12-13 10:05:03 +00007003 // Cases where distinguising braced lists and blocks is hard.
7004 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
7005 verifyFormat("void f() {\n"
7006 " return; // comment\n"
7007 "}\n"
7008 "SomeType t;");
7009 verifyFormat("void f() {\n"
7010 " if (a) {\n"
7011 " f();\n"
7012 " }\n"
7013 "}\n"
7014 "SomeType t;");
7015
Daniel Jasper08434342015-05-26 07:26:26 +00007016 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007017 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00007018 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007019 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
7020 " bbbbb,\n"
7021 " ccccc,\n"
7022 " ddddd,\n"
7023 " eeeee,\n"
7024 " ffffff,\n"
7025 " ggggg,\n"
7026 " hhhhhh,\n"
7027 " iiiiii,\n"
7028 " jjjjjj,\n"
7029 " kkkkkk};",
7030 NoBinPacking);
7031 verifyFormat("const Aaaaaa aaaaa = {\n"
7032 " aaaaa,\n"
7033 " bbbbb,\n"
7034 " ccccc,\n"
7035 " ddddd,\n"
7036 " eeeee,\n"
7037 " ffffff,\n"
7038 " ggggg,\n"
7039 " hhhhhh,\n"
7040 " iiiiii,\n"
7041 " jjjjjj,\n"
7042 " kkkkkk,\n"
7043 "};",
7044 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00007045 verifyFormat(
7046 "const Aaaaaa aaaaa = {\n"
7047 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
7048 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
7049 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
7050 "};",
7051 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007052
Chandler Carruthf8b72662014-03-02 12:37:31 +00007053 // FIXME: The alignment of these trailing comments might be bad. Then again,
7054 // this might be utterly useless in real code.
7055 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00007056 " : some_value{ //\n"
7057 " aaaaaaa, //\n"
7058 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00007059
Chandler Carruthf8b72662014-03-02 12:37:31 +00007060 // In braced lists, the first comment is always assumed to belong to the
7061 // first element. Thus, it can be moved to the next or previous line as
7062 // appropriate.
7063 EXPECT_EQ("function({// First element:\n"
7064 " 1,\n"
7065 " // Second element:\n"
7066 " 2});",
7067 format("function({\n"
7068 " // First element:\n"
7069 " 1,\n"
7070 " // Second element:\n"
7071 " 2});"));
7072 EXPECT_EQ("std::vector<int> MyNumbers{\n"
7073 " // First element:\n"
7074 " 1,\n"
7075 " // Second element:\n"
7076 " 2};",
7077 format("std::vector<int> MyNumbers{// First element:\n"
7078 " 1,\n"
7079 " // Second element:\n"
7080 " 2};",
7081 getLLVMStyleWithColumns(30)));
Francois Ferrandd2130f52017-06-30 20:00:02 +00007082 // A trailing comma should still lead to an enforced line break and no
7083 // binpacking.
Daniel Jasper64a328e2014-11-11 19:34:57 +00007084 EXPECT_EQ("vector<int> SomeVector = {\n"
7085 " // aaa\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00007086 " 1,\n"
7087 " 2,\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00007088 "};",
7089 format("vector<int> SomeVector = { // aaa\n"
7090 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00007091
Chandler Carruthf8b72662014-03-02 12:37:31 +00007092 FormatStyle ExtraSpaces = getLLVMStyle();
7093 ExtraSpaces.Cpp11BracedListStyle = false;
7094 ExtraSpaces.ColumnLimit = 75;
7095 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
7096 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
7097 verifyFormat("f({ 1, 2 });", ExtraSpaces);
7098 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
7099 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
7100 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
7101 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
7102 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
7103 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
7104 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
7105 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
7106 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
7107 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
7108 verifyFormat("class Class {\n"
7109 " T member = { arg1, arg2 };\n"
7110 "};",
7111 ExtraSpaces);
7112 verifyFormat(
7113 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7114 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
7115 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
7116 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
7117 ExtraSpaces);
7118 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00007119 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007120 ExtraSpaces);
7121 verifyFormat(
7122 "someFunction(OtherParam,\n"
7123 " BracedList{ // comment 1 (Forcing interesting break)\n"
7124 " param1, param2,\n"
7125 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00007126 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007127 ExtraSpaces);
7128 verifyFormat(
7129 "std::this_thread::sleep_for(\n"
7130 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
7131 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00007132 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00007133 " aaaaaaa,\n"
7134 " aaaaaaaaaa,\n"
7135 " aaaaa,\n"
7136 " aaaaaaaaaaaaaaa,\n"
7137 " aaa,\n"
7138 " aaaaaaaaaa,\n"
7139 " a,\n"
7140 " aaaaaaaaaaaaaaaaaaaaa,\n"
7141 " aaaaaaaaaaaa,\n"
7142 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
7143 " aaaaaaa,\n"
7144 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007145 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Francois Ferrand5f07f442017-06-19 14:41:21 +00007146 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
7147 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
Francois Ferrandf92f8062018-05-16 08:03:52 +00007148
7149 // Avoid breaking between initializer/equal sign and opening brace
7150 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200;
7151 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n"
7152 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
7153 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
7154 " { \"ccccccccccccccccccccc\", 2 }\n"
7155 "};",
7156 ExtraSpaces);
7157 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n"
7158 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
7159 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
7160 " { \"ccccccccccccccccccccc\", 2 }\n"
7161 "};",
7162 ExtraSpaces);
Hans Wennborgbfc34062018-06-14 08:01:09 +00007163
7164 FormatStyle SpaceBeforeBrace = getLLVMStyle();
7165 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true;
7166 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace);
7167 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace);
Manuel Klimekab419912013-05-23 09:41:43 +00007168}
7169
Daniel Jasper33b909c2013-10-25 14:29:37 +00007170TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007171 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7172 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7173 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7174 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7175 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7176 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007177 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007178 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00007179 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007180 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7181 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007182 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007183 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7184 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7185 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
7186 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7187 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7188 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7189 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007190 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007191 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7192 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007193 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7194 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7195 " // Separating comment.\n"
7196 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
7197 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7198 " // Leading comment\n"
7199 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7200 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007201 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7202 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007203 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00007204 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7205 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007206 getLLVMStyleWithColumns(38));
7207 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007208 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
7209 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007210 verifyFormat(
7211 "static unsigned SomeValues[10][3] = {\n"
7212 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
7213 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
7214 verifyFormat("static auto fields = new vector<string>{\n"
7215 " \"aaaaaaaaaaaaa\",\n"
7216 " \"aaaaaaaaaaaaa\",\n"
7217 " \"aaaaaaaaaaaa\",\n"
7218 " \"aaaaaaaaaaaaaa\",\n"
7219 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7220 " \"aaaaaaaaaaaa\",\n"
7221 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7222 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00007223 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
7224 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
7225 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
7226 " 3, cccccccccccccccccccccc};",
7227 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00007228
7229 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00007230 verifyFormat("vector<int> x = {\n"
7231 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
7232 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00007233 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00007234 verifyFormat("vector<int> x = {\n"
7235 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00007236 "};",
7237 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00007238 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7239 " 1, 1, 1, 1,\n"
7240 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00007241 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007242
Daniel Jasper60c27072015-05-13 08:16:00 +00007243 // Trailing comment in the first line.
7244 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
7245 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
7246 " 111111111, 222222222, 3333333333, 444444444, //\n"
7247 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00007248 // Trailing comment in the last line.
7249 verifyFormat("int aaaaa[] = {\n"
7250 " 1, 2, 3, // comment\n"
7251 " 4, 5, 6 // comment\n"
7252 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00007253
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007254 // With nested lists, we should either format one item per line or all nested
7255 // lists one on line.
7256 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007257 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
7258 " {aaaaaaaaaaaaaaaaaaa},\n"
7259 " {aaaaaaaaaaaaaaaaaaaaa},\n"
7260 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00007261 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00007262 verifyFormat(
7263 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007264 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
7265 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
7266 " {aaa, aaa},\n"
7267 " {aaa, aaa},\n"
7268 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
7269 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7270 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00007271
7272 // No column layout should be used here.
Francois Ferrandd2130f52017-06-30 20:00:02 +00007273 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007274 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00007275
7276 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00007277
Daniel Jaspereb65e912015-12-21 18:31:15 +00007278 // No braced initializer here.
7279 verifyFormat("void f() {\n"
7280 " struct Dummy {};\n"
7281 " f(v);\n"
7282 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00007283
7284 // Long lists should be formatted in columns even if they are nested.
7285 verifyFormat(
7286 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7287 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7288 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7289 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7290 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7291 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00007292
7293 // Allow "single-column" layout even if that violates the column limit. There
7294 // isn't going to be a better way.
7295 verifyFormat("std::vector<int> a = {\n"
7296 " aaaaaaaa,\n"
7297 " aaaaaaaa,\n"
7298 " aaaaaaaa,\n"
7299 " aaaaaaaa,\n"
7300 " aaaaaaaaaa,\n"
7301 " aaaaaaaa,\n"
7302 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
7303 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00007304 verifyFormat("vector<int> aaaa = {\n"
7305 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7306 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7307 " aaaaaa.aaaaaaa,\n"
7308 " aaaaaa.aaaaaaa,\n"
7309 " aaaaaa.aaaaaaa,\n"
7310 " aaaaaa.aaaaaaa,\n"
7311 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007312
7313 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00007314 verifyFormat("someFunction(Param, {List1, List2,\n"
7315 " List3});",
7316 getLLVMStyleWithColumns(35));
7317 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007318 " {List1, List2,\n"
7319 " List3});",
7320 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00007321 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
7322 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007323}
7324
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007325TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007326 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00007327 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007328
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007329 verifyFormat("void f() { return 42; }");
7330 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007331 " return 42;\n"
7332 "}",
7333 DoNotMerge);
7334 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007335 " // Comment\n"
7336 "}");
7337 verifyFormat("{\n"
7338 "#error {\n"
7339 " int a;\n"
7340 "}");
7341 verifyFormat("{\n"
7342 " int a;\n"
7343 "#error {\n"
7344 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00007345 verifyFormat("void f() {} // comment");
7346 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00007347 verifyFormat("void f() {\n"
7348 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007349 DoNotMerge);
7350 verifyFormat("void f() {\n"
7351 " int a;\n"
7352 "} // comment",
7353 DoNotMerge);
7354 verifyFormat("void f() {\n"
7355 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00007356 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007357
7358 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7359 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7360
7361 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7362 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007363 verifyFormat("class C {\n"
7364 " C()\n"
7365 " : iiiiiiii(nullptr),\n"
7366 " kkkkkkk(nullptr),\n"
7367 " mmmmmmm(nullptr),\n"
7368 " nnnnnnn(nullptr) {}\n"
7369 "};",
7370 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007371
7372 FormatStyle NoColumnLimit = getLLVMStyle();
7373 NoColumnLimit.ColumnLimit = 0;
7374 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7375 EXPECT_EQ("class C {\n"
7376 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007377 "};",
7378 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007379 EXPECT_EQ("A()\n"
7380 " : b(0) {\n"
7381 "}",
7382 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7383
7384 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007385 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7386 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007387 EXPECT_EQ("A()\n"
7388 " : b(0) {\n"
7389 "}",
7390 format("A():b(0){}", DoNotMergeNoColumnLimit));
7391 EXPECT_EQ("A()\n"
7392 " : b(0) {\n"
7393 "}",
7394 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007395
7396 verifyFormat("#define A \\\n"
7397 " void f() { \\\n"
7398 " int i; \\\n"
7399 " }",
7400 getLLVMStyleWithColumns(20));
7401 verifyFormat("#define A \\\n"
7402 " void f() { int i; }",
7403 getLLVMStyleWithColumns(21));
7404 verifyFormat("#define A \\\n"
7405 " void f() { \\\n"
7406 " int i; \\\n"
7407 " } \\\n"
7408 " int j;",
7409 getLLVMStyleWithColumns(22));
7410 verifyFormat("#define A \\\n"
7411 " void f() { int i; } \\\n"
7412 " int j;",
7413 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007414}
7415
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007416TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
7417 FormatStyle MergeEmptyOnly = getLLVMStyle();
7418 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7419 verifyFormat("class C {\n"
7420 " int f() {}\n"
7421 "};",
7422 MergeEmptyOnly);
7423 verifyFormat("class C {\n"
7424 " int f() {\n"
7425 " return 42;\n"
7426 " }\n"
7427 "};",
7428 MergeEmptyOnly);
7429 verifyFormat("int f() {}", MergeEmptyOnly);
7430 verifyFormat("int f() {\n"
7431 " return 42;\n"
7432 "}",
7433 MergeEmptyOnly);
7434
7435 // Also verify behavior when BraceWrapping.AfterFunction = true
7436 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7437 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
7438 verifyFormat("int f() {}", MergeEmptyOnly);
7439 verifyFormat("class C {\n"
7440 " int f() {}\n"
7441 "};",
7442 MergeEmptyOnly);
7443}
7444
Daniel Jasperd74cf402014-04-08 12:46:38 +00007445TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7446 FormatStyle MergeInlineOnly = getLLVMStyle();
7447 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7448 verifyFormat("class C {\n"
7449 " int f() { return 42; }\n"
7450 "};",
7451 MergeInlineOnly);
7452 verifyFormat("int f() {\n"
7453 " return 42;\n"
7454 "}",
7455 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007456
7457 // SFS_Inline implies SFS_Empty
7458 verifyFormat("class C {\n"
7459 " int f() {}\n"
7460 "};",
7461 MergeInlineOnly);
7462 verifyFormat("int f() {}", MergeInlineOnly);
7463
7464 // Also verify behavior when BraceWrapping.AfterFunction = true
7465 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7466 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7467 verifyFormat("class C {\n"
7468 " int f() { return 42; }\n"
7469 "};",
7470 MergeInlineOnly);
7471 verifyFormat("int f()\n"
7472 "{\n"
7473 " return 42;\n"
7474 "}",
7475 MergeInlineOnly);
7476
7477 // SFS_Inline implies SFS_Empty
7478 verifyFormat("int f() {}", MergeInlineOnly);
7479 verifyFormat("class C {\n"
7480 " int f() {}\n"
7481 "};",
7482 MergeInlineOnly);
7483}
7484
Francois Ferrandd3f0e3d2017-06-21 13:56:02 +00007485TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
7486 FormatStyle MergeInlineOnly = getLLVMStyle();
7487 MergeInlineOnly.AllowShortFunctionsOnASingleLine =
7488 FormatStyle::SFS_InlineOnly;
7489 verifyFormat("class C {\n"
7490 " int f() { return 42; }\n"
7491 "};",
7492 MergeInlineOnly);
7493 verifyFormat("int f() {\n"
7494 " return 42;\n"
7495 "}",
7496 MergeInlineOnly);
7497
7498 // SFS_InlineOnly does not imply SFS_Empty
7499 verifyFormat("class C {\n"
7500 " int f() {}\n"
7501 "};",
7502 MergeInlineOnly);
7503 verifyFormat("int f() {\n"
7504 "}",
7505 MergeInlineOnly);
7506
7507 // Also verify behavior when BraceWrapping.AfterFunction = true
7508 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7509 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7510 verifyFormat("class C {\n"
7511 " int f() { return 42; }\n"
7512 "};",
7513 MergeInlineOnly);
7514 verifyFormat("int f()\n"
7515 "{\n"
7516 " return 42;\n"
7517 "}",
7518 MergeInlineOnly);
7519
7520 // SFS_InlineOnly does not imply SFS_Empty
7521 verifyFormat("int f()\n"
7522 "{\n"
7523 "}",
7524 MergeInlineOnly);
7525 verifyFormat("class C {\n"
7526 " int f() {}\n"
7527 "};",
7528 MergeInlineOnly);
7529}
7530
Francois Ferrandad722562017-06-30 20:25:55 +00007531TEST_F(FormatTest, SplitEmptyFunction) {
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007532 FormatStyle Style = getLLVMStyle();
7533 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7534 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7535 Style.BraceWrapping.AfterFunction = true;
Francois Ferrandad722562017-06-30 20:25:55 +00007536 Style.BraceWrapping.SplitEmptyFunction = false;
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007537 Style.ColumnLimit = 40;
7538
7539 verifyFormat("int f()\n"
7540 "{}",
7541 Style);
7542 verifyFormat("int f()\n"
7543 "{\n"
7544 " return 42;\n"
7545 "}",
7546 Style);
7547 verifyFormat("int f()\n"
7548 "{\n"
7549 " // some comment\n"
7550 "}",
7551 Style);
7552
7553 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7554 verifyFormat("int f() {}", Style);
7555 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7556 "{}",
7557 Style);
7558 verifyFormat("int f()\n"
7559 "{\n"
7560 " return 0;\n"
7561 "}",
7562 Style);
7563
7564 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7565 verifyFormat("class Foo {\n"
7566 " int f() {}\n"
7567 "};\n",
7568 Style);
7569 verifyFormat("class Foo {\n"
7570 " int f() { return 0; }\n"
7571 "};\n",
7572 Style);
7573 verifyFormat("class Foo {\n"
7574 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7575 " {}\n"
7576 "};\n",
7577 Style);
7578 verifyFormat("class Foo {\n"
7579 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7580 " {\n"
7581 " return 0;\n"
7582 " }\n"
7583 "};\n",
7584 Style);
7585
7586 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7587 verifyFormat("int f() {}", Style);
7588 verifyFormat("int f() { return 0; }", Style);
7589 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7590 "{}",
7591 Style);
7592 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7593 "{\n"
7594 " return 0;\n"
7595 "}",
7596 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00007597}
Krasimir Georgiev6a1c9d52017-10-02 15:53:37 +00007598TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
7599 FormatStyle Style = getLLVMStyle();
7600 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7601 verifyFormat("#ifdef A\n"
7602 "int f() {}\n"
7603 "#else\n"
7604 "int g() {}\n"
7605 "#endif",
7606 Style);
7607}
Daniel Jasperd74cf402014-04-08 12:46:38 +00007608
Francois Ferrandad722562017-06-30 20:25:55 +00007609TEST_F(FormatTest, SplitEmptyClass) {
7610 FormatStyle Style = getLLVMStyle();
7611 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7612 Style.BraceWrapping.AfterClass = true;
7613 Style.BraceWrapping.SplitEmptyRecord = false;
7614
7615 verifyFormat("class Foo\n"
7616 "{};",
7617 Style);
7618 verifyFormat("/* something */ class Foo\n"
7619 "{};",
7620 Style);
7621 verifyFormat("template <typename X> class Foo\n"
7622 "{};",
7623 Style);
7624 verifyFormat("class Foo\n"
7625 "{\n"
7626 " Foo();\n"
7627 "};",
7628 Style);
7629 verifyFormat("typedef class Foo\n"
7630 "{\n"
7631 "} Foo_t;",
7632 Style);
7633}
7634
7635TEST_F(FormatTest, SplitEmptyStruct) {
7636 FormatStyle Style = getLLVMStyle();
7637 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7638 Style.BraceWrapping.AfterStruct = true;
7639 Style.BraceWrapping.SplitEmptyRecord = false;
7640
7641 verifyFormat("struct Foo\n"
7642 "{};",
7643 Style);
7644 verifyFormat("/* something */ struct Foo\n"
7645 "{};",
7646 Style);
7647 verifyFormat("template <typename X> struct Foo\n"
7648 "{};",
7649 Style);
7650 verifyFormat("struct Foo\n"
7651 "{\n"
7652 " Foo();\n"
7653 "};",
7654 Style);
7655 verifyFormat("typedef struct Foo\n"
7656 "{\n"
7657 "} Foo_t;",
7658 Style);
7659 //typedef struct Bar {} Bar_t;
7660}
7661
7662TEST_F(FormatTest, SplitEmptyUnion) {
7663 FormatStyle Style = getLLVMStyle();
7664 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7665 Style.BraceWrapping.AfterUnion = true;
7666 Style.BraceWrapping.SplitEmptyRecord = false;
7667
7668 verifyFormat("union Foo\n"
7669 "{};",
7670 Style);
7671 verifyFormat("/* something */ union Foo\n"
7672 "{};",
7673 Style);
7674 verifyFormat("union Foo\n"
7675 "{\n"
7676 " A,\n"
7677 "};",
7678 Style);
7679 verifyFormat("typedef union Foo\n"
7680 "{\n"
7681 "} Foo_t;",
7682 Style);
7683}
7684
7685TEST_F(FormatTest, SplitEmptyNamespace) {
7686 FormatStyle Style = getLLVMStyle();
7687 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7688 Style.BraceWrapping.AfterNamespace = true;
7689 Style.BraceWrapping.SplitEmptyNamespace = false;
7690
7691 verifyFormat("namespace Foo\n"
7692 "{};",
7693 Style);
7694 verifyFormat("/* something */ namespace Foo\n"
7695 "{};",
7696 Style);
7697 verifyFormat("inline namespace Foo\n"
7698 "{};",
7699 Style);
Sam McCall6f3778c2018-09-05 07:44:02 +00007700 verifyFormat("/* something */ inline namespace Foo\n"
7701 "{};",
7702 Style);
7703 verifyFormat("export namespace Foo\n"
7704 "{};",
7705 Style);
Francois Ferrandad722562017-06-30 20:25:55 +00007706 verifyFormat("namespace Foo\n"
7707 "{\n"
7708 "void Bar();\n"
7709 "};",
7710 Style);
7711}
7712
7713TEST_F(FormatTest, NeverMergeShortRecords) {
7714 FormatStyle Style = getLLVMStyle();
7715
7716 verifyFormat("class Foo {\n"
7717 " Foo();\n"
7718 "};",
7719 Style);
7720 verifyFormat("typedef class Foo {\n"
7721 " Foo();\n"
7722 "} Foo_t;",
7723 Style);
7724 verifyFormat("struct Foo {\n"
7725 " Foo();\n"
7726 "};",
7727 Style);
7728 verifyFormat("typedef struct Foo {\n"
7729 " Foo();\n"
7730 "} Foo_t;",
7731 Style);
7732 verifyFormat("union Foo {\n"
7733 " A,\n"
7734 "};",
7735 Style);
7736 verifyFormat("typedef union Foo {\n"
7737 " A,\n"
7738 "} Foo_t;",
7739 Style);
7740 verifyFormat("namespace Foo {\n"
7741 "void Bar();\n"
7742 "};",
7743 Style);
7744
7745 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7746 Style.BraceWrapping.AfterClass = true;
7747 Style.BraceWrapping.AfterStruct = true;
7748 Style.BraceWrapping.AfterUnion = true;
7749 Style.BraceWrapping.AfterNamespace = true;
7750 verifyFormat("class Foo\n"
7751 "{\n"
7752 " Foo();\n"
7753 "};",
7754 Style);
7755 verifyFormat("typedef class Foo\n"
7756 "{\n"
7757 " Foo();\n"
7758 "} Foo_t;",
7759 Style);
7760 verifyFormat("struct Foo\n"
7761 "{\n"
7762 " Foo();\n"
7763 "};",
7764 Style);
7765 verifyFormat("typedef struct Foo\n"
7766 "{\n"
7767 " Foo();\n"
7768 "} Foo_t;",
7769 Style);
7770 verifyFormat("union Foo\n"
7771 "{\n"
7772 " A,\n"
7773 "};",
7774 Style);
7775 verifyFormat("typedef union Foo\n"
7776 "{\n"
7777 " A,\n"
7778 "} Foo_t;",
7779 Style);
7780 verifyFormat("namespace Foo\n"
7781 "{\n"
7782 "void Bar();\n"
7783 "};",
7784 Style);
7785}
7786
Manuel Klimeke01bab52013-01-15 13:38:33 +00007787TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7788 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007789 verifyFormat("struct foo a = {bar};\nint n;");
7790 verifyFormat("class foo a = {bar};\nint n;");
7791 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007792
7793 // Elaborate types inside function definitions.
7794 verifyFormat("struct foo f() {}\nint n;");
7795 verifyFormat("class foo f() {}\nint n;");
7796 verifyFormat("union foo f() {}\nint n;");
7797
7798 // Templates.
7799 verifyFormat("template <class X> void f() {}\nint n;");
7800 verifyFormat("template <struct X> void f() {}\nint n;");
7801 verifyFormat("template <union X> void f() {}\nint n;");
7802
7803 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007804 verifyFormat("struct {\n} n;");
7805 verifyFormat(
7806 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007807 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007808 verifyFormat("class MACRO Z {\n} n;");
7809 verifyFormat("class MACRO(X) Z {\n} n;");
7810 verifyFormat("class __attribute__(X) Z {\n} n;");
7811 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007812 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007813 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007814 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7815 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007816
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007817 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007818 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007819
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007820 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007821 verifyFormat(
7822 "template <typename F>\n"
7823 "Matcher(const Matcher<F> &Other,\n"
7824 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7825 " !is_same<F, T>::value>::type * = 0)\n"
7826 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7827
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007828 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007829 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007830 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007831
7832 // FIXME:
7833 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007834 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007835
Manuel Klimeke01bab52013-01-15 13:38:33 +00007836 // Elaborate types where incorrectly parsing the structural element would
7837 // break the indent.
7838 verifyFormat("if (true)\n"
7839 " class X x;\n"
7840 "else\n"
7841 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007842
7843 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007844 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007845}
7846
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007847TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007848 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7849 format("#error Leave all white!!!!! space* alone!\n"));
7850 EXPECT_EQ(
7851 "#warning Leave all white!!!!! space* alone!\n",
7852 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007853 EXPECT_EQ("#error 1", format(" # error 1"));
7854 EXPECT_EQ("#warning 1", format(" # warning 1"));
7855}
7856
Daniel Jasper4431aa92013-04-23 13:54:04 +00007857TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007858 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007859 verifyFormat("#if (AAAA && BBBB)");
7860 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007861 // FIXME: Come up with a better indentation for #elif.
7862 verifyFormat(
7863 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7864 " defined(BBBBBBBB)\n"
7865 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7866 " defined(BBBBBBBB)\n"
7867 "#endif",
7868 getLLVMStyleWithColumns(65));
7869}
7870
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007871TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7872 FormatStyle AllowsMergedIf = getGoogleStyle();
7873 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7874 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7875 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007876 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7877 EXPECT_EQ("if (true) return 42;",
7878 format("if (true)\nreturn 42;", AllowsMergedIf));
7879 FormatStyle ShortMergedIf = AllowsMergedIf;
7880 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007881 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007882 " if (true) return 42;",
7883 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007884 verifyFormat("#define A \\\n"
7885 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007886 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007887 "#define B",
7888 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007889 verifyFormat("#define A \\\n"
7890 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007891 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007892 "g();",
7893 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007894 verifyFormat("{\n"
7895 "#ifdef A\n"
7896 " // Comment\n"
7897 " if (true) continue;\n"
7898 "#endif\n"
7899 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007900 " if (true) continue;\n"
7901 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007902 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007903 ShortMergedIf.ColumnLimit = 33;
7904 verifyFormat("#define A \\\n"
7905 " if constexpr (true) return 42;",
7906 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007907 ShortMergedIf.ColumnLimit = 29;
7908 verifyFormat("#define A \\\n"
7909 " if (aaaaaaaaaa) return 1; \\\n"
7910 " return 2;",
7911 ShortMergedIf);
7912 ShortMergedIf.ColumnLimit = 28;
7913 verifyFormat("#define A \\\n"
7914 " if (aaaaaaaaaa) \\\n"
7915 " return 1; \\\n"
7916 " return 2;",
7917 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007918 verifyFormat("#define A \\\n"
7919 " if constexpr (aaaaaaa) \\\n"
7920 " return 1; \\\n"
7921 " return 2;",
7922 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007923}
7924
Manuel Klimekd33516e2013-01-23 10:09:28 +00007925TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007926 verifyFormat("void f(int *a);");
7927 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007928 verifyFormat("class A {\n void f(int *a);\n};");
7929 verifyFormat("class A {\n int *a;\n};");
7930 verifyFormat("namespace a {\n"
7931 "namespace b {\n"
7932 "class A {\n"
7933 " void f() {}\n"
7934 " int *a;\n"
7935 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00007936 "} // namespace b\n"
7937 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007938}
7939
Manuel Klimekd33516e2013-01-23 10:09:28 +00007940TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7941 verifyFormat("while");
7942 verifyFormat("operator");
7943}
7944
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007945TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7946 // This code would be painfully slow to format if we didn't skip it.
7947 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
7948 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7949 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7950 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7951 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7952 "A(1, 1)\n"
7953 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7954 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7955 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7956 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7957 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7958 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7959 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7960 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7961 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7962 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7963 // Deeply nested part is untouched, rest is formatted.
7964 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7965 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00007966 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007967}
7968
Nico Weber7e6a7a12013-01-08 17:56:31 +00007969//===----------------------------------------------------------------------===//
7970// Objective-C tests.
7971//===----------------------------------------------------------------------===//
7972
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007973TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7974 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7975 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7976 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007977 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007978 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7979 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7980 format("-(NSInteger)Method3:(id)anObject;"));
7981 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7982 format("-(NSInteger)Method4:(id)anObject;"));
7983 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7984 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7985 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7986 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007987 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7988 "forAllCells:(BOOL)flag;",
7989 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7990 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007991
7992 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007993 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7994 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007995 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7996 " inRange:(NSRange)range\n"
7997 " outRange:(NSRange)out_range\n"
7998 " outRange1:(NSRange)out_range1\n"
7999 " outRange2:(NSRange)out_range2\n"
8000 " outRange3:(NSRange)out_range3\n"
8001 " outRange4:(NSRange)out_range4\n"
8002 " outRange5:(NSRange)out_range5\n"
8003 " outRange6:(NSRange)out_range6\n"
8004 " outRange7:(NSRange)out_range7\n"
8005 " outRange8:(NSRange)out_range8\n"
8006 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00008007
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008008 // When the function name has to be wrapped.
8009 FormatStyle Style = getLLVMStyle();
Ben Hamilton416348e2018-04-12 15:11:48 +00008010 // ObjC ignores IndentWrappedFunctionNames when wrapping methods
8011 // and always indents instead.
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008012 Style.IndentWrappedFunctionNames = false;
8013 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
Ben Hamilton416348e2018-04-12 15:11:48 +00008014 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
8015 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008016 "}",
8017 Style);
8018 Style.IndentWrappedFunctionNames = true;
8019 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
Ben Hamilton416348e2018-04-12 15:11:48 +00008020 " veryLooooooooooongName:(NSString)cccccccccccccc\n"
8021 " anotherName:(NSString)dddddddddddddd {\n"
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008022 "}",
8023 Style);
8024
Nico Weberd6f962f2013-01-10 20:18:33 +00008025 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00008026 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00008027 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
8028 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00008029 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00008030
Daniel Jasper37194282013-05-28 08:33:00 +00008031 verifyFormat("- (int (*)())foo:(int (*)())f;");
8032 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00008033
8034 // If there's no return type (very rare in practice!), LLVM and Google style
8035 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00008036 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00008037 verifyFormat("- foo:(int)f;");
8038 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00008039}
8040
Nico Weber0588b502013-02-07 00:19:29 +00008041
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008042TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00008043 EXPECT_EQ("\"some text \"\n"
8044 "\"other\";",
8045 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00008046 EXPECT_EQ("\"some text \"\n"
8047 "\"other\";",
8048 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008049 EXPECT_EQ(
8050 "#define A \\\n"
8051 " \"some \" \\\n"
8052 " \"text \" \\\n"
8053 " \"other\";",
8054 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
8055 EXPECT_EQ(
8056 "#define A \\\n"
8057 " \"so \" \\\n"
8058 " \"text \" \\\n"
8059 " \"other\";",
8060 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
8061
8062 EXPECT_EQ("\"some text\"",
8063 format("\"some text\"", getLLVMStyleWithColumns(1)));
8064 EXPECT_EQ("\"some text\"",
8065 format("\"some text\"", getLLVMStyleWithColumns(11)));
8066 EXPECT_EQ("\"some \"\n"
8067 "\"text\"",
8068 format("\"some text\"", getLLVMStyleWithColumns(10)));
8069 EXPECT_EQ("\"some \"\n"
8070 "\"text\"",
8071 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00008072 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008073 "\" tex\"\n"
8074 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008075 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00008076 EXPECT_EQ("\"some\"\n"
8077 "\" tex\"\n"
8078 "\" and\"",
8079 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
8080 EXPECT_EQ("\"some\"\n"
8081 "\"/tex\"\n"
8082 "\"/and\"",
8083 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008084
8085 EXPECT_EQ("variable =\n"
8086 " \"long string \"\n"
8087 " \"literal\";",
8088 format("variable = \"long string literal\";",
8089 getLLVMStyleWithColumns(20)));
8090
8091 EXPECT_EQ("variable = f(\n"
8092 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00008093 " \"literal\",\n"
8094 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00008095 " loooooooooooooooooooong);",
8096 format("variable = f(\"long string literal\", short, "
8097 "loooooooooooooooooooong);",
8098 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008099
Daniel Jaspera44991332015-04-29 13:06:49 +00008100 EXPECT_EQ(
8101 "f(g(\"long string \"\n"
8102 " \"literal\"),\n"
8103 " b);",
8104 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008105 EXPECT_EQ("f(g(\"long string \"\n"
8106 " \"literal\",\n"
8107 " a),\n"
8108 " b);",
8109 format("f(g(\"long string literal\", a), b);",
8110 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008111 EXPECT_EQ(
8112 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00008113 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008114 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
8115 EXPECT_EQ("f(\"one two three four five six \"\n"
8116 " \"seven\".split(\n"
8117 " really_looooong_variable));",
8118 format("f(\"one two three four five six seven\"."
8119 "split(really_looooong_variable));",
8120 getLLVMStyleWithColumns(33)));
8121
8122 EXPECT_EQ("f(\"some \"\n"
8123 " \"text\",\n"
8124 " other);",
8125 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00008126
8127 // Only break as a last resort.
8128 verifyFormat(
8129 "aaaaaaaaaaaaaaaaaaaa(\n"
8130 " aaaaaaaaaaaaaaaaaaaa,\n"
8131 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00008132
Daniel Jaspera44991332015-04-29 13:06:49 +00008133 EXPECT_EQ("\"splitmea\"\n"
8134 "\"trandomp\"\n"
8135 "\"oint\"",
8136 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00008137
Daniel Jaspera44991332015-04-29 13:06:49 +00008138 EXPECT_EQ("\"split/\"\n"
8139 "\"pathat/\"\n"
8140 "\"slashes\"",
8141 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008142
Daniel Jaspera44991332015-04-29 13:06:49 +00008143 EXPECT_EQ("\"split/\"\n"
8144 "\"pathat/\"\n"
8145 "\"slashes\"",
8146 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00008147 EXPECT_EQ("\"split at \"\n"
8148 "\"spaces/at/\"\n"
8149 "\"slashes.at.any$\"\n"
8150 "\"non-alphanumeric%\"\n"
8151 "\"1111111111characte\"\n"
8152 "\"rs\"",
8153 format("\"split at "
8154 "spaces/at/"
8155 "slashes.at."
8156 "any$non-"
8157 "alphanumeric%"
8158 "1111111111characte"
8159 "rs\"",
8160 getLLVMStyleWithColumns(20)));
8161
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008162 // Verify that splitting the strings understands
8163 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00008164 EXPECT_EQ(
8165 "aaaaaaaaaaaa(\n"
8166 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8167 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8168 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8169 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8170 "aaaaaaaaaaaaaaaaaaaaaa\");",
8171 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00008172 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8173 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8174 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8175 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8176 "aaaaaaaaaaaaaaaaaaaaaa\";",
8177 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00008178 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8179 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8180 format("llvm::outs() << "
8181 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8182 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00008183 EXPECT_EQ("ffff(\n"
8184 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8185 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8186 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8187 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8188 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008189
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008190 FormatStyle Style = getLLVMStyleWithColumns(12);
8191 Style.BreakStringLiterals = false;
8192 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8193
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008194 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008195 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00008196 EXPECT_EQ("#define A \\\n"
8197 " \"some \" \\\n"
8198 " \"text \" \\\n"
8199 " \"other\";",
8200 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008201}
8202
Manuel Klimek93699f42017-11-29 14:29:43 +00008203TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
8204 EXPECT_EQ("C a = \"some more \"\n"
8205 " \"text\";",
8206 format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
8207}
8208
Manuel Klimek9e321992015-07-28 15:50:24 +00008209TEST_F(FormatTest, FullyRemoveEmptyLines) {
8210 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8211 NoEmptyLines.MaxEmptyLinesToKeep = 0;
8212 EXPECT_EQ("int i = a(b());",
8213 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8214}
8215
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008216TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8217 EXPECT_EQ(
8218 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8219 "(\n"
8220 " \"x\t\");",
8221 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8222 "aaaaaaa("
8223 "\"x\t\");"));
8224}
8225
Daniel Jasper174b0122014-01-09 14:18:12 +00008226TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00008227 EXPECT_EQ(
8228 "u8\"utf8 string \"\n"
8229 "u8\"literal\";",
8230 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8231 EXPECT_EQ(
8232 "u\"utf16 string \"\n"
8233 "u\"literal\";",
8234 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8235 EXPECT_EQ(
8236 "U\"utf32 string \"\n"
8237 "U\"literal\";",
8238 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8239 EXPECT_EQ("L\"wide string \"\n"
8240 "L\"literal\";",
8241 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00008242 EXPECT_EQ("@\"NSString \"\n"
8243 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00008244 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00008245 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00008246
8247 // This input makes clang-format try to split the incomplete unicode escape
8248 // sequence, which used to lead to a crasher.
8249 verifyNoCrash(
8250 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8251 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008252}
8253
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00008254TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8255 FormatStyle Style = getGoogleStyleWithColumns(15);
8256 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8257 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8258 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8259 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8260 EXPECT_EQ("u8R\"x(raw literal)x\";",
8261 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008262}
8263
8264TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8265 FormatStyle Style = getLLVMStyleWithColumns(20);
8266 EXPECT_EQ(
8267 "_T(\"aaaaaaaaaaaaaa\")\n"
8268 "_T(\"aaaaaaaaaaaaaa\")\n"
8269 "_T(\"aaaaaaaaaaaa\")",
8270 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00008271 EXPECT_EQ("f(x,\n"
8272 " _T(\"aaaaaaaaaaaa\")\n"
8273 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00008274 " z);",
8275 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8276
8277 // FIXME: Handle embedded spaces in one iteration.
8278 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8279 // "_T(\"aaaaaaaaaaaaa\")\n"
8280 // "_T(\"aaaaaaaaaaaaa\")\n"
8281 // "_T(\"a\")",
8282 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8283 // getLLVMStyleWithColumns(20)));
8284 EXPECT_EQ(
8285 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8286 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008287 EXPECT_EQ("f(\n"
8288 "#if !TEST\n"
8289 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8290 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00008291 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008292 format("f(\n"
8293 "#if !TEST\n"
8294 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8295 "#endif\n"
8296 ");"));
8297 EXPECT_EQ("f(\n"
8298 "\n"
8299 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8300 format("f(\n"
8301 "\n"
8302 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008303}
8304
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00008305TEST_F(FormatTest, BreaksStringLiteralOperands) {
8306 // In a function call with two operands, the second can be broken with no line
8307 // break before it.
8308 EXPECT_EQ("func(a, \"long long \"\n"
8309 " \"long long\");",
8310 format("func(a, \"long long long long\");",
8311 getLLVMStyleWithColumns(24)));
8312 // In a function call with three operands, the second must be broken with a
8313 // line break before it.
8314 EXPECT_EQ("func(a,\n"
8315 " \"long long long \"\n"
8316 " \"long\",\n"
8317 " c);",
8318 format("func(a, \"long long long long\", c);",
8319 getLLVMStyleWithColumns(24)));
8320 // In a function call with three operands, the third must be broken with a
8321 // line break before it.
8322 EXPECT_EQ("func(a, b,\n"
8323 " \"long long long \"\n"
8324 " \"long\");",
8325 format("func(a, b, \"long long long long\");",
8326 getLLVMStyleWithColumns(24)));
8327 // In a function call with three operands, both the second and the third must
8328 // be broken with a line break before them.
8329 EXPECT_EQ("func(a,\n"
8330 " \"long long long \"\n"
8331 " \"long\",\n"
8332 " \"long long long \"\n"
8333 " \"long\");",
8334 format("func(a, \"long long long long\", \"long long long long\");",
8335 getLLVMStyleWithColumns(24)));
8336 // In a chain of << with two operands, the second can be broken with no line
8337 // break before it.
8338 EXPECT_EQ("a << \"line line \"\n"
8339 " \"line\";",
8340 format("a << \"line line line\";",
8341 getLLVMStyleWithColumns(20)));
8342 // In a chain of << with three operands, the second can be broken with no line
8343 // break before it.
8344 EXPECT_EQ("abcde << \"line \"\n"
8345 " \"line line\"\n"
8346 " << c;",
8347 format("abcde << \"line line line\" << c;",
8348 getLLVMStyleWithColumns(20)));
8349 // In a chain of << with three operands, the third must be broken with a line
8350 // break before it.
8351 EXPECT_EQ("a << b\n"
8352 " << \"line line \"\n"
8353 " \"line\";",
8354 format("a << b << \"line line line\";",
8355 getLLVMStyleWithColumns(20)));
8356 // In a chain of << with three operands, the second can be broken with no line
8357 // break before it and the third must be broken with a line break before it.
8358 EXPECT_EQ("abcd << \"line line \"\n"
8359 " \"line\"\n"
8360 " << \"line line \"\n"
8361 " \"line\";",
8362 format("abcd << \"line line line\" << \"line line line\";",
8363 getLLVMStyleWithColumns(20)));
8364 // In a chain of binary operators with two operands, the second can be broken
8365 // with no line break before it.
8366 EXPECT_EQ("abcd + \"line line \"\n"
8367 " \"line line\";",
8368 format("abcd + \"line line line line\";",
8369 getLLVMStyleWithColumns(20)));
8370 // In a chain of binary operators with three operands, the second must be
8371 // broken with a line break before it.
8372 EXPECT_EQ("abcd +\n"
8373 " \"line line \"\n"
8374 " \"line line\" +\n"
8375 " e;",
8376 format("abcd + \"line line line line\" + e;",
8377 getLLVMStyleWithColumns(20)));
8378 // In a function call with two operands, with AlignAfterOpenBracket enabled,
8379 // the first must be broken with a line break before it.
8380 FormatStyle Style = getLLVMStyleWithColumns(25);
8381 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8382 EXPECT_EQ("someFunction(\n"
8383 " \"long long long \"\n"
8384 " \"long\",\n"
8385 " a);",
8386 format("someFunction(\"long long long long\", a);", Style));
8387}
8388
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008389TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008390 EXPECT_EQ(
8391 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8392 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8393 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8394 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8395 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8396 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8397}
8398
8399TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8400 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008401 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008402 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8403 "multiline raw string literal xxxxxxxxxxxxxx\n"
8404 ")x\",\n"
8405 " a),\n"
8406 " b);",
8407 format("fffffffffff(g(R\"x(\n"
8408 "multiline raw string literal xxxxxxxxxxxxxx\n"
8409 ")x\", a), b);",
8410 getGoogleStyleWithColumns(20)));
8411 EXPECT_EQ("fffffffffff(\n"
8412 " g(R\"x(qqq\n"
8413 "multiline raw string literal xxxxxxxxxxxxxx\n"
8414 ")x\",\n"
8415 " a),\n"
8416 " b);",
8417 format("fffffffffff(g(R\"x(qqq\n"
8418 "multiline raw string literal xxxxxxxxxxxxxx\n"
8419 ")x\", a), b);",
8420 getGoogleStyleWithColumns(20)));
8421
8422 EXPECT_EQ("fffffffffff(R\"x(\n"
8423 "multiline raw string literal xxxxxxxxxxxxxx\n"
8424 ")x\");",
8425 format("fffffffffff(R\"x(\n"
8426 "multiline raw string literal xxxxxxxxxxxxxx\n"
8427 ")x\");",
8428 getGoogleStyleWithColumns(20)));
8429 EXPECT_EQ("fffffffffff(R\"x(\n"
8430 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008431 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008432 format("fffffffffff(R\"x(\n"
8433 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008434 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008435 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008436 EXPECT_EQ("fffffffffff(\n"
8437 " R\"x(\n"
8438 "multiline raw string literal xxxxxxxxxxxxxx\n"
8439 ")x\" +\n"
8440 " bbbbbb);",
8441 format("fffffffffff(\n"
8442 " R\"x(\n"
8443 "multiline raw string literal xxxxxxxxxxxxxx\n"
8444 ")x\" + bbbbbb);",
8445 getGoogleStyleWithColumns(20)));
Daniel Jasperfd327672018-03-22 14:43:54 +00008446 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
8447 format("fffffffffff(\n"
8448 " R\"(single line raw string)\" + bbbbbb);"));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008449}
8450
Alexander Kornienkobe633902013-06-14 11:46:10 +00008451TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008452 verifyFormat("string a = \"unterminated;");
8453 EXPECT_EQ("function(\"unterminated,\n"
8454 " OtherParameter);",
8455 format("function( \"unterminated,\n"
8456 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008457}
8458
8459TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008460 FormatStyle Style = getLLVMStyle();
8461 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008462 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008463 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008464}
8465
Daniel Jaspera44991332015-04-29 13:06:49 +00008466TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008467
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008468TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8469 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8470 " \"ddeeefff\");",
8471 format("someFunction(\"aaabbbcccdddeeefff\");",
8472 getLLVMStyleWithColumns(25)));
8473 EXPECT_EQ("someFunction1234567890(\n"
8474 " \"aaabbbcccdddeeefff\");",
8475 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8476 getLLVMStyleWithColumns(26)));
8477 EXPECT_EQ("someFunction1234567890(\n"
8478 " \"aaabbbcccdddeeeff\"\n"
8479 " \"f\");",
8480 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8481 getLLVMStyleWithColumns(25)));
8482 EXPECT_EQ("someFunction1234567890(\n"
8483 " \"aaabbbcccdddeeeff\"\n"
8484 " \"f\");",
8485 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8486 getLLVMStyleWithColumns(24)));
Manuel Klimek77866142017-11-17 11:17:15 +00008487 EXPECT_EQ("someFunction(\n"
8488 " \"aaabbbcc ddde \"\n"
8489 " \"efff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008490 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008491 getLLVMStyleWithColumns(25)));
8492 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8493 " \"ddeeefff\");",
8494 format("someFunction(\"aaabbbccc ddeeefff\");",
8495 getLLVMStyleWithColumns(25)));
8496 EXPECT_EQ("someFunction1234567890(\n"
8497 " \"aaabb \"\n"
8498 " \"cccdddeeefff\");",
8499 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8500 getLLVMStyleWithColumns(25)));
8501 EXPECT_EQ("#define A \\\n"
8502 " string s = \\\n"
8503 " \"123456789\" \\\n"
8504 " \"0\"; \\\n"
8505 " int i;",
8506 format("#define A string s = \"1234567890\"; int i;",
8507 getLLVMStyleWithColumns(20)));
Manuel Klimek77866142017-11-17 11:17:15 +00008508 EXPECT_EQ("someFunction(\n"
8509 " \"aaabbbcc \"\n"
8510 " \"dddeeefff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008511 format("someFunction(\"aaabbbcc dddeeefff\");",
8512 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008513}
8514
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008515TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008516 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8517 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008518 EXPECT_EQ("\"test\"\n"
8519 "\"\\n\"",
8520 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8521 EXPECT_EQ("\"tes\\\\\"\n"
8522 "\"n\"",
8523 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8524 EXPECT_EQ("\"\\\\\\\\\"\n"
8525 "\"\\n\"",
8526 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008527 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008528 EXPECT_EQ("\"\\uff01\"\n"
8529 "\"test\"",
8530 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8531 EXPECT_EQ("\"\\Uff01ff02\"",
8532 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8533 EXPECT_EQ("\"\\x000000000001\"\n"
8534 "\"next\"",
8535 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8536 EXPECT_EQ("\"\\x000000000001next\"",
8537 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8538 EXPECT_EQ("\"\\x000000000001\"",
8539 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8540 EXPECT_EQ("\"test\"\n"
8541 "\"\\000000\"\n"
8542 "\"000001\"",
8543 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8544 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008545 "\"00000000\"\n"
8546 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008547 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008548}
8549
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008550TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8551 verifyFormat("void f() {\n"
8552 " return g() {}\n"
8553 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008554 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008555 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008556 "}");
8557}
8558
Manuel Klimek421147e2014-01-24 09:25:23 +00008559TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8560 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008561 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008562}
8563
Manuel Klimek13b97d82013-05-13 08:42:42 +00008564TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8565 verifyFormat("class X {\n"
8566 " void f() {\n"
8567 " }\n"
8568 "};",
8569 getLLVMStyleWithColumns(12));
8570}
8571
8572TEST_F(FormatTest, ConfigurableIndentWidth) {
8573 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8574 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008575 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008576 verifyFormat("void f() {\n"
8577 " someFunction();\n"
8578 " if (true) {\n"
8579 " f();\n"
8580 " }\n"
8581 "}",
8582 EightIndent);
8583 verifyFormat("class X {\n"
8584 " void f() {\n"
8585 " }\n"
8586 "};",
8587 EightIndent);
8588 verifyFormat("int x[] = {\n"
8589 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008590 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008591 EightIndent);
8592}
8593
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008594TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008595 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008596 "f();",
8597 getLLVMStyleWithColumns(8));
8598}
8599
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008600TEST_F(FormatTest, ConfigurableUseOfTab) {
8601 FormatStyle Tab = getLLVMStyleWithColumns(42);
8602 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008603 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008604 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008605
8606 EXPECT_EQ("if (aaaaaaaa && // q\n"
8607 " bb)\t\t// w\n"
8608 "\t;",
8609 format("if (aaaaaaaa &&// q\n"
8610 "bb)// w\n"
8611 ";",
8612 Tab));
8613 EXPECT_EQ("if (aaa && bbb) // w\n"
8614 "\t;",
8615 format("if(aaa&&bbb)// w\n"
8616 ";",
8617 Tab));
8618
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008619 verifyFormat("class X {\n"
8620 "\tvoid f() {\n"
8621 "\t\tsomeFunction(parameter1,\n"
8622 "\t\t\t parameter2);\n"
8623 "\t}\n"
8624 "};",
8625 Tab);
8626 verifyFormat("#define A \\\n"
8627 "\tvoid f() { \\\n"
8628 "\t\tsomeFunction( \\\n"
8629 "\t\t parameter1, \\\n"
8630 "\t\t parameter2); \\\n"
8631 "\t}",
8632 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008633
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008634 Tab.TabWidth = 4;
8635 Tab.IndentWidth = 8;
8636 verifyFormat("class TabWidth4Indent8 {\n"
8637 "\t\tvoid f() {\n"
8638 "\t\t\t\tsomeFunction(parameter1,\n"
8639 "\t\t\t\t\t\t\t parameter2);\n"
8640 "\t\t}\n"
8641 "};",
8642 Tab);
8643
8644 Tab.TabWidth = 4;
8645 Tab.IndentWidth = 4;
8646 verifyFormat("class TabWidth4Indent4 {\n"
8647 "\tvoid f() {\n"
8648 "\t\tsomeFunction(parameter1,\n"
8649 "\t\t\t\t\t parameter2);\n"
8650 "\t}\n"
8651 "};",
8652 Tab);
8653
8654 Tab.TabWidth = 8;
8655 Tab.IndentWidth = 4;
8656 verifyFormat("class TabWidth8Indent4 {\n"
8657 " void f() {\n"
8658 "\tsomeFunction(parameter1,\n"
8659 "\t\t parameter2);\n"
8660 " }\n"
8661 "};",
8662 Tab);
8663
Alexander Kornienko39856b72013-09-10 09:38:25 +00008664 Tab.TabWidth = 8;
8665 Tab.IndentWidth = 8;
8666 EXPECT_EQ("/*\n"
8667 "\t a\t\tcomment\n"
8668 "\t in multiple lines\n"
8669 " */",
8670 format(" /*\t \t \n"
8671 " \t \t a\t\tcomment\t \t\n"
8672 " \t \t in multiple lines\t\n"
8673 " \t */",
8674 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008675
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008676 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008677 verifyFormat("{\n"
8678 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8679 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8680 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8681 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8682 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8683 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008684 "};",
8685 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008686 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008687 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008688 "\ta2,\n"
8689 "\ta3\n"
8690 "};",
8691 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008692 EXPECT_EQ("if (aaaaaaaa && // q\n"
8693 " bb) // w\n"
8694 "\t;",
8695 format("if (aaaaaaaa &&// q\n"
8696 "bb)// w\n"
8697 ";",
8698 Tab));
8699 verifyFormat("class X {\n"
8700 "\tvoid f() {\n"
8701 "\t\tsomeFunction(parameter1,\n"
8702 "\t\t parameter2);\n"
8703 "\t}\n"
8704 "};",
8705 Tab);
8706 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008707 "\tQ(\n"
8708 "\t {\n"
8709 "\t\t int a;\n"
8710 "\t\t someFunction(aaaaaaaa,\n"
8711 "\t\t bbbbbbb);\n"
8712 "\t },\n"
8713 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008714 "}",
8715 Tab);
8716 EXPECT_EQ("{\n"
8717 "\t/* aaaa\n"
8718 "\t bbbb */\n"
8719 "}",
8720 format("{\n"
8721 "/* aaaa\n"
8722 " bbbb */\n"
8723 "}",
8724 Tab));
8725 EXPECT_EQ("{\n"
8726 "\t/*\n"
8727 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8728 "\t bbbbbbbbbbbbb\n"
8729 "\t*/\n"
8730 "}",
8731 format("{\n"
8732 "/*\n"
8733 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8734 "*/\n"
8735 "}",
8736 Tab));
8737 EXPECT_EQ("{\n"
8738 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8739 "\t// bbbbbbbbbbbbb\n"
8740 "}",
8741 format("{\n"
8742 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8743 "}",
8744 Tab));
8745 EXPECT_EQ("{\n"
8746 "\t/*\n"
8747 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8748 "\t bbbbbbbbbbbbb\n"
8749 "\t*/\n"
8750 "}",
8751 format("{\n"
8752 "\t/*\n"
8753 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8754 "\t*/\n"
8755 "}",
8756 Tab));
8757 EXPECT_EQ("{\n"
8758 "\t/*\n"
8759 "\n"
8760 "\t*/\n"
8761 "}",
8762 format("{\n"
8763 "\t/*\n"
8764 "\n"
8765 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008766 "}",
8767 Tab));
8768 EXPECT_EQ("{\n"
8769 "\t/*\n"
8770 " asdf\n"
8771 "\t*/\n"
8772 "}",
8773 format("{\n"
8774 "\t/*\n"
8775 " asdf\n"
8776 "\t*/\n"
8777 "}",
8778 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008779
8780 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008781 EXPECT_EQ("/*\n"
8782 " a\t\tcomment\n"
8783 " in multiple lines\n"
8784 " */",
8785 format(" /*\t \t \n"
8786 " \t \t a\t\tcomment\t \t\n"
8787 " \t \t in multiple lines\t\n"
8788 " \t */",
8789 Tab));
8790 EXPECT_EQ("/* some\n"
8791 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008792 format(" \t \t /* some\n"
8793 " \t \t comment */",
8794 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008795 EXPECT_EQ("int a; /* some\n"
8796 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008797 format(" \t \t int a; /* some\n"
8798 " \t \t comment */",
8799 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008800
Alexander Kornienko39856b72013-09-10 09:38:25 +00008801 EXPECT_EQ("int a; /* some\n"
8802 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008803 format(" \t \t int\ta; /* some\n"
8804 " \t \t comment */",
8805 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008806 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8807 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008808 format(" \t \t f(\"\t\t\"); /* some\n"
8809 " \t \t comment */",
8810 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008811 EXPECT_EQ("{\n"
8812 " /*\n"
8813 " * Comment\n"
8814 " */\n"
8815 " int i;\n"
8816 "}",
8817 format("{\n"
8818 "\t/*\n"
8819 "\t * Comment\n"
8820 "\t */\n"
8821 "\t int i;\n"
8822 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008823
8824 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8825 Tab.TabWidth = 8;
8826 Tab.IndentWidth = 8;
8827 EXPECT_EQ("if (aaaaaaaa && // q\n"
8828 " bb) // w\n"
8829 "\t;",
8830 format("if (aaaaaaaa &&// q\n"
8831 "bb)// w\n"
8832 ";",
8833 Tab));
8834 EXPECT_EQ("if (aaa && bbb) // w\n"
8835 "\t;",
8836 format("if(aaa&&bbb)// w\n"
8837 ";",
8838 Tab));
8839 verifyFormat("class X {\n"
8840 "\tvoid f() {\n"
8841 "\t\tsomeFunction(parameter1,\n"
8842 "\t\t\t parameter2);\n"
8843 "\t}\n"
8844 "};",
8845 Tab);
8846 verifyFormat("#define A \\\n"
8847 "\tvoid f() { \\\n"
8848 "\t\tsomeFunction( \\\n"
8849 "\t\t parameter1, \\\n"
8850 "\t\t parameter2); \\\n"
8851 "\t}",
8852 Tab);
8853 Tab.TabWidth = 4;
8854 Tab.IndentWidth = 8;
8855 verifyFormat("class TabWidth4Indent8 {\n"
8856 "\t\tvoid f() {\n"
8857 "\t\t\t\tsomeFunction(parameter1,\n"
8858 "\t\t\t\t\t\t\t parameter2);\n"
8859 "\t\t}\n"
8860 "};",
8861 Tab);
8862 Tab.TabWidth = 4;
8863 Tab.IndentWidth = 4;
8864 verifyFormat("class TabWidth4Indent4 {\n"
8865 "\tvoid f() {\n"
8866 "\t\tsomeFunction(parameter1,\n"
8867 "\t\t\t\t\t parameter2);\n"
8868 "\t}\n"
8869 "};",
8870 Tab);
8871 Tab.TabWidth = 8;
8872 Tab.IndentWidth = 4;
8873 verifyFormat("class TabWidth8Indent4 {\n"
8874 " void f() {\n"
8875 "\tsomeFunction(parameter1,\n"
8876 "\t\t parameter2);\n"
8877 " }\n"
8878 "};",
8879 Tab);
8880 Tab.TabWidth = 8;
8881 Tab.IndentWidth = 8;
8882 EXPECT_EQ("/*\n"
8883 "\t a\t\tcomment\n"
8884 "\t in multiple lines\n"
8885 " */",
8886 format(" /*\t \t \n"
8887 " \t \t a\t\tcomment\t \t\n"
8888 " \t \t in multiple lines\t\n"
8889 " \t */",
8890 Tab));
8891 verifyFormat("{\n"
8892 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8893 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8894 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8895 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8896 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8897 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8898 "};",
8899 Tab);
8900 verifyFormat("enum AA {\n"
8901 "\ta1, // Force multiple lines\n"
8902 "\ta2,\n"
8903 "\ta3\n"
8904 "};",
8905 Tab);
8906 EXPECT_EQ("if (aaaaaaaa && // q\n"
8907 " bb) // w\n"
8908 "\t;",
8909 format("if (aaaaaaaa &&// q\n"
8910 "bb)// w\n"
8911 ";",
8912 Tab));
8913 verifyFormat("class X {\n"
8914 "\tvoid f() {\n"
8915 "\t\tsomeFunction(parameter1,\n"
8916 "\t\t\t parameter2);\n"
8917 "\t}\n"
8918 "};",
8919 Tab);
8920 verifyFormat("{\n"
8921 "\tQ(\n"
8922 "\t {\n"
8923 "\t\t int a;\n"
8924 "\t\t someFunction(aaaaaaaa,\n"
8925 "\t\t\t\t bbbbbbb);\n"
8926 "\t },\n"
8927 "\t p);\n"
8928 "}",
8929 Tab);
8930 EXPECT_EQ("{\n"
8931 "\t/* aaaa\n"
8932 "\t bbbb */\n"
8933 "}",
8934 format("{\n"
8935 "/* aaaa\n"
8936 " bbbb */\n"
8937 "}",
8938 Tab));
8939 EXPECT_EQ("{\n"
8940 "\t/*\n"
8941 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8942 "\t bbbbbbbbbbbbb\n"
8943 "\t*/\n"
8944 "}",
8945 format("{\n"
8946 "/*\n"
8947 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8948 "*/\n"
8949 "}",
8950 Tab));
8951 EXPECT_EQ("{\n"
8952 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8953 "\t// bbbbbbbbbbbbb\n"
8954 "}",
8955 format("{\n"
8956 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8957 "}",
8958 Tab));
8959 EXPECT_EQ("{\n"
8960 "\t/*\n"
8961 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8962 "\t bbbbbbbbbbbbb\n"
8963 "\t*/\n"
8964 "}",
8965 format("{\n"
8966 "\t/*\n"
8967 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8968 "\t*/\n"
8969 "}",
8970 Tab));
8971 EXPECT_EQ("{\n"
8972 "\t/*\n"
8973 "\n"
8974 "\t*/\n"
8975 "}",
8976 format("{\n"
8977 "\t/*\n"
8978 "\n"
8979 "\t*/\n"
8980 "}",
8981 Tab));
8982 EXPECT_EQ("{\n"
8983 "\t/*\n"
8984 " asdf\n"
8985 "\t*/\n"
8986 "}",
8987 format("{\n"
8988 "\t/*\n"
8989 " asdf\n"
8990 "\t*/\n"
8991 "}",
8992 Tab));
8993 EXPECT_EQ("/*\n"
8994 "\t a\t\tcomment\n"
8995 "\t in multiple lines\n"
8996 " */",
8997 format(" /*\t \t \n"
8998 " \t \t a\t\tcomment\t \t\n"
8999 " \t \t in multiple lines\t\n"
9000 " \t */",
9001 Tab));
9002 EXPECT_EQ("/* some\n"
9003 " comment */",
9004 format(" \t \t /* some\n"
9005 " \t \t comment */",
9006 Tab));
9007 EXPECT_EQ("int a; /* some\n"
9008 " comment */",
9009 format(" \t \t int a; /* some\n"
9010 " \t \t comment */",
9011 Tab));
9012 EXPECT_EQ("int a; /* some\n"
9013 "comment */",
9014 format(" \t \t int\ta; /* some\n"
9015 " \t \t comment */",
9016 Tab));
9017 EXPECT_EQ("f(\"\t\t\"); /* some\n"
9018 " comment */",
9019 format(" \t \t f(\"\t\t\"); /* some\n"
9020 " \t \t comment */",
9021 Tab));
9022 EXPECT_EQ("{\n"
9023 " /*\n"
9024 " * Comment\n"
9025 " */\n"
9026 " int i;\n"
9027 "}",
9028 format("{\n"
9029 "\t/*\n"
9030 "\t * Comment\n"
9031 "\t */\n"
9032 "\t int i;\n"
9033 "}"));
9034 Tab.AlignConsecutiveAssignments = true;
9035 Tab.AlignConsecutiveDeclarations = true;
9036 Tab.TabWidth = 4;
9037 Tab.IndentWidth = 4;
9038 verifyFormat("class Assign {\n"
9039 "\tvoid f() {\n"
9040 "\t\tint x = 123;\n"
9041 "\t\tint random = 4;\n"
9042 "\t\tstd::string alphabet =\n"
9043 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
9044 "\t}\n"
9045 "};",
9046 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00009047}
9048
Alexander Kornienko917f9e02013-09-10 12:29:48 +00009049TEST_F(FormatTest, CalculatesOriginalColumn) {
9050 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9051 "q\"; /* some\n"
9052 " comment */",
9053 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9054 "q\"; /* some\n"
9055 " comment */",
9056 getLLVMStyle()));
9057 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
9058 "/* some\n"
9059 " comment */",
9060 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
9061 " /* some\n"
9062 " comment */",
9063 getLLVMStyle()));
9064 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9065 "qqq\n"
9066 "/* some\n"
9067 " comment */",
9068 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9069 "qqq\n"
9070 " /* some\n"
9071 " comment */",
9072 getLLVMStyle()));
9073 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9074 "wwww; /* some\n"
9075 " comment */",
9076 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9077 "wwww; /* some\n"
9078 " comment */",
9079 getLLVMStyle()));
9080}
9081
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009082TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00009083 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009084 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009085
9086 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009087 " continue;",
9088 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009089 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009090 " continue;",
9091 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009092 verifyFormat("if(true)\n"
9093 " f();\n"
9094 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009095 " f();",
9096 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009097 verifyFormat("do {\n"
9098 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009099 "} while(something());",
9100 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009101 verifyFormat("switch(x) {\n"
9102 "default:\n"
9103 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009104 "}",
9105 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00009106 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00009107 verifyFormat("size_t x = sizeof(x);", NoSpace);
9108 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
9109 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
9110 verifyFormat("alignas(128) char a[128];", NoSpace);
9111 verifyFormat("size_t x = alignof(MyType);", NoSpace);
9112 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
9113 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00009114 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00009115 verifyFormat("T A::operator()();", NoSpace);
9116 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009117
9118 FormatStyle Space = getLLVMStyle();
9119 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
9120
9121 verifyFormat("int f ();", Space);
9122 verifyFormat("void f (int a, T b) {\n"
9123 " while (true)\n"
9124 " continue;\n"
9125 "}",
9126 Space);
9127 verifyFormat("if (true)\n"
9128 " f ();\n"
9129 "else if (true)\n"
9130 " f ();",
9131 Space);
9132 verifyFormat("do {\n"
9133 " do_something ();\n"
9134 "} while (something ());",
9135 Space);
9136 verifyFormat("switch (x) {\n"
9137 "default:\n"
9138 " break;\n"
9139 "}",
9140 Space);
9141 verifyFormat("A::A () : a (1) {}", Space);
9142 verifyFormat("void f () __attribute__ ((asdf));", Space);
9143 verifyFormat("*(&a + 1);\n"
9144 "&((&a)[1]);\n"
9145 "a[(b + c) * d];\n"
9146 "(((a + 1) * 2) + 3) * 4;",
9147 Space);
9148 verifyFormat("#define A(x) x", Space);
9149 verifyFormat("#define A (x) x", Space);
9150 verifyFormat("#if defined(x)\n"
9151 "#endif",
9152 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00009153 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00009154 verifyFormat("size_t x = sizeof (x);", Space);
9155 verifyFormat("auto f (int x) -> decltype (x);", Space);
9156 verifyFormat("int f (T x) noexcept (x.create ());", Space);
9157 verifyFormat("alignas (128) char a[128];", Space);
9158 verifyFormat("size_t x = alignof (MyType);", Space);
9159 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
9160 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00009161 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00009162 verifyFormat("T A::operator() ();", Space);
9163 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009164}
9165
9166TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
9167 FormatStyle Spaces = getLLVMStyle();
9168
9169 Spaces.SpacesInParentheses = true;
Daniel Jasperd5e9ff42018-03-22 14:30:28 +00009170 verifyFormat("do_something( ::globalVar );", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009171 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009172 verifyFormat("call();", Spaces);
9173 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00009174 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
9175 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009176 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009177 " continue;",
9178 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009179 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009180 " continue;",
9181 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009182 verifyFormat("if ( true )\n"
9183 " f();\n"
9184 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009185 " f();",
9186 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009187 verifyFormat("do {\n"
9188 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009189 "} while ( something() );",
9190 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009191 verifyFormat("switch ( x ) {\n"
9192 "default:\n"
9193 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009194 "}",
9195 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009196
9197 Spaces.SpacesInParentheses = false;
9198 Spaces.SpacesInCStyleCastParentheses = true;
9199 verifyFormat("Type *A = ( Type * )P;", Spaces);
9200 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
9201 verifyFormat("x = ( int32 )y;", Spaces);
9202 verifyFormat("int a = ( int )(2.0f);", Spaces);
9203 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
9204 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
9205 verifyFormat("#define x (( int )-1)", Spaces);
9206
Daniel Jasper92e09822015-03-18 12:59:19 +00009207 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00009208 Spaces.SpacesInParentheses = false;
9209 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009210 Spaces.SpacesInCStyleCastParentheses = true;
9211 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009212 verifyFormat("call( );", Spaces);
9213 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009214 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009215 " continue;",
9216 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009217 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009218 " continue;",
9219 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009220 verifyFormat("if (true)\n"
9221 " f( );\n"
9222 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009223 " f( );",
9224 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009225 verifyFormat("do {\n"
9226 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009227 "} while (something( ));",
9228 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009229 verifyFormat("switch (x) {\n"
9230 "default:\n"
9231 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009232 "}",
9233 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009234
Daniel Jasper92e09822015-03-18 12:59:19 +00009235 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009236 Spaces.SpaceAfterCStyleCast = true;
9237 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009238 verifyFormat("call( );", Spaces);
9239 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009240 verifyFormat("while (( bool ) 1)\n"
9241 " continue;",
9242 Spaces);
9243 verifyFormat("for (;;)\n"
9244 " continue;",
9245 Spaces);
9246 verifyFormat("if (true)\n"
9247 " f( );\n"
9248 "else if (true)\n"
9249 " f( );",
9250 Spaces);
9251 verifyFormat("do {\n"
9252 " do_something(( int ) i);\n"
9253 "} while (something( ));",
9254 Spaces);
9255 verifyFormat("switch (x) {\n"
9256 "default:\n"
9257 " break;\n"
9258 "}",
9259 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009260
9261 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009262 Spaces.SpacesInCStyleCastParentheses = false;
9263 Spaces.SpaceAfterCStyleCast = true;
9264 verifyFormat("while ((bool) 1)\n"
9265 " continue;",
9266 Spaces);
9267 verifyFormat("do {\n"
9268 " do_something((int) i);\n"
9269 "} while (something( ));",
9270 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009271}
9272
Daniel Jasperad981f82014-08-26 11:41:14 +00009273TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9274 verifyFormat("int a[5];");
9275 verifyFormat("a[3] += 42;");
9276
9277 FormatStyle Spaces = getLLVMStyle();
9278 Spaces.SpacesInSquareBrackets = true;
9279 // Lambdas unchanged.
9280 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9281 verifyFormat("return [i, args...] {};", Spaces);
9282
9283 // Not lambdas.
9284 verifyFormat("int a[ 5 ];", Spaces);
9285 verifyFormat("a[ 3 ] += 42;", Spaces);
9286 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9287 verifyFormat("double &operator[](int i) { return 0; }\n"
9288 "int i;",
9289 Spaces);
9290 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9291 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9292 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9293}
9294
Daniel Jasperd94bff32013-09-25 15:15:02 +00009295TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9296 verifyFormat("int a = 5;");
9297 verifyFormat("a += 42;");
9298 verifyFormat("a or_eq 8;");
9299
9300 FormatStyle Spaces = getLLVMStyle();
9301 Spaces.SpaceBeforeAssignmentOperators = false;
9302 verifyFormat("int a= 5;", Spaces);
9303 verifyFormat("a+= 42;", Spaces);
9304 verifyFormat("a or_eq 8;", Spaces);
9305}
9306
Francois Ferrand2a9ea782018-03-01 10:09:13 +00009307TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
9308 verifyFormat("class Foo : public Bar {};");
9309 verifyFormat("Foo::Foo() : foo(1) {}");
9310 verifyFormat("for (auto a : b) {\n}");
9311 verifyFormat("int x = a ? b : c;");
9312 verifyFormat("{\n"
9313 "label0:\n"
9314 " int x = 0;\n"
9315 "}");
9316 verifyFormat("switch (x) {\n"
9317 "case 1:\n"
9318 "default:\n"
9319 "}");
9320
9321 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
9322 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
9323 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
9324 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
9325 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
9326 verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
9327 verifyFormat("{\n"
9328 "label1:\n"
9329 " int x = 0;\n"
9330 "}",
9331 CtorInitializerStyle);
9332 verifyFormat("switch (x) {\n"
9333 "case 1:\n"
9334 "default:\n"
9335 "}",
9336 CtorInitializerStyle);
9337 CtorInitializerStyle.BreakConstructorInitializers =
9338 FormatStyle::BCIS_AfterColon;
9339 verifyFormat("Fooooooooooo::Fooooooooooo():\n"
9340 " aaaaaaaaaaaaaaaa(1),\n"
9341 " bbbbbbbbbbbbbbbb(2) {}",
9342 CtorInitializerStyle);
9343 CtorInitializerStyle.BreakConstructorInitializers =
9344 FormatStyle::BCIS_BeforeComma;
9345 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9346 " : aaaaaaaaaaaaaaaa(1)\n"
9347 " , bbbbbbbbbbbbbbbb(2) {}",
9348 CtorInitializerStyle);
9349 CtorInitializerStyle.BreakConstructorInitializers =
9350 FormatStyle::BCIS_BeforeColon;
9351 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9352 " : aaaaaaaaaaaaaaaa(1),\n"
9353 " bbbbbbbbbbbbbbbb(2) {}",
9354 CtorInitializerStyle);
9355 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
9356 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9357 ": aaaaaaaaaaaaaaaa(1),\n"
9358 " bbbbbbbbbbbbbbbb(2) {}",
9359 CtorInitializerStyle);
9360
Francois Ferrand6bb103f2018-06-11 14:41:26 +00009361 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30);
Francois Ferrand2a9ea782018-03-01 10:09:13 +00009362 InheritanceStyle.SpaceBeforeInheritanceColon = false;
9363 verifyFormat("class Foo: public Bar {};", InheritanceStyle);
9364 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
9365 verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
9366 verifyFormat("int x = a ? b : c;", InheritanceStyle);
9367 verifyFormat("{\n"
9368 "label2:\n"
9369 " int x = 0;\n"
9370 "}",
9371 InheritanceStyle);
9372 verifyFormat("switch (x) {\n"
9373 "case 1:\n"
9374 "default:\n"
9375 "}",
9376 InheritanceStyle);
Francois Ferrand6bb103f2018-06-11 14:41:26 +00009377 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon;
9378 verifyFormat("class Foooooooooooooooooooooo:\n"
9379 " public aaaaaaaaaaaaaaaaaa,\n"
9380 " public bbbbbbbbbbbbbbbbbb {\n"
9381 "}",
9382 InheritanceStyle);
9383 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
9384 verifyFormat("class Foooooooooooooooooooooo\n"
9385 " : public aaaaaaaaaaaaaaaaaa\n"
9386 " , public bbbbbbbbbbbbbbbbbb {\n"
9387 "}",
9388 InheritanceStyle);
9389 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
9390 verifyFormat("class Foooooooooooooooooooooo\n"
9391 " : public aaaaaaaaaaaaaaaaaa,\n"
9392 " public bbbbbbbbbbbbbbbbbb {\n"
9393 "}",
9394 InheritanceStyle);
9395 InheritanceStyle.ConstructorInitializerIndentWidth = 0;
9396 verifyFormat("class Foooooooooooooooooooooo\n"
9397 ": public aaaaaaaaaaaaaaaaaa,\n"
9398 " public bbbbbbbbbbbbbbbbbb {}",
9399 InheritanceStyle);
Francois Ferrand2a9ea782018-03-01 10:09:13 +00009400
9401 FormatStyle ForLoopStyle = getLLVMStyle();
9402 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
9403 verifyFormat("class Foo : public Bar {};", ForLoopStyle);
9404 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
9405 verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
9406 verifyFormat("int x = a ? b : c;", ForLoopStyle);
9407 verifyFormat("{\n"
9408 "label2:\n"
9409 " int x = 0;\n"
9410 "}",
9411 ForLoopStyle);
9412 verifyFormat("switch (x) {\n"
9413 "case 1:\n"
9414 "default:\n"
9415 "}",
9416 ForLoopStyle);
9417
9418 FormatStyle NoSpaceStyle = getLLVMStyle();
9419 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
9420 NoSpaceStyle.SpaceBeforeInheritanceColon = false;
9421 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
9422 verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
9423 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
9424 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
9425 verifyFormat("int x = a ? b : c;", NoSpaceStyle);
9426 verifyFormat("{\n"
9427 "label3:\n"
9428 " int x = 0;\n"
9429 "}",
9430 NoSpaceStyle);
9431 verifyFormat("switch (x) {\n"
9432 "case 1:\n"
9433 "default:\n"
9434 "}",
9435 NoSpaceStyle);
9436}
9437
Daniel Jaspera44991332015-04-29 13:06:49 +00009438TEST_F(FormatTest, AlignConsecutiveAssignments) {
9439 FormatStyle Alignment = getLLVMStyle();
9440 Alignment.AlignConsecutiveAssignments = false;
9441 verifyFormat("int a = 5;\n"
9442 "int oneTwoThree = 123;",
9443 Alignment);
9444 verifyFormat("int a = 5;\n"
9445 "int oneTwoThree = 123;",
9446 Alignment);
9447
9448 Alignment.AlignConsecutiveAssignments = true;
9449 verifyFormat("int a = 5;\n"
9450 "int oneTwoThree = 123;",
9451 Alignment);
9452 verifyFormat("int a = method();\n"
9453 "int oneTwoThree = 133;",
9454 Alignment);
9455 verifyFormat("a &= 5;\n"
9456 "bcd *= 5;\n"
9457 "ghtyf += 5;\n"
9458 "dvfvdb -= 5;\n"
9459 "a /= 5;\n"
9460 "vdsvsv %= 5;\n"
9461 "sfdbddfbdfbb ^= 5;\n"
9462 "dvsdsv |= 5;\n"
9463 "int dsvvdvsdvvv = 123;",
9464 Alignment);
9465 verifyFormat("int i = 1, j = 10;\n"
9466 "something = 2000;",
9467 Alignment);
9468 verifyFormat("something = 2000;\n"
9469 "int i = 1, j = 10;\n",
9470 Alignment);
9471 verifyFormat("something = 2000;\n"
9472 "another = 911;\n"
9473 "int i = 1, j = 10;\n"
9474 "oneMore = 1;\n"
9475 "i = 2;",
9476 Alignment);
9477 verifyFormat("int a = 5;\n"
9478 "int one = 1;\n"
9479 "method();\n"
9480 "int oneTwoThree = 123;\n"
9481 "int oneTwo = 12;",
9482 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009483 verifyFormat("int oneTwoThree = 123;\n"
9484 "int oneTwo = 12;\n"
9485 "method();\n",
9486 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009487 verifyFormat("int oneTwoThree = 123; // comment\n"
9488 "int oneTwo = 12; // comment",
9489 Alignment);
9490 EXPECT_EQ("int a = 5;\n"
9491 "\n"
9492 "int oneTwoThree = 123;",
9493 format("int a = 5;\n"
9494 "\n"
9495 "int oneTwoThree= 123;",
9496 Alignment));
9497 EXPECT_EQ("int a = 5;\n"
9498 "int one = 1;\n"
9499 "\n"
9500 "int oneTwoThree = 123;",
9501 format("int a = 5;\n"
9502 "int one = 1;\n"
9503 "\n"
9504 "int oneTwoThree = 123;",
9505 Alignment));
9506 EXPECT_EQ("int a = 5;\n"
9507 "int one = 1;\n"
9508 "\n"
9509 "int oneTwoThree = 123;\n"
9510 "int oneTwo = 12;",
9511 format("int a = 5;\n"
9512 "int one = 1;\n"
9513 "\n"
9514 "int oneTwoThree = 123;\n"
9515 "int oneTwo = 12;",
9516 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009517 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9518 verifyFormat("#define A \\\n"
9519 " int aaaa = 12; \\\n"
9520 " int b = 23; \\\n"
9521 " int ccc = 234; \\\n"
9522 " int dddddddddd = 2345;",
9523 Alignment);
9524 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00009525 verifyFormat("#define A \\\n"
9526 " int aaaa = 12; \\\n"
9527 " int b = 23; \\\n"
9528 " int ccc = 234; \\\n"
9529 " int dddddddddd = 2345;",
9530 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009531 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00009532 verifyFormat("#define A "
9533 " \\\n"
9534 " int aaaa = 12; "
9535 " \\\n"
9536 " int b = 23; "
9537 " \\\n"
9538 " int ccc = 234; "
9539 " \\\n"
9540 " int dddddddddd = 2345;",
9541 Alignment);
9542 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9543 "k = 4, int l = 5,\n"
9544 " int m = 6) {\n"
9545 " int j = 10;\n"
9546 " otherThing = 1;\n"
9547 "}",
9548 Alignment);
9549 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9550 " int i = 1;\n"
9551 " int j = 2;\n"
9552 " int big = 10000;\n"
9553 "}",
9554 Alignment);
9555 verifyFormat("class C {\n"
9556 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009557 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009558 " virtual void f() = 0;\n"
9559 "};",
9560 Alignment);
9561 verifyFormat("int i = 1;\n"
9562 "if (SomeType t = getSomething()) {\n"
9563 "}\n"
9564 "int j = 2;\n"
9565 "int big = 10000;",
9566 Alignment);
9567 verifyFormat("int j = 7;\n"
9568 "for (int k = 0; k < N; ++k) {\n"
9569 "}\n"
9570 "int j = 2;\n"
9571 "int big = 10000;\n"
9572 "}",
9573 Alignment);
9574 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9575 verifyFormat("int i = 1;\n"
9576 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9577 " = someLooooooooooooooooongFunction();\n"
9578 "int j = 2;",
9579 Alignment);
9580 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9581 verifyFormat("int i = 1;\n"
9582 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9583 " someLooooooooooooooooongFunction();\n"
9584 "int j = 2;",
9585 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009586
9587 verifyFormat("auto lambda = []() {\n"
9588 " auto i = 0;\n"
9589 " return 0;\n"
9590 "};\n"
9591 "int i = 0;\n"
9592 "auto v = type{\n"
9593 " i = 1, //\n"
9594 " (i = 2), //\n"
9595 " i = 3 //\n"
9596 "};",
9597 Alignment);
9598
Daniel Jaspera44991332015-04-29 13:06:49 +00009599 verifyFormat(
9600 "int i = 1;\n"
9601 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9602 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009603 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00009604 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009605
9606 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9607 " typename B = very_long_type_name_1,\n"
9608 " typename T_2 = very_long_type_name_2>\n"
9609 "auto foo() {}\n",
9610 Alignment);
9611 verifyFormat("int a, b = 1;\n"
9612 "int c = 2;\n"
9613 "int dd = 3;\n",
9614 Alignment);
9615 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9616 "float b[1][] = {{3.f}};\n",
9617 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009618 verifyFormat("for (int i = 0; i < 1; i++)\n"
9619 " int x = 1;\n",
9620 Alignment);
9621 verifyFormat("for (i = 0; i < 1; i++)\n"
9622 " x = 1;\n"
9623 "y = 1;\n",
9624 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009625}
9626
Daniel Jaspere12597c2015-10-01 10:06:54 +00009627TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9628 FormatStyle Alignment = getLLVMStyle();
9629 Alignment.AlignConsecutiveDeclarations = false;
9630 verifyFormat("float const a = 5;\n"
9631 "int oneTwoThree = 123;",
9632 Alignment);
9633 verifyFormat("int a = 5;\n"
9634 "float const oneTwoThree = 123;",
9635 Alignment);
9636
9637 Alignment.AlignConsecutiveDeclarations = true;
9638 verifyFormat("float const a = 5;\n"
9639 "int oneTwoThree = 123;",
9640 Alignment);
9641 verifyFormat("int a = method();\n"
9642 "float const oneTwoThree = 133;",
9643 Alignment);
9644 verifyFormat("int i = 1, j = 10;\n"
9645 "something = 2000;",
9646 Alignment);
9647 verifyFormat("something = 2000;\n"
9648 "int i = 1, j = 10;\n",
9649 Alignment);
9650 verifyFormat("float something = 2000;\n"
9651 "double another = 911;\n"
9652 "int i = 1, j = 10;\n"
9653 "const int *oneMore = 1;\n"
9654 "unsigned i = 2;",
9655 Alignment);
9656 verifyFormat("float a = 5;\n"
9657 "int one = 1;\n"
9658 "method();\n"
9659 "const double oneTwoThree = 123;\n"
9660 "const unsigned int oneTwo = 12;",
9661 Alignment);
9662 verifyFormat("int oneTwoThree{0}; // comment\n"
9663 "unsigned oneTwo; // comment",
9664 Alignment);
9665 EXPECT_EQ("float const a = 5;\n"
9666 "\n"
9667 "int oneTwoThree = 123;",
9668 format("float const a = 5;\n"
9669 "\n"
9670 "int oneTwoThree= 123;",
9671 Alignment));
9672 EXPECT_EQ("float a = 5;\n"
9673 "int one = 1;\n"
9674 "\n"
9675 "unsigned oneTwoThree = 123;",
9676 format("float a = 5;\n"
9677 "int one = 1;\n"
9678 "\n"
9679 "unsigned oneTwoThree = 123;",
9680 Alignment));
9681 EXPECT_EQ("float a = 5;\n"
9682 "int one = 1;\n"
9683 "\n"
9684 "unsigned oneTwoThree = 123;\n"
9685 "int oneTwo = 12;",
9686 format("float a = 5;\n"
9687 "int one = 1;\n"
9688 "\n"
9689 "unsigned oneTwoThree = 123;\n"
9690 "int oneTwo = 12;",
9691 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009692 // Function prototype alignment
9693 verifyFormat("int a();\n"
9694 "double b();",
9695 Alignment);
9696 verifyFormat("int a(int x);\n"
9697 "double b();",
9698 Alignment);
9699 unsigned OldColumnLimit = Alignment.ColumnLimit;
9700 // We need to set ColumnLimit to zero, in order to stress nested alignments,
9701 // otherwise the function parameters will be re-flowed onto a single line.
9702 Alignment.ColumnLimit = 0;
9703 EXPECT_EQ("int a(int x,\n"
9704 " float y);\n"
9705 "double b(int x,\n"
9706 " double y);",
9707 format("int a(int x,\n"
9708 " float y);\n"
9709 "double b(int x,\n"
9710 " double y);",
9711 Alignment));
9712 // This ensures that function parameters of function declarations are
9713 // correctly indented when their owning functions are indented.
9714 // The failure case here is for 'double y' to not be indented enough.
9715 EXPECT_EQ("double a(int x);\n"
9716 "int b(int y,\n"
9717 " double z);",
9718 format("double a(int x);\n"
9719 "int b(int y,\n"
9720 " double z);",
9721 Alignment));
9722 // Set ColumnLimit low so that we induce wrapping immediately after
9723 // the function name and opening paren.
9724 Alignment.ColumnLimit = 13;
9725 verifyFormat("int function(\n"
9726 " int x,\n"
9727 " bool y);",
9728 Alignment);
9729 Alignment.ColumnLimit = OldColumnLimit;
9730 // Ensure function pointers don't screw up recursive alignment
9731 verifyFormat("int a(int x, void (*fp)(int y));\n"
9732 "double b();",
9733 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009734 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009735 // Ensure recursive alignment is broken by function braces, so that the
9736 // "a = 1" does not align with subsequent assignments inside the function
9737 // body.
9738 verifyFormat("int func(int a = 1) {\n"
9739 " int b = 2;\n"
9740 " int cc = 3;\n"
9741 "}",
9742 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009743 verifyFormat("float something = 2000;\n"
9744 "double another = 911;\n"
9745 "int i = 1, j = 10;\n"
9746 "const int *oneMore = 1;\n"
9747 "unsigned i = 2;",
9748 Alignment);
9749 verifyFormat("int oneTwoThree = {0}; // comment\n"
9750 "unsigned oneTwo = 0; // comment",
9751 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009752 // Make sure that scope is correctly tracked, in the absence of braces
9753 verifyFormat("for (int i = 0; i < n; i++)\n"
9754 " j = i;\n"
9755 "double x = 1;\n",
9756 Alignment);
9757 verifyFormat("if (int i = 0)\n"
9758 " j = i;\n"
9759 "double x = 1;\n",
9760 Alignment);
9761 // Ensure operator[] and operator() are comprehended
9762 verifyFormat("struct test {\n"
9763 " long long int foo();\n"
9764 " int operator[](int a);\n"
9765 " double bar();\n"
9766 "};\n",
9767 Alignment);
9768 verifyFormat("struct test {\n"
9769 " long long int foo();\n"
9770 " int operator()(int a);\n"
9771 " double bar();\n"
9772 "};\n",
9773 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009774 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9775 " int const i = 1;\n"
9776 " int * j = 2;\n"
9777 " int big = 10000;\n"
9778 "\n"
9779 " unsigned oneTwoThree = 123;\n"
9780 " int oneTwo = 12;\n"
9781 " method();\n"
9782 " float k = 2;\n"
9783 " int ll = 10000;\n"
9784 "}",
9785 format("void SomeFunction(int parameter= 0) {\n"
9786 " int const i= 1;\n"
9787 " int *j=2;\n"
9788 " int big = 10000;\n"
9789 "\n"
9790 "unsigned oneTwoThree =123;\n"
9791 "int oneTwo = 12;\n"
9792 " method();\n"
9793 "float k= 2;\n"
9794 "int ll=10000;\n"
9795 "}",
9796 Alignment));
9797 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009798 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9799 verifyFormat("#define A \\\n"
9800 " int aaaa = 12; \\\n"
9801 " float b = 23; \\\n"
9802 " const int ccc = 234; \\\n"
9803 " unsigned dddddddddd = 2345;",
9804 Alignment);
9805 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009806 verifyFormat("#define A \\\n"
9807 " int aaaa = 12; \\\n"
9808 " float b = 23; \\\n"
9809 " const int ccc = 234; \\\n"
9810 " unsigned dddddddddd = 2345;",
9811 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009812 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009813 Alignment.ColumnLimit = 30;
9814 verifyFormat("#define A \\\n"
9815 " int aaaa = 12; \\\n"
9816 " float b = 23; \\\n"
9817 " const int ccc = 234; \\\n"
9818 " int dddddddddd = 2345;",
9819 Alignment);
9820 Alignment.ColumnLimit = 80;
9821 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9822 "k = 4, int l = 5,\n"
9823 " int m = 6) {\n"
9824 " const int j = 10;\n"
9825 " otherThing = 1;\n"
9826 "}",
9827 Alignment);
9828 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9829 " int const i = 1;\n"
9830 " int * j = 2;\n"
9831 " int big = 10000;\n"
9832 "}",
9833 Alignment);
9834 verifyFormat("class C {\n"
9835 "public:\n"
9836 " int i = 1;\n"
9837 " virtual void f() = 0;\n"
9838 "};",
9839 Alignment);
9840 verifyFormat("float i = 1;\n"
9841 "if (SomeType t = getSomething()) {\n"
9842 "}\n"
9843 "const unsigned j = 2;\n"
9844 "int big = 10000;",
9845 Alignment);
9846 verifyFormat("float j = 7;\n"
9847 "for (int k = 0; k < N; ++k) {\n"
9848 "}\n"
9849 "unsigned j = 2;\n"
9850 "int big = 10000;\n"
9851 "}",
9852 Alignment);
9853 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9854 verifyFormat("float i = 1;\n"
9855 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9856 " = someLooooooooooooooooongFunction();\n"
9857 "int j = 2;",
9858 Alignment);
9859 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9860 verifyFormat("int i = 1;\n"
9861 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9862 " someLooooooooooooooooongFunction();\n"
9863 "int j = 2;",
9864 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009865
9866 Alignment.AlignConsecutiveAssignments = true;
9867 verifyFormat("auto lambda = []() {\n"
9868 " auto ii = 0;\n"
9869 " float j = 0;\n"
9870 " return 0;\n"
9871 "};\n"
9872 "int i = 0;\n"
9873 "float i2 = 0;\n"
9874 "auto v = type{\n"
9875 " i = 1, //\n"
9876 " (i = 2), //\n"
9877 " i = 3 //\n"
9878 "};",
9879 Alignment);
9880 Alignment.AlignConsecutiveAssignments = false;
9881
Daniel Jaspere12597c2015-10-01 10:06:54 +00009882 verifyFormat(
9883 "int i = 1;\n"
9884 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9885 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009886 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00009887 Alignment);
9888
9889 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9890 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009891 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00009892 // happens.
9893 Alignment.AlignConsecutiveAssignments = true;
9894 Alignment.ColumnLimit = 30;
9895 verifyFormat("float ii = 1;\n"
9896 "unsigned j = 2;\n"
9897 "int someVerylongVariable = 1;\n"
9898 "AnotherLongType ll = 123456;\n"
9899 "VeryVeryLongType k = 2;\n"
9900 "int myvar = 1;",
9901 Alignment);
9902 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009903 Alignment.AlignConsecutiveAssignments = false;
9904
9905 verifyFormat(
9906 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9907 " typename LongType, typename B>\n"
9908 "auto foo() {}\n",
9909 Alignment);
9910 verifyFormat("float a, b = 1;\n"
9911 "int c = 2;\n"
9912 "int dd = 3;\n",
9913 Alignment);
9914 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9915 "float b[1][] = {{3.f}};\n",
9916 Alignment);
9917 Alignment.AlignConsecutiveAssignments = true;
9918 verifyFormat("float a, b = 1;\n"
9919 "int c = 2;\n"
9920 "int dd = 3;\n",
9921 Alignment);
9922 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9923 "float b[1][] = {{3.f}};\n",
9924 Alignment);
9925 Alignment.AlignConsecutiveAssignments = false;
9926
9927 Alignment.ColumnLimit = 30;
9928 Alignment.BinPackParameters = false;
9929 verifyFormat("void foo(float a,\n"
9930 " float b,\n"
9931 " int c,\n"
9932 " uint32_t *d) {\n"
9933 " int * e = 0;\n"
9934 " float f = 0;\n"
9935 " double g = 0;\n"
9936 "}\n"
9937 "void bar(ino_t a,\n"
9938 " int b,\n"
9939 " uint32_t *c,\n"
9940 " bool d) {}\n",
9941 Alignment);
9942 Alignment.BinPackParameters = true;
9943 Alignment.ColumnLimit = 80;
Daniel Jasper4917af62017-08-25 19:14:53 +00009944
9945 // Bug 33507
9946 Alignment.PointerAlignment = FormatStyle::PAS_Middle;
9947 verifyFormat(
9948 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
9949 " static const Version verVs2017;\n"
9950 " return true;\n"
9951 "});\n",
9952 Alignment);
9953 Alignment.PointerAlignment = FormatStyle::PAS_Right;
Ilya Biryukovf16a6fa2018-08-01 15:32:56 +00009954
9955 // See llvm.org/PR35641
9956 Alignment.AlignConsecutiveDeclarations = true;
9957 verifyFormat("int func() { //\n"
9958 " int b;\n"
9959 " unsigned c;\n"
9960 "}",
9961 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009962}
9963
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009964TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009965 FormatStyle LinuxBraceStyle = getLLVMStyle();
9966 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009967 verifyFormat("namespace a\n"
9968 "{\n"
9969 "class A\n"
9970 "{\n"
9971 " void f()\n"
9972 " {\n"
9973 " if (true) {\n"
9974 " a();\n"
9975 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009976 " } else {\n"
9977 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009978 " }\n"
9979 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009980 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009981 "};\n"
9982 "struct B {\n"
9983 " int x;\n"
9984 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009985 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009986 LinuxBraceStyle);
9987 verifyFormat("enum X {\n"
9988 " Y = 0,\n"
9989 "}\n",
9990 LinuxBraceStyle);
9991 verifyFormat("struct S {\n"
9992 " int Type;\n"
9993 " union {\n"
9994 " int x;\n"
9995 " double y;\n"
9996 " } Value;\n"
9997 " class C\n"
9998 " {\n"
9999 " MyFavoriteType Value;\n"
10000 " } Class;\n"
10001 "}\n",
10002 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010003}
10004
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010005TEST_F(FormatTest, MozillaBraceBreaking) {
10006 FormatStyle MozillaBraceStyle = getLLVMStyle();
10007 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +000010008 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010009 verifyFormat("namespace a {\n"
10010 "class A\n"
10011 "{\n"
10012 " void f()\n"
10013 " {\n"
10014 " if (true) {\n"
10015 " a();\n"
10016 " b();\n"
10017 " }\n"
10018 " }\n"
10019 " void g() { return; }\n"
10020 "};\n"
10021 "enum E\n"
10022 "{\n"
10023 " A,\n"
10024 " // foo\n"
10025 " B,\n"
10026 " C\n"
10027 "};\n"
10028 "struct B\n"
10029 "{\n"
10030 " int x;\n"
10031 "};\n"
10032 "}\n",
10033 MozillaBraceStyle);
10034 verifyFormat("struct S\n"
10035 "{\n"
10036 " int Type;\n"
10037 " union\n"
10038 " {\n"
10039 " int x;\n"
10040 " double y;\n"
10041 " } Value;\n"
10042 " class C\n"
10043 " {\n"
10044 " MyFavoriteType Value;\n"
10045 " } Class;\n"
10046 "}\n",
10047 MozillaBraceStyle);
10048}
10049
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010050TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010051 FormatStyle StroustrupBraceStyle = getLLVMStyle();
10052 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010053 verifyFormat("namespace a {\n"
10054 "class A {\n"
10055 " void f()\n"
10056 " {\n"
10057 " if (true) {\n"
10058 " a();\n"
10059 " b();\n"
10060 " }\n"
10061 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +000010062 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010063 "};\n"
10064 "struct B {\n"
10065 " int x;\n"
10066 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +000010067 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010068 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010069
Daniel Jasperd9670872014-08-05 12:06:20 +000010070 verifyFormat("void foo()\n"
10071 "{\n"
10072 " if (a) {\n"
10073 " a();\n"
10074 " }\n"
10075 " else {\n"
10076 " b();\n"
10077 " }\n"
10078 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010079 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +000010080
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010081 verifyFormat("#ifdef _DEBUG\n"
10082 "int foo(int i = 0)\n"
10083 "#else\n"
10084 "int foo(int i = 5)\n"
10085 "#endif\n"
10086 "{\n"
10087 " return i;\n"
10088 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010089 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010090
10091 verifyFormat("void foo() {}\n"
10092 "void bar()\n"
10093 "#ifdef _DEBUG\n"
10094 "{\n"
10095 " foo();\n"
10096 "}\n"
10097 "#else\n"
10098 "{\n"
10099 "}\n"
10100 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010101 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010102
10103 verifyFormat("void foobar() { int i = 5; }\n"
10104 "#ifdef _DEBUG\n"
10105 "void bar() {}\n"
10106 "#else\n"
10107 "void bar() { foobar(); }\n"
10108 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010109 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010110}
10111
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010112TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010113 FormatStyle AllmanBraceStyle = getLLVMStyle();
10114 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010115
10116 EXPECT_EQ("namespace a\n"
10117 "{\n"
10118 "void f();\n"
10119 "void g();\n"
10120 "} // namespace a\n",
10121 format("namespace a\n"
10122 "{\n"
10123 "void f();\n"
10124 "void g();\n"
10125 "}\n",
10126 AllmanBraceStyle));
10127
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010128 verifyFormat("namespace a\n"
10129 "{\n"
10130 "class A\n"
10131 "{\n"
10132 " void f()\n"
10133 " {\n"
10134 " if (true)\n"
10135 " {\n"
10136 " a();\n"
10137 " b();\n"
10138 " }\n"
10139 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +000010140 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010141 "};\n"
10142 "struct B\n"
10143 "{\n"
10144 " int x;\n"
10145 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010146 "} // namespace a",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010147 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010148
10149 verifyFormat("void f()\n"
10150 "{\n"
10151 " if (true)\n"
10152 " {\n"
10153 " a();\n"
10154 " }\n"
10155 " else if (false)\n"
10156 " {\n"
10157 " b();\n"
10158 " }\n"
10159 " else\n"
10160 " {\n"
10161 " c();\n"
10162 " }\n"
10163 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010164 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010165
10166 verifyFormat("void f()\n"
10167 "{\n"
10168 " for (int i = 0; i < 10; ++i)\n"
10169 " {\n"
10170 " a();\n"
10171 " }\n"
10172 " while (false)\n"
10173 " {\n"
10174 " b();\n"
10175 " }\n"
10176 " do\n"
10177 " {\n"
10178 " c();\n"
10179 " } while (false)\n"
10180 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010181 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010182
10183 verifyFormat("void f(int a)\n"
10184 "{\n"
10185 " switch (a)\n"
10186 " {\n"
10187 " case 0:\n"
10188 " break;\n"
10189 " case 1:\n"
10190 " {\n"
10191 " break;\n"
10192 " }\n"
10193 " case 2:\n"
10194 " {\n"
10195 " }\n"
10196 " break;\n"
10197 " default:\n"
10198 " break;\n"
10199 " }\n"
10200 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010201 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +000010202
10203 verifyFormat("enum X\n"
10204 "{\n"
10205 " Y = 0,\n"
10206 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010207 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +000010208 verifyFormat("enum X\n"
10209 "{\n"
10210 " Y = 0\n"
10211 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010212 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +000010213
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010214 verifyFormat("@interface BSApplicationController ()\n"
10215 "{\n"
10216 "@private\n"
10217 " id _extraIvar;\n"
10218 "}\n"
10219 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010220 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010221
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010222 verifyFormat("#ifdef _DEBUG\n"
10223 "int foo(int i = 0)\n"
10224 "#else\n"
10225 "int foo(int i = 5)\n"
10226 "#endif\n"
10227 "{\n"
10228 " return i;\n"
10229 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010230 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010231
10232 verifyFormat("void foo() {}\n"
10233 "void bar()\n"
10234 "#ifdef _DEBUG\n"
10235 "{\n"
10236 " foo();\n"
10237 "}\n"
10238 "#else\n"
10239 "{\n"
10240 "}\n"
10241 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010242 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010243
10244 verifyFormat("void foobar() { int i = 5; }\n"
10245 "#ifdef _DEBUG\n"
10246 "void bar() {}\n"
10247 "#else\n"
10248 "void bar() { foobar(); }\n"
10249 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010250 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010251
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010252 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +000010253 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010254 " // ...\n"
10255 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010256 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010257 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +000010258 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010259 " // ...\n"
10260 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010261 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010262 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010263 // .. or dict literals.
10264 verifyFormat("void f()\n"
10265 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +000010266 " // ...\n"
10267 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
10268 "}",
10269 AllmanBraceStyle);
10270 verifyFormat("void f()\n"
10271 "{\n"
10272 " // ...\n"
10273 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010274 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010275 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +000010276 verifyFormat("int f()\n"
10277 "{ // comment\n"
10278 " return 42;\n"
10279 "}",
10280 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +000010281
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010282 AllmanBraceStyle.ColumnLimit = 19;
10283 verifyFormat("void f() { int i; }", AllmanBraceStyle);
10284 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +000010285 verifyFormat("void f()\n"
10286 "{\n"
10287 " int i;\n"
10288 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010289 AllmanBraceStyle);
10290 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +000010291
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010292 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +000010293 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
10294 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
10295 verifyFormat("void f(bool b)\n"
10296 "{\n"
10297 " if (b)\n"
10298 " {\n"
10299 " return;\n"
10300 " }\n"
10301 "}\n",
10302 BreakBeforeBraceShortIfs);
10303 verifyFormat("void f(bool b)\n"
10304 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000010305 " if constexpr (b)\n"
10306 " {\n"
10307 " return;\n"
10308 " }\n"
10309 "}\n",
10310 BreakBeforeBraceShortIfs);
10311 verifyFormat("void f(bool b)\n"
10312 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +000010313 " if (b) return;\n"
10314 "}\n",
10315 BreakBeforeBraceShortIfs);
10316 verifyFormat("void f(bool b)\n"
10317 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000010318 " if constexpr (b) return;\n"
10319 "}\n",
10320 BreakBeforeBraceShortIfs);
10321 verifyFormat("void f(bool b)\n"
10322 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +000010323 " while (b)\n"
10324 " {\n"
10325 " return;\n"
10326 " }\n"
10327 "}\n",
10328 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010329}
10330
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010331TEST_F(FormatTest, GNUBraceBreaking) {
10332 FormatStyle GNUBraceStyle = getLLVMStyle();
10333 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
10334 verifyFormat("namespace a\n"
10335 "{\n"
10336 "class A\n"
10337 "{\n"
10338 " void f()\n"
10339 " {\n"
10340 " int a;\n"
10341 " {\n"
10342 " int b;\n"
10343 " }\n"
10344 " if (true)\n"
10345 " {\n"
10346 " a();\n"
10347 " b();\n"
10348 " }\n"
10349 " }\n"
10350 " void g() { return; }\n"
10351 "}\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010352 "} // namespace a",
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010353 GNUBraceStyle);
10354
10355 verifyFormat("void f()\n"
10356 "{\n"
10357 " if (true)\n"
10358 " {\n"
10359 " a();\n"
10360 " }\n"
10361 " else if (false)\n"
10362 " {\n"
10363 " b();\n"
10364 " }\n"
10365 " else\n"
10366 " {\n"
10367 " c();\n"
10368 " }\n"
10369 "}\n",
10370 GNUBraceStyle);
10371
10372 verifyFormat("void f()\n"
10373 "{\n"
10374 " for (int i = 0; i < 10; ++i)\n"
10375 " {\n"
10376 " a();\n"
10377 " }\n"
10378 " while (false)\n"
10379 " {\n"
10380 " b();\n"
10381 " }\n"
10382 " do\n"
10383 " {\n"
10384 " c();\n"
10385 " }\n"
10386 " while (false);\n"
10387 "}\n",
10388 GNUBraceStyle);
10389
10390 verifyFormat("void f(int a)\n"
10391 "{\n"
10392 " switch (a)\n"
10393 " {\n"
10394 " case 0:\n"
10395 " break;\n"
10396 " case 1:\n"
10397 " {\n"
10398 " break;\n"
10399 " }\n"
10400 " case 2:\n"
10401 " {\n"
10402 " }\n"
10403 " break;\n"
10404 " default:\n"
10405 " break;\n"
10406 " }\n"
10407 "}\n",
10408 GNUBraceStyle);
10409
10410 verifyFormat("enum X\n"
10411 "{\n"
10412 " Y = 0,\n"
10413 "}\n",
10414 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010415
10416 verifyFormat("@interface BSApplicationController ()\n"
10417 "{\n"
10418 "@private\n"
10419 " id _extraIvar;\n"
10420 "}\n"
10421 "@end\n",
10422 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010423
10424 verifyFormat("#ifdef _DEBUG\n"
10425 "int foo(int i = 0)\n"
10426 "#else\n"
10427 "int foo(int i = 5)\n"
10428 "#endif\n"
10429 "{\n"
10430 " return i;\n"
10431 "}",
10432 GNUBraceStyle);
10433
10434 verifyFormat("void foo() {}\n"
10435 "void bar()\n"
10436 "#ifdef _DEBUG\n"
10437 "{\n"
10438 " foo();\n"
10439 "}\n"
10440 "#else\n"
10441 "{\n"
10442 "}\n"
10443 "#endif",
10444 GNUBraceStyle);
10445
10446 verifyFormat("void foobar() { int i = 5; }\n"
10447 "#ifdef _DEBUG\n"
10448 "void bar() {}\n"
10449 "#else\n"
10450 "void bar() { foobar(); }\n"
10451 "#endif",
10452 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010453}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010454
10455TEST_F(FormatTest, WebKitBraceBreaking) {
10456 FormatStyle WebKitBraceStyle = getLLVMStyle();
10457 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +000010458 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010459 verifyFormat("namespace a {\n"
10460 "class A {\n"
10461 " void f()\n"
10462 " {\n"
10463 " if (true) {\n"
10464 " a();\n"
10465 " b();\n"
10466 " }\n"
10467 " }\n"
10468 " void g() { return; }\n"
10469 "};\n"
10470 "enum E {\n"
10471 " A,\n"
10472 " // foo\n"
10473 " B,\n"
10474 " C\n"
10475 "};\n"
10476 "struct B {\n"
10477 " int x;\n"
10478 "};\n"
10479 "}\n",
10480 WebKitBraceStyle);
10481 verifyFormat("struct S {\n"
10482 " int Type;\n"
10483 " union {\n"
10484 " int x;\n"
10485 " double y;\n"
10486 " } Value;\n"
10487 " class C {\n"
10488 " MyFavoriteType Value;\n"
10489 " } Class;\n"
10490 "};\n",
10491 WebKitBraceStyle);
10492}
10493
Manuel Klimekd5735502013-08-12 03:51:17 +000010494TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10495 verifyFormat("void f() {\n"
10496 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010497 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010498 " }\n"
10499 "}\n",
10500 getLLVMStyle());
10501}
10502
Daniel Jasper9613c812013-08-07 16:29:23 +000010503TEST_F(FormatTest, UnderstandsPragmas) {
10504 verifyFormat("#pragma omp reduction(| : var)");
10505 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010506
10507 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10508 "(including parentheses).",
10509 format("#pragma mark Any non-hyphenated or hyphenated string "
10510 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010511}
10512
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010513TEST_F(FormatTest, UnderstandPragmaOption) {
10514 verifyFormat("#pragma option -C -A");
10515
10516 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10517}
10518
Manuel Klimek77866142017-11-17 11:17:15 +000010519TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
10520 FormatStyle Style = getLLVMStyle();
10521 Style.ColumnLimit = 20;
10522
10523 verifyFormat("int a; // the\n"
10524 " // comment", Style);
10525 EXPECT_EQ("int a; /* first line\n"
10526 " * second\n"
10527 " * line third\n"
10528 " * line\n"
10529 " */",
10530 format("int a; /* first line\n"
10531 " * second\n"
10532 " * line third\n"
10533 " * line\n"
10534 " */",
10535 Style));
10536 EXPECT_EQ("int a; // first line\n"
10537 " // second\n"
10538 " // line third\n"
10539 " // line",
10540 format("int a; // first line\n"
10541 " // second line\n"
10542 " // third line",
10543 Style));
10544
10545 Style.PenaltyExcessCharacter = 90;
10546 verifyFormat("int a; // the comment", Style);
Manuel Klimek93699f42017-11-29 14:29:43 +000010547 EXPECT_EQ("int a; // the comment\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010548 " // aaa",
10549 format("int a; // the comment aaa", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010550 EXPECT_EQ("int a; /* first line\n"
10551 " * second line\n"
10552 " * third line\n"
10553 " */",
10554 format("int a; /* first line\n"
10555 " * second line\n"
10556 " * third line\n"
10557 " */",
10558 Style));
Manuel Klimek93699f42017-11-29 14:29:43 +000010559 EXPECT_EQ("int a; // first line\n"
10560 " // second line\n"
10561 " // third line",
10562 format("int a; // first line\n"
10563 " // second line\n"
10564 " // third line",
10565 Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010566 // FIXME: Investigate why this is not getting the same layout as the test
10567 // above.
10568 EXPECT_EQ("int a; /* first line\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010569 " * second line\n"
10570 " * third line\n"
Manuel Klimek77866142017-11-17 11:17:15 +000010571 " */",
10572 format("int a; /* first line second line third line"
10573 "\n*/",
10574 Style));
10575
10576 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010577 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010578 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010579 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010580 Style));
10581 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010582 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010583 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010584 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010585 Style));
10586
10587 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
10588 // next one.
Manuel Klimek93699f42017-11-29 14:29:43 +000010589 EXPECT_EQ("// foo bar baz bazfoo\n"
10590 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010591 format("// foo bar baz bazfoo bar\n"
10592 "// foo bar\n",
10593 Style));
10594
10595 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010596 "// foo bar baz bazfoo\n"
10597 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010598 format("// foo bar baz bazfoo\n"
10599 "// foo bar baz bazfoo bar\n"
10600 "// foo bar\n",
10601 Style));
10602
Manuel Klimek77866142017-11-17 11:17:15 +000010603 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010604 "// foo bar baz bazfoo\n"
10605 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010606 format("// foo bar baz bazfoo\n"
10607 "// foo bar baz bazfoo bar\n"
10608 "// foo bar\n",
10609 Style));
Manuel Klimek0b58c322017-12-01 13:28:08 +000010610
10611 // Make sure we do not keep protruding characters if strict mode reflow is
10612 // cheaper than keeping protruding characters.
10613 Style.ColumnLimit = 21;
10614 EXPECT_EQ("// foo foo foo foo\n"
10615 "// foo foo foo foo\n"
10616 "// foo foo foo foo\n",
10617 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n",
10618 Style));
10619
10620 EXPECT_EQ("int a = /* long block\n"
10621 " comment */\n"
10622 " 42;",
10623 format("int a = /* long block comment */ 42;", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010624}
10625
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010626#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10627 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010628 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10629 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010630
10631TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010632 SmallVector<FormatStyle, 3> Styles;
10633 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010634
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010635 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010636 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10637 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10638 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010639
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010640 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010641 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10642 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10643 EXPECT_ALL_STYLES_EQUAL(Styles);
10644
Nico Weber514ecc82014-02-02 20:50:45 +000010645 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010646 EXPECT_TRUE(
10647 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10648 EXPECT_TRUE(
10649 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10650 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010651
Nico Weber514ecc82014-02-02 20:50:45 +000010652 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010653 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10654 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10655 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010656
10657 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010658 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10659 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10660 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010661
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010662 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010663 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10664 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10665 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010666
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010667 Styles[0] = getGNUStyle();
10668 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10669 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10670 EXPECT_ALL_STYLES_EQUAL(Styles);
10671
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010672 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10673}
10674
10675TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10676 SmallVector<FormatStyle, 8> Styles;
10677 Styles.resize(2);
10678
10679 Styles[0] = getGoogleStyle();
10680 Styles[1] = getLLVMStyle();
10681 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10682 EXPECT_ALL_STYLES_EQUAL(Styles);
10683
10684 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010685 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010686 Styles[1] = getLLVMStyle();
10687 Styles[1].Language = FormatStyle::LK_JavaScript;
10688 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10689
10690 Styles[2] = getLLVMStyle();
10691 Styles[2].Language = FormatStyle::LK_JavaScript;
10692 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10693 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010694 &Styles[2])
10695 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010696
10697 Styles[3] = getLLVMStyle();
10698 Styles[3].Language = FormatStyle::LK_JavaScript;
10699 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10700 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010701 &Styles[3])
10702 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010703
10704 Styles[4] = getLLVMStyle();
10705 Styles[4].Language = FormatStyle::LK_JavaScript;
10706 EXPECT_EQ(0, parseConfiguration("---\n"
10707 "BasedOnStyle: LLVM\n"
10708 "IndentWidth: 123\n"
10709 "---\n"
10710 "BasedOnStyle: Google\n"
10711 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010712 &Styles[4])
10713 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010714 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010715}
10716
Daniel Jasper91881d92014-09-29 08:07:46 +000010717#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010718 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010719 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010720 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010721 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010722 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010723
Daniel Jasper91881d92014-09-29 08:07:46 +000010724#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10725
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010726#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10727 Style.STRUCT.FIELD = false; \
10728 EXPECT_EQ(0, \
10729 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10730 .value()); \
10731 EXPECT_TRUE(Style.STRUCT.FIELD); \
10732 EXPECT_EQ(0, \
10733 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10734 .value()); \
10735 EXPECT_FALSE(Style.STRUCT.FIELD);
10736
10737#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10738 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10739
Daniel Jasper00853002014-09-16 16:22:30 +000010740#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10741 EXPECT_NE(VALUE, Style.FIELD); \
10742 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10743 EXPECT_EQ(VALUE, Style.FIELD)
10744
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010745TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010746 FormatStyle Style = {};
10747 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +000010748 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010749 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010750 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010751 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010752 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010753 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010754 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010755 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010756 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper18210d72014-10-09 09:52:05 +000010757 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010758 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010759 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010760 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010761 CHECK_PARSE_BOOL(BreakStringLiterals);
Francois Ferrande56a8292017-06-14 12:29:47 +000010762 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010763 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010764 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010765 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010766 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010767 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010768 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010769 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010770 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010771 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010772 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010773 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010774 CHECK_PARSE_BOOL(SortIncludes);
Krasimir Georgievac16a202017-06-23 11:46:03 +000010775 CHECK_PARSE_BOOL(SortUsingDeclarations);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010776 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010777 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010778 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010779 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010780 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010781 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010782 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010783 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010784 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Hans Wennborgbfc34062018-06-14 08:01:09 +000010785 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList);
Francois Ferrand2a9ea782018-03-01 10:09:13 +000010786 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
10787 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
10788 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010789
10790 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10791 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10792 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10793 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10794 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10795 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10796 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10797 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
Krasimir Georgievd6ce9372017-09-15 11:23:50 +000010798 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010799 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10800 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10801 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrandad722562017-06-30 20:25:55 +000010802 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
10803 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
10804 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010805}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010806
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010807#undef CHECK_PARSE_BOOL
10808
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010809TEST_F(FormatTest, ParsesConfiguration) {
10810 FormatStyle Style = {};
10811 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010812 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010813 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10814 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010815 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010816 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10817 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +000010818 CHECK_PARSE("PenaltyBreakAssignment: 1234",
10819 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010820 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10821 PenaltyBreakBeforeFirstCallParameter, 1234u);
Francois Ferrand58e6fe52018-05-16 08:25:03 +000010822 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234",
10823 PenaltyBreakTemplateDeclaration, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010824 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10825 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10826 PenaltyReturnTypeOnItsOwnLine, 1234u);
10827 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10828 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010829 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010830 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010831 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010832
Daniel Jasper553d4872014-06-17 12:40:34 +000010833 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010834 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10835 FormatStyle::PAS_Left);
10836 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10837 FormatStyle::PAS_Right);
10838 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10839 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010840 // For backward compatibility:
10841 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10842 FormatStyle::PAS_Left);
10843 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10844 FormatStyle::PAS_Right);
10845 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10846 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010847
Alexander Kornienkod6538332013-05-07 15:32:14 +000010848 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010849 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10850 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010851 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10852 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10853 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10854
Daniel Jasperac043c92014-09-15 11:11:00 +000010855 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010856 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10857 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010858 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10859 FormatStyle::BOS_None);
10860 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10861 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010862 // For backward compatibility:
10863 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10864 FormatStyle::BOS_None);
10865 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10866 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010867
Francois Ferranda6b6d512017-05-24 11:36:58 +000010868 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
10869 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
10870 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10871 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
10872 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
10873 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
10874 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
10875 // For backward compatibility:
10876 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
10877 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10878
Francois Ferrand6bb103f2018-06-11 14:41:26 +000010879 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
10880 CHECK_PARSE("BreakInheritanceList: BeforeComma",
10881 BreakInheritanceList, FormatStyle::BILS_BeforeComma);
10882 CHECK_PARSE("BreakInheritanceList: AfterColon",
10883 BreakInheritanceList, FormatStyle::BILS_AfterColon);
10884 CHECK_PARSE("BreakInheritanceList: BeforeColon",
10885 BreakInheritanceList, FormatStyle::BILS_BeforeColon);
10886 // For backward compatibility:
10887 CHECK_PARSE("BreakBeforeInheritanceComma: true",
10888 BreakInheritanceList, FormatStyle::BILS_BeforeComma);
10889
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010890 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10891 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10892 FormatStyle::BAS_Align);
10893 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10894 FormatStyle::BAS_DontAlign);
10895 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10896 FormatStyle::BAS_AlwaysBreak);
10897 // For backward compatibility:
10898 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10899 FormatStyle::BAS_DontAlign);
10900 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10901 FormatStyle::BAS_Align);
10902
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +000010903 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10904 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
10905 FormatStyle::ENAS_DontAlign);
10906 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
10907 FormatStyle::ENAS_Left);
10908 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
10909 FormatStyle::ENAS_Right);
10910 // For backward compatibility:
10911 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
10912 FormatStyle::ENAS_Left);
10913 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
10914 FormatStyle::ENAS_Right);
10915
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010916 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010917 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10918 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10919 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010920 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10921 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010922 // For backward compatibility:
10923 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10924 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010925
Daniel Jasperd74cf402014-04-08 12:46:38 +000010926 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010927 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10928 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10929 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10930 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010931 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10932 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010933 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10934 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010935 // For backward compatibility:
10936 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10937 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10938 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10939 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010940
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010941 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10942 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10943 FormatStyle::SBPO_Never);
10944 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10945 FormatStyle::SBPO_Always);
10946 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10947 FormatStyle::SBPO_ControlStatements);
10948 // For backward compatibility:
10949 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10950 FormatStyle::SBPO_Never);
10951 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10952 FormatStyle::SBPO_ControlStatements);
10953
Alexander Kornienkod6538332013-05-07 15:32:14 +000010954 Style.ColumnLimit = 123;
10955 FormatStyle BaseStyle = getLLVMStyle();
10956 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10957 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10958
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010959 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10960 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10961 FormatStyle::BS_Attach);
10962 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10963 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010964 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10965 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010966 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10967 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010968 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10969 FormatStyle::BS_Allman);
10970 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010971 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10972 FormatStyle::BS_WebKit);
10973 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10974 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010975
Zachary Turner448592e2015-12-18 22:20:15 +000010976 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10977 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10978 FormatStyle::RTBS_None);
10979 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10980 FormatStyle::RTBS_All);
10981 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010982 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010983 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10984 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10985 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10986 AlwaysBreakAfterReturnType,
10987 FormatStyle::RTBS_TopLevelDefinitions);
10988
Francois Ferrand58e6fe52018-05-16 08:25:03 +000010989 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
10990 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", AlwaysBreakTemplateDeclarations,
10991 FormatStyle::BTDS_No);
10992 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", AlwaysBreakTemplateDeclarations,
10993 FormatStyle::BTDS_MultiLine);
10994 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", AlwaysBreakTemplateDeclarations,
10995 FormatStyle::BTDS_Yes);
10996 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", AlwaysBreakTemplateDeclarations,
10997 FormatStyle::BTDS_MultiLine);
10998 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", AlwaysBreakTemplateDeclarations,
10999 FormatStyle::BTDS_Yes);
11000
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000011001 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
11002 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
11003 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
11004 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
11005 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
11006 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
11007 AlwaysBreakAfterDefinitionReturnType,
11008 FormatStyle::DRTBS_TopLevel);
11009
Daniel Jasper65ee3472013-07-31 23:16:02 +000011010 Style.NamespaceIndentation = FormatStyle::NI_All;
11011 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
11012 FormatStyle::NI_None);
11013 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
11014 FormatStyle::NI_Inner);
11015 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
11016 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000011017
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000011018 // FIXME: This is required because parsing a configuration simply overwrites
11019 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000011020 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000011021 std::vector<std::string> BoostForeach;
11022 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000011023 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000011024 std::vector<std::string> BoostAndQForeach;
11025 BoostAndQForeach.push_back("BOOST_FOREACH");
11026 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000011027 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
11028 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000011029
Eric Liu9d92c022018-05-14 19:51:33 +000011030 Style.IncludeStyle.IncludeCategories.clear();
11031 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = {
11032 {"abc/.*", 2}, {".*", 1}};
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000011033 CHECK_PARSE("IncludeCategories:\n"
11034 " - Regex: abc/.*\n"
11035 " Priority: 2\n"
11036 " - Regex: .*\n"
11037 " Priority: 1",
Eric Liu9d92c022018-05-14 19:51:33 +000011038 IncludeStyle.IncludeCategories, ExpectedCategories);
11039 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex,
11040 "abc$");
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000011041
11042 Style.RawStringFormats.clear();
11043 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011044 {
11045 FormatStyle::LK_TextProto,
11046 {"pb", "proto"},
11047 {"PARSE_TEXT_PROTO"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000011048 /*CanonicalDelimiter=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011049 "llvm",
11050 },
11051 {
11052 FormatStyle::LK_Cpp,
11053 {"cc", "cpp"},
11054 {"C_CODEBLOCK", "CPPEVAL"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000011055 /*CanonicalDelimiter=*/"cc",
11056 /*BasedOnStyle=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011057 },
Krasimir Georgiev4527f132018-01-17 12:24:59 +000011058 };
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000011059
11060 CHECK_PARSE("RawStringFormats:\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000011061 " - Language: TextProto\n"
11062 " Delimiters:\n"
11063 " - 'pb'\n"
11064 " - 'proto'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011065 " EnclosingFunctions:\n"
11066 " - 'PARSE_TEXT_PROTO'\n"
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000011067 " BasedOnStyle: llvm\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000011068 " - Language: Cpp\n"
11069 " Delimiters:\n"
11070 " - 'cc'\n"
11071 " - 'cpp'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011072 " EnclosingFunctions:\n"
11073 " - 'C_CODEBLOCK'\n"
Krasimir Georgiev412ed092018-01-19 16:18:47 +000011074 " - 'CPPEVAL'\n"
11075 " CanonicalDelimiter: 'cc'",
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000011076 RawStringFormats, ExpectedRawStringFormats);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011077}
11078
11079TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
11080 FormatStyle Style = {};
11081 Style.Language = FormatStyle::LK_Cpp;
11082 CHECK_PARSE("Language: Cpp\n"
11083 "IndentWidth: 12",
11084 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000011085 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
11086 "IndentWidth: 34",
11087 &Style),
11088 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011089 EXPECT_EQ(12u, Style.IndentWidth);
11090 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
11091 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
11092
11093 Style.Language = FormatStyle::LK_JavaScript;
11094 CHECK_PARSE("Language: JavaScript\n"
11095 "IndentWidth: 12",
11096 IndentWidth, 12u);
11097 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000011098 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
11099 "IndentWidth: 34",
11100 &Style),
11101 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011102 EXPECT_EQ(23u, Style.IndentWidth);
11103 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
11104 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
11105
11106 CHECK_PARSE("BasedOnStyle: LLVM\n"
11107 "IndentWidth: 67",
11108 IndentWidth, 67u);
11109
11110 CHECK_PARSE("---\n"
11111 "Language: JavaScript\n"
11112 "IndentWidth: 12\n"
11113 "---\n"
11114 "Language: Cpp\n"
11115 "IndentWidth: 34\n"
11116 "...\n",
11117 IndentWidth, 12u);
11118
11119 Style.Language = FormatStyle::LK_Cpp;
11120 CHECK_PARSE("---\n"
11121 "Language: JavaScript\n"
11122 "IndentWidth: 12\n"
11123 "---\n"
11124 "Language: Cpp\n"
11125 "IndentWidth: 34\n"
11126 "...\n",
11127 IndentWidth, 34u);
11128 CHECK_PARSE("---\n"
11129 "IndentWidth: 78\n"
11130 "---\n"
11131 "Language: JavaScript\n"
11132 "IndentWidth: 56\n"
11133 "...\n",
11134 IndentWidth, 78u);
11135
11136 Style.ColumnLimit = 123;
11137 Style.IndentWidth = 234;
11138 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
11139 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000011140 EXPECT_FALSE(parseConfiguration("---\n"
11141 "IndentWidth: 456\n"
11142 "BreakBeforeBraces: Allman\n"
11143 "---\n"
11144 "Language: JavaScript\n"
11145 "IndentWidth: 111\n"
11146 "TabWidth: 111\n"
11147 "---\n"
11148 "Language: Cpp\n"
11149 "BreakBeforeBraces: Stroustrup\n"
11150 "TabWidth: 789\n"
11151 "...\n",
11152 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011153 EXPECT_EQ(123u, Style.ColumnLimit);
11154 EXPECT_EQ(456u, Style.IndentWidth);
11155 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
11156 EXPECT_EQ(789u, Style.TabWidth);
11157
Rafael Espindola1f243172014-06-12 11:35:17 +000011158 EXPECT_EQ(parseConfiguration("---\n"
11159 "Language: JavaScript\n"
11160 "IndentWidth: 56\n"
11161 "---\n"
11162 "IndentWidth: 78\n"
11163 "...\n",
11164 &Style),
11165 ParseError::Error);
11166 EXPECT_EQ(parseConfiguration("---\n"
11167 "Language: JavaScript\n"
11168 "IndentWidth: 56\n"
11169 "---\n"
11170 "Language: JavaScript\n"
11171 "IndentWidth: 78\n"
11172 "...\n",
11173 &Style),
11174 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011175
11176 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
11177}
Daniel Jasper65ee3472013-07-31 23:16:02 +000011178
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011179#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011180
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000011181TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
11182 FormatStyle Style = {};
11183 Style.Language = FormatStyle::LK_JavaScript;
11184 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011185 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000011186 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011187
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000011188 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011189 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000011190 "BasedOnStyle: Google\n"
11191 "---\n"
11192 "Language: JavaScript\n"
11193 "IndentWidth: 76\n"
11194 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011195 &Style)
11196 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000011197 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000011198 EXPECT_EQ(76u, Style.IndentWidth);
11199 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
11200}
11201
Alexander Kornienkod6538332013-05-07 15:32:14 +000011202TEST_F(FormatTest, ConfigurationRoundTripTest) {
11203 FormatStyle Style = getLLVMStyle();
11204 std::string YAML = configurationAsText(Style);
11205 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011206 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000011207 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
11208 EXPECT_EQ(Style, ParsedStyle);
11209}
11210
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011211TEST_F(FormatTest, WorksFor8bitEncodings) {
11212 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
11213 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
11214 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
11215 "\"\xef\xee\xf0\xf3...\"",
11216 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
11217 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
11218 "\xef\xee\xf0\xf3...\"",
11219 getLLVMStyleWithColumns(12)));
11220}
11221
Alexander Kornienko393e3082013-11-13 14:04:17 +000011222TEST_F(FormatTest, HandlesUTF8BOM) {
11223 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
11224 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
11225 format("\xef\xbb\xbf#include <iostream>"));
11226 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
11227 format("\xef\xbb\xbf\n#include <iostream>"));
11228}
11229
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000011230// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
11231#if !defined(_MSC_VER)
11232
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011233TEST_F(FormatTest, CountsUTF8CharactersProperly) {
11234 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
11235 getLLVMStyleWithColumns(35));
11236 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011237 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011238 verifyFormat("// Однажды в студёную зимнюю пору...",
11239 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000011240 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011241 verifyFormat("/* Однажды в студёную зимнюю пору... */",
11242 getLLVMStyleWithColumns(39));
11243 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011244 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011245}
11246
11247TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000011248 // Non-printable characters' width is currently considered to be the length in
11249 // bytes in UTF8. The characters can be displayed in very different manner
11250 // (zero-width, single width with a substitution glyph, expanded to their code
11251 // (e.g. "<8d>"), so there's no single correct way to handle them.
11252 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000011253 "\"\xc2\x8d\";",
11254 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000011255 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000011256 "\"\xc2\x8d\";",
11257 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000011258 EXPECT_EQ("\"Однажды, в \"\n"
11259 "\"студёную \"\n"
11260 "\"зимнюю \"\n"
11261 "\"пору,\"",
11262 format("\"Однажды, в студёную зимнюю пору,\"",
11263 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011264 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000011265 "\"一 二 三 \"\n"
11266 "\"四 五六 \"\n"
11267 "\"七 八 九 \"\n"
11268 "\"十\"",
11269 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Manuel Klimek93699f42017-11-29 14:29:43 +000011270 EXPECT_EQ("\"一\t\"\n"
11271 "\"二 \t\"\n"
11272 "\"三 四 \"\n"
11273 "\"五\t\"\n"
11274 "\"六 \t\"\n"
11275 "\"七 \"\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011276 "\"八九十\tqq\"",
11277 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
11278 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000011279
11280 // UTF8 character in an escape sequence.
11281 EXPECT_EQ("\"aaaaaa\"\n"
11282 "\"\\\xC2\x8D\"",
11283 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011284}
11285
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011286TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
11287 EXPECT_EQ("const char *sssss =\n"
11288 " \"一二三四五六七八\\\n"
11289 " 九 十\";",
11290 format("const char *sssss = \"一二三四五六七八\\\n"
11291 " 九 十\";",
11292 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011293}
11294
11295TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000011296 EXPECT_EQ("// aaaaÄ\xc2\x8d",
11297 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011298 EXPECT_EQ("// Я из лесу\n"
11299 "// вышел; был\n"
11300 "// сильный\n"
11301 "// мороз.",
11302 format("// Я из лесу вышел; был сильный мороз.",
11303 getLLVMStyleWithColumns(13)));
11304 EXPECT_EQ("// 一二三\n"
11305 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011306 "// 八 九\n"
11307 "// 十",
11308 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011309}
11310
11311TEST_F(FormatTest, SplitsUTF8BlockComments) {
11312 EXPECT_EQ("/* Гляжу,\n"
11313 " * поднимается\n"
11314 " * медленно в\n"
11315 " * гору\n"
11316 " * Лошадка,\n"
11317 " * везущая\n"
11318 " * хворосту\n"
11319 " * воз. */",
11320 format("/* Гляжу, поднимается медленно в гору\n"
11321 " * Лошадка, везущая хворосту воз. */",
11322 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011323 EXPECT_EQ(
11324 "/* 一二三\n"
11325 " * 四五六七\n"
11326 " * 八 九\n"
11327 " * 十 */",
11328 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000011329 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
11330 " * 𝕓𝕪𝕥𝕖\n"
11331 " * 𝖀𝕿𝕱-𝟠 */",
11332 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011333}
11334
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011335#endif // _MSC_VER
11336
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011337TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
11338 FormatStyle Style = getLLVMStyle();
11339
11340 Style.ConstructorInitializerIndentWidth = 4;
11341 verifyFormat(
11342 "SomeClass::Constructor()\n"
11343 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11344 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11345 Style);
11346
11347 Style.ConstructorInitializerIndentWidth = 2;
11348 verifyFormat(
11349 "SomeClass::Constructor()\n"
11350 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11351 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11352 Style);
11353
11354 Style.ConstructorInitializerIndentWidth = 0;
11355 verifyFormat(
11356 "SomeClass::Constructor()\n"
11357 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11358 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11359 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000011360 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
11361 verifyFormat(
11362 "SomeLongTemplateVariableName<\n"
11363 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
11364 Style);
11365 verifyFormat(
11366 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
11367 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
11368 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000011369}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011370
Daniel Jasper00853002014-09-16 16:22:30 +000011371TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
11372 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +000011373 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011374 Style.ConstructorInitializerIndentWidth = 4;
11375 verifyFormat("SomeClass::Constructor()\n"
11376 " : a(a)\n"
11377 " , b(b)\n"
11378 " , c(c) {}",
11379 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011380 verifyFormat("SomeClass::Constructor()\n"
11381 " : a(a) {}",
11382 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011383
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011384 Style.ColumnLimit = 0;
11385 verifyFormat("SomeClass::Constructor()\n"
11386 " : a(a) {}",
11387 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000011388 verifyFormat("SomeClass::Constructor() noexcept\n"
11389 " : a(a) {}",
11390 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011391 verifyFormat("SomeClass::Constructor()\n"
11392 " : a(a)\n"
11393 " , b(b)\n"
11394 " , c(c) {}",
11395 Style);
11396 verifyFormat("SomeClass::Constructor()\n"
11397 " : a(a) {\n"
11398 " foo();\n"
11399 " bar();\n"
11400 "}",
11401 Style);
11402
Daniel Jasperd74cf402014-04-08 12:46:38 +000011403 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011404 verifyFormat("SomeClass::Constructor()\n"
11405 " : a(a)\n"
11406 " , b(b)\n"
11407 " , c(c) {\n}",
11408 Style);
11409 verifyFormat("SomeClass::Constructor()\n"
11410 " : a(a) {\n}",
11411 Style);
11412
11413 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000011414 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011415 Style.ConstructorInitializerIndentWidth = 2;
11416 verifyFormat("SomeClass::Constructor()\n"
11417 " : a(a)\n"
11418 " , b(b)\n"
11419 " , c(c) {}",
11420 Style);
11421
11422 Style.ConstructorInitializerIndentWidth = 0;
11423 verifyFormat("SomeClass::Constructor()\n"
11424 ": a(a)\n"
11425 ", b(b)\n"
11426 ", c(c) {}",
11427 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011428
11429 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
11430 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011431 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
11432 verifyFormat(
11433 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
11434 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011435 verifyFormat(
11436 "SomeClass::Constructor()\n"
11437 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
11438 Style);
11439 Style.ConstructorInitializerIndentWidth = 4;
11440 Style.ColumnLimit = 60;
11441 verifyFormat("SomeClass::Constructor()\n"
11442 " : aaaaaaaa(aaaaaaaa)\n"
11443 " , aaaaaaaa(aaaaaaaa)\n"
11444 " , aaaaaaaa(aaaaaaaa) {}",
11445 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011446}
11447
Daniel Jasper38efc132014-10-21 07:51:54 +000011448TEST_F(FormatTest, Destructors) {
11449 verifyFormat("void F(int &i) { i.~int(); }");
11450 verifyFormat("void F(int &i) { i->~int(); }");
11451}
11452
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011453TEST_F(FormatTest, FormatsWithWebKitStyle) {
11454 FormatStyle Style = getWebKitStyle();
11455
11456 // Don't indent in outer namespaces.
11457 verifyFormat("namespace outer {\n"
11458 "int i;\n"
11459 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000011460 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011461 "} // namespace inner\n"
11462 "} // namespace outer\n"
11463 "namespace other_outer {\n"
11464 "int i;\n"
11465 "}",
11466 Style);
11467
11468 // Don't indent case labels.
11469 verifyFormat("switch (variable) {\n"
11470 "case 1:\n"
11471 "case 2:\n"
11472 " doSomething();\n"
11473 " break;\n"
11474 "default:\n"
11475 " ++variable;\n"
11476 "}",
11477 Style);
11478
11479 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000011480 EXPECT_EQ("void f()\n"
11481 "{\n"
11482 " if (aaaaaaaaaaaaaaaa\n"
11483 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
11484 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11485 " return;\n"
11486 "}",
11487 format("void f() {\n"
11488 "if (aaaaaaaaaaaaaaaa\n"
11489 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
11490 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11491 "return;\n"
11492 "}",
11493 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011494
Daniel Jasper35995672014-04-29 14:05:20 +000011495 // Allow functions on a single line.
11496 verifyFormat("void f() { return; }", Style);
11497
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011498 // Constructor initializers are formatted one per line with the "," on the
11499 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011500 verifyFormat("Constructor()\n"
11501 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
11502 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000011503 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011504 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
11505 "{\n"
11506 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011507 Style);
11508 verifyFormat("SomeClass::Constructor()\n"
11509 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011510 "{\n"
11511 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011512 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000011513 EXPECT_EQ("SomeClass::Constructor()\n"
11514 " : a(a)\n"
11515 "{\n"
11516 "}",
11517 format("SomeClass::Constructor():a(a){}", Style));
11518 verifyFormat("SomeClass::Constructor()\n"
11519 " : a(a)\n"
11520 " , b(b)\n"
11521 " , c(c)\n"
11522 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000011523 "}",
11524 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011525 verifyFormat("SomeClass::Constructor()\n"
11526 " : a(a)\n"
11527 "{\n"
11528 " foo();\n"
11529 " bar();\n"
11530 "}",
11531 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011532
Daniel Jasper65ee3472013-07-31 23:16:02 +000011533 // Access specifiers should be aligned left.
11534 verifyFormat("class C {\n"
11535 "public:\n"
11536 " int i;\n"
11537 "};",
11538 Style);
11539
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011540 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000011541 verifyFormat("int a; // Do not\n"
11542 "double b; // align comments.",
11543 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011544
Daniel Jasper3219e432014-12-02 13:24:51 +000011545 // Do not align operands.
11546 EXPECT_EQ("ASSERT(aaaa\n"
11547 " || bbbb);",
11548 format("ASSERT ( aaaa\n||bbbb);", Style));
11549
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011550 // Accept input's line breaks.
11551 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
11552 " || bbbbbbbbbbbbbbb) {\n"
11553 " i++;\n"
11554 "}",
11555 format("if (aaaaaaaaaaaaaaa\n"
11556 "|| bbbbbbbbbbbbbbb) { i++; }",
11557 Style));
11558 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
11559 " i++;\n"
11560 "}",
11561 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000011562
11563 // Don't automatically break all macro definitions (llvm.org/PR17842).
11564 verifyFormat("#define aNumber 10", Style);
11565 // However, generally keep the line breaks that the user authored.
11566 EXPECT_EQ("#define aNumber \\\n"
11567 " 10",
11568 format("#define aNumber \\\n"
11569 " 10",
11570 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000011571
11572 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011573 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
11574 " copyItems:YES];",
11575 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
11576 "copyItems:YES];",
11577 Style));
11578 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
11579 " copyItems:YES];",
11580 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
11581 " copyItems:YES];",
11582 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000011583 // FIXME: This does not seem right, there should be more indentation before
11584 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011585 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000011586 " @\"a\",\n"
11587 " @\"a\"\n"
11588 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011589 " copyItems:YES];",
11590 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
11591 " @\"a\",\n"
11592 " @\"a\"\n"
11593 " ]\n"
11594 " copyItems:YES];",
11595 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011596 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011597 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11598 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011599 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11600 " copyItems:YES];",
11601 Style));
11602
11603 verifyFormat("[self.a b:c c:d];", Style);
11604 EXPECT_EQ("[self.a b:c\n"
11605 " c:d];",
11606 format("[self.a b:c\n"
11607 "c:d];",
11608 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011609}
11610
Manuel Klimekffdeb592013-09-03 15:10:01 +000011611TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011612 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
11613 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
11614 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
11615 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
11616 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000011617 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Manuel Klimek9f0a4e52017-09-19 09:59:30 +000011618 verifyFormat("auto c = [a = [b = 42] {}] {};\n");
11619 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000011620 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011621 verifyFormat("void f() {\n"
11622 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
11623 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011624 verifyFormat("void f() {\n"
11625 " other(x.begin(), //\n"
11626 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000011627 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011628 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000011629 verifyFormat("SomeFunction([]() { // A cool function...\n"
11630 " return 43;\n"
11631 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000011632 EXPECT_EQ("SomeFunction([]() {\n"
11633 "#define A a\n"
11634 " return 43;\n"
11635 "});",
11636 format("SomeFunction([](){\n"
11637 "#define A a\n"
11638 "return 43;\n"
11639 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000011640 verifyFormat("void f() {\n"
11641 " SomeFunction([](decltype(x), A *a) {});\n"
11642 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011643 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11644 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000011645 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
11646 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
11647 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000011648 verifyFormat("Constructor()\n"
11649 " : Field([] { // comment\n"
11650 " int i;\n"
11651 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000011652 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
11653 " return some_parameter.size();\n"
11654 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000011655 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
11656 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000011657 verifyFormat("int i = aaaaaa ? 1 //\n"
11658 " : [] {\n"
11659 " return 2; //\n"
11660 " }();");
11661 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11662 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11663 " return x == 2; // force break\n"
11664 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011665 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11666 " [=](int iiiiiiiiiiii) {\n"
11667 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
11668 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
11669 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011670 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011671 verifyFormat("SomeFunction({[&] {\n"
11672 " // comment\n"
11673 " },\n"
11674 " [&] {\n"
11675 " // comment\n"
11676 " }});");
11677 verifyFormat("SomeFunction({[&] {\n"
11678 " // comment\n"
11679 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011680 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11681 " [&]() { return true; },\n"
11682 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011683
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011684 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011685 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011686 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011687 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11688 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011689 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011690 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011691 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11692 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011693 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011694 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11695 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011696 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011697 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011698 verifyFormat(
11699 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11700 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11701 " return aaaaaaaaaaaaaaaaa;\n"
11702 " });",
11703 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011704 verifyFormat("[]() //\n"
11705 " -> int {\n"
11706 " return 1; //\n"
11707 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011708
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011709 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011710 verifyFormat("SomeFunction(\n"
11711 " []() {\n"
11712 " int i = 42;\n"
11713 " return i;\n"
11714 " },\n"
11715 " []() {\n"
11716 " int j = 43;\n"
11717 " return j;\n"
11718 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011719
Daniel Jasperda18fd82014-06-10 06:39:03 +000011720 // More complex introducers.
11721 verifyFormat("return [i, args...] {};");
11722
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011723 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011724 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011725 verifyFormat("double &operator[](int i) { return 0; }\n"
11726 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011727 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011728 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011729 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011730
11731 // Other corner cases.
11732 verifyFormat("void f() {\n"
11733 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000011734 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000011735 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011736
11737 // Lambdas created through weird macros.
11738 verifyFormat("void f() {\n"
11739 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011740 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011741 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011742
11743 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11744 " doo_dah();\n"
11745 " doo_dah();\n"
11746 " })) {\n"
11747 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000011748 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
11749 " doo_dah();\n"
11750 " doo_dah();\n"
11751 " })) {\n"
11752 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011753 verifyFormat("auto lambda = []() {\n"
11754 " int a = 2\n"
11755 "#if A\n"
11756 " + 2\n"
11757 "#endif\n"
11758 " ;\n"
11759 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011760
11761 // Lambdas with complex multiline introducers.
11762 verifyFormat(
11763 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11764 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
11765 " -> ::std::unordered_set<\n"
11766 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
11767 " //\n"
11768 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011769}
11770
Martin Probsta004b3f2017-11-17 18:06:33 +000011771TEST_F(FormatTest, EmptyLinesInLambdas) {
11772 verifyFormat("auto lambda = []() {\n"
11773 " x(); //\n"
11774 "};",
11775 "auto lambda = []() {\n"
11776 "\n"
11777 " x(); //\n"
11778 "\n"
11779 "};");
11780}
11781
Manuel Klimek516e0542013-09-04 13:25:30 +000011782TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011783 FormatStyle ShortBlocks = getLLVMStyle();
11784 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11785 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11786 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11787 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11788 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11789 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11790 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011791
Daniel Jasper76284682014-10-22 09:12:44 +000011792 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11793 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11794 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011795
Daniel Jasper76284682014-10-22 09:12:44 +000011796 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011797 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011798 "}];");
11799 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011800 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011801 "}]};");
11802 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011803 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011804 "}];");
11805 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011806 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011807 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011808 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011809 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011810 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011811 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011812 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011813
11814 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011815 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011816 "}];",
11817 getLLVMStyleWithColumns(60));
11818 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011819 " NSString *path = [self sessionFilePath];\n"
11820 " if (path) {\n"
11821 " // ...\n"
11822 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011823 "});");
11824 verifyFormat("[[SessionService sharedService]\n"
11825 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011826 " if (window) {\n"
11827 " [self windowDidLoad:window];\n"
11828 " } else {\n"
11829 " [self errorLoadingWindow];\n"
11830 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011831 " }];");
11832 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011833 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011834 "};\n",
11835 getLLVMStyleWithColumns(40));
11836 verifyFormat("[[SessionService sharedService]\n"
11837 " loadWindowWithCompletionBlock: //\n"
11838 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011839 " if (window) {\n"
11840 " [self windowDidLoad:window];\n"
11841 " } else {\n"
11842 " [self errorLoadingWindow];\n"
11843 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011844 " }];",
11845 getLLVMStyleWithColumns(60));
11846 verifyFormat("[myObject doSomethingWith:arg1\n"
11847 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011848 " // ...\n"
11849 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011850 " }\n"
11851 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011852 " // ...\n"
11853 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011854 " }\n"
11855 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011856 " // ...\n"
11857 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011858 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011859 verifyFormat("[myObject doSomethingWith:arg1\n"
11860 " firstBlock:-1\n"
11861 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011862 " // ...\n"
11863 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011864 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011865
11866 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011867 " @autoreleasepool {\n"
11868 " if (a) {\n"
11869 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011870 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011871 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011872 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011873 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011874 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11875 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011876
11877 FormatStyle FourIndent = getLLVMStyle();
11878 FourIndent.ObjCBlockIndentWidth = 4;
11879 verifyFormat("[operation setCompletionBlock:^{\n"
11880 " [self onOperationDone];\n"
11881 "}];",
11882 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011883}
11884
Daniel Jasper289afc02015-04-23 09:23:17 +000011885TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11886 FormatStyle ZeroColumn = getLLVMStyle();
11887 ZeroColumn.ColumnLimit = 0;
11888
11889 verifyFormat("[[SessionService sharedService] "
11890 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11891 " if (window) {\n"
11892 " [self windowDidLoad:window];\n"
11893 " } else {\n"
11894 " [self errorLoadingWindow];\n"
11895 " }\n"
11896 "}];",
11897 ZeroColumn);
11898 EXPECT_EQ("[[SessionService sharedService]\n"
11899 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11900 " if (window) {\n"
11901 " [self windowDidLoad:window];\n"
11902 " } else {\n"
11903 " [self errorLoadingWindow];\n"
11904 " }\n"
11905 " }];",
11906 format("[[SessionService sharedService]\n"
11907 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11908 " if (window) {\n"
11909 " [self windowDidLoad:window];\n"
11910 " } else {\n"
11911 " [self errorLoadingWindow];\n"
11912 " }\n"
11913 "}];",
11914 ZeroColumn));
11915 verifyFormat("[myObject doSomethingWith:arg1\n"
11916 " firstBlock:^(Foo *a) {\n"
11917 " // ...\n"
11918 " int i;\n"
11919 " }\n"
11920 " secondBlock:^(Bar *b) {\n"
11921 " // ...\n"
11922 " int i;\n"
11923 " }\n"
11924 " thirdBlock:^Foo(Bar *b) {\n"
11925 " // ...\n"
11926 " int i;\n"
11927 " }];",
11928 ZeroColumn);
11929 verifyFormat("f(^{\n"
11930 " @autoreleasepool {\n"
11931 " if (a) {\n"
11932 " g();\n"
11933 " }\n"
11934 " }\n"
11935 "});",
11936 ZeroColumn);
11937 verifyFormat("void (^largeBlock)(void) = ^{\n"
11938 " // ...\n"
11939 "};",
11940 ZeroColumn);
11941
11942 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11943 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011944 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011945 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11946 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11947 " int i;\n"
11948 "};",
11949 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11950}
11951
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011952TEST_F(FormatTest, SupportsCRLF) {
11953 EXPECT_EQ("int a;\r\n"
11954 "int b;\r\n"
11955 "int c;\r\n",
11956 format("int a;\r\n"
11957 " int b;\r\n"
11958 " int c;\r\n",
11959 getLLVMStyle()));
11960 EXPECT_EQ("int a;\r\n"
11961 "int b;\r\n"
11962 "int c;\r\n",
11963 format("int a;\r\n"
11964 " int b;\n"
11965 " int c;\r\n",
11966 getLLVMStyle()));
11967 EXPECT_EQ("int a;\n"
11968 "int b;\n"
11969 "int c;\n",
11970 format("int a;\r\n"
11971 " int b;\n"
11972 " int c;\n",
11973 getLLVMStyle()));
11974 EXPECT_EQ("\"aaaaaaa \"\r\n"
11975 "\"bbbbbbb\";\r\n",
11976 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11977 EXPECT_EQ("#define A \\\r\n"
11978 " b; \\\r\n"
11979 " c; \\\r\n"
11980 " d;\r\n",
11981 format("#define A \\\r\n"
11982 " b; \\\r\n"
11983 " c; d; \r\n",
11984 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011985
11986 EXPECT_EQ("/*\r\n"
11987 "multi line block comments\r\n"
11988 "should not introduce\r\n"
11989 "an extra carriage return\r\n"
11990 "*/\r\n",
11991 format("/*\r\n"
11992 "multi line block comments\r\n"
11993 "should not introduce\r\n"
11994 "an extra carriage return\r\n"
11995 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011996}
11997
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011998TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11999 verifyFormat("MY_CLASS(C) {\n"
12000 " int i;\n"
12001 " int j;\n"
12002 "};");
12003}
12004
Daniel Jasper6633ab82013-10-18 10:38:14 +000012005TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
12006 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
12007 TwoIndent.ContinuationIndentWidth = 2;
12008
12009 EXPECT_EQ("int i =\n"
12010 " longFunction(\n"
12011 " arg);",
12012 format("int i = longFunction(arg);", TwoIndent));
12013
12014 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
12015 SixIndent.ContinuationIndentWidth = 6;
12016
12017 EXPECT_EQ("int i =\n"
12018 " longFunction(\n"
12019 " arg);",
12020 format("int i = longFunction(arg);", SixIndent));
12021}
12022
Daniel Jasperdd978ae2013-10-29 14:52:02 +000012023TEST_F(FormatTest, SpacesInAngles) {
12024 FormatStyle Spaces = getLLVMStyle();
12025 Spaces.SpacesInAngles = true;
12026
12027 verifyFormat("static_cast< int >(arg);", Spaces);
12028 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
12029 verifyFormat("f< int, float >();", Spaces);
12030 verifyFormat("template <> g() {}", Spaces);
12031 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000012032 verifyFormat("std::function< void(int, int) > fct;", Spaces);
12033 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
12034 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000012035
12036 Spaces.Standard = FormatStyle::LS_Cpp03;
12037 Spaces.SpacesInAngles = true;
12038 verifyFormat("A< A< int > >();", Spaces);
12039
12040 Spaces.SpacesInAngles = false;
12041 verifyFormat("A<A<int> >();", Spaces);
12042
12043 Spaces.Standard = FormatStyle::LS_Cpp11;
12044 Spaces.SpacesInAngles = true;
12045 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000012046
Daniel Jasperdd978ae2013-10-29 14:52:02 +000012047 Spaces.SpacesInAngles = false;
12048 verifyFormat("A<A<int>>();", Spaces);
12049}
12050
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000012051TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
12052 FormatStyle Style = getLLVMStyle();
12053 Style.SpaceAfterTemplateKeyword = false;
12054 verifyFormat("template<int> void foo();", Style);
12055}
12056
Jacques Pienaarfc275112015-02-18 23:48:37 +000012057TEST_F(FormatTest, TripleAngleBrackets) {
12058 verifyFormat("f<<<1, 1>>>();");
12059 verifyFormat("f<<<1, 1, 1, s>>>();");
12060 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000012061 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000012062 verifyFormat("f<param><<<1, 1>>>();");
12063 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000012064 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000012065 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
12066 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000012067 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
12068 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000012069}
12070
12071TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000012072 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000012073 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000012074 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
12075 "aaallvm::outs() <<");
12076 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
12077 "aaaallvm::outs()\n <<");
12078}
12079
Manuel Klimek819788d2014-03-18 11:22:45 +000012080TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
12081 std::string code = "#if A\n"
12082 "#if B\n"
12083 "a.\n"
12084 "#endif\n"
12085 " a = 1;\n"
12086 "#else\n"
12087 "#endif\n"
12088 "#if C\n"
12089 "#else\n"
12090 "#endif\n";
12091 EXPECT_EQ(code, format(code));
12092}
12093
Manuel Klimek68b03042014-04-14 09:14:11 +000012094TEST_F(FormatTest, HandleConflictMarkers) {
12095 // Git/SVN conflict markers.
12096 EXPECT_EQ("int a;\n"
12097 "void f() {\n"
12098 " callme(some(parameter1,\n"
12099 "<<<<<<< text by the vcs\n"
12100 " parameter2),\n"
12101 "||||||| text by the vcs\n"
12102 " parameter2),\n"
12103 " parameter3,\n"
12104 "======= text by the vcs\n"
12105 " parameter2, parameter3),\n"
12106 ">>>>>>> text by the vcs\n"
12107 " otherparameter);\n",
12108 format("int a;\n"
12109 "void f() {\n"
12110 " callme(some(parameter1,\n"
12111 "<<<<<<< text by the vcs\n"
12112 " parameter2),\n"
12113 "||||||| text by the vcs\n"
12114 " parameter2),\n"
12115 " parameter3,\n"
12116 "======= text by the vcs\n"
12117 " parameter2,\n"
12118 " parameter3),\n"
12119 ">>>>>>> text by the vcs\n"
12120 " otherparameter);\n"));
12121
12122 // Perforce markers.
12123 EXPECT_EQ("void f() {\n"
12124 " function(\n"
12125 ">>>> text by the vcs\n"
12126 " parameter,\n"
12127 "==== text by the vcs\n"
12128 " parameter,\n"
12129 "==== text by the vcs\n"
12130 " parameter,\n"
12131 "<<<< text by the vcs\n"
12132 " parameter);\n",
12133 format("void f() {\n"
12134 " function(\n"
12135 ">>>> text by the vcs\n"
12136 " parameter,\n"
12137 "==== text by the vcs\n"
12138 " parameter,\n"
12139 "==== text by the vcs\n"
12140 " parameter,\n"
12141 "<<<< text by the vcs\n"
12142 " parameter);\n"));
12143
12144 EXPECT_EQ("<<<<<<<\n"
12145 "|||||||\n"
12146 "=======\n"
12147 ">>>>>>>",
12148 format("<<<<<<<\n"
12149 "|||||||\n"
12150 "=======\n"
12151 ">>>>>>>"));
12152
12153 EXPECT_EQ("<<<<<<<\n"
12154 "|||||||\n"
12155 "int i;\n"
12156 "=======\n"
12157 ">>>>>>>",
12158 format("<<<<<<<\n"
12159 "|||||||\n"
12160 "int i;\n"
12161 "=======\n"
12162 ">>>>>>>"));
12163
12164 // FIXME: Handle parsing of macros around conflict markers correctly:
12165 EXPECT_EQ("#define Macro \\\n"
12166 "<<<<<<<\n"
12167 "Something \\\n"
12168 "|||||||\n"
12169 "Else \\\n"
12170 "=======\n"
12171 "Other \\\n"
12172 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000012173 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000012174 format("#define Macro \\\n"
12175 "<<<<<<<\n"
12176 " Something \\\n"
12177 "|||||||\n"
12178 " Else \\\n"
12179 "=======\n"
12180 " Other \\\n"
12181 ">>>>>>>\n"
12182 " End\n"
12183 "int i;\n"));
12184}
12185
Daniel Jasper471894432014-08-06 13:40:26 +000012186TEST_F(FormatTest, DisableRegions) {
12187 EXPECT_EQ("int i;\n"
12188 "// clang-format off\n"
12189 " int j;\n"
12190 "// clang-format on\n"
12191 "int k;",
12192 format(" int i;\n"
12193 " // clang-format off\n"
12194 " int j;\n"
12195 " // clang-format on\n"
12196 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000012197 EXPECT_EQ("int i;\n"
12198 "/* clang-format off */\n"
12199 " int j;\n"
12200 "/* clang-format on */\n"
12201 "int k;",
12202 format(" int i;\n"
12203 " /* clang-format off */\n"
12204 " int j;\n"
12205 " /* clang-format on */\n"
12206 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000012207
12208 // Don't reflow comments within disabled regions.
12209 EXPECT_EQ(
12210 "// clang-format off\n"
12211 "// long long long long long long line\n"
12212 "/* clang-format on */\n"
12213 "/* long long long\n"
12214 " * long long long\n"
12215 " * line */\n"
12216 "int i;\n"
12217 "/* clang-format off */\n"
12218 "/* long long long long long long line */\n",
12219 format("// clang-format off\n"
12220 "// long long long long long long line\n"
12221 "/* clang-format on */\n"
12222 "/* long long long long long long line */\n"
12223 "int i;\n"
12224 "/* clang-format off */\n"
12225 "/* long long long long long long line */\n",
12226 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000012227}
12228
Manuel Klimekf0c95b32015-06-11 10:14:13 +000012229TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
12230 format("? ) =");
12231 verifyNoCrash("#define a\\\n /**/}");
12232}
Manuel Klimek5f594f82014-08-13 14:00:41 +000012233
Daniel Jasper498f5582015-12-25 08:53:31 +000012234TEST_F(FormatTest, FormatsTableGenCode) {
12235 FormatStyle Style = getLLVMStyle();
12236 Style.Language = FormatStyle::LK_TableGen;
12237 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
12238}
12239
Nico Weberb2673a12016-11-10 21:49:25 +000012240TEST_F(FormatTest, ArrayOfTemplates) {
12241 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
12242 format("auto a = new unique_ptr<int > [ 10];"));
12243
12244 FormatStyle Spaces = getLLVMStyle();
12245 Spaces.SpacesInSquareBrackets = true;
12246 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
12247 format("auto a = new unique_ptr<int > [10];", Spaces));
12248}
12249
12250TEST_F(FormatTest, ArrayAsTemplateType) {
12251 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
12252 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
12253
12254 FormatStyle Spaces = getLLVMStyle();
12255 Spaces.SpacesInSquareBrackets = true;
12256 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
12257 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
12258}
12259
Martin Probstc9c51c42017-03-16 10:21:35 +000012260TEST_F(FormatTest, NoSpaceAfterSuper) {
12261 verifyFormat("__super::FooBar();");
12262}
12263
Ben Hamilton07e58362018-02-21 21:27:27 +000012264TEST(FormatStyle, GetStyleWithEmptyFileName) {
Bjorn Pettersson0b2f7742018-02-26 14:14:11 +000012265 vfs::InMemoryFileSystem FS;
12266 auto Style1 = getStyle("file", "", "Google", "", &FS);
Ben Hamilton07e58362018-02-21 21:27:27 +000012267 ASSERT_TRUE((bool)Style1);
12268 ASSERT_EQ(*Style1, getGoogleStyle());
12269}
12270
Eric Liu547d8792016-03-24 13:22:42 +000012271TEST(FormatStyle, GetStyleOfFile) {
12272 vfs::InMemoryFileSystem FS;
12273 // Test 1: format file in the same directory.
12274 ASSERT_TRUE(
12275 FS.addFile("/a/.clang-format", 0,
12276 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
12277 ASSERT_TRUE(
12278 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000012279 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000012280 ASSERT_TRUE((bool)Style1);
12281 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000012282
Antonio Maiorano7eb75072017-01-20 01:22:42 +000012283 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000012284 ASSERT_TRUE(
12285 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000012286 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000012287 ASSERT_TRUE((bool)Style2);
12288 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000012289
Antonio Maiorano7eb75072017-01-20 01:22:42 +000012290 // Test 2.2: no format on 'none' fallback style.
12291 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
12292 ASSERT_TRUE((bool)Style2);
12293 ASSERT_EQ(*Style2, getNoStyle());
12294
12295 // Test 2.3: format if config is found with no based style while fallback is
12296 // 'none'.
12297 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
12298 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
12299 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
12300 ASSERT_TRUE((bool)Style2);
12301 ASSERT_EQ(*Style2, getLLVMStyle());
12302
12303 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
12304 Style2 = getStyle("{}", "a.h", "none", "", &FS);
12305 ASSERT_TRUE((bool)Style2);
12306 ASSERT_EQ(*Style2, getLLVMStyle());
12307
Eric Liu547d8792016-03-24 13:22:42 +000012308 // Test 3: format file in parent directory.
12309 ASSERT_TRUE(
12310 FS.addFile("/c/.clang-format", 0,
12311 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
12312 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
12313 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000012314 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000012315 ASSERT_TRUE((bool)Style3);
12316 ASSERT_EQ(*Style3, getGoogleStyle());
12317
12318 // Test 4: error on invalid fallback style
12319 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
12320 ASSERT_FALSE((bool)Style4);
12321 llvm::consumeError(Style4.takeError());
12322
12323 // Test 5: error on invalid yaml on command line
12324 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
12325 ASSERT_FALSE((bool)Style5);
12326 llvm::consumeError(Style5.takeError());
12327
12328 // Test 6: error on invalid style
12329 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
12330 ASSERT_FALSE((bool)Style6);
12331 llvm::consumeError(Style6.takeError());
12332
12333 // Test 7: found config file, error on parsing it
12334 ASSERT_TRUE(
12335 FS.addFile("/d/.clang-format", 0,
12336 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
12337 "InvalidKey: InvalidValue")));
12338 ASSERT_TRUE(
12339 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
12340 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
12341 ASSERT_FALSE((bool)Style7);
12342 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000012343}
12344
Manuel Klimekb12e5a52016-03-01 12:37:30 +000012345TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
12346 // Column limit is 20.
12347 std::string Code = "Type *a =\n"
12348 " new Type();\n"
12349 "g(iiiii, 0, jjjjj,\n"
12350 " 0, kkkkk, 0, mm);\n"
12351 "int bad = format ;";
12352 std::string Expected = "auto a = new Type();\n"
12353 "g(iiiii, nullptr,\n"
12354 " jjjjj, nullptr,\n"
12355 " kkkkk, nullptr,\n"
12356 " mm);\n"
12357 "int bad = format ;";
12358 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000012359 tooling::Replacements Replaces = toReplacements(
12360 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
12361 "auto "),
12362 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
12363 "nullptr"),
12364 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
12365 "nullptr"),
12366 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
12367 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000012368
12369 format::FormatStyle Style = format::getLLVMStyle();
12370 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000012371 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
12372 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
12373 << llvm::toString(FormattedReplaces.takeError()) << "\n";
12374 auto Result = applyAllReplacements(Code, *FormattedReplaces);
12375 EXPECT_TRUE(static_cast<bool>(Result));
12376 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000012377}
12378
Eric Liubaf58c22016-05-18 13:43:48 +000012379TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
12380 std::string Code = "#include \"a.h\"\n"
12381 "#include \"c.h\"\n"
12382 "\n"
12383 "int main() {\n"
12384 " return 0;\n"
12385 "}";
12386 std::string Expected = "#include \"a.h\"\n"
12387 "#include \"b.h\"\n"
12388 "#include \"c.h\"\n"
12389 "\n"
12390 "int main() {\n"
12391 " return 0;\n"
12392 "}";
12393 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000012394 tooling::Replacements Replaces = toReplacements(
12395 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
12396 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000012397
12398 format::FormatStyle Style = format::getLLVMStyle();
12399 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000012400 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
12401 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
12402 << llvm::toString(FormattedReplaces.takeError()) << "\n";
12403 auto Result = applyAllReplacements(Code, *FormattedReplaces);
12404 EXPECT_TRUE(static_cast<bool>(Result));
12405 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000012406}
12407
Krasimir Georgievac16a202017-06-23 11:46:03 +000012408TEST_F(FormatTest, FormatSortsUsingDeclarations) {
12409 EXPECT_EQ("using std::cin;\n"
12410 "using std::cout;",
12411 format("using std::cout;\n"
12412 "using std::cin;", getGoogleStyle()));
12413}
12414
Nico Weberdc065182017-04-05 18:10:42 +000012415TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
12416 format::FormatStyle Style = format::getLLVMStyle();
12417 Style.Standard = FormatStyle::LS_Cpp03;
12418 // cpp03 recognize this string as identifier u8 and literal character 'a'
12419 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
12420}
12421
12422TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
12423 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
12424 // all modes, including C++11, C++14 and C++17
12425 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
12426}
12427
Krasimir Georgieva2e7d0d2017-08-29 13:51:38 +000012428TEST_F(FormatTest, DoNotFormatLikelyXml) {
12429 EXPECT_EQ("<!-- ;> -->",
12430 format("<!-- ;> -->", getGoogleStyle()));
12431 EXPECT_EQ(" <!-- >; -->",
12432 format(" <!-- >; -->", getGoogleStyle()));
12433}
12434
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012435TEST_F(FormatTest, StructuredBindings) {
12436 // Structured bindings is a C++17 feature.
12437 // all modes, including C++11, C++14 and C++17
12438 verifyFormat("auto [a, b] = f();");
12439 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
12440 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();"));
12441 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();"));
12442 EXPECT_EQ("auto const volatile [a, b] = f();",
12443 format("auto const volatile[a, b] = f();"));
12444 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012445 EXPECT_EQ("auto &[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012446 format("auto &[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012447 EXPECT_EQ("auto &&[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012448 format("auto &&[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012449 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();"));
12450 EXPECT_EQ("auto const volatile &&[a, b] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012451 format("auto const volatile &&[a, b] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012452 EXPECT_EQ("auto const &&[a, b] = f();", format("auto const && [a, b] = f();"));
12453 EXPECT_EQ("const auto &[a, b] = f();", format("const auto & [a, b] = f();"));
12454 EXPECT_EQ("const auto volatile &&[a, b] = f();",
12455 format("const auto volatile &&[a, b] = f();"));
12456 EXPECT_EQ("volatile const auto &&[a, b] = f();",
12457 format("volatile const auto &&[a, b] = f();"));
12458 EXPECT_EQ("const auto &&[a, b] = f();", format("const auto && [a, b] = f();"));
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012459
Manuel Klimeke411aa82017-09-20 09:29:37 +000012460 // Make sure we don't mistake structured bindings for lambdas.
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012461 FormatStyle PointerMiddle = getLLVMStyle();
12462 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
12463 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
12464 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
12465 verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
12466 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
12467 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
12468 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
12469 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
12470 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
12471 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
12472 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
12473 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
12474 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
12475
12476 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
12477 format("for (const auto && [a, b] : some_range) {\n}"));
12478 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
12479 format("for (const auto & [a, b] : some_range) {\n}"));
12480 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
12481 format("for (const auto[a, b] : some_range) {\n}"));
12482 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);"));
12483 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);"));
12484 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);"));
12485 EXPECT_EQ("auto const &[x, y](expr);", format("auto const & [x,y] (expr);"));
12486 EXPECT_EQ("auto const &&[x, y](expr);", format("auto const && [x,y] (expr);"));
12487 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};"));
12488 EXPECT_EQ("auto const &[x, y]{expr};", format("auto const & [x,y] {expr};"));
12489 EXPECT_EQ("auto const &&[x, y]{expr};", format("auto const && [x,y] {expr};"));
Manuel Klimeke411aa82017-09-20 09:29:37 +000012490
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012491 format::FormatStyle Spaces = format::getLLVMStyle();
12492 Spaces.SpacesInSquareBrackets = true;
12493 verifyFormat("auto [ a, b ] = f();", Spaces);
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012494 verifyFormat("auto &&[ a, b ] = f();", Spaces);
12495 verifyFormat("auto &[ a, b ] = f();", Spaces);
12496 verifyFormat("auto const &&[ a, b ] = f();", Spaces);
12497 verifyFormat("auto const &[ a, b ] = f();", Spaces);
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012498}
12499
Ben Hamilton6e066352018-02-27 15:56:40 +000012500TEST_F(FormatTest, FileAndCode) {
12501 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
12502 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
12503 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
12504 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
12505 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@interface Foo\n@end\n"));
Ben Hamiltonb1a79192018-04-12 15:11:53 +000012506 EXPECT_EQ(
12507 FormatStyle::LK_ObjC,
12508 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }"));
12509 EXPECT_EQ(FormatStyle::LK_ObjC,
12510 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))"));
12511 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;"));
Ben Hamilton6e066352018-02-27 15:56:40 +000012512 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
12513 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo", "@interface Foo\n@end\n"));
Ben Hamilton19c782d2018-03-22 03:25:22 +000012514 EXPECT_EQ(FormatStyle::LK_ObjC,
12515 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
12516 EXPECT_EQ(
12517 FormatStyle::LK_ObjC,
12518 guessLanguage("foo.h",
12519 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
Ben Hamilton9dc78162018-04-03 14:07:11 +000012520 EXPECT_EQ(
12521 FormatStyle::LK_Cpp,
12522 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
Ben Hamilton3b345c32018-02-21 15:54:31 +000012523}
12524
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012525TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
12526 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
12527 EXPECT_EQ(FormatStyle::LK_ObjC,
12528 guessLanguage("foo.h", "array[[calculator getIndex]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012529 EXPECT_EQ(FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012530 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012531 EXPECT_EQ(
12532 FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012533 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
12534 EXPECT_EQ(FormatStyle::LK_ObjC,
12535 guessLanguage("foo.h", "[[noreturn foo] bar];"));
12536 EXPECT_EQ(FormatStyle::LK_Cpp,
12537 guessLanguage("foo.h", "[[clang::fallthrough]];"));
12538 EXPECT_EQ(FormatStyle::LK_ObjC,
12539 guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
12540 EXPECT_EQ(FormatStyle::LK_Cpp,
12541 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
12542 EXPECT_EQ(FormatStyle::LK_Cpp,
12543 guessLanguage("foo.h", "[[using clang: fallthrough]];"));
12544 EXPECT_EQ(FormatStyle::LK_ObjC,
12545 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
12546 EXPECT_EQ(FormatStyle::LK_Cpp,
12547 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
12548 EXPECT_EQ(
12549 FormatStyle::LK_Cpp,
12550 guessLanguage("foo.h",
12551 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
12552 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012553}
12554
Ben Hamilton788a2222018-03-12 15:42:40 +000012555TEST_F(FormatTest, GuessLanguageWithCaret) {
12556 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
12557 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
12558 EXPECT_EQ(FormatStyle::LK_ObjC,
12559 guessLanguage("foo.h", "int(^)(char, float);"));
12560 EXPECT_EQ(FormatStyle::LK_ObjC,
12561 guessLanguage("foo.h", "int(^foo)(char, float);"));
12562 EXPECT_EQ(FormatStyle::LK_ObjC,
12563 guessLanguage("foo.h", "int(^foo[10])(char, float);"));
12564 EXPECT_EQ(FormatStyle::LK_ObjC,
12565 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
12566 EXPECT_EQ(
12567 FormatStyle::LK_ObjC,
12568 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
12569}
12570
Ben Hamilton6432afe2018-03-22 17:37:19 +000012571TEST_F(FormatTest, GuessLanguageWithChildLines) {
12572 EXPECT_EQ(FormatStyle::LK_Cpp,
12573 guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
12574 EXPECT_EQ(FormatStyle::LK_ObjC,
12575 guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
Ben Hamiltonea7a27b2018-03-27 15:01:21 +000012576 EXPECT_EQ(
12577 FormatStyle::LK_Cpp,
12578 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })"));
12579 EXPECT_EQ(
12580 FormatStyle::LK_ObjC,
12581 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })"));
Ben Hamilton6432afe2018-03-22 17:37:19 +000012582}
12583
Daniel Jasperd246a5a2015-06-15 15:25:11 +000012584} // end namespace
12585} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000012586} // end namespace clang