blob: 1ac9dc7550ae6df4305f7912f38b3ee54a57307c [file] [log] [blame]
Daniel Jasperf7935112012-12-03 18:12:45 +00001//===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Chandler Carruth320d9662012-12-04 09:45:34 +000010#include "clang/Format/Format.h"
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011
Eric Liu40ef2fb2016-08-01 10:16:37 +000012#include "../Tooling/ReplacementTest.h"
Manuel Klimekb12e5a52016-03-01 12:37:30 +000013#include "FormatTestUtils.h"
14
15#include "clang/Frontend/TextDiagnosticPrinter.h"
Chandler Carruth4b417452013-01-19 08:09:44 +000016#include "llvm/Support/Debug.h"
Eric Liu547d8792016-03-24 13:22:42 +000017#include "llvm/Support/MemoryBuffer.h"
Chandler Carruth4b417452013-01-19 08:09:44 +000018#include "gtest/gtest.h"
Manuel Klimek24998102013-01-16 14:55:28 +000019
Chandler Carruth10346662014-04-22 03:17:02 +000020#define DEBUG_TYPE "format-test"
21
Eric Liu40ef2fb2016-08-01 10:16:37 +000022using clang::tooling::ReplacementTest;
23using clang::tooling::toReplacements;
24
Daniel Jasperf7935112012-12-03 18:12:45 +000025namespace clang {
26namespace format {
Daniel Jasperd246a5a2015-06-15 15:25:11 +000027namespace {
Daniel Jasperf7935112012-12-03 18:12:45 +000028
Daniel Jaspera44991332015-04-29 13:06:49 +000029FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); }
Nico Weber514ecc82014-02-02 20:50:45 +000030
Daniel Jasperf7935112012-12-03 18:12:45 +000031class FormatTest : public ::testing::Test {
32protected:
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000033 enum StatusCheck {
34 SC_ExpectComplete,
35 SC_ExpectIncomplete,
36 SC_DoNotCheck
Manuel Klimekec5c3db2015-05-07 12:26:30 +000037 };
38
Daniel Jasperd246a5a2015-06-15 15:25:11 +000039 std::string format(llvm::StringRef Code,
40 const FormatStyle &Style = getLLVMStyle(),
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000041 StatusCheck CheckComplete = SC_ExpectComplete) {
Nicola Zaghen3538b392018-05-15 13:30:56 +000042 LLVM_DEBUG(llvm::errs() << "---\n");
43 LLVM_DEBUG(llvm::errs() << Code << "\n\n");
Daniel Jasperd246a5a2015-06-15 15:25:11 +000044 std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000045 FormattingAttemptStatus Status;
Manuel Klimekec5c3db2015-05-07 12:26:30 +000046 tooling::Replacements Replaces =
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000047 reformat(Style, Code, Ranges, "<stdin>", &Status);
48 if (CheckComplete != SC_DoNotCheck) {
49 bool ExpectedCompleteFormat = CheckComplete == SC_ExpectComplete;
50 EXPECT_EQ(ExpectedCompleteFormat, Status.FormatComplete)
51 << Code << "\n\n";
Manuel Klimekec5c3db2015-05-07 12:26:30 +000052 }
Daniel Jasperec04c0d2013-05-16 10:40:07 +000053 ReplacementCount = Replaces.size();
Eric Liu4f8d9942016-07-11 13:53:12 +000054 auto Result = applyAllReplacements(Code, Replaces);
55 EXPECT_TRUE(static_cast<bool>(Result));
Nicola Zaghen3538b392018-05-15 13:30:56 +000056 LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
Eric Liu4f8d9942016-07-11 13:53:12 +000057 return *Result;
Daniel Jasperf7935112012-12-03 18:12:45 +000058 }
59
Francois Ferranda6b6d512017-05-24 11:36:58 +000060 FormatStyle getStyleWithColumns(FormatStyle Style, unsigned ColumnLimit) {
Manuel Klimekb69e3c62013-01-02 18:33:23 +000061 Style.ColumnLimit = ColumnLimit;
62 return Style;
63 }
64
Francois Ferranda6b6d512017-05-24 11:36:58 +000065 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
66 return getStyleWithColumns(getLLVMStyle(), ColumnLimit);
67 }
68
Daniel Jasper1b750ed2013-01-14 16:24:39 +000069 FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
Francois Ferranda6b6d512017-05-24 11:36:58 +000070 return getStyleWithColumns(getGoogleStyle(), ColumnLimit);
Daniel Jasper1b750ed2013-01-14 16:24:39 +000071 }
72
Martin Probsta004b3f2017-11-17 18:06:33 +000073 void verifyFormat(llvm::StringRef Expected, llvm::StringRef Code,
Manuel Klimekb69e3c62013-01-02 18:33:23 +000074 const FormatStyle &Style = getLLVMStyle()) {
Mark Zerenc9a918c2018-04-04 21:09:00 +000075 EXPECT_EQ(Expected.str(), format(Expected, Style))
76 << "Expected code is not stable";
Martin Probsta004b3f2017-11-17 18:06:33 +000077 EXPECT_EQ(Expected.str(), format(Code, Style));
Nico Weberd96ae862017-02-24 19:10:12 +000078 if (Style.Language == FormatStyle::LK_Cpp) {
79 // Objective-C++ is a superset of C++, so everything checked for C++
80 // needs to be checked for Objective-C++ as well.
81 FormatStyle ObjCStyle = Style;
82 ObjCStyle.Language = FormatStyle::LK_ObjC;
Martin Probsta004b3f2017-11-17 18:06:33 +000083 EXPECT_EQ(Expected.str(), format(test::messUp(Code), ObjCStyle));
Nico Weberd96ae862017-02-24 19:10:12 +000084 }
Daniel Jasperf7935112012-12-03 18:12:45 +000085 }
86
Martin Probsta004b3f2017-11-17 18:06:33 +000087 void verifyFormat(llvm::StringRef Code,
88 const FormatStyle &Style = getLLVMStyle()) {
89 verifyFormat(Code, test::messUp(Code), Style);
90 }
91
Manuel Klimekec5c3db2015-05-07 12:26:30 +000092 void verifyIncompleteFormat(llvm::StringRef Code,
93 const FormatStyle &Style = getLLVMStyle()) {
94 EXPECT_EQ(Code.str(),
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000095 format(test::messUp(Code), Style, SC_ExpectIncomplete));
Manuel Klimekec5c3db2015-05-07 12:26:30 +000096 }
97
Daniel Jasperf7935112012-12-03 18:12:45 +000098 void verifyGoogleFormat(llvm::StringRef Code) {
Manuel Klimekb69e3c62013-01-02 18:33:23 +000099 verifyFormat(Code, getGoogleStyle());
Daniel Jasperf7935112012-12-03 18:12:45 +0000100 }
Daniel Jasper5b49f472013-01-23 12:10:53 +0000101
102 void verifyIndependentOfContext(llvm::StringRef text) {
103 verifyFormat(text);
104 verifyFormat(llvm::Twine("void f() { " + text + " }").str());
105 }
Daniel Jasper7b038a22013-01-30 09:46:12 +0000106
Daniel Jasper675b4f82015-01-19 10:51:23 +0000107 /// \brief Verify that clang-format does not crash on the given input.
108 void verifyNoCrash(llvm::StringRef Code,
109 const FormatStyle &Style = getLLVMStyle()) {
Krasimir Georgievbcda54b2017-04-21 14:35:20 +0000110 format(Code, Style, SC_DoNotCheck);
Daniel Jasper675b4f82015-01-19 10:51:23 +0000111 }
112
Daniel Jasper7b038a22013-01-30 09:46:12 +0000113 int ReplacementCount;
Daniel Jasperf7935112012-12-03 18:12:45 +0000114};
115
Manuel Klimek52b15152013-01-09 15:25:02 +0000116TEST_F(FormatTest, MessUp) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +0000117 EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
118 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
119 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
120 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
121 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
Manuel Klimek52b15152013-01-09 15:25:02 +0000122}
123
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000124//===----------------------------------------------------------------------===//
125// Basic function tests.
126//===----------------------------------------------------------------------===//
127
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +0000128TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000129 EXPECT_EQ(";", format(";"));
130}
131
132TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
133 EXPECT_EQ("int i;", format(" int i;"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +0000134 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000135 EXPECT_EQ("int i;\nint j;", format(" int i; int j;"));
136 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;"));
137}
138
139TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
140 EXPECT_EQ("int i;", format("int\ni;"));
141}
142
143TEST_F(FormatTest, FormatsNestedBlockStatements) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000144 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000145}
146
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000147TEST_F(FormatTest, FormatsNestedCall) {
148 verifyFormat("Method(f1, f2(f3));");
149 verifyFormat("Method(f1(f2, f3()));");
Daniel Jasper48cb3b92013-01-13 08:19:51 +0000150 verifyFormat("Method(f1(f2, (f3())));");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000151}
152
Daniel Jasper14556742013-02-07 21:08:36 +0000153TEST_F(FormatTest, NestedNameSpecifiers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +0000154 verifyFormat("vector<::Type> v;");
Daniel Jasper14556742013-02-07 21:08:36 +0000155 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
Daniel Jasper11be8ac2013-08-28 07:07:07 +0000156 verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
Daniel Jasperf322eb52014-10-23 20:22:22 +0000157 verifyFormat("bool a = 2 < ::SomeFunction();");
Daniel Jasper23c2b5a2017-02-17 10:44:07 +0000158 verifyFormat("ALWAYS_INLINE ::std::string getName();");
159 verifyFormat("some::string getName();");
Daniel Jasper736c14f2013-01-16 07:19:28 +0000160}
161
Daniel Jasper7b038a22013-01-30 09:46:12 +0000162TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
163 EXPECT_EQ("if (a) {\n"
164 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000165 "}",
166 format("if(a){f();}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000167 EXPECT_EQ(4, ReplacementCount);
168 EXPECT_EQ("if (a) {\n"
169 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000170 "}",
171 format("if (a) {\n"
172 " f();\n"
173 "}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000174 EXPECT_EQ(0, ReplacementCount);
Daniel Jasperd6e61882015-06-17 12:23:15 +0000175 EXPECT_EQ("/*\r\n"
176 "\r\n"
177 "*/\r\n",
178 format("/*\r\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +0000179 "\r\n"
180 "*/\r\n"));
Daniel Jasperd6e61882015-06-17 12:23:15 +0000181 EXPECT_EQ(0, ReplacementCount);
Daniel Jasper7b038a22013-01-30 09:46:12 +0000182}
183
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000184TEST_F(FormatTest, RemovesEmptyLines) {
185 EXPECT_EQ("class C {\n"
186 " int i;\n"
187 "};",
188 format("class C {\n"
189 " int i;\n"
190 "\n"
191 "};"));
192
Nico Weber34272652014-11-13 16:25:37 +0000193 // Don't remove empty lines at the start of namespaces or extern "C" blocks.
Daniel Jasper01b35482014-03-21 13:03:33 +0000194 EXPECT_EQ("namespace N {\n"
195 "\n"
196 "int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000197 "}",
Daniel Jasper01b35482014-03-21 13:03:33 +0000198 format("namespace N {\n"
199 "\n"
200 "int i;\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000201 "}",
202 getGoogleStyle()));
Sam McCall6f3778c2018-09-05 07:44:02 +0000203 EXPECT_EQ("/* something */ namespace N {\n"
204 "\n"
205 "int i;\n"
206 "}",
207 format("/* something */ namespace N {\n"
208 "\n"
209 "int i;\n"
210 "}",
211 getGoogleStyle()));
212 EXPECT_EQ("inline namespace N {\n"
213 "\n"
214 "int i;\n"
215 "}",
216 format("inline namespace N {\n"
217 "\n"
218 "int i;\n"
219 "}",
220 getGoogleStyle()));
221 EXPECT_EQ("/* something */ inline namespace N {\n"
222 "\n"
223 "int i;\n"
224 "}",
225 format("/* something */ inline namespace N {\n"
226 "\n"
227 "int i;\n"
228 "}",
229 getGoogleStyle()));
230 EXPECT_EQ("export namespace N {\n"
231 "\n"
232 "int i;\n"
233 "}",
234 format("export namespace N {\n"
235 "\n"
236 "int i;\n"
237 "}",
238 getGoogleStyle()));
Nico Weber34272652014-11-13 16:25:37 +0000239 EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
240 "\n"
241 "int i;\n"
242 "}",
243 format("extern /**/ \"C\" /**/ {\n"
244 "\n"
245 "int i;\n"
246 "}",
247 getGoogleStyle()));
248
249 // ...but do keep inlining and removing empty lines for non-block extern "C"
250 // functions.
251 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
252 EXPECT_EQ("extern \"C\" int f() {\n"
253 " int i = 42;\n"
254 " return i;\n"
255 "}",
256 format("extern \"C\" int f() {\n"
257 "\n"
258 " int i = 42;\n"
259 " return i;\n"
260 "}",
261 getGoogleStyle()));
Daniel Jasper01b35482014-03-21 13:03:33 +0000262
Daniel Jasper11164bd2014-03-21 12:58:53 +0000263 // Remove empty lines at the beginning and end of blocks.
264 EXPECT_EQ("void f() {\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000265 "\n"
266 " if (a) {\n"
267 "\n"
268 " f();\n"
269 " }\n"
270 "}",
271 format("void f() {\n"
272 "\n"
273 " if (a) {\n"
274 "\n"
275 " f();\n"
276 "\n"
277 " }\n"
278 "\n"
279 "}",
280 getLLVMStyle()));
281 EXPECT_EQ("void f() {\n"
Daniel Jasper11164bd2014-03-21 12:58:53 +0000282 " if (a) {\n"
283 " f();\n"
284 " }\n"
285 "}",
286 format("void f() {\n"
287 "\n"
288 " if (a) {\n"
289 "\n"
290 " f();\n"
291 "\n"
292 " }\n"
293 "\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000294 "}",
295 getGoogleStyle()));
Daniel Jasper11164bd2014-03-21 12:58:53 +0000296
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000297 // Don't remove empty lines in more complex control statements.
298 EXPECT_EQ("void f() {\n"
299 " if (a) {\n"
300 " f();\n"
301 "\n"
302 " } else if (b) {\n"
303 " f();\n"
304 " }\n"
305 "}",
306 format("void f() {\n"
307 " if (a) {\n"
308 " f();\n"
309 "\n"
310 " } else if (b) {\n"
311 " f();\n"
312 "\n"
313 " }\n"
314 "\n"
315 "}"));
316
Krasimir Georgiev62103052018-04-19 13:02:15 +0000317 // Don't remove empty lines before namespace endings.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000318 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
319 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000320 EXPECT_EQ("namespace {\n"
321 "int i;\n"
Krasimir Georgiev62103052018-04-19 13:02:15 +0000322 "\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000323 "}",
324 format("namespace {\n"
325 "int i;\n"
326 "\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000327 "}", LLVMWithNoNamespaceFix));
328 EXPECT_EQ("namespace {\n"
329 "int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000330 "}",
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000331 format("namespace {\n"
332 "int i;\n"
Krasimir Georgiev62103052018-04-19 13:02:15 +0000333 "}", LLVMWithNoNamespaceFix));
334 EXPECT_EQ("namespace {\n"
335 "int i;\n"
336 "\n"
337 "};",
338 format("namespace {\n"
339 "int i;\n"
340 "\n"
341 "};", LLVMWithNoNamespaceFix));
342 EXPECT_EQ("namespace {\n"
343 "int i;\n"
344 "};",
345 format("namespace {\n"
346 "int i;\n"
347 "};", LLVMWithNoNamespaceFix));
348 EXPECT_EQ("namespace {\n"
349 "int i;\n"
350 "\n"
351 "}",
352 format("namespace {\n"
353 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000354 "\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000355 "}"));
356 EXPECT_EQ("namespace {\n"
357 "int i;\n"
Krasimir Georgiev03e69f52018-03-27 13:14:29 +0000358 "\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000359 "} // namespace",
360 format("namespace {\n"
361 "int i;\n"
362 "\n"
363 "} // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000364
365 FormatStyle Style = getLLVMStyle();
366 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
367 Style.MaxEmptyLinesToKeep = 2;
368 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
369 Style.BraceWrapping.AfterClass = true;
370 Style.BraceWrapping.AfterFunction = true;
371 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
372
373 EXPECT_EQ("class Foo\n"
374 "{\n"
375 " Foo() {}\n"
376 "\n"
377 " void funk() {}\n"
378 "};",
379 format("class Foo\n"
380 "{\n"
381 " Foo()\n"
382 " {\n"
383 " }\n"
384 "\n"
385 " void funk() {}\n"
386 "};",
387 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000388}
389
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000390TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000391 verifyFormat("x = (a) and (b);");
392 verifyFormat("x = (a) or (b);");
393 verifyFormat("x = (a) bitand (b);");
394 verifyFormat("x = (a) bitor (b);");
395 verifyFormat("x = (a) not_eq (b);");
396 verifyFormat("x = (a) and_eq (b);");
397 verifyFormat("x = (a) or_eq (b);");
398 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000399}
400
Olivier Goffart90f981b2017-07-14 09:23:40 +0000401TEST_F(FormatTest, RecognizesUnaryOperatorKeywords) {
402 verifyFormat("x = compl(a);");
403 verifyFormat("x = not(a);");
404 verifyFormat("x = bitand(a);");
405 // Unary operator must not be merged with the next identifier
406 verifyFormat("x = compl a;");
407 verifyFormat("x = not a;");
408 verifyFormat("x = bitand a;");
409}
410
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000411//===----------------------------------------------------------------------===//
412// Tests for control statements.
413//===----------------------------------------------------------------------===//
414
Daniel Jaspercdd06622013-05-14 10:31:09 +0000415TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000416 verifyFormat("if (true)\n f();\ng();");
417 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000418 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000419 verifyFormat("if constexpr (true)\n"
420 " f();\ng();");
421 verifyFormat("if constexpr (a)\n"
422 " if constexpr (b)\n"
423 " if constexpr (c)\n"
424 " g();\n"
425 "h();");
426 verifyFormat("if constexpr (a)\n"
427 " if constexpr (b) {\n"
428 " f();\n"
429 " }\n"
430 "g();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000431
Daniel Jasper3a685df2013-05-16 12:12:21 +0000432 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +0000433 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jasperced17f82013-01-16 15:44:34 +0000434 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
435 verifyFormat("if (a)\n"
436 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000437 " f();",
438 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000439 verifyFormat("{\n"
440 " if (a)\n"
441 " label:\n"
442 " f();\n"
443 "}",
444 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000445 verifyFormat("#define A \\\n"
446 " if (a) \\\n"
447 " label: \\\n"
448 " f()",
449 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000450 verifyFormat("if (a)\n"
451 " ;",
452 AllowsMergedIf);
453 verifyFormat("if (a)\n"
454 " if (b) return;",
455 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000456
Daniel Jasper3a685df2013-05-16 12:12:21 +0000457 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000458 " f();\n",
459 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000460 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000461 " f();",
462 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000463 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000464 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000465 "}",
466 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000467 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000468 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000469 "}",
470 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000471
472 AllowsMergedIf.ColumnLimit = 14;
473 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000474 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000475 " return;",
476 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000477
478 AllowsMergedIf.ColumnLimit = 13;
479 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000480}
481
Daniel Jasper3a685df2013-05-16 12:12:21 +0000482TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
483 FormatStyle AllowsMergedLoops = getLLVMStyle();
484 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
485 verifyFormat("while (true) continue;", AllowsMergedLoops);
486 verifyFormat("for (;;) continue;", AllowsMergedLoops);
487 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
488 verifyFormat("while (true)\n"
489 " ;",
490 AllowsMergedLoops);
491 verifyFormat("for (;;)\n"
492 " ;",
493 AllowsMergedLoops);
494 verifyFormat("for (;;)\n"
495 " for (;;) continue;",
496 AllowsMergedLoops);
497 verifyFormat("for (;;) // Can't merge this\n"
498 " continue;",
499 AllowsMergedLoops);
500 verifyFormat("for (;;) /* still don't merge */\n"
501 " continue;",
502 AllowsMergedLoops);
503}
504
Daniel Jasper17605d32014-05-14 09:33:35 +0000505TEST_F(FormatTest, FormatShortBracedStatements) {
506 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000507 AllowSimpleBracedStatements.ColumnLimit = 40;
Daniel Jasper17605d32014-05-14 09:33:35 +0000508 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
509
510 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
511 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
512
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000513 AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom;
514 AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true;
515 AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false;
516
Daniel Jasper17605d32014-05-14 09:33:35 +0000517 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000518 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000519 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
520 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
521 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000522 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000523 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
524 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000525 verifyFormat("if (true) {\n"
526 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
527 "}",
528 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000529 verifyFormat("if (true) { //\n"
530 " f();\n"
531 "}",
532 AllowSimpleBracedStatements);
533 verifyFormat("if (true) {\n"
534 " f();\n"
535 " f();\n"
536 "}",
537 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000538 verifyFormat("if (true) {\n"
539 " f();\n"
540 "} else {\n"
541 " f();\n"
542 "}",
543 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000544
Daniel Jasperf92659e2017-06-19 07:45:41 +0000545 verifyFormat("struct A2 {\n"
546 " int X;\n"
547 "};",
548 AllowSimpleBracedStatements);
549 verifyFormat("typedef struct A2 {\n"
550 " int X;\n"
551 "} A2_t;",
552 AllowSimpleBracedStatements);
Daniel Jasperbd630732014-05-22 13:25:26 +0000553 verifyFormat("template <int> struct A2 {\n"
554 " struct B {};\n"
555 "};",
556 AllowSimpleBracedStatements);
557
Daniel Jasper17605d32014-05-14 09:33:35 +0000558 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000559 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000560 verifyFormat("if (true) {\n"
561 " f();\n"
562 "}",
563 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000564 verifyFormat("if (true) {\n"
565 " f();\n"
566 "} else {\n"
567 " f();\n"
568 "}",
569 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000570
571 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000572 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000573 verifyFormat("while (true) {\n"
574 " f();\n"
575 "}",
576 AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000577 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000578 verifyFormat("for (;;) {\n"
579 " f();\n"
580 "}",
581 AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000582
583 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
584 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
585 AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = true;
586
587 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
588 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
589 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
590 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
591 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
592 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
593 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
594 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
595 verifyFormat("if (true)\n"
596 "{\n"
597 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
598 "}",
599 AllowSimpleBracedStatements);
600 verifyFormat("if (true)\n"
601 "{ //\n"
602 " f();\n"
603 "}",
604 AllowSimpleBracedStatements);
605 verifyFormat("if (true)\n"
606 "{\n"
607 " f();\n"
608 " f();\n"
609 "}",
610 AllowSimpleBracedStatements);
611 verifyFormat("if (true)\n"
612 "{\n"
613 " f();\n"
614 "} else\n"
615 "{\n"
616 " f();\n"
617 "}",
618 AllowSimpleBracedStatements);
619
620 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
621 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
622 verifyFormat("if (true)\n"
623 "{\n"
624 " f();\n"
625 "}",
626 AllowSimpleBracedStatements);
627 verifyFormat("if (true)\n"
628 "{\n"
629 " f();\n"
630 "} else\n"
631 "{\n"
632 " f();\n"
633 "}",
634 AllowSimpleBracedStatements);
635
636 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
637 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
638 verifyFormat("while (true)\n"
639 "{\n"
640 " f();\n"
641 "}",
642 AllowSimpleBracedStatements);
643 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
644 verifyFormat("for (;;)\n"
645 "{\n"
646 " f();\n"
647 "}",
648 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000649}
650
Krasimir Georgievbf4cdda2018-01-19 16:12:37 +0000651TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) {
652 FormatStyle Style = getLLVMStyleWithColumns(60);
653 Style.AllowShortBlocksOnASingleLine = true;
654 Style.AllowShortIfStatementsOnASingleLine = true;
655 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
656 EXPECT_EQ("#define A \\\n"
657 " if (HANDLEwernufrnuLwrmviferuvnierv) \\\n"
658 " { RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; }\n"
659 "X;",
660 format("#define A \\\n"
661 " if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n"
662 " RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n"
663 " }\n"
664 "X;",
665 Style));
666}
667
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000668TEST_F(FormatTest, ParseIfElse) {
669 verifyFormat("if (true)\n"
670 " if (true)\n"
671 " if (true)\n"
672 " f();\n"
673 " else\n"
674 " g();\n"
675 " else\n"
676 " h();\n"
677 "else\n"
678 " i();");
679 verifyFormat("if (true)\n"
680 " if (true)\n"
681 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000682 " if (true)\n"
683 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000684 " } else {\n"
685 " g();\n"
686 " }\n"
687 " else\n"
688 " h();\n"
689 "else {\n"
690 " i();\n"
691 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000692 verifyFormat("if (true)\n"
693 " if constexpr (true)\n"
694 " if (true) {\n"
695 " if constexpr (true)\n"
696 " f();\n"
697 " } else {\n"
698 " g();\n"
699 " }\n"
700 " else\n"
701 " h();\n"
702 "else {\n"
703 " i();\n"
704 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000705 verifyFormat("void f() {\n"
706 " if (a) {\n"
707 " } else {\n"
708 " }\n"
709 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000710}
711
712TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000713 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000714 verifyFormat("if (a)\n"
715 " f();\n"
716 "else if (b)\n"
717 " g();\n"
718 "else\n"
719 " h();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000720 verifyFormat("if constexpr (a)\n"
721 " f();\n"
722 "else if constexpr (b)\n"
723 " g();\n"
724 "else\n"
725 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000726 verifyFormat("if (a) {\n"
727 " f();\n"
728 "}\n"
729 "// or else ..\n"
730 "else {\n"
731 " g()\n"
732 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000733
734 verifyFormat("if (a) {\n"
735 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
736 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
737 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000738 verifyFormat("if (a) {\n"
739 "} else if (\n"
740 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
741 "}",
742 getLLVMStyleWithColumns(62));
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000743 verifyFormat("if (a) {\n"
744 "} else if constexpr (\n"
745 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
746 "}",
747 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000748}
749
Daniel Jasperf7935112012-12-03 18:12:45 +0000750TEST_F(FormatTest, FormatsForLoop) {
751 verifyFormat(
752 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000753 " ++VeryVeryLongLoopVariable)\n"
754 " ;");
755 verifyFormat("for (;;)\n"
756 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000757 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000758 verifyFormat("for (;;) {\n"
759 " f();\n"
760 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000761 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000762
763 verifyFormat(
764 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
765 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000766 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000767
768 verifyFormat(
769 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000770 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000771 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
772 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000773 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000774 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
775 " I = FD->getDeclsInPrototypeScope().begin(),\n"
776 " E = FD->getDeclsInPrototypeScope().end();\n"
777 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000778 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
779 " I = Container.begin(),\n"
780 " E = Container.end();\n"
781 " I != E; ++I) {\n}",
782 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000783
Daniel Jasper48c62f92013-01-28 17:30:17 +0000784 verifyFormat(
785 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
786 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000787 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
788 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000789 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000790 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
791 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
792 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000793 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
794 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
795 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000796 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
797 " aaaaaaaaaa);\n"
798 " iter; ++iter) {\n"
799 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000800 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
801 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
802 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
803 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000804
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +0000805 // These should not be formatted as Objective-C for-in loops.
806 verifyFormat("for (Foo *x = 0; x != in; x++) {\n}");
807 verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}");
808 verifyFormat("Foo *x;\nfor (x in y) {\n}");
809 verifyFormat("for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}");
810
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000811 FormatStyle NoBinPacking = getLLVMStyle();
812 NoBinPacking.BinPackParameters = false;
813 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
814 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
815 " aaaaaaaaaaaaaaaa,\n"
816 " aaaaaaaaaaaaaaaa,\n"
817 " aaaaaaaaaaaaaaaa);\n"
818 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
819 "}",
820 NoBinPacking);
821 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000822 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
823 " E = UnwrappedLines.end();\n"
824 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000825 " ++I) {\n}",
826 NoBinPacking);
Daniel Jasper7b85a192017-09-03 08:56:24 +0000827
828 FormatStyle AlignLeft = getLLVMStyle();
829 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
830 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft);
Daniel Jasperf7935112012-12-03 18:12:45 +0000831}
832
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000833TEST_F(FormatTest, RangeBasedForLoops) {
834 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
835 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
836 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
837 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000838 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
839 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000840 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
841 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000842}
843
Daniel Jaspere1e43192014-04-01 12:55:11 +0000844TEST_F(FormatTest, ForEachLoops) {
845 verifyFormat("void f() {\n"
846 " foreach (Item *item, itemlist) {}\n"
847 " Q_FOREACH (Item *item, itemlist) {}\n"
848 " BOOST_FOREACH (Item *item, itemlist) {}\n"
849 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
850 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000851
852 // As function-like macros.
853 verifyFormat("#define foreach(x, y)\n"
854 "#define Q_FOREACH(x, y)\n"
855 "#define BOOST_FOREACH(x, y)\n"
856 "#define UNKNOWN_FOREACH(x, y)\n");
857
858 // Not as function-like macros.
859 verifyFormat("#define foreach (x, y)\n"
860 "#define Q_FOREACH (x, y)\n"
861 "#define BOOST_FOREACH (x, y)\n"
862 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000863}
864
Daniel Jasperf7935112012-12-03 18:12:45 +0000865TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000866 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000867 verifyFormat("while (true)\n"
868 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000869 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000870 verifyFormat("while () {\n"
871 " f();\n"
872 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000873}
874
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000875TEST_F(FormatTest, FormatsDoWhile) {
876 verifyFormat("do {\n"
877 " do_something();\n"
878 "} while (something());");
879 verifyFormat("do\n"
880 " do_something();\n"
881 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000882}
883
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000884TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000885 verifyFormat("switch (x) {\n"
886 "case 1:\n"
887 " f();\n"
888 " break;\n"
889 "case kFoo:\n"
890 "case ns::kBar:\n"
891 "case kBaz:\n"
892 " break;\n"
893 "default:\n"
894 " g();\n"
895 " break;\n"
896 "}");
897 verifyFormat("switch (x) {\n"
898 "case 1: {\n"
899 " f();\n"
900 " break;\n"
901 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000902 "case 2: {\n"
903 " break;\n"
904 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000905 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000906 verifyFormat("switch (x) {\n"
907 "case 1: {\n"
908 " f();\n"
909 " {\n"
910 " g();\n"
911 " h();\n"
912 " }\n"
913 " break;\n"
914 "}\n"
915 "}");
916 verifyFormat("switch (x) {\n"
917 "case 1: {\n"
918 " f();\n"
919 " if (foo) {\n"
920 " g();\n"
921 " h();\n"
922 " }\n"
923 " break;\n"
924 "}\n"
925 "}");
926 verifyFormat("switch (x) {\n"
927 "case 1: {\n"
928 " f();\n"
929 " g();\n"
930 "} break;\n"
931 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000932 verifyFormat("switch (test)\n"
933 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000934 verifyFormat("switch (x) {\n"
935 "default: {\n"
936 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000937 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000938 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000939 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000940 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000941 "// if 1, do f()\n"
942 "case 1:\n"
943 " f();\n"
944 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000945 verifyFormat("switch (x) {\n"
946 "case 1:\n"
947 " // Do amazing stuff\n"
948 " {\n"
949 " f();\n"
950 " g();\n"
951 " }\n"
952 " break;\n"
953 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000954 verifyFormat("#define A \\\n"
955 " switch (x) { \\\n"
956 " case a: \\\n"
957 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000958 " }",
959 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000960 verifyFormat("#define OPERATION_CASE(name) \\\n"
961 " case OP_name: \\\n"
962 " return operations::Operation##name\n",
963 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000964 verifyFormat("switch (x) {\n"
965 "case 1:;\n"
966 "default:;\n"
967 " int i;\n"
968 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000969
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000970 verifyGoogleFormat("switch (x) {\n"
971 " case 1:\n"
972 " f();\n"
973 " break;\n"
974 " case kFoo:\n"
975 " case ns::kBar:\n"
976 " case kBaz:\n"
977 " break;\n"
978 " default:\n"
979 " g();\n"
980 " break;\n"
981 "}");
982 verifyGoogleFormat("switch (x) {\n"
983 " case 1: {\n"
984 " f();\n"
985 " break;\n"
986 " }\n"
987 "}");
988 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000989 " ;");
990
991 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
992 " case OP_name: \\\n"
993 " return operations::Operation##name\n");
994 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
995 " // Get the correction operation class.\n"
996 " switch (OpCode) {\n"
997 " CASE(Add);\n"
998 " CASE(Subtract);\n"
999 " default:\n"
1000 " return operations::Unknown;\n"
1001 " }\n"
1002 "#undef OPERATION_CASE\n"
1003 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00001004 verifyFormat("DEBUG({\n"
1005 " switch (x) {\n"
1006 " case A:\n"
1007 " f();\n"
1008 " break;\n"
Krasimir Georgieve0926342017-07-12 15:21:43 +00001009 " // fallthrough\n"
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00001010 " case B:\n"
1011 " g();\n"
1012 " break;\n"
1013 " }\n"
1014 "});");
Krasimir Georgieve0926342017-07-12 15:21:43 +00001015 EXPECT_EQ("DEBUG({\n"
1016 " switch (x) {\n"
1017 " case A:\n"
1018 " f();\n"
1019 " break;\n"
1020 " // On B:\n"
1021 " case B:\n"
1022 " g();\n"
1023 " break;\n"
1024 " }\n"
1025 "});",
1026 format("DEBUG({\n"
1027 " switch (x) {\n"
1028 " case A:\n"
1029 " f();\n"
1030 " break;\n"
1031 " // On B:\n"
1032 " case B:\n"
1033 " g();\n"
1034 " break;\n"
1035 " }\n"
1036 "});",
1037 getLLVMStyle()));
Jonas Toth81b61a82018-09-02 09:04:51 +00001038 EXPECT_EQ("switch (n) {\n"
1039 "case 0: {\n"
1040 " return false;\n"
1041 "}\n"
1042 "default: {\n"
1043 " return true;\n"
1044 "}\n"
1045 "}",
1046 format("switch (n)\n"
1047 "{\n"
1048 "case 0: {\n"
1049 " return false;\n"
1050 "}\n"
1051 "default: {\n"
1052 " return true;\n"
1053 "}\n"
1054 "}",
1055 getLLVMStyle()));
Daniel Jasper031e2402014-04-28 07:48:36 +00001056 verifyFormat("switch (a) {\n"
1057 "case (b):\n"
1058 " return;\n"
1059 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +00001060
1061 verifyFormat("switch (a) {\n"
1062 "case some_namespace::\n"
1063 " some_constant:\n"
1064 " return;\n"
1065 "}",
1066 getLLVMStyleWithColumns(34));
Owen Pan58c3dee2018-09-13 07:27:15 +00001067
1068 FormatStyle Style = getLLVMStyle();
1069 Style.IndentCaseLabels = true;
1070 Style.AllowShortBlocksOnASingleLine = false;
1071 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1072 Style.BraceWrapping.AfterControlStatement = true;
1073 EXPECT_EQ("switch (n)\n"
1074 "{\n"
1075 " case 0:\n"
1076 " {\n"
1077 " return false;\n"
1078 " }\n"
1079 " default:\n"
1080 " {\n"
1081 " return true;\n"
1082 " }\n"
1083 "}",
1084 format("switch (n) {\n"
1085 " case 0: {\n"
1086 " return false;\n"
1087 " }\n"
1088 " default: {\n"
1089 " return true;\n"
1090 " }\n"
1091 "}",
1092 Style));
Daniel Jasperf7935112012-12-03 18:12:45 +00001093}
1094
Daniel Jasper2d0cd492013-10-20 16:56:16 +00001095TEST_F(FormatTest, CaseRanges) {
1096 verifyFormat("switch (x) {\n"
1097 "case 'A' ... 'Z':\n"
1098 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +00001099 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +00001100 " break;\n"
1101 "}");
1102}
1103
Daniel Jasperb87899b2014-09-10 13:11:45 +00001104TEST_F(FormatTest, ShortCaseLabels) {
1105 FormatStyle Style = getLLVMStyle();
1106 Style.AllowShortCaseLabelsOnASingleLine = true;
1107 verifyFormat("switch (a) {\n"
1108 "case 1: x = 1; break;\n"
1109 "case 2: return;\n"
1110 "case 3:\n"
1111 "case 4:\n"
1112 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +00001113 "case 6: // comment\n"
1114 " return;\n"
1115 "case 7:\n"
1116 " // comment\n"
1117 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +00001118 "case 8:\n"
1119 " x = 8; // comment\n"
1120 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +00001121 "default: y = 1; break;\n"
1122 "}",
1123 Style);
1124 verifyFormat("switch (a) {\n"
Francois Ferranda64ba702017-07-28 07:56:18 +00001125 "case 0: return; // comment\n"
1126 "case 1: break; // comment\n"
1127 "case 2: return;\n"
1128 "// comment\n"
1129 "case 3: return;\n"
1130 "// comment 1\n"
1131 "// comment 2\n"
1132 "// comment 3\n"
1133 "case 4: break; /* comment */\n"
1134 "case 5:\n"
1135 " // comment\n"
1136 " break;\n"
1137 "case 6: /* comment */ x = 1; break;\n"
1138 "case 7: x = /* comment */ 1; break;\n"
1139 "case 8:\n"
1140 " x = 1; /* comment */\n"
1141 " break;\n"
1142 "case 9:\n"
1143 " break; // comment line 1\n"
1144 " // comment line 2\n"
1145 "}",
1146 Style);
1147 EXPECT_EQ("switch (a) {\n"
1148 "case 1:\n"
1149 " x = 8;\n"
1150 " // fall through\n"
1151 "case 2: x = 8;\n"
1152 "// comment\n"
1153 "case 3:\n"
1154 " return; /* comment line 1\n"
1155 " * comment line 2 */\n"
1156 "case 4: i = 8;\n"
1157 "// something else\n"
1158 "#if FOO\n"
1159 "case 5: break;\n"
1160 "#endif\n"
1161 "}",
1162 format("switch (a) {\n"
1163 "case 1: x = 8;\n"
1164 " // fall through\n"
1165 "case 2:\n"
1166 " x = 8;\n"
1167 "// comment\n"
1168 "case 3:\n"
1169 " return; /* comment line 1\n"
1170 " * comment line 2 */\n"
1171 "case 4:\n"
1172 " i = 8;\n"
1173 "// something else\n"
1174 "#if FOO\n"
1175 "case 5: break;\n"
1176 "#endif\n"
1177 "}",
1178 Style));
1179 EXPECT_EQ("switch (a) {\n" "case 0:\n"
1180 " return; // long long long long long long long long long long long long comment\n"
1181 " // line\n" "}",
1182 format("switch (a) {\n"
1183 "case 0: return; // long long long long long long long long long long long long comment line\n"
1184 "}",
1185 Style));
1186 EXPECT_EQ("switch (a) {\n"
1187 "case 0:\n"
1188 " return; /* long long long long long long long long long long long long comment\n"
1189 " line */\n"
1190 "}",
1191 format("switch (a) {\n"
1192 "case 0: return; /* long long long long long long long long long long long long comment line */\n"
1193 "}",
1194 Style));
1195 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +00001196 "#if FOO\n"
1197 "case 0: return 0;\n"
1198 "#endif\n"
1199 "}",
1200 Style);
1201 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +00001202 "case 1: {\n"
1203 "}\n"
1204 "case 2: {\n"
1205 " return;\n"
1206 "}\n"
1207 "case 3: {\n"
1208 " x = 1;\n"
1209 " return;\n"
1210 "}\n"
1211 "case 4:\n"
1212 " if (x)\n"
1213 " return;\n"
1214 "}",
1215 Style);
1216 Style.ColumnLimit = 21;
1217 verifyFormat("switch (a) {\n"
1218 "case 1: x = 1; break;\n"
1219 "case 2: return;\n"
1220 "case 3:\n"
1221 "case 4:\n"
1222 "case 5: return;\n"
1223 "default:\n"
1224 " y = 1;\n"
1225 " break;\n"
1226 "}",
1227 Style);
Jonas Toth90d2aa22018-08-24 17:25:06 +00001228 Style.ColumnLimit = 80;
1229 Style.AllowShortCaseLabelsOnASingleLine = false;
1230 Style.IndentCaseLabels = true;
1231 EXPECT_EQ("switch (n) {\n"
1232 " default /*comments*/:\n"
1233 " return true;\n"
1234 " case 0:\n"
1235 " return false;\n"
1236 "}",
1237 format("switch (n) {\n"
1238 "default/*comments*/:\n"
1239 " return true;\n"
1240 "case 0:\n"
1241 " return false;\n"
1242 "}",
1243 Style));
Owen Pan9da65a32018-09-21 03:46:36 +00001244 Style.AllowShortCaseLabelsOnASingleLine = true;
1245 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1246 Style.BraceWrapping.AfterControlStatement = true;
1247 EXPECT_EQ("switch (n)\n"
1248 "{\n"
1249 " case 0:\n"
1250 " {\n"
1251 " return false;\n"
1252 " }\n"
1253 " default:\n"
1254 " {\n"
1255 " return true;\n"
1256 " }\n"
1257 "}",
1258 format("switch (n) {\n"
1259 " case 0: {\n"
1260 " return false;\n"
1261 " }\n"
1262 " default:\n"
1263 " {\n"
1264 " return true;\n"
1265 " }\n"
1266 "}",
1267 Style));
Daniel Jasperb87899b2014-09-10 13:11:45 +00001268}
1269
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001270TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +00001271 verifyFormat("void f() {\n"
1272 " some_code();\n"
1273 "test_label:\n"
1274 " some_other_code();\n"
1275 " {\n"
1276 " some_more_code();\n"
1277 " another_label:\n"
1278 " some_more_code();\n"
1279 " }\n"
1280 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +00001281 verifyFormat("{\n"
1282 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00001283 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +00001284 " some_other_code();\n"
1285 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +00001286 verifyFormat("{\n"
1287 " some_code();\n"
1288 "test_label:;\n"
1289 " int i = 0;\n"
1290 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00001291}
1292
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001293//===----------------------------------------------------------------------===//
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001294// Tests for classes, namespaces, etc.
1295//===----------------------------------------------------------------------===//
1296
1297TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001298 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001299}
1300
1301TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1302 verifyFormat("class A {\n"
1303 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00001304 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001305 "protected:\n"
1306 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001307 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001308 "};");
Sam McCall6f3778c2018-09-05 07:44:02 +00001309 verifyFormat("export class A {\n"
1310 "public:\n"
1311 "public: // comment\n"
1312 "protected:\n"
1313 "private:\n"
1314 " void f() {}\n"
1315 "};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001316 verifyGoogleFormat("class A {\n"
1317 " public:\n"
1318 " protected:\n"
1319 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001320 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001321 "};");
Sam McCall6f3778c2018-09-05 07:44:02 +00001322 verifyGoogleFormat("export class A {\n"
1323 " public:\n"
1324 " protected:\n"
1325 " private:\n"
1326 " void f() {}\n"
1327 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00001328 verifyFormat("class A {\n"
1329 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001330 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00001331 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001332 " void f2() {}\n"
1333 "protected slots:\n"
1334 " void f3() {}\n"
1335 "protected Q_SLOTS:\n"
1336 " void f4() {}\n"
1337 "private slots:\n"
1338 " void f5() {}\n"
1339 "private Q_SLOTS:\n"
1340 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00001341 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001342 " void g1();\n"
1343 "Q_SIGNALS:\n"
1344 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00001345 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00001346
1347 // Don't interpret 'signals' the wrong way.
1348 verifyFormat("signals.set();");
1349 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00001350 verifyFormat("{\n"
1351 " signals.set(); // This needs indentation.\n"
1352 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00001353 verifyFormat("void f() {\n"
1354 "label:\n"
1355 " signals.baz();\n"
1356 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001357}
1358
Alexander Kornienkofd433362013-03-27 17:08:02 +00001359TEST_F(FormatTest, SeparatesLogicalBlocks) {
1360 EXPECT_EQ("class A {\n"
1361 "public:\n"
1362 " void f();\n"
1363 "\n"
1364 "private:\n"
1365 " void g() {}\n"
1366 " // test\n"
1367 "protected:\n"
1368 " int h;\n"
1369 "};",
1370 format("class A {\n"
1371 "public:\n"
1372 "void f();\n"
1373 "private:\n"
1374 "void g() {}\n"
1375 "// test\n"
1376 "protected:\n"
1377 "int h;\n"
1378 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00001379 EXPECT_EQ("class A {\n"
1380 "protected:\n"
1381 "public:\n"
1382 " void f();\n"
1383 "};",
1384 format("class A {\n"
1385 "protected:\n"
1386 "\n"
1387 "public:\n"
1388 "\n"
1389 " void f();\n"
1390 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00001391
1392 // Even ensure proper spacing inside macros.
1393 EXPECT_EQ("#define B \\\n"
1394 " class A { \\\n"
1395 " protected: \\\n"
1396 " public: \\\n"
1397 " void f(); \\\n"
1398 " };",
1399 format("#define B \\\n"
1400 " class A { \\\n"
1401 " protected: \\\n"
1402 " \\\n"
1403 " public: \\\n"
1404 " \\\n"
1405 " void f(); \\\n"
1406 " };",
1407 getGoogleStyle()));
1408 // But don't remove empty lines after macros ending in access specifiers.
1409 EXPECT_EQ("#define A private:\n"
1410 "\n"
1411 "int i;",
1412 format("#define A private:\n"
1413 "\n"
1414 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00001415}
1416
Daniel Jasper83193602013-04-05 17:22:09 +00001417TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001418 verifyFormat("class A : public B {};");
1419 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001420
1421 verifyFormat(
1422 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001423 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00001424 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1425 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001426 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001427 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001428 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001429 verifyFormat("class AAAAAAAAAAAA : public B,\n"
1430 " public C,\n"
1431 " public D,\n"
1432 " public E,\n"
1433 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001434 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00001435
1436 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00001437 " ReallyReallyLongClassName {\n"
1438 " int i;\n"
1439 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00001440 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00001441 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1442 " aaaaaaaaaaaaaaaa> {};");
1443 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1444 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1445 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00001446 verifyFormat("template <class R, class C>\n"
1447 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1448 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00001449 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00001450}
1451
Francois Ferrand6bb103f2018-06-11 14:41:26 +00001452TEST_F(FormatTest, BreakInheritanceStyle) {
1453 FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle();
1454 StyleWithInheritanceBreakBeforeComma.BreakInheritanceList =
1455 FormatStyle::BILS_BeforeComma;
1456 verifyFormat("class MyClass : public X {};",
1457 StyleWithInheritanceBreakBeforeComma);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00001458 verifyFormat("class MyClass\n"
1459 " : public X\n"
1460 " , public Y {};",
Francois Ferrand6bb103f2018-06-11 14:41:26 +00001461 StyleWithInheritanceBreakBeforeComma);
1462 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n"
1463 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n"
1464 " , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1465 StyleWithInheritanceBreakBeforeComma);
1466 verifyFormat("struct aaaaaaaaaaaaa\n"
1467 " : public aaaaaaaaaaaaaaaaaaa< // break\n"
1468 " aaaaaaaaaaaaaaaa> {};",
1469 StyleWithInheritanceBreakBeforeComma);
1470
1471 FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle();
1472 StyleWithInheritanceBreakAfterColon.BreakInheritanceList =
1473 FormatStyle::BILS_AfterColon;
1474 verifyFormat("class MyClass : public X {};",
1475 StyleWithInheritanceBreakAfterColon);
1476 verifyFormat("class MyClass : public X, public Y {};",
1477 StyleWithInheritanceBreakAfterColon);
1478 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n"
1479 " public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1480 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1481 StyleWithInheritanceBreakAfterColon);
1482 verifyFormat("struct aaaaaaaaaaaaa :\n"
1483 " public aaaaaaaaaaaaaaaaaaa< // break\n"
1484 " aaaaaaaaaaaaaaaa> {};",
1485 StyleWithInheritanceBreakAfterColon);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00001486}
1487
Manuel Klimek28cacc72013-01-07 18:10:23 +00001488TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00001489 verifyFormat("class A {\n} a, b;");
1490 verifyFormat("struct A {\n} a, b;");
1491 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00001492}
1493
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001494TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001495 verifyFormat("enum {\n"
1496 " Zero,\n"
1497 " One = 1,\n"
1498 " Two = One + 1,\n"
1499 " Three = (One + Two),\n"
1500 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1501 " Five = (One, Two, Three, Four, 5)\n"
1502 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001503 verifyGoogleFormat("enum {\n"
1504 " Zero,\n"
1505 " One = 1,\n"
1506 " Two = One + 1,\n"
1507 " Three = (One + Two),\n"
1508 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1509 " Five = (One, Two, Three, Four, 5)\n"
1510 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001511 verifyFormat("enum Enum {};");
1512 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001513 verifyFormat("enum X E {} d;");
1514 verifyFormat("enum __attribute__((...)) E {} d;");
1515 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00001516 verifyFormat("enum {\n"
1517 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001518 "};",
1519 getLLVMStyleWithColumns(30));
1520
1521 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00001522 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001523
1524 EXPECT_EQ("enum KeepEmptyLines {\n"
1525 " ONE,\n"
1526 "\n"
1527 " TWO,\n"
1528 "\n"
1529 " THREE\n"
1530 "}",
1531 format("enum KeepEmptyLines {\n"
1532 " ONE,\n"
1533 "\n"
1534 " TWO,\n"
1535 "\n"
1536 "\n"
1537 " THREE\n"
1538 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00001539 verifyFormat("enum E { // comment\n"
1540 " ONE,\n"
1541 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00001542 "};\n"
1543 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001544 // Not enums.
1545 verifyFormat("enum X f() {\n"
1546 " a();\n"
1547 " return 42;\n"
1548 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00001549 verifyFormat("enum X Type::f() {\n"
1550 " a();\n"
1551 " return 42;\n"
1552 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001553 verifyFormat("enum ::X f() {\n"
1554 " a();\n"
1555 " return 42;\n"
1556 "}");
1557 verifyFormat("enum ns::X f() {\n"
1558 " a();\n"
1559 " return 42;\n"
1560 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001561}
1562
Daniel Jasperb7150872013-08-30 10:10:19 +00001563TEST_F(FormatTest, FormatsEnumsWithErrors) {
1564 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001565 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001566 " Two = 1;\n"
1567 "};");
1568 verifyFormat("namespace n {\n"
1569 "enum Type {\n"
1570 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001571 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001572 " int i;\n"
1573 "}\n"
1574 "void g() {}");
1575}
1576
Daniel Jasper2b41a822013-08-20 12:42:50 +00001577TEST_F(FormatTest, FormatsEnumStruct) {
1578 verifyFormat("enum struct {\n"
1579 " Zero,\n"
1580 " One = 1,\n"
1581 " Two = One + 1,\n"
1582 " Three = (One + Two),\n"
1583 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1584 " Five = (One, Two, Three, Four, 5)\n"
1585 "};");
1586 verifyFormat("enum struct Enum {};");
1587 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001588 verifyFormat("enum struct X E {} d;");
1589 verifyFormat("enum struct __attribute__((...)) E {} d;");
1590 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001591 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
1592}
1593
1594TEST_F(FormatTest, FormatsEnumClass) {
1595 verifyFormat("enum class {\n"
1596 " Zero,\n"
1597 " One = 1,\n"
1598 " Two = One + 1,\n"
1599 " Three = (One + Two),\n"
1600 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1601 " Five = (One, Two, Three, Four, 5)\n"
1602 "};");
1603 verifyFormat("enum class Enum {};");
1604 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001605 verifyFormat("enum class X E {} d;");
1606 verifyFormat("enum class __attribute__((...)) E {} d;");
1607 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001608 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
1609}
1610
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001611TEST_F(FormatTest, FormatsEnumTypes) {
1612 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001613 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001614 " B\n"
1615 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00001616 verifyFormat("enum X : int { A, B };");
1617 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001618}
1619
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001620TEST_F(FormatTest, FormatsTypedefEnum) {
1621 FormatStyle Style = getLLVMStyle();
1622 Style.ColumnLimit = 40;
1623 verifyFormat("typedef enum {} EmptyEnum;");
1624 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1625 verifyFormat("typedef enum {\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001626 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001627 " ONE = 1,\n"
1628 " TWO = 2,\n"
1629 " THREE = 3\n"
1630 "} LongEnum;",
1631 Style);
1632 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1633 Style.BraceWrapping.AfterEnum = true;
1634 verifyFormat("typedef enum {} EmptyEnum;");
1635 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1636 verifyFormat("typedef enum\n"
1637 "{\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001638 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001639 " ONE = 1,\n"
1640 " TWO = 2,\n"
1641 " THREE = 3\n"
1642 "} LongEnum;",
1643 Style);
1644}
1645
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001646TEST_F(FormatTest, FormatsNSEnums) {
1647 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1648 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1649 " // Information about someDecentlyLongValue.\n"
1650 " someDecentlyLongValue,\n"
1651 " // Information about anotherDecentlyLongValue.\n"
1652 " anotherDecentlyLongValue,\n"
1653 " // Information about aThirdDecentlyLongValue.\n"
1654 " aThirdDecentlyLongValue\n"
1655 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00001656 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1657 " a = 1,\n"
1658 " b = 2,\n"
1659 " c = 3,\n"
1660 "};");
1661 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1662 " a = 1,\n"
1663 " b = 2,\n"
1664 " c = 3,\n"
1665 "};");
1666 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1667 " a = 1,\n"
1668 " b = 2,\n"
1669 " c = 3,\n"
1670 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001671}
1672
Nico Weber7769a902013-01-14 05:49:49 +00001673TEST_F(FormatTest, FormatsBitfields) {
1674 verifyFormat("struct Bitfields {\n"
1675 " unsigned sClass : 8;\n"
1676 " unsigned ValueKind : 2;\n"
1677 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00001678 verifyFormat("struct A {\n"
1679 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1680 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1681 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00001682 verifyFormat("struct MyStruct {\n"
1683 " uchar data;\n"
1684 " uchar : 8;\n"
1685 " uchar : 8;\n"
1686 " uchar other;\n"
1687 "};");
Nico Weber7769a902013-01-14 05:49:49 +00001688}
1689
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001690TEST_F(FormatTest, FormatsNamespaces) {
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001691 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1692 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1693
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001694 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001695 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001696 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001697 "}",
1698 LLVMWithNoNamespaceFix);
Sam McCall6f3778c2018-09-05 07:44:02 +00001699 verifyFormat("/* something */ namespace some_namespace {\n"
1700 "class A {};\n"
1701 "void f() { f(); }\n"
1702 "}",
1703 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001704 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001705 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001706 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001707 "}",
1708 LLVMWithNoNamespaceFix);
Sam McCall6f3778c2018-09-05 07:44:02 +00001709 verifyFormat("/* something */ namespace {\n"
1710 "class A {};\n"
1711 "void f() { f(); }\n"
1712 "}",
1713 LLVMWithNoNamespaceFix);
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001714 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001715 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001716 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001717 "}",
1718 LLVMWithNoNamespaceFix);
Sam McCall6f3778c2018-09-05 07:44:02 +00001719 verifyFormat("/* something */ inline namespace X {\n"
1720 "class A {};\n"
1721 "void f() { f(); }\n"
1722 "}",
1723 LLVMWithNoNamespaceFix);
1724 verifyFormat("export namespace X {\n"
1725 "class A {};\n"
1726 "void f() { f(); }\n"
1727 "}",
1728 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001729 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001730 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001731 "void f() { f(); }",
1732 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001733
1734 // This code is more common than we thought; if we
1735 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001736 // its own line, which is undesirable.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001737 verifyFormat("namespace {};",
1738 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001739 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001740 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001741 "};",
1742 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001743
1744 verifyFormat("namespace {\n"
1745 "int SomeVariable = 0; // comment\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001746 "} // namespace",
1747 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001748 EXPECT_EQ("#ifndef HEADER_GUARD\n"
1749 "#define HEADER_GUARD\n"
1750 "namespace my_namespace {\n"
1751 "int i;\n"
1752 "} // my_namespace\n"
1753 "#endif // HEADER_GUARD",
1754 format("#ifndef HEADER_GUARD\n"
1755 " #define HEADER_GUARD\n"
1756 " namespace my_namespace {\n"
1757 "int i;\n"
1758 "} // my_namespace\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001759 "#endif // HEADER_GUARD",
1760 LLVMWithNoNamespaceFix));
Daniel Jasper65ee3472013-07-31 23:16:02 +00001761
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001762 EXPECT_EQ("namespace A::B {\n"
1763 "class C {};\n"
1764 "}",
1765 format("namespace A::B {\n"
1766 "class C {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001767 "}",
1768 LLVMWithNoNamespaceFix));
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001769
Daniel Jasper65ee3472013-07-31 23:16:02 +00001770 FormatStyle Style = getLLVMStyle();
1771 Style.NamespaceIndentation = FormatStyle::NI_All;
1772 EXPECT_EQ("namespace out {\n"
1773 " int i;\n"
1774 " namespace in {\n"
1775 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001776 " } // namespace in\n"
1777 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001778 format("namespace out {\n"
1779 "int i;\n"
1780 "namespace in {\n"
1781 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001782 "} // namespace in\n"
1783 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001784 Style));
1785
1786 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1787 EXPECT_EQ("namespace out {\n"
1788 "int i;\n"
1789 "namespace in {\n"
1790 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001791 "} // namespace in\n"
1792 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001793 format("namespace out {\n"
1794 "int i;\n"
1795 "namespace in {\n"
1796 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001797 "} // namespace in\n"
1798 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001799 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001800}
1801
Francois Ferrande56a8292017-06-14 12:29:47 +00001802TEST_F(FormatTest, FormatsCompactNamespaces) {
1803 FormatStyle Style = getLLVMStyle();
1804 Style.CompactNamespaces = true;
1805
1806 verifyFormat("namespace A { namespace B {\n"
1807 "}} // namespace A::B",
1808 Style);
1809
1810 EXPECT_EQ("namespace out { namespace in {\n"
1811 "}} // namespace out::in",
1812 format("namespace out {\n"
1813 "namespace in {\n"
1814 "} // namespace in\n"
1815 "} // namespace out",
1816 Style));
1817
1818 // Only namespaces which have both consecutive opening and end get compacted
1819 EXPECT_EQ("namespace out {\n"
1820 "namespace in1 {\n"
1821 "} // namespace in1\n"
1822 "namespace in2 {\n"
1823 "} // namespace in2\n"
1824 "} // namespace out",
1825 format("namespace out {\n"
1826 "namespace in1 {\n"
1827 "} // namespace in1\n"
1828 "namespace in2 {\n"
1829 "} // namespace in2\n"
1830 "} // namespace out",
1831 Style));
1832
1833 EXPECT_EQ("namespace out {\n"
1834 "int i;\n"
1835 "namespace in {\n"
1836 "int j;\n"
1837 "} // namespace in\n"
1838 "int k;\n"
1839 "} // namespace out",
1840 format("namespace out { int i;\n"
1841 "namespace in { int j; } // namespace in\n"
1842 "int k; } // namespace out",
1843 Style));
1844
1845 EXPECT_EQ("namespace A { namespace B { namespace C {\n"
1846 "}}} // namespace A::B::C\n",
1847 format("namespace A { namespace B {\n"
1848 "namespace C {\n"
1849 "}} // namespace B::C\n"
1850 "} // namespace A\n",
1851 Style));
1852
1853 Style.ColumnLimit = 40;
1854 EXPECT_EQ("namespace aaaaaaaaaa {\n"
1855 "namespace bbbbbbbbbb {\n"
1856 "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
1857 format("namespace aaaaaaaaaa {\n"
1858 "namespace bbbbbbbbbb {\n"
1859 "} // namespace bbbbbbbbbb\n"
1860 "} // namespace aaaaaaaaaa",
1861 Style));
1862
1863 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
1864 "namespace cccccc {\n"
1865 "}}} // namespace aaaaaa::bbbbbb::cccccc",
1866 format("namespace aaaaaa {\n"
1867 "namespace bbbbbb {\n"
1868 "namespace cccccc {\n"
1869 "} // namespace cccccc\n"
1870 "} // namespace bbbbbb\n"
1871 "} // namespace aaaaaa",
1872 Style));
1873 Style.ColumnLimit = 80;
1874
1875 // Extra semicolon after 'inner' closing brace prevents merging
1876 EXPECT_EQ("namespace out { namespace in {\n"
1877 "}; } // namespace out::in",
1878 format("namespace out {\n"
1879 "namespace in {\n"
1880 "}; // namespace in\n"
1881 "} // namespace out",
1882 Style));
1883
1884 // Extra semicolon after 'outer' closing brace is conserved
1885 EXPECT_EQ("namespace out { namespace in {\n"
1886 "}}; // namespace out::in",
1887 format("namespace out {\n"
1888 "namespace in {\n"
1889 "} // namespace in\n"
1890 "}; // namespace out",
1891 Style));
1892
1893 Style.NamespaceIndentation = FormatStyle::NI_All;
1894 EXPECT_EQ("namespace out { namespace in {\n"
1895 " int i;\n"
1896 "}} // namespace out::in",
1897 format("namespace out {\n"
1898 "namespace in {\n"
1899 "int i;\n"
1900 "} // namespace in\n"
1901 "} // namespace out",
1902 Style));
1903 EXPECT_EQ("namespace out { namespace mid {\n"
1904 " namespace in {\n"
1905 " int j;\n"
1906 " } // namespace in\n"
1907 " int k;\n"
1908 "}} // namespace out::mid",
1909 format("namespace out { namespace mid {\n"
1910 "namespace in { int j; } // namespace in\n"
1911 "int k; }} // namespace out::mid",
1912 Style));
1913
1914 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1915 EXPECT_EQ("namespace out { namespace in {\n"
1916 " int i;\n"
1917 "}} // namespace out::in",
1918 format("namespace out {\n"
1919 "namespace in {\n"
1920 "int i;\n"
1921 "} // namespace in\n"
1922 "} // namespace out",
1923 Style));
1924 EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
1925 " int i;\n"
1926 "}}} // namespace out::mid::in",
1927 format("namespace out {\n"
1928 "namespace mid {\n"
1929 "namespace in {\n"
1930 "int i;\n"
1931 "} // namespace in\n"
1932 "} // namespace mid\n"
1933 "} // namespace out",
1934 Style));
1935}
1936
Krasimir Georgievd6ce9372017-09-15 11:23:50 +00001937TEST_F(FormatTest, FormatsExternC) {
1938 verifyFormat("extern \"C\" {\nint a;");
1939 verifyFormat("extern \"C\" {}");
1940 verifyFormat("extern \"C\" {\n"
1941 "int foo();\n"
1942 "}");
1943 verifyFormat("extern \"C\" int foo() {}");
1944 verifyFormat("extern \"C\" int foo();");
1945 verifyFormat("extern \"C\" int foo() {\n"
1946 " int i = 42;\n"
1947 " return i;\n"
1948 "}");
1949
1950 FormatStyle Style = getLLVMStyle();
1951 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1952 Style.BraceWrapping.AfterFunction = true;
1953 verifyFormat("extern \"C\" int foo() {}", Style);
1954 verifyFormat("extern \"C\" int foo();", Style);
1955 verifyFormat("extern \"C\" int foo()\n"
1956 "{\n"
1957 " int i = 42;\n"
1958 " return i;\n"
1959 "}",
1960 Style);
1961
1962 Style.BraceWrapping.AfterExternBlock = true;
1963 Style.BraceWrapping.SplitEmptyRecord = false;
1964 verifyFormat("extern \"C\"\n"
1965 "{}",
1966 Style);
1967 verifyFormat("extern \"C\"\n"
1968 "{\n"
1969 " int foo();\n"
1970 "}",
1971 Style);
1972}
Manuel Klimekae610d12013-01-21 14:32:05 +00001973
Daniel Jasper40aacf42013-03-14 13:45:21 +00001974TEST_F(FormatTest, FormatsInlineASM) {
1975 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00001976 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00001977 verifyFormat(
1978 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1979 " \"cpuid\\n\\t\"\n"
1980 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00001981 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00001982 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00001983 EXPECT_EQ(
1984 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001985 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001986 " mov edx,[that] // vtable in edx\n"
1987 " mov eax,methodIndex\n"
1988 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001989 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001990 "}",
1991 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1992 " __asm {\n"
1993 " mov edx,[that] // vtable in edx\n"
1994 " mov eax,methodIndex\n"
1995 " call [edx][eax*4] // stdcall\n"
1996 " }\n"
1997 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00001998 EXPECT_EQ("_asm {\n"
1999 " xor eax, eax;\n"
2000 " cpuid;\n"
2001 "}",
2002 format("_asm {\n"
2003 " xor eax, eax;\n"
2004 " cpuid;\n"
2005 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00002006 verifyFormat("void function() {\n"
2007 " // comment\n"
2008 " asm(\"\");\n"
2009 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00002010 EXPECT_EQ("__asm {\n"
2011 "}\n"
2012 "int i;",
2013 format("__asm {\n"
2014 "}\n"
2015 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00002016}
2017
Nico Weberd5650bd2013-01-07 16:36:17 +00002018TEST_F(FormatTest, FormatTryCatch) {
2019 verifyFormat("try {\n"
2020 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002021 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002022 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002023 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002024 " exit(42);\n"
2025 "}");
2026
2027 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00002028 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002029 " return 5;\n"
2030 "}");
2031 verifyFormat("class A {\n"
2032 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002033 " A() try : a(0) {\n"
2034 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002035 " throw;\n"
2036 " }\n"
2037 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00002038
2039 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002040 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00002041}
2042
Nico Weberfac23712015-02-04 15:26:27 +00002043TEST_F(FormatTest, FormatSEHTryCatch) {
2044 verifyFormat("__try {\n"
2045 " int a = b * c;\n"
2046 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2047 " // Do nothing.\n"
2048 "}");
2049
2050 verifyFormat("__try {\n"
2051 " int a = b * c;\n"
2052 "} __finally {\n"
2053 " // Do nothing.\n"
2054 "}");
2055
2056 verifyFormat("DEBUG({\n"
2057 " __try {\n"
2058 " } __finally {\n"
2059 " }\n"
2060 "});\n");
2061}
2062
Daniel Jasper04a71a42014-05-08 11:58:24 +00002063TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2064 verifyFormat("try {\n"
2065 " f();\n"
2066 "} catch {\n"
2067 " g();\n"
2068 "}");
2069 verifyFormat("try {\n"
2070 " f();\n"
2071 "} catch (A a) MACRO(x) {\n"
2072 " g();\n"
2073 "} catch (B b) MACRO(x) {\n"
2074 " g();\n"
2075 "}");
2076}
2077
2078TEST_F(FormatTest, FormatTryCatchBraceStyles) {
2079 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00002080 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
2081 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00002082 Style.BreakBeforeBraces = BraceStyle;
2083 verifyFormat("try {\n"
2084 " // something\n"
2085 "} catch (...) {\n"
2086 " // something\n"
2087 "}",
2088 Style);
2089 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00002090 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
2091 verifyFormat("try {\n"
2092 " // something\n"
2093 "}\n"
2094 "catch (...) {\n"
2095 " // something\n"
2096 "}",
2097 Style);
Nico Weberfac23712015-02-04 15:26:27 +00002098 verifyFormat("__try {\n"
2099 " // something\n"
2100 "}\n"
2101 "__finally {\n"
2102 " // something\n"
2103 "}",
2104 Style);
Nico Weber33381f52015-02-07 01:57:32 +00002105 verifyFormat("@try {\n"
2106 " // something\n"
2107 "}\n"
2108 "@finally {\n"
2109 " // something\n"
2110 "}",
2111 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00002112 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2113 verifyFormat("try\n"
2114 "{\n"
2115 " // something\n"
2116 "}\n"
2117 "catch (...)\n"
2118 "{\n"
2119 " // something\n"
2120 "}",
2121 Style);
2122 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
2123 verifyFormat("try\n"
2124 " {\n"
2125 " // something\n"
2126 " }\n"
2127 "catch (...)\n"
2128 " {\n"
2129 " // something\n"
2130 " }",
2131 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00002132 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2133 Style.BraceWrapping.BeforeCatch = true;
2134 verifyFormat("try {\n"
2135 " // something\n"
2136 "}\n"
2137 "catch (...) {\n"
2138 " // something\n"
2139 "}",
2140 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00002141}
2142
Daniel Jaspere25509f2012-12-17 11:29:41 +00002143TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002144 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00002145
Daniel Jaspera44991332015-04-29 13:06:49 +00002146 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
2147 " 100000000, "
2148 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00002149
Daniel Jasper473c62c2013-05-17 09:35:01 +00002150 // Here, everything other than the "}" would fit on a line.
2151 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002152 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002153 EXPECT_EQ("S s = {a,\n"
2154 "\n"
2155 " b};",
2156 format("S s = {\n"
2157 " a,\n"
2158 "\n"
2159 " b\n"
2160 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00002161
2162 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
2163 // line. However, the formatting looks a bit off and this probably doesn't
2164 // happen often in practice.
2165 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002166 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00002167 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00002168}
2169
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002170TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002171 verifyFormat("const struct A a = {.a = 1, .b = 2};");
2172 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
2173 " .bbbbbbbbbb = 2,\n"
2174 " .cccccccccc = 3,\n"
2175 " .dddddddddd = 4,\n"
2176 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002177 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002178 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
2179 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
2180 " .ccccccccccccccccccccccccccc = 3,\n"
2181 " .ddddddddddddddddddddddddddd = 4,\n"
2182 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002183
2184 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00002185
2186 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
2187 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
2188 " [2] = bbbbbbbbbb,\n"
2189 " [3] = cccccccccc,\n"
2190 " [4] = dddddddddd,\n"
2191 " [5] = eeeeeeeeee};");
2192 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2193 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2194 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2195 " [3] = cccccccccccccccccccccccccccccccccccccc,\n"
2196 " [4] = dddddddddddddddddddddddddddddddddddddd,\n"
2197 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002198}
2199
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002200TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002201 verifyFormat("static A x = {{{}}};\n");
2202 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2203 " {init1, init2, init3, init4}}};",
2204 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00002205
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002206 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002207 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2208 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2209 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2210 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00002211 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002212 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2213 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2214 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00002215 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2216 " {rect.fRight - rect.fLeft, rect.fBottom - "
2217 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002218
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002219 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00002220 "SomeArrayOfSomeType a = {\n"
2221 " {{1, 2, 3},\n"
2222 " {1, 2, 3},\n"
2223 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
2224 " 333333333333333333333333333333},\n"
2225 " {1, 2, 3},\n"
2226 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00002227 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00002228 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002229 " {{1, 2, 3}},\n"
2230 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002231 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2232 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002233 " {{1, 2, 3}},\n"
2234 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002235
Daniel Jaspera44991332015-04-29 13:06:49 +00002236 verifyFormat("struct {\n"
2237 " unsigned bit;\n"
2238 " const char *const name;\n"
2239 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2240 " {kOsWin, \"Windows\"},\n"
2241 " {kOsLinux, \"Linux\"},\n"
2242 " {kOsCrOS, \"Chrome OS\"}};");
2243 verifyFormat("struct {\n"
2244 " unsigned bit;\n"
2245 " const char *const name;\n"
2246 "} kBitsToOs[] = {\n"
2247 " {kOsMac, \"Mac\"},\n"
2248 " {kOsWin, \"Windows\"},\n"
2249 " {kOsLinux, \"Linux\"},\n"
2250 " {kOsCrOS, \"Chrome OS\"},\n"
2251 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002252}
2253
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002254TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2255 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2256 " \\\n"
2257 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2258}
2259
Daniel Jasperda16db32013-01-07 10:48:50 +00002260TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002261 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2262 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00002263
2264 // Do break defaulted and deleted functions.
2265 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2266 " default;",
2267 getLLVMStyleWithColumns(40));
2268 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2269 " delete;",
2270 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002271}
2272
2273TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2274 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2275 getLLVMStyleWithColumns(40));
2276 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2277 getLLVMStyleWithColumns(40));
2278 EXPECT_EQ("#define Q \\\n"
2279 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
2280 " \"aaaaaaaa.cpp\"",
2281 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2282 getLLVMStyleWithColumns(40)));
2283}
2284
2285TEST_F(FormatTest, UnderstandsLinePPDirective) {
2286 EXPECT_EQ("# 123 \"A string literal\"",
2287 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00002288}
2289
Manuel Klimek591b5802013-01-31 15:58:48 +00002290TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00002291 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00002292 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002293}
2294
2295TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2296 EXPECT_EQ("#line 42 \"test\"\n",
2297 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002298 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
2299 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002300}
2301
2302TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2303 EXPECT_EQ("#line 42 \"test\"",
2304 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002305 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002306}
2307
Daniel Jasper877615c2013-10-11 19:45:02 +00002308TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2309 verifyFormat("#define A \\x20");
2310 verifyFormat("#define A \\ x20");
2311 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
2312 verifyFormat("#define A ''");
2313 verifyFormat("#define A ''qqq");
2314 verifyFormat("#define A `qqq");
2315 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00002316 EXPECT_EQ("const char *c = STRINGIFY(\n"
2317 "\\na : b);",
2318 format("const char * c = STRINGIFY(\n"
2319 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00002320
2321 verifyFormat("a\r\\");
2322 verifyFormat("a\v\\");
2323 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00002324}
2325
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002326TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002327 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2328 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002329 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002330 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00002331 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00002332
2333 verifyFormat("#define A A\n#define A A");
2334 verifyFormat("#define A(X) A\n#define A A");
2335
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002336 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2337 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002338}
2339
2340TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002341 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002342 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002343 "#define A( \\\n"
2344 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002345 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002346 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002347 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002348 " #include \"a.h\"\n"
2349 "#define A(A,\\\n"
2350 " B)\n"
2351 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002352 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002353 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002354}
2355
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002356TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002357
2358TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2359 EXPECT_EQ("#define A \\\n"
2360 " c; \\\n"
2361 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002362 "f;",
2363 format("#define A c; e;\n"
2364 "f;",
2365 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002366}
2367
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002368TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002369
Manuel Klimek1abf7892013-01-04 23:34:14 +00002370TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00002371 EXPECT_EQ("int x,\n"
2372 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002373 " y;",
2374 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002375}
2376
Manuel Klimek09e07972013-01-05 21:34:55 +00002377TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00002378 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00002379 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00002380 verifyFormat("#define A \\\n"
2381 " { \\\n"
2382 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002383 " }",
2384 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00002385
2386 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002387 " void function##X()",
2388 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002389
2390 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002391 " void a##b##c()",
2392 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002393
Daniel Jasper39825ea2013-01-14 15:40:57 +00002394 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00002395}
2396
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002397TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00002398 EXPECT_EQ("#define A (x)", format("#define A (x)"));
2399 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002400}
2401
Manuel Klimek0c137952013-02-11 12:33:24 +00002402TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2403 EXPECT_EQ("#define A b;", format("#define A \\\n"
2404 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002405 " b;",
2406 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002407 EXPECT_EQ("#define A \\\n"
2408 " \\\n"
2409 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002410 " b;",
2411 format("#define A \\\n"
2412 " \\\n"
2413 " a; \\\n"
2414 " b;",
2415 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002416 EXPECT_EQ("#define A \\\n"
2417 " a; \\\n"
2418 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002419 " b;",
2420 format("#define A \\\n"
2421 " a; \\\n"
2422 " \\\n"
2423 " b;",
2424 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002425}
2426
Daniel Jasper00475962013-02-19 17:14:38 +00002427TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002428 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00002429 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00002430 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00002431 " case 2\n",
2432 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00002433 verifyFormat("#define MACRO(a) \\\n"
2434 " if (a) \\\n"
2435 " f(); \\\n"
2436 " else \\\n"
2437 " g()",
2438 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00002439 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002440 verifyIncompleteFormat("#define STR(x) #x\n"
2441 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00002442 verifyFormat("#pragma omp threadprivate( \\\n"
2443 " y)), // expected-warning",
2444 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00002445 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00002446 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002447 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00002448 "#define b \\\n"
2449 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002450 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002451 "a",
2452 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00002453 verifyFormat("#define A \\\n"
2454 " { \\\n"
2455 " {\n"
2456 "#define B \\\n"
2457 " } \\\n"
2458 " }",
2459 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00002460 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00002461 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00002462 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00002463 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00002464}
2465
Daniel Jasper40e19212013-05-29 13:16:10 +00002466TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2467 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2468 EXPECT_EQ("class A : public QObject {\n"
2469 " Q_OBJECT\n"
2470 "\n"
2471 " A() {}\n"
2472 "};",
2473 format("class A : public QObject {\n"
2474 " Q_OBJECT\n"
2475 "\n"
2476 " A() {\n}\n"
2477 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00002478 EXPECT_EQ("MACRO\n"
2479 "/*static*/ int i;",
2480 format("MACRO\n"
2481 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00002482 EXPECT_EQ("SOME_MACRO\n"
2483 "namespace {\n"
2484 "void f();\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002485 "} // namespace",
Daniel Jasper41a0f782013-05-29 14:09:17 +00002486 format("SOME_MACRO\n"
2487 " namespace {\n"
2488 "void f( );\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002489 "} // namespace"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002490 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00002491 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2492 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002493 // Only if everything is upper case.
2494 EXPECT_EQ("class A : public QObject {\n"
2495 " Q_Object A() {}\n"
2496 "};",
2497 format("class A : public QObject {\n"
2498 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00002499 " A() {\n}\n"
2500 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00002501
2502 // Only if the next line can actually start an unwrapped line.
2503 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2504 format("SOME_WEIRD_LOG_MACRO\n"
2505 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00002506
2507 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00002508 "(n, buffers))\n",
2509 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00002510}
2511
Alexander Kornienkode644272013-04-08 22:16:06 +00002512TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2513 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2514 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2515 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002516 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00002517 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2518 "int *createScopDetectionPass() { return 0; }",
2519 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2520 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2521 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2522 " class X {};\n"
2523 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2524 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002525 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2526 // braces, so that inner block is indented one level more.
2527 EXPECT_EQ("int q() {\n"
2528 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2529 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2530 " IPC_END_MESSAGE_MAP()\n"
2531 "}",
2532 format("int q() {\n"
2533 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2534 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2535 " IPC_END_MESSAGE_MAP()\n"
2536 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00002537
Daniel Jasper352dae12014-01-03 11:50:46 +00002538 // Same inside macros.
2539 EXPECT_EQ("#define LIST(L) \\\n"
2540 " L(A) \\\n"
2541 " L(B) \\\n"
2542 " L(C)",
2543 format("#define LIST(L) \\\n"
2544 " L(A) \\\n"
2545 " L(B) \\\n"
2546 " L(C)",
2547 getGoogleStyle()));
2548
Daniel Jasper545c6522013-09-17 09:26:07 +00002549 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002550 EXPECT_EQ("int q() {\n"
2551 " f(x);\n"
2552 " f(x) {}\n"
2553 " f(x)->g();\n"
2554 " f(x)->*g();\n"
2555 " f(x).g();\n"
2556 " f(x) = x;\n"
2557 " f(x) += x;\n"
2558 " f(x) -= x;\n"
2559 " f(x) *= x;\n"
2560 " f(x) /= x;\n"
2561 " f(x) %= x;\n"
2562 " f(x) &= x;\n"
2563 " f(x) |= x;\n"
2564 " f(x) ^= x;\n"
2565 " f(x) >>= x;\n"
2566 " f(x) <<= x;\n"
2567 " f(x)[y].z();\n"
2568 " LOG(INFO) << x;\n"
2569 " ifstream(x) >> x;\n"
2570 "}\n",
2571 format("int q() {\n"
2572 " f(x)\n;\n"
2573 " f(x)\n {}\n"
2574 " f(x)\n->g();\n"
2575 " f(x)\n->*g();\n"
2576 " f(x)\n.g();\n"
2577 " f(x)\n = x;\n"
2578 " f(x)\n += x;\n"
2579 " f(x)\n -= x;\n"
2580 " f(x)\n *= x;\n"
2581 " f(x)\n /= x;\n"
2582 " f(x)\n %= x;\n"
2583 " f(x)\n &= x;\n"
2584 " f(x)\n |= x;\n"
2585 " f(x)\n ^= x;\n"
2586 " f(x)\n >>= x;\n"
2587 " f(x)\n <<= x;\n"
2588 " f(x)\n[y].z();\n"
2589 " LOG(INFO)\n << x;\n"
2590 " ifstream(x)\n >> x;\n"
2591 "}\n"));
2592 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002593 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002594 " if (1) {\n"
2595 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002596 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002597 " while (1) {\n"
2598 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002599 " F(x)\n"
2600 " G(x);\n"
2601 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002602 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002603 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002604 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002605 " }\n"
2606 "}\n",
2607 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002608 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002609 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002610 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002611 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002612 "F(x)\n"
2613 "G(x);\n"
2614 "F(x)\n"
2615 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002616 "}\n"));
2617 EXPECT_EQ("class A {\n"
2618 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002619 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002620 " A(X x)\n" // FIXME: function-level try blocks are broken.
2621 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002622 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002623 " }\n"
2624 "};",
2625 format("class A {\n"
2626 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002627 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002628 " A(X x)\n"
2629 " try : t(0) {} catch (...) {}\n"
2630 "};"));
Owen Pancb5ffbe2018-09-28 09:17:00 +00002631 FormatStyle Style = getLLVMStyle();
2632 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2633 Style.BraceWrapping.AfterControlStatement = true;
2634 Style.BraceWrapping.AfterFunction = true;
2635 EXPECT_EQ("void f()\n"
2636 "try\n"
2637 "{\n"
2638 "}",
2639 format("void f() try {\n"
2640 "}", Style));
Daniel Jaspera44991332015-04-29 13:06:49 +00002641 EXPECT_EQ("class SomeClass {\n"
2642 "public:\n"
2643 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2644 "};",
2645 format("class SomeClass {\n"
2646 "public:\n"
2647 " SomeClass()\n"
2648 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2649 "};"));
2650 EXPECT_EQ("class SomeClass {\n"
2651 "public:\n"
2652 " SomeClass()\n"
2653 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2654 "};",
2655 format("class SomeClass {\n"
2656 "public:\n"
2657 " SomeClass()\n"
2658 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2659 "};",
2660 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00002661
2662 verifyFormat("MACRO(>)");
Francois Ferrand6f40e212018-10-02 16:37:51 +00002663
2664 // Some macros contain an implicit semicolon.
2665 Style = getLLVMStyle();
2666 Style.StatementMacros.push_back("FOO");
2667 verifyFormat("FOO(a) int b = 0;");
2668 verifyFormat("FOO(a)\n"
2669 "int b = 0;",
2670 Style);
2671 verifyFormat("FOO(a);\n"
2672 "int b = 0;",
2673 Style);
2674 verifyFormat("FOO(argc, argv, \"4.0.2\")\n"
2675 "int b = 0;",
2676 Style);
2677 verifyFormat("FOO()\n"
2678 "int b = 0;",
2679 Style);
2680 verifyFormat("FOO\n"
2681 "int b = 0;",
2682 Style);
2683 verifyFormat("void f() {\n"
2684 " FOO(a)\n"
2685 " return a;\n"
2686 "}",
2687 Style);
2688 verifyFormat("FOO(a)\n"
2689 "FOO(b)",
2690 Style);
2691 verifyFormat("int a = 0;\n"
2692 "FOO(b)\n"
2693 "int c = 0;",
2694 Style);
2695 verifyFormat("int a = 0;\n"
2696 "int x = FOO(a)\n"
2697 "int b = 0;",
2698 Style);
2699 verifyFormat("void foo(int a) { FOO(a) }\n"
2700 "uint32_t bar() {}",
2701 Style);
Alexander Kornienkode644272013-04-08 22:16:06 +00002702}
2703
Manuel Klimek4fe43002013-05-22 12:51:29 +00002704TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2705 verifyFormat("#define A \\\n"
2706 " f({ \\\n"
2707 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00002708 " });",
2709 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00002710}
2711
Krasimir Georgievad47c902017-08-30 14:34:57 +00002712TEST_F(FormatTest, IndentPreprocessorDirectives) {
2713 FormatStyle Style = getLLVMStyle();
2714 Style.IndentPPDirectives = FormatStyle::PPDIS_None;
2715 Style.ColumnLimit = 40;
2716 verifyFormat("#ifdef _WIN32\n"
2717 "#define A 0\n"
2718 "#ifdef VAR2\n"
2719 "#define B 1\n"
2720 "#include <someheader.h>\n"
2721 "#define MACRO \\\n"
2722 " some_very_long_func_aaaaaaaaaa();\n"
2723 "#endif\n"
2724 "#else\n"
2725 "#define A 1\n"
2726 "#endif",
2727 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002728 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
2729 verifyFormat("#ifdef _WIN32\n"
2730 "# define A 0\n"
2731 "# ifdef VAR2\n"
2732 "# define B 1\n"
2733 "# include <someheader.h>\n"
2734 "# define MACRO \\\n"
2735 " some_very_long_func_aaaaaaaaaa();\n"
2736 "# endif\n"
2737 "#else\n"
2738 "# define A 1\n"
2739 "#endif",
2740 Style);
2741 verifyFormat("#if A\n"
2742 "# define MACRO \\\n"
2743 " void a(int x) { \\\n"
2744 " b(); \\\n"
2745 " c(); \\\n"
2746 " d(); \\\n"
2747 " e(); \\\n"
2748 " f(); \\\n"
2749 " }\n"
2750 "#endif",
2751 Style);
2752 // Comments before include guard.
2753 verifyFormat("// file comment\n"
2754 "// file comment\n"
2755 "#ifndef HEADER_H\n"
2756 "#define HEADER_H\n"
2757 "code();\n"
2758 "#endif",
2759 Style);
2760 // Test with include guards.
Krasimir Georgievad47c902017-08-30 14:34:57 +00002761 verifyFormat("#ifndef HEADER_H\n"
2762 "#define HEADER_H\n"
2763 "code();\n"
2764 "#endif",
2765 Style);
2766 // Include guards must have a #define with the same variable immediately
2767 // after #ifndef.
2768 verifyFormat("#ifndef NOT_GUARD\n"
2769 "# define FOO\n"
2770 "code();\n"
2771 "#endif",
2772 Style);
2773
2774 // Include guards must cover the entire file.
2775 verifyFormat("code();\n"
2776 "code();\n"
2777 "#ifndef NOT_GUARD\n"
2778 "# define NOT_GUARD\n"
2779 "code();\n"
2780 "#endif",
2781 Style);
2782 verifyFormat("#ifndef NOT_GUARD\n"
2783 "# define NOT_GUARD\n"
2784 "code();\n"
2785 "#endif\n"
2786 "code();",
2787 Style);
2788 // Test with trailing blank lines.
2789 verifyFormat("#ifndef HEADER_H\n"
2790 "#define HEADER_H\n"
2791 "code();\n"
2792 "#endif\n",
2793 Style);
2794 // Include guards don't have #else.
2795 verifyFormat("#ifndef NOT_GUARD\n"
2796 "# define NOT_GUARD\n"
2797 "code();\n"
2798 "#else\n"
2799 "#endif",
2800 Style);
2801 verifyFormat("#ifndef NOT_GUARD\n"
2802 "# define NOT_GUARD\n"
2803 "code();\n"
2804 "#elif FOO\n"
2805 "#endif",
2806 Style);
Mark Zeren1c3afaf2018-02-05 15:59:00 +00002807 // Non-identifier #define after potential include guard.
2808 verifyFormat("#ifndef FOO\n"
2809 "# define 1\n"
2810 "#endif\n",
2811 Style);
2812 // #if closes past last non-preprocessor line.
2813 verifyFormat("#ifndef FOO\n"
2814 "#define FOO\n"
2815 "#if 1\n"
2816 "int i;\n"
2817 "# define A 0\n"
2818 "#endif\n"
2819 "#endif\n",
2820 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002821 // FIXME: This doesn't handle the case where there's code between the
2822 // #ifndef and #define but all other conditions hold. This is because when
2823 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
2824 // previous code line yet, so we can't detect it.
2825 EXPECT_EQ("#ifndef NOT_GUARD\n"
2826 "code();\n"
2827 "#define NOT_GUARD\n"
2828 "code();\n"
2829 "#endif",
2830 format("#ifndef NOT_GUARD\n"
2831 "code();\n"
2832 "# define NOT_GUARD\n"
2833 "code();\n"
2834 "#endif",
2835 Style));
2836 // FIXME: This doesn't handle cases where legitimate preprocessor lines may
2837 // be outside an include guard. Examples are #pragma once and
2838 // #pragma GCC diagnostic, or anything else that does not change the meaning
2839 // of the file if it's included multiple times.
2840 EXPECT_EQ("#ifdef WIN32\n"
2841 "# pragma once\n"
2842 "#endif\n"
2843 "#ifndef HEADER_H\n"
2844 "# define HEADER_H\n"
2845 "code();\n"
2846 "#endif",
2847 format("#ifdef WIN32\n"
2848 "# pragma once\n"
2849 "#endif\n"
2850 "#ifndef HEADER_H\n"
2851 "#define HEADER_H\n"
2852 "code();\n"
2853 "#endif",
2854 Style));
2855 // FIXME: This does not detect when there is a single non-preprocessor line
2856 // in front of an include-guard-like structure where other conditions hold
2857 // because ScopedLineState hides the line.
2858 EXPECT_EQ("code();\n"
2859 "#ifndef HEADER_H\n"
2860 "#define HEADER_H\n"
2861 "code();\n"
2862 "#endif",
2863 format("code();\n"
2864 "#ifndef HEADER_H\n"
2865 "# define HEADER_H\n"
2866 "code();\n"
2867 "#endif",
2868 Style));
Mark Zerend2b2ac62018-01-31 20:05:50 +00002869 // Keep comments aligned with #, otherwise indent comments normally. These
2870 // tests cannot use verifyFormat because messUp manipulates leading
2871 // whitespace.
2872 {
2873 const char *Expected = ""
2874 "void f() {\n"
2875 "#if 1\n"
2876 "// Preprocessor aligned.\n"
2877 "# define A 0\n"
2878 " // Code. Separated by blank line.\n"
2879 "\n"
2880 "# define B 0\n"
2881 " // Code. Not aligned with #\n"
2882 "# define C 0\n"
2883 "#endif";
2884 const char *ToFormat = ""
2885 "void f() {\n"
2886 "#if 1\n"
2887 "// Preprocessor aligned.\n"
2888 "# define A 0\n"
2889 "// Code. Separated by blank line.\n"
2890 "\n"
2891 "# define B 0\n"
2892 " // Code. Not aligned with #\n"
2893 "# define C 0\n"
2894 "#endif";
2895 EXPECT_EQ(Expected, format(ToFormat, Style));
2896 EXPECT_EQ(Expected, format(Expected, Style));
2897 }
2898 // Keep block quotes aligned.
2899 {
2900 const char *Expected = ""
2901 "void f() {\n"
2902 "#if 1\n"
2903 "/* Preprocessor aligned. */\n"
2904 "# define A 0\n"
2905 " /* Code. Separated by blank line. */\n"
2906 "\n"
2907 "# define B 0\n"
2908 " /* Code. Not aligned with # */\n"
2909 "# define C 0\n"
2910 "#endif";
2911 const char *ToFormat = ""
2912 "void f() {\n"
2913 "#if 1\n"
2914 "/* Preprocessor aligned. */\n"
2915 "# define A 0\n"
2916 "/* Code. Separated by blank line. */\n"
2917 "\n"
2918 "# define B 0\n"
2919 " /* Code. Not aligned with # */\n"
2920 "# define C 0\n"
2921 "#endif";
2922 EXPECT_EQ(Expected, format(ToFormat, Style));
2923 EXPECT_EQ(Expected, format(Expected, Style));
2924 }
2925 // Keep comments aligned with un-indented directives.
2926 {
2927 const char *Expected = ""
2928 "void f() {\n"
2929 "// Preprocessor aligned.\n"
2930 "#define A 0\n"
2931 " // Code. Separated by blank line.\n"
2932 "\n"
2933 "#define B 0\n"
2934 " // Code. Not aligned with #\n"
2935 "#define C 0\n";
2936 const char *ToFormat = ""
2937 "void f() {\n"
2938 "// Preprocessor aligned.\n"
2939 "#define A 0\n"
2940 "// Code. Separated by blank line.\n"
2941 "\n"
2942 "#define B 0\n"
2943 " // Code. Not aligned with #\n"
2944 "#define C 0\n";
2945 EXPECT_EQ(Expected, format(ToFormat, Style));
2946 EXPECT_EQ(Expected, format(Expected, Style));
2947 }
Krasimir Georgievad47c902017-08-30 14:34:57 +00002948 // Test with tabs.
2949 Style.UseTab = FormatStyle::UT_Always;
2950 Style.IndentWidth = 8;
2951 Style.TabWidth = 8;
2952 verifyFormat("#ifdef _WIN32\n"
2953 "#\tdefine A 0\n"
2954 "#\tifdef VAR2\n"
2955 "#\t\tdefine B 1\n"
2956 "#\t\tinclude <someheader.h>\n"
2957 "#\t\tdefine MACRO \\\n"
2958 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
2959 "#\tendif\n"
2960 "#else\n"
2961 "#\tdefine A 1\n"
2962 "#endif",
2963 Style);
Daniel Jasper4df130f2017-09-04 13:33:52 +00002964
2965 // Regression test: Multiline-macro inside include guards.
2966 verifyFormat("#ifndef HEADER_H\n"
2967 "#define HEADER_H\n"
2968 "#define A() \\\n"
2969 " int i; \\\n"
2970 " int j;\n"
2971 "#endif // HEADER_H",
2972 getLLVMStyleWithColumns(20));
Manuel Klimekef2cfb12013-01-05 22:14:16 +00002973}
2974
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002975TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002976 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002977}
2978
Manuel Klimek1058d982013-01-06 20:07:31 +00002979TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
2980 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
2981 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2982 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
2983 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2984}
Manuel Klimek1abf7892013-01-04 23:34:14 +00002985
Daniel Jaspere2408e32015-05-06 11:16:43 +00002986TEST_F(FormatTest, EscapedNewlines) {
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002987 FormatStyle Narrow = getLLVMStyleWithColumns(11);
2988 EXPECT_EQ("#define A \\\n int i; \\\n int j;",
2989 format("#define A \\\nint i;\\\n int j;", Narrow));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002990 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00002991 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00002992 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002993 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002994
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002995 FormatStyle AlignLeft = getLLVMStyle();
2996 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
2997 EXPECT_EQ("#define MACRO(x) \\\n"
2998 "private: \\\n"
2999 " int x(int a);\n",
3000 format("#define MACRO(x) \\\n"
3001 "private: \\\n"
3002 " int x(int a);\n",
3003 AlignLeft));
3004
3005 // CRLF line endings
3006 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;",
3007 format("#define A \\\r\nint i;\\\r\n int j;", Narrow));
3008 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
3009 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3010 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */"));
3011 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
3012 EXPECT_EQ("#define MACRO(x) \\\r\n"
3013 "private: \\\r\n"
3014 " int x(int a);\r\n",
3015 format("#define MACRO(x) \\\r\n"
3016 "private: \\\r\n"
3017 " int x(int a);\r\n",
3018 AlignLeft));
3019
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00003020 FormatStyle DontAlign = getLLVMStyle();
3021 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
3022 DontAlign.MaxEmptyLinesToKeep = 3;
3023 // FIXME: can't use verifyFormat here because the newline before
3024 // "public:" is not inserted the first time it's reformatted
3025 EXPECT_EQ("#define A \\\n"
3026 " class Foo { \\\n"
3027 " void bar(); \\\n"
3028 "\\\n"
3029 "\\\n"
3030 "\\\n"
3031 " public: \\\n"
3032 " void baz(); \\\n"
3033 " };",
3034 format("#define A \\\n"
3035 " class Foo { \\\n"
3036 " void bar(); \\\n"
3037 "\\\n"
3038 "\\\n"
3039 "\\\n"
3040 " public: \\\n"
3041 " void baz(); \\\n"
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00003042 " };",
3043 DontAlign));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003044}
3045
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003046TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3047 verifyFormat("#define A \\\n"
3048 " int v( \\\n"
3049 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003050 " int i;",
3051 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003052}
3053
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003054TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00003055 EXPECT_EQ(
3056 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3057 " \\\n"
3058 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3059 "\n"
3060 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3061 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3062 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
3063 "\\\n"
3064 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3065 " \n"
3066 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3067 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003068}
3069
Manuel Klimek52b15152013-01-09 15:25:02 +00003070TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3071 EXPECT_EQ("int\n"
3072 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003073 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003074 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003075 verifyFormat("functionCallTo(\n"
3076 " someOtherFunction(\n"
3077 " withSomeParameters, whichInSequence,\n"
3078 " areLongerThanALine(andAnotherCall,\n"
3079 "#define A B\n"
3080 " withMoreParamters,\n"
3081 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003082 " andMoreParameters),\n"
3083 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003084 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00003085 verifyFormat("Foo::Foo()\n"
3086 "#ifdef BAR\n"
3087 " : baz(0)\n"
3088 "#endif\n"
3089 "{\n"
3090 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00003091 verifyFormat("void f() {\n"
3092 " if (true)\n"
3093 "#ifdef A\n"
3094 " f(42);\n"
3095 " x();\n"
3096 "#else\n"
3097 " g();\n"
3098 " x();\n"
3099 "#endif\n"
3100 "}");
3101 verifyFormat("void f(param1, param2,\n"
3102 " param3,\n"
3103 "#ifdef A\n"
3104 " param4(param5,\n"
3105 "#ifdef A1\n"
3106 " param6,\n"
3107 "#ifdef A2\n"
3108 " param7),\n"
3109 "#else\n"
3110 " param8),\n"
3111 " param9,\n"
3112 "#endif\n"
3113 " param10,\n"
3114 "#endif\n"
3115 " param11)\n"
3116 "#else\n"
3117 " param12)\n"
3118 "#endif\n"
3119 "{\n"
3120 " x();\n"
3121 "}",
3122 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00003123 verifyFormat("#if 1\n"
3124 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003125 verifyFormat("#if 1\n"
3126 "#endif\n"
3127 "#if 1\n"
3128 "#else\n"
3129 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00003130 verifyFormat("DEBUG({\n"
3131 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3132 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3133 "});\n"
3134 "#if a\n"
3135 "#else\n"
3136 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00003137
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003138 verifyIncompleteFormat("void f(\n"
3139 "#if A\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00003140 ");\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003141 "#else\n"
3142 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00003143}
3144
Manuel Klimek14bd9172014-01-29 08:49:02 +00003145TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3146 verifyFormat("#endif\n"
3147 "#if B");
3148}
3149
Manuel Klimek88033d72013-10-21 08:11:15 +00003150TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3151 FormatStyle SingleLine = getLLVMStyle();
3152 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00003153 verifyFormat("#if 0\n"
3154 "#elif 1\n"
3155 "#endif\n"
3156 "void foo() {\n"
3157 " if (test) foo2();\n"
3158 "}",
3159 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00003160}
3161
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003162TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00003163 verifyFormat("functionCall({ int i; });");
3164 verifyFormat("functionCall({\n"
3165 " int i;\n"
3166 " int j;\n"
3167 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00003168 verifyFormat("functionCall(\n"
3169 " {\n"
3170 " int i;\n"
3171 " int j;\n"
3172 " },\n"
3173 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00003174 verifyFormat("functionA(functionB({\n"
3175 " int i;\n"
3176 " int j;\n"
3177 " }),\n"
3178 " aaaa, bbbb, cccc);");
3179 verifyFormat("functionCall(\n"
3180 " {\n"
3181 " int i;\n"
3182 " int j;\n"
3183 " },\n"
3184 " aaaa, bbbb, // comment\n"
3185 " cccc);");
3186 verifyFormat("functionA(functionB({\n"
3187 " int i;\n"
3188 " int j;\n"
3189 " }),\n"
3190 " aaaa, bbbb, // comment\n"
3191 " cccc);");
3192 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3193 verifyFormat("functionCall(aaaa, bbbb, {\n"
3194 " int i;\n"
3195 " int j;\n"
3196 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00003197 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00003198 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00003199 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003200 " int i; // break\n"
3201 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00003202 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3203 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003204 verifyFormat("DEBUG({\n"
3205 " if (a)\n"
3206 " f();\n"
3207 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003208}
3209
3210TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003211 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003212 "int i;",
3213 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003214}
3215
3216TEST_F(FormatTest, LayoutNestedBlocks) {
3217 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3218 " struct s {\n"
3219 " int i;\n"
3220 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003221 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003222 " for (int i = 0; i < 10; ++i)\n"
3223 " return;\n"
3224 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003225 verifyFormat("call(parameter, {\n"
3226 " something();\n"
3227 " // Comment using all columns.\n"
3228 " somethingelse();\n"
3229 "});",
3230 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00003231 verifyFormat("DEBUG( //\n"
3232 " { f(); }, a);");
3233 verifyFormat("DEBUG( //\n"
3234 " {\n"
3235 " f(); //\n"
3236 " },\n"
3237 " a);");
3238
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003239 EXPECT_EQ("call(parameter, {\n"
3240 " something();\n"
3241 " // Comment too\n"
3242 " // looooooooooong.\n"
3243 " somethingElse();\n"
3244 "});",
3245 format("call(parameter, {\n"
3246 " something();\n"
3247 " // Comment too looooooooooong.\n"
3248 " somethingElse();\n"
3249 "});",
3250 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003251 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003252 EXPECT_EQ("DEBUG({ // comment\n"
3253 " int i;\n"
3254 "});",
3255 format("DEBUG({ // comment\n"
3256 "int i;\n"
3257 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003258 EXPECT_EQ("DEBUG({\n"
3259 " int i;\n"
3260 "\n"
3261 " // comment\n"
3262 " int j;\n"
3263 "});",
3264 format("DEBUG({\n"
3265 " int i;\n"
3266 "\n"
3267 " // comment\n"
3268 " int j;\n"
3269 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003270
3271 verifyFormat("DEBUG({\n"
3272 " if (a)\n"
3273 " return;\n"
3274 "});");
3275 verifyGoogleFormat("DEBUG({\n"
3276 " if (a) return;\n"
3277 "});");
3278 FormatStyle Style = getGoogleStyle();
3279 Style.ColumnLimit = 45;
Krasimir Georgiev5528cac2018-10-31 17:56:57 +00003280 verifyFormat("Debug(\n"
3281 " aaaaa,\n"
3282 " {\n"
3283 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3284 " },\n"
3285 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003286 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003287
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003288 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3289
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003290 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003291}
3292
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003293TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3294 EXPECT_EQ("#define MACRO() \\\n"
3295 " Debug(aaa, /* force line break */ \\\n"
3296 " { \\\n"
3297 " int i; \\\n"
3298 " int j; \\\n"
3299 " })",
3300 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3301 " { int i; int j; })",
3302 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003303
3304 EXPECT_EQ("#define A \\\n"
3305 " [] { \\\n"
3306 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3307 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3308 " }",
3309 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3310 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3311 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003312}
3313
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003314TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3315 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003316 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003317 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003318}
3319
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003320TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3321 FormatStyle Style = getLLVMStyle();
3322 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3323 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3324 verifyFormat("FOO_BEGIN\n"
3325 " FOO_ENTRY\n"
3326 "FOO_END", Style);
3327 verifyFormat("FOO_BEGIN\n"
3328 " NESTED_FOO_BEGIN\n"
3329 " NESTED_FOO_ENTRY\n"
3330 " NESTED_FOO_END\n"
3331 "FOO_END", Style);
3332 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3333 " int x;\n"
3334 " x = 1;\n"
3335 "FOO_END(Baz)", Style);
3336}
3337
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003338//===----------------------------------------------------------------------===//
3339// Line break tests.
3340//===----------------------------------------------------------------------===//
3341
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003342TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003343 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003344 "void f() {\n"
3345 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3346 " parameter, parameter, parameter)),\n"
3347 " SecondLongCall(parameter));\n"
3348 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003349 verifyFormat(
3350 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3351 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3352 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3353 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3354 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003355 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3356 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3357 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3358 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003359 verifyFormat(
3360 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3361 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3362 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3363 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003364 verifyFormat("int a = bbbb && ccc &&\n"
3365 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003366 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003367 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003368}
3369
Daniel Jasperd69fc772013-05-08 14:12:04 +00003370TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3371 verifyFormat(
3372 "bool aaaaaaa =\n"
3373 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3374 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003375 verifyFormat(
3376 "bool aaaaaaa =\n"
3377 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3378 " bbbbbbbb();");
3379
Daniel Jasperd69fc772013-05-08 14:12:04 +00003380 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3381 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3382 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003383 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3384 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3385 " ccccccccc == ddddddddddd;");
3386 verifyFormat(
3387 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3388 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3389 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003390
3391 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3392 " aaaaaa) &&\n"
3393 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003394 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3395 " aaaaaa) >>\n"
3396 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003397 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003398 " SourceMgr.getSpellingColumnNumber(\n"
3399 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3400 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003401
Daniel Jasper68d888c2013-06-03 08:42:05 +00003402 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3403 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3404 " cccccc) {\n}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00003405 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3406 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3407 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003408 verifyFormat("b = a &&\n"
3409 " // Comment\n"
3410 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003411
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003412 // If the LHS of a comparison is not a binary expression itself, the
3413 // additional linebreak confuses many people.
3414 verifyFormat(
3415 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3416 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3417 "}");
3418 verifyFormat(
3419 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3420 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3421 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003422 verifyFormat(
3423 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3424 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3425 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003426 verifyFormat(
3427 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3428 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
3429 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003430 // Even explicit parentheses stress the precedence enough to make the
3431 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003432 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3433 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3434 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003435 // This cases is borderline, but with the indentation it is still readable.
3436 verifyFormat(
3437 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3438 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3439 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3440 "}",
3441 getLLVMStyleWithColumns(75));
3442
3443 // If the LHS is a binary expression, we should still use the additional break
3444 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003445 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3446 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3447 " 5) {\n"
3448 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003449 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3450 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
3451 " 5) {\n"
3452 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003453
Daniel Jasper571f1af2013-05-14 20:39:56 +00003454 FormatStyle OnePerLine = getLLVMStyle();
3455 OnePerLine.BinPackParameters = false;
3456 verifyFormat(
3457 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3458 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3459 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3460 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00003461
3462 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3463 " .aaa(aaaaaaaaaaaaa) *\n"
3464 " aaaaaaa +\n"
3465 " aaaaaaa;",
3466 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00003467}
3468
Daniel Jasper6bee6822013-04-08 20:33:42 +00003469TEST_F(FormatTest, ExpressionIndentation) {
3470 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3471 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3472 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3473 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3474 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3475 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3476 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3477 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3478 " ccccccccccccccccccccccccccccccccccccccccc;");
3479 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3480 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3481 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3482 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3483 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3484 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3485 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3486 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3487 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3488 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3489 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3490 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003491 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003492 "} else if (aaaaa && bbbbb > // break\n"
3493 " ccccc) {\n"
3494 "}");
3495 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00003496 "} else if (aaaaa &&\n"
3497 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003498 " ccccc &&\n"
3499 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003500 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00003501
3502 // Presence of a trailing comment used to change indentation of b.
3503 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3504 " b;\n"
3505 "return aaaaaaaaaaaaaaaaaaa +\n"
3506 " b; //",
3507 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00003508}
3509
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003510TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3511 // Not sure what the best system is here. Like this, the LHS can be found
3512 // immediately above an operator (everything with the same or a higher
3513 // indent). The RHS is aligned right of the operator and so compasses
3514 // everything until something with the same indent as the operator is found.
3515 // FIXME: Is this a good system?
3516 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00003517 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003518 verifyFormat(
3519 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003520 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3521 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3522 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3523 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3524 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003525 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003526 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3527 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003528 Style);
3529 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003530 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3531 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003532 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3533 Style);
3534 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003535 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3536 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003537 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3538 Style);
3539 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3540 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003541 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3542 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003543 Style);
3544 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003545 "} else if (aaaaa\n"
3546 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003547 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003548 "}",
3549 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00003550 verifyFormat("return (a)\n"
3551 " // comment\n"
3552 " + b;",
3553 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003554 verifyFormat(
3555 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3556 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3557 " + cc;",
3558 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003559
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00003560 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3561 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3562 Style);
3563
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003564 // Forced by comments.
3565 verifyFormat(
3566 "unsigned ContentSize =\n"
3567 " sizeof(int16_t) // DWARF ARange version number\n"
3568 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3569 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
3570 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00003571
3572 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3573 " == boost::fusion::at_c<1>(iiii).second;",
3574 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00003575
3576 Style.ColumnLimit = 60;
3577 verifyFormat("zzzzzzzzzz\n"
3578 " = bbbbbbbbbbbbbbbbb\n"
3579 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3580 Style);
Jonas Toth4636deb2018-08-24 17:14:31 +00003581
3582 Style.ColumnLimit = 80;
3583 Style.IndentWidth = 4;
3584 Style.TabWidth = 4;
3585 Style.UseTab = FormatStyle::UT_Always;
3586 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
3587 Style.AlignOperands = false;
3588 EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n"
3589 "\t&& (someOtherLongishConditionPart1\n"
3590 "\t\t|| someOtherEvenLongerNestedConditionPart2);",
3591 format("return someVeryVeryLongConditionThatBarelyFitsOnALine && (someOtherLongishConditionPart1 || someOtherEvenLongerNestedConditionPart2);",
3592 Style));
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003593}
3594
Daniel Jasperb1270392017-02-01 23:27:37 +00003595TEST_F(FormatTest, EnforcedOperatorWraps) {
3596 // Here we'd like to wrap after the || operators, but a comment is forcing an
3597 // earlier wrap.
3598 verifyFormat("bool x = aaaaa //\n"
3599 " || bbbbb\n"
3600 " //\n"
3601 " || cccc;");
3602}
3603
Daniel Jasper3219e432014-12-02 13:24:51 +00003604TEST_F(FormatTest, NoOperandAlignment) {
3605 FormatStyle Style = getLLVMStyle();
3606 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00003607 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
3608 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3609 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3610 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003611 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00003612 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3613 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3614 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3615 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3616 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3617 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3618 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3619 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3620 " > ccccccccccccccccccccccccccccccccccccccccc;",
3621 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003622
3623 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3624 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3625 " + cc;",
3626 Style);
3627 verifyFormat("int a = aa\n"
3628 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003629 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00003630 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00003631
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003632 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00003633 verifyFormat("return (a > b\n"
3634 " // comment1\n"
3635 " // comment2\n"
3636 " || c);",
3637 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003638}
3639
Daniel Jasperac043c92014-09-15 11:11:00 +00003640TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3641 FormatStyle Style = getLLVMStyle();
3642 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3643 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3644 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00003645 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3646 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00003647}
3648
Daniel Jasper988e7e42017-05-08 15:07:52 +00003649TEST_F(FormatTest, AllowBinPackingInsideArguments) {
3650 FormatStyle Style = getLLVMStyle();
3651 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3652 Style.BinPackArguments = false;
3653 Style.ColumnLimit = 40;
3654 verifyFormat("void test() {\n"
3655 " someFunction(\n"
3656 " this + argument + is + quite\n"
3657 " + long + so + it + gets + wrapped\n"
3658 " + but + remains + bin - packed);\n"
3659 "}",
3660 Style);
3661 verifyFormat("void test() {\n"
3662 " someFunction(arg1,\n"
3663 " this + argument + is\n"
3664 " + quite + long + so\n"
3665 " + it + gets + wrapped\n"
3666 " + but + remains + bin\n"
3667 " - packed,\n"
3668 " arg3);\n"
3669 "}",
3670 Style);
3671 verifyFormat("void test() {\n"
3672 " someFunction(\n"
3673 " arg1,\n"
3674 " this + argument + has\n"
3675 " + anotherFunc(nested,\n"
3676 " calls + whose\n"
3677 " + arguments\n"
3678 " + are + also\n"
3679 " + wrapped,\n"
3680 " in + addition)\n"
3681 " + to + being + bin - packed,\n"
3682 " arg3);\n"
3683 "}",
3684 Style);
3685
3686 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
3687 verifyFormat("void test() {\n"
3688 " someFunction(\n"
3689 " arg1,\n"
3690 " this + argument + has +\n"
3691 " anotherFunc(nested,\n"
3692 " calls + whose +\n"
3693 " arguments +\n"
3694 " are + also +\n"
3695 " wrapped,\n"
3696 " in + addition) +\n"
3697 " to + being + bin - packed,\n"
3698 " arg3);\n"
3699 "}",
3700 Style);
3701}
3702
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003703TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003704 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003705 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3706 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003707 verifyFormat("Constructor()\n"
3708 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003709 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003710 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003711 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003712 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003713
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003714 verifyFormat("template <typename T>\n"
3715 "Constructor() : Initializer(FitsOnTheLine) {}",
3716 getLLVMStyleWithColumns(45));
3717
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003718 verifyFormat(
3719 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003720 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003721
3722 verifyFormat(
3723 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003724 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003725 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003726 verifyFormat(
3727 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003728 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003729 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003730 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3731 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3732 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003733
3734 verifyFormat("Constructor()\n"
3735 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3736 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3737 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003738 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003739
Daniel Jasper65585ed2013-01-28 13:31:35 +00003740 verifyFormat("Constructor()\n"
3741 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003742 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00003743
Daniel Jasper62e68172013-02-25 15:59:54 +00003744 verifyFormat("Constructor(int Parameter = 0)\n"
3745 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3746 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00003747 verifyFormat("Constructor()\n"
3748 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3749 "}",
3750 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00003751 verifyFormat("Constructor()\n"
3752 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3753 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003754
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003755 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003756 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003757 verifyFormat("Constructor()\n"
3758 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3759 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3760 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003761
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003762 FormatStyle OnePerLine = getLLVMStyle();
3763 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003764 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003765 verifyFormat("SomeClass::Constructor()\n"
3766 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3767 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003768 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003769 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003770 verifyFormat("SomeClass::Constructor()\n"
3771 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3772 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003773 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003774 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003775 verifyFormat("MyClass::MyClass(int var)\n"
3776 " : some_var_(var), // 4 space indent\n"
3777 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003778 "}",
3779 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003780 verifyFormat("Constructor()\n"
3781 " : aaaaa(aaaaaa),\n"
3782 " aaaaa(aaaaaa),\n"
3783 " aaaaa(aaaaaa),\n"
3784 " aaaaa(aaaaaa),\n"
3785 " aaaaa(aaaaaa) {}",
3786 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003787 verifyFormat("Constructor()\n"
3788 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3789 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3790 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003791 OnePerLine.BinPackParameters = false;
3792 verifyFormat(
3793 "Constructor()\n"
3794 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3795 " aaaaaaaaaaa().aaa(),\n"
3796 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3797 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003798 OnePerLine.ColumnLimit = 60;
3799 verifyFormat("Constructor()\n"
3800 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3801 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3802 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003803
3804 EXPECT_EQ("Constructor()\n"
3805 " : // Comment forcing unwanted break.\n"
3806 " aaaa(aaaa) {}",
3807 format("Constructor() :\n"
3808 " // Comment forcing unwanted break.\n"
3809 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003810}
3811
Francois Ferranda6b6d512017-05-24 11:36:58 +00003812TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
3813 FormatStyle Style = getLLVMStyle();
3814 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
3815
3816 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3817 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
3818 getStyleWithColumns(Style, 45));
3819 verifyFormat("Constructor() :\n"
3820 " Initializer(FitsOnTheLine) {}",
3821 getStyleWithColumns(Style, 44));
3822 verifyFormat("Constructor() :\n"
3823 " Initializer(FitsOnTheLine) {}",
3824 getStyleWithColumns(Style, 43));
3825
3826 verifyFormat("template <typename T>\n"
3827 "Constructor() : Initializer(FitsOnTheLine) {}",
3828 getStyleWithColumns(Style, 50));
3829
3830 verifyFormat(
3831 "SomeClass::Constructor() :\n"
3832 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3833 Style);
3834
3835 verifyFormat(
3836 "SomeClass::Constructor() :\n"
3837 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3838 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3839 Style);
3840 verifyFormat(
3841 "SomeClass::Constructor() :\n"
3842 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3843 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3844 Style);
3845 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3846 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3847 " aaaaaaaaaa(aaaaaa) {}",
3848 Style);
3849
3850 verifyFormat("Constructor() :\n"
3851 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3852 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3853 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3854 " aaaaaaaaaaaaaaaaaaaaaaa() {}",
3855 Style);
3856
3857 verifyFormat("Constructor() :\n"
3858 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3859 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3860 Style);
3861
3862 verifyFormat("Constructor(int Parameter = 0) :\n"
3863 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3864 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
3865 Style);
3866 verifyFormat("Constructor() :\n"
3867 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3868 "}",
3869 getStyleWithColumns(Style, 60));
3870 verifyFormat("Constructor() :\n"
3871 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3872 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
3873 Style);
3874
3875 // Here a line could be saved by splitting the second initializer onto two
3876 // lines, but that is not desirable.
3877 verifyFormat("Constructor() :\n"
3878 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3879 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3880 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3881 Style);
3882
3883 FormatStyle OnePerLine = Style;
3884 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3885 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3886 verifyFormat("SomeClass::Constructor() :\n"
3887 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3888 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3889 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3890 OnePerLine);
3891 verifyFormat("SomeClass::Constructor() :\n"
3892 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3893 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3894 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3895 OnePerLine);
3896 verifyFormat("MyClass::MyClass(int var) :\n"
3897 " some_var_(var), // 4 space indent\n"
3898 " some_other_var_(var + 1) { // lined up\n"
3899 "}",
3900 OnePerLine);
3901 verifyFormat("Constructor() :\n"
3902 " aaaaa(aaaaaa),\n"
3903 " aaaaa(aaaaaa),\n"
3904 " aaaaa(aaaaaa),\n"
3905 " aaaaa(aaaaaa),\n"
3906 " aaaaa(aaaaaa) {}",
3907 OnePerLine);
3908 verifyFormat("Constructor() :\n"
3909 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3910 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3911 OnePerLine);
3912 OnePerLine.BinPackParameters = false;
3913 verifyFormat(
3914 "Constructor() :\n"
3915 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3916 " aaaaaaaaaaa().aaa(),\n"
3917 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3918 OnePerLine);
3919 OnePerLine.ColumnLimit = 60;
3920 verifyFormat("Constructor() :\n"
3921 " aaaaaaaaaaaaaaaaaaaa(a),\n"
3922 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3923 OnePerLine);
3924
3925 EXPECT_EQ("Constructor() :\n"
3926 " // Comment forcing unwanted break.\n"
3927 " aaaa(aaaa) {}",
3928 format("Constructor() :\n"
3929 " // Comment forcing unwanted break.\n"
3930 " aaaa(aaaa) {}",
3931 Style));
3932
3933 Style.ColumnLimit = 0;
3934 verifyFormat("SomeClass::Constructor() :\n"
3935 " a(a) {}",
3936 Style);
3937 verifyFormat("SomeClass::Constructor() noexcept :\n"
3938 " a(a) {}",
3939 Style);
3940 verifyFormat("SomeClass::Constructor() :\n"
3941 " a(a), b(b), c(c) {}",
3942 Style);
3943 verifyFormat("SomeClass::Constructor() :\n"
3944 " a(a) {\n"
3945 " foo();\n"
3946 " bar();\n"
3947 "}",
3948 Style);
3949
3950 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
3951 verifyFormat("SomeClass::Constructor() :\n"
3952 " a(a), b(b), c(c) {\n"
3953 "}",
3954 Style);
3955 verifyFormat("SomeClass::Constructor() :\n"
3956 " a(a) {\n"
3957 "}",
3958 Style);
3959
3960 Style.ColumnLimit = 80;
3961 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
3962 Style.ConstructorInitializerIndentWidth = 2;
3963 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
3964 Style);
3965 verifyFormat("SomeClass::Constructor() :\n"
3966 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3967 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
3968 Style);
Francois Ferrand6bb103f2018-06-11 14:41:26 +00003969
3970 // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as well
3971 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
3972 verifyFormat("class SomeClass\n"
3973 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3974 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
3975 Style);
3976 Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
3977 verifyFormat("class SomeClass\n"
3978 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3979 " , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
3980 Style);
3981 Style.BreakInheritanceList = FormatStyle::BILS_AfterColon;
3982 verifyFormat("class SomeClass :\n"
3983 " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3984 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
3985 Style);
Francois Ferranda6b6d512017-05-24 11:36:58 +00003986}
3987
David Blaikieea95dd72017-08-31 18:49:34 +00003988#ifndef EXPENSIVE_CHECKS
3989// Expensive checks enables libstdc++ checking which includes validating the
3990// state of ranges used in std::priority_queue - this blows out the
3991// runtime/scalability of the function and makes this test unacceptably slow.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003992TEST_F(FormatTest, MemoizationTests) {
3993 // This breaks if the memoization lookup does not take \c Indent and
3994 // \c LastSpace into account.
3995 verifyFormat(
3996 "extern CFRunLoopTimerRef\n"
3997 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3998 " CFTimeInterval interval, CFOptionFlags flags,\n"
3999 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00004000 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004001
4002 // Deep nesting somewhat works around our memoization.
4003 verifyFormat(
4004 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4005 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4006 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4007 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4008 " aaaaa())))))))))))))))))))))))))))))))))))))));",
4009 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00004010 verifyFormat(
4011 "aaaaa(\n"
4012 " aaaaa,\n"
4013 " aaaaa(\n"
4014 " aaaaa,\n"
4015 " aaaaa(\n"
4016 " aaaaa,\n"
4017 " aaaaa(\n"
4018 " aaaaa,\n"
4019 " aaaaa(\n"
4020 " aaaaa,\n"
4021 " aaaaa(\n"
4022 " aaaaa,\n"
4023 " aaaaa(\n"
4024 " aaaaa,\n"
4025 " aaaaa(\n"
4026 " aaaaa,\n"
4027 " aaaaa(\n"
4028 " aaaaa,\n"
4029 " aaaaa(\n"
4030 " aaaaa,\n"
4031 " aaaaa(\n"
4032 " aaaaa,\n"
4033 " aaaaa(\n"
4034 " aaaaa,\n"
4035 " aaaaa))))))))))));",
4036 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00004037 verifyFormat(
4038 "a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(), a), a), a), a),\n"
4039 " a),\n"
4040 " a),\n"
4041 " a),\n"
4042 " a),\n"
4043 " a),\n"
4044 " a),\n"
4045 " a),\n"
4046 " a),\n"
4047 " a),\n"
4048 " a),\n"
4049 " a),\n"
4050 " a),\n"
4051 " a),\n"
4052 " a),\n"
4053 " a),\n"
4054 " a),\n"
4055 " a)",
4056 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00004057
4058 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004059 FormatStyle OnePerLine = getLLVMStyle();
4060 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004061 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00004062 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00004063 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00004064 for (unsigned i = 0, e = 80; i != e; ++i) {
4065 input += " a,\n";
4066 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004067 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004068 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004069}
David Blaikieea95dd72017-08-31 18:49:34 +00004070#endif
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004071
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004072TEST_F(FormatTest, BreaksAsHighAsPossible) {
4073 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004074 "void f() {\n"
4075 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
4076 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
4077 " f();\n"
4078 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00004079 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004080 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004081}
4082
Daniel Jasper6728fc12013-04-11 14:29:13 +00004083TEST_F(FormatTest, BreaksFunctionDeclarations) {
4084 // Principially, we break function declarations in a certain order:
4085 // 1) break amongst arguments.
4086 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
4087 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004088 verifyFormat("template <class TemplateIt>\n"
4089 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
4090 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00004091
4092 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00004093 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004094 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004095 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004096 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004097
4098 // 3) break after (.
4099 verifyFormat(
4100 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00004101 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
4102 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004103
4104 // 4) break before after nested name specifiers.
4105 verifyFormat(
4106 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004107 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
4108 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004109 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004110
4111 // However, there are exceptions, if a sufficient amount of lines can be
4112 // saved.
4113 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
4114 // more adjusting.
4115 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4116 " Cccccccccccccc cccccccccc,\n"
4117 " Cccccccccccccc cccccccccc,\n"
4118 " Cccccccccccccc cccccccccc,\n"
4119 " Cccccccccccccc cccccccccc);");
4120 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004121 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004122 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4123 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4124 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004125 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004126 verifyFormat(
4127 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4128 " Cccccccccccccc cccccccccc,\n"
4129 " Cccccccccccccc cccccccccc,\n"
4130 " Cccccccccccccc cccccccccc,\n"
4131 " Cccccccccccccc cccccccccc,\n"
4132 " Cccccccccccccc cccccccccc,\n"
4133 " Cccccccccccccc cccccccccc);");
4134 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4135 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4136 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4137 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4138 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00004139
4140 // Break after multi-line parameters.
4141 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4142 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4143 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4144 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00004145 verifyFormat("void SomeLoooooooooooongFunction(\n"
4146 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
4147 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4148 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004149
4150 // Treat overloaded operators like other functions.
4151 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4152 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00004153 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4154 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00004155 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4156 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
4157 verifyGoogleFormat(
4158 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
4159 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004160 verifyGoogleFormat(
4161 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
4162 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00004163 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4164 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4165 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
4166 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00004167 verifyGoogleFormat(
4168 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
4169 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4170 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00004171 verifyGoogleFormat(
4172 "template <typename T>\n"
4173 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4174 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
4175 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00004176
4177 FormatStyle Style = getLLVMStyle();
4178 Style.PointerAlignment = FormatStyle::PAS_Left;
4179 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4180 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
4181 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004182 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
4183 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4184 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00004185}
4186
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004187TEST_F(FormatTest, TrailingReturnType) {
4188 verifyFormat("auto foo() -> int;\n");
4189 verifyFormat("struct S {\n"
4190 " auto bar() const -> int;\n"
4191 "};");
4192 verifyFormat("template <size_t Order, typename T>\n"
4193 "auto load_img(const std::string &filename)\n"
4194 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00004195 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
4196 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00004197 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00004198 verifyFormat("template <typename T>\n"
4199 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
4200 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00004201
4202 // Not trailing return types.
4203 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004204}
4205
Daniel Jasper5be31f72013-05-21 09:16:31 +00004206TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004207 // Avoid breaking before trailing 'const' or other trailing annotations, if
4208 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00004209 FormatStyle Style = getGoogleStyle();
4210 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00004211 verifyFormat("void someLongFunction(\n"
4212 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00004213 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00004214 verifyFormat("LoooooongReturnType\n"
4215 "someLoooooooongFunction() const {}",
4216 getLLVMStyleWithColumns(47));
4217 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
4218 " const {}",
4219 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004220 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4221 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
4222 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4223 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
4224 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4225 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00004226 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
4227 " aaaaaaaaaaa aaaaa) const override;");
4228 verifyGoogleFormat(
4229 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4230 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004231
Daniel Jasper5550de62014-02-17 07:57:46 +00004232 // Even if the first parameter has to be wrapped.
4233 verifyFormat("void someLongFunction(\n"
4234 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004235 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00004236 verifyFormat("void someLongFunction(\n"
4237 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004238 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00004239 verifyFormat("void someLongFunction(\n"
4240 " int someLongParameter) override {}",
4241 Style);
4242 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004243 " int someLongParameter) OVERRIDE {}",
4244 Style);
4245 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004246 " int someLongParameter) final {}",
4247 Style);
4248 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004249 " int someLongParameter) FINAL {}",
4250 Style);
4251 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004252 " int parameter) const override {}",
4253 Style);
4254
Daniel Jaspere3f907f2014-06-02 09:52:08 +00004255 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
4256 verifyFormat("void someLongFunction(\n"
4257 " int someLongParameter) const\n"
4258 "{\n"
4259 "}",
4260 Style);
4261
Daniel Jasper5550de62014-02-17 07:57:46 +00004262 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004263 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
4264 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4265 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00004266
4267 // Breaking before function-like trailing annotations is fine to keep them
4268 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00004269 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4270 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4271 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4272 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4273 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4274 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00004275 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
4276 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00004277 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004278
4279 verifyFormat(
4280 "void aaaaaaaaaaaaaaaaaa()\n"
4281 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4282 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
4283 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4284 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004285 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004286 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004287 " GUARDED_BY(aaaaaaaaaaaa);");
4288 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004289 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004290 " GUARDED_BY(aaaaaaaaaaaa);");
4291 verifyGoogleFormat(
4292 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4293 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004294 verifyGoogleFormat(
4295 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4296 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004297}
4298
Daniel Jasperf090f032015-05-18 09:47:22 +00004299TEST_F(FormatTest, FunctionAnnotations) {
4300 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004301 "int OldFunction(const string &parameter) {}");
4302 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004303 "string OldFunction(const string &parameter) {}");
4304 verifyFormat("template <typename T>\n"
4305 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4306 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004307
4308 // Not function annotations.
4309 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4310 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004311 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4312 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004313 verifyFormat("MACRO(abc).function() // wrap\n"
4314 " << abc;");
4315 verifyFormat("MACRO(abc)->function() // wrap\n"
4316 " << abc;");
4317 verifyFormat("MACRO(abc)::function() // wrap\n"
4318 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004319}
4320
Daniel Jasperf7935112012-12-03 18:12:45 +00004321TEST_F(FormatTest, BreaksDesireably) {
4322 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4323 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004324 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004325 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4326 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4327 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004328
4329 verifyFormat(
4330 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004331 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004332
4333 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4334 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4335 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004336
4337 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004338 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4339 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4340 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00004341 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4342 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004343
4344 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4345 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4346
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004347 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004348 "void f() {\n"
4349 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4350 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4351 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004352 verifyFormat(
4353 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4354 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4355 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004356 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4357 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4358 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004359 "aaaaaa(aaa,\n"
4360 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004361 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4362 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004363 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4364 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4365 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004366
Daniel Jasper739b85f2015-06-29 10:42:59 +00004367 // Indent consistently independent of call expression and unary operator.
4368 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4369 " dddddddddddddddddddddddddddddd));");
4370 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4371 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004372 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004373 " dddddddddddddddddddddddddddddd));");
4374
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004375 // This test case breaks on an incorrect memoization, i.e. an optimization not
4376 // taking into account the StopAt value.
4377 verifyFormat(
4378 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004379 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4380 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4381 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004382
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004383 verifyFormat("{\n {\n {\n"
4384 " Annotation.SpaceRequiredBefore =\n"
4385 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4386 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4387 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004388
4389 // Break on an outer level if there was a break on an inner level.
4390 EXPECT_EQ("f(g(h(a, // comment\n"
4391 " b, c),\n"
4392 " d, e),\n"
4393 " x, y);",
4394 format("f(g(h(a, // comment\n"
4395 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004396
4397 // Prefer breaking similar line breaks.
4398 verifyFormat(
4399 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4400 " NSTrackingMouseEnteredAndExited |\n"
4401 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004402}
4403
Daniel Jasper18210d72014-10-09 09:52:05 +00004404TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4405 FormatStyle NoBinPacking = getGoogleStyle();
4406 NoBinPacking.BinPackParameters = false;
4407 NoBinPacking.BinPackArguments = true;
4408 verifyFormat("void f() {\n"
4409 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4410 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4411 "}",
4412 NoBinPacking);
4413 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4414 " int aaaaaaaaaaaaaaaaaaaa,\n"
4415 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4416 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004417
Daniel Jasper00693b082016-01-09 15:56:47 +00004418 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4419 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4420 " vector<int> bbbbbbbbbbbbbbb);",
4421 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004422 // FIXME: This behavior difference is probably not wanted. However, currently
4423 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4424 // template arguments from BreakBeforeParameter being set because of the
4425 // one-per-line formatting.
4426 verifyFormat(
4427 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4428 " aaaaaaaaaa> aaaaaaaaaa);",
4429 NoBinPacking);
4430 verifyFormat(
4431 "void fffffffffff(\n"
4432 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4433 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004434}
4435
Daniel Jasper9278eb92013-01-16 14:59:02 +00004436TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004437 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004438 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004439 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004440 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4441 " aaaaaaaaaaaaaaaaaaaa,\n"
4442 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4443 NoBinPacking);
4444 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4445 " aaaaaaaaaaaaa,\n"
4446 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4447 NoBinPacking);
4448 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004449 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4450 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4451 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4452 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004453 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4454 NoBinPacking);
4455 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4456 " .aaaaaaaaaaaaaaaaaa();",
4457 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004458 verifyFormat("void f() {\n"
4459 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4460 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4461 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004462 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004463
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004464 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004465 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4466 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004467 " aaaaaaaaaaaa);",
4468 NoBinPacking);
4469 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004470 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4471 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004472 " test);",
4473 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004474
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004475 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4476 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004477 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4478 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004479 NoBinPacking);
4480 verifyFormat("a(\"a\"\n"
4481 " \"a\",\n"
4482 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004483
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004484 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004485 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004486 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004487 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004488 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004489 verifyFormat(
4490 "void f() {\n"
4491 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4492 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004493 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004494 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004495 verifyFormat(
4496 "template <class SomeType, class SomeOtherType>\n"
4497 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4498 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004499}
4500
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004501TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4502 FormatStyle Style = getLLVMStyleWithColumns(15);
4503 Style.ExperimentalAutoDetectBinPacking = true;
4504 EXPECT_EQ("aaa(aaaa,\n"
4505 " aaaa,\n"
4506 " aaaa);\n"
4507 "aaa(aaaa,\n"
4508 " aaaa,\n"
4509 " aaaa);",
4510 format("aaa(aaaa,\n" // one-per-line
4511 " aaaa,\n"
4512 " aaaa );\n"
4513 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4514 Style));
4515 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4516 " aaaa);\n"
4517 "aaa(aaaa, aaaa,\n"
4518 " aaaa);",
4519 format("aaa(aaaa, aaaa,\n" // bin-packed
4520 " aaaa );\n"
4521 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4522 Style));
4523}
4524
Daniel Jasper04468962013-01-18 10:56:38 +00004525TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004526 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4527 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4528 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4529 " .StartsWith(\".init\", ORDER_INIT)\n"
4530 " .StartsWith(\".fini\", ORDER_FINI)\n"
4531 " .StartsWith(\".hash\", ORDER_HASH)\n"
4532 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004533
Daniel Jaspereb50c672013-02-15 20:33:06 +00004534 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004535 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004536 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004537 "aaaaaaa->aaaaaaa\n"
4538 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4539 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004540 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004541 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004542 "aaaaaaa->aaaaaaa\n"
4543 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4544 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4545 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004546 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004547 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004548 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004549 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4550 " aaaaaa->aaaaaaaaaaaa()\n"
4551 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004552 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004553 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004554 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004555 "void f() {\n"
4556 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004557 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004558 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004559 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004560 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004561 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004562 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004563 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004564 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004565 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004566 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004567 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004568
4569 verifyFormat(
4570 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4571 verifyFormat("aaaaaaaaaaaaaaa()\n"
4572 " .aaaaaaaaaaaaaaa()\n"
4573 " .aaaaaaaaaaaaaaa()\n"
4574 " .aaaaaaaaaaaaaaa()\n"
4575 " .aaaaaaaaaaaaaaa();");
4576 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4577 " .aaaaaaaaaaaaaaa()\n"
4578 " .aaaaaaaaaaaaaaa()\n"
4579 " .aaaaaaaaaaaaaaa();");
4580 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4581 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4582 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004583 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4584 " ->aaaaaaaaaaaaaae(0)\n"
4585 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004586
Daniel Jasper775954b2015-04-24 10:08:09 +00004587 // Don't linewrap after very short segments.
4588 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4589 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4590 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4591 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4592 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4593 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4594 verifyFormat("aaa()\n"
4595 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4596 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4597 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4598
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004599 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4600 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4601 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4602 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4603 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004604 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004605
Daniel Jaspera41aa532014-09-19 08:01:25 +00004606 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004607 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4608 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004609
4610 // Prefer not to create "hanging" indents.
4611 verifyFormat(
4612 "return !soooooooooooooome_map\n"
4613 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4614 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004615 verifyFormat(
4616 "return aaaaaaaaaaaaaaaa\n"
4617 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4618 " .aaaa(aaaaaaaaaaaaaa);");
4619 // No hanging indent here.
4620 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4621 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4622 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4623 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004624 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4625 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4626 getLLVMStyleWithColumns(60));
4627 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4628 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4629 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4630 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004631 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4632 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4633 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Ilya Biryukov370eff82018-09-17 07:46:20 +00004634
4635 // Dont break if only closing statements before member call
4636 verifyFormat("test() {\n"
4637 " ([]() -> {\n"
4638 " int b = 32;\n"
4639 " return 3;\n"
4640 " }).foo();\n"
4641 "}");
4642 verifyFormat("test() {\n"
4643 " (\n"
4644 " []() -> {\n"
4645 " int b = 32;\n"
4646 " return 3;\n"
4647 " },\n"
4648 " foo, bar)\n"
4649 " .foo();\n"
4650 "}");
4651 verifyFormat("test() {\n"
4652 " ([]() -> {\n"
4653 " int b = 32;\n"
4654 " return 3;\n"
4655 " })\n"
4656 " .foo()\n"
4657 " .bar();\n"
4658 "}");
4659 verifyFormat("test() {\n"
4660 " ([]() -> {\n"
4661 " int b = 32;\n"
4662 " return 3;\n"
4663 " })\n"
4664 " .foo(\"aaaaaaaaaaaaaaaaa\"\n"
4665 " \"bbbb\");\n"
4666 "}",
4667 getLLVMStyleWithColumns(30));
Daniel Jasper04468962013-01-18 10:56:38 +00004668}
4669
Daniel Jasperde5c2072012-12-24 00:13:23 +00004670TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4671 verifyFormat(
4672 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004673 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004674 verifyFormat(
4675 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4676 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4677
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004678 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004679 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004680 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4681 " ccccccccccccccccccccccccc) {\n}");
4682
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004683 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004684 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004685 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4686 " ccccccccccccccccccccccccc) {\n}");
4687
Daniel Jasperde5c2072012-12-24 00:13:23 +00004688 verifyFormat(
4689 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004690 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004691 verifyFormat(
4692 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4693 " ccccccccccccccccccccccccc) {\n}");
4694
Daniel Jasper400adc62013-02-08 15:28:42 +00004695 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4696 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4697 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4698 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004699 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4700 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4701 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4702 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4703
Daniel Jasper400adc62013-02-08 15:28:42 +00004704 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4705 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4706 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004707 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4708 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4709 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004710}
4711
Daniel Jasper43b65482013-01-23 12:27:43 +00004712TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004713 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004714 "unsigned Cost =\n"
4715 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4716 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004717 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004718 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4719 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004720
4721 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004722 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4723 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004724 verifyFormat("unsigned OriginalStartColumn =\n"
4725 " SourceMgr.getSpellingColumnNumber(\n"
4726 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4727 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004728}
4729
Francois Ferrand9976efa2017-05-22 08:28:17 +00004730TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
4731 FormatStyle Style = getLLVMStyle();
4732 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4733 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
4734 Style);
4735
4736 Style.PenaltyBreakAssignment = 20;
4737 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4738 " cccccccccccccccccccccccccc;",
4739 Style);
4740}
4741
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004742TEST_F(FormatTest, AlignsAfterAssignments) {
4743 verifyFormat(
4744 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004745 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004746 verifyFormat(
4747 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004748 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004749 verifyFormat(
4750 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004751 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004752 verifyFormat(
4753 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004754 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004755 verifyFormat(
4756 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4757 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4758 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004759}
4760
4761TEST_F(FormatTest, AlignsAfterReturn) {
4762 verifyFormat(
4763 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4764 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4765 verifyFormat(
4766 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4767 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004768 verifyFormat(
4769 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004770 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004771 verifyFormat(
4772 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004773 " aaaaaaaaaaaaaaaaaaaaaa());");
4774 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4775 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4776 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4777 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4778 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004779 verifyFormat("return\n"
4780 " // true if code is one of a or b.\n"
4781 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004782}
4783
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004784TEST_F(FormatTest, AlignsAfterOpenBracket) {
4785 verifyFormat(
4786 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4787 " aaaaaaaaa aaaaaaa) {}");
4788 verifyFormat(
4789 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4790 " aaaaaaaaaaa aaaaaaaaa);");
4791 verifyFormat(
4792 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4793 " aaaaaaaaaaaaaaaaaaaaa));");
4794 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004795 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004796 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4797 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4798 Style);
4799 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4800 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4801 Style);
4802 verifyFormat("SomeLongVariableName->someFunction(\n"
4803 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4804 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004805 verifyFormat(
4806 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4807 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4808 Style);
4809 verifyFormat(
4810 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4811 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4812 Style);
4813 verifyFormat(
4814 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4815 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4816 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004817
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004818 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4819 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4820 " b));",
4821 Style);
4822
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004823 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4824 Style.BinPackArguments = false;
4825 Style.BinPackParameters = false;
4826 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4827 " aaaaaaaaaaa aaaaaaaa,\n"
4828 " aaaaaaaaa aaaaaaa,\n"
4829 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4830 Style);
4831 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4832 " aaaaaaaaaaa aaaaaaaaa,\n"
4833 " aaaaaaaaaaa aaaaaaaaa,\n"
4834 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4835 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004836 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4837 " aaaaaaaaaaaaaaa,\n"
4838 " aaaaaaaaaaaaaaaaaaaaa,\n"
4839 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004840 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004841 verifyFormat(
4842 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4843 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4844 Style);
4845 verifyFormat(
4846 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4847 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4848 Style);
4849 verifyFormat(
4850 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4851 " aaaaaaaaaaaaaaaaaaaaa(\n"
4852 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4853 " aaaaaaaaaaaaaaaa);",
4854 Style);
4855 verifyFormat(
4856 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4857 " aaaaaaaaaaaaaaaaaaaaa(\n"
4858 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4859 " aaaaaaaaaaaaaaaa);",
4860 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004861}
4862
Daniel Jasper3219e432014-12-02 13:24:51 +00004863TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4864 FormatStyle Style = getLLVMStyleWithColumns(40);
4865 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4866 " bbbbbbbbbbbbbbbbbbbbbb);",
4867 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004868 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004869 Style.AlignOperands = false;
4870 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4871 " bbbbbbbbbbbbbbbbbbbbbb);",
4872 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004873 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004874 Style.AlignOperands = true;
4875 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4876 " bbbbbbbbbbbbbbbbbbbbbb);",
4877 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004878 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004879 Style.AlignOperands = false;
4880 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4881 " bbbbbbbbbbbbbbbbbbbbbb);",
4882 Style);
4883}
4884
Daniel Jasper399d24b2013-01-09 07:06:56 +00004885TEST_F(FormatTest, BreaksConditionalExpressions) {
4886 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004887 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4888 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4889 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4890 verifyFormat(
4891 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004892 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4893 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004894 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004895 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4896 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4897 verifyFormat(
4898 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004899 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4900 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004901 verifyFormat(
4902 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4903 " : aaaaaaaaaaaaa);");
4904 verifyFormat(
4905 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004906 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004907 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4908 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004909 verifyFormat(
4910 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4911 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4912 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004913 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4914 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4915 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4916 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4917 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4918 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4919 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4920 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4921 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4922 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4923 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4924 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004925 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4926 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4927 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4928 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4929 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004930 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4931 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4932 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004933 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4934 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4935 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4936 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004937 verifyFormat(
4938 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4939 " ? aaaaaaaaaaaaaaa\n"
4940 " : aaaaaaaaaaaaaaa;");
4941 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004942 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004943 " ? b\n"
4944 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004945 verifyFormat("return aaaa == bbbb\n"
4946 " // comment\n"
4947 " ? aaaa\n"
4948 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004949 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004950 " format(TheLine.First,\n"
4951 " IndentForLevel[TheLine.Level] >= 0\n"
4952 " ? IndentForLevel[TheLine.Level]\n"
4953 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004954 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004955 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004956 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4957 " ? aaaaaaaaaaaaaaa\n"
4958 " : bbbbbbbbbbbbbbb //\n"
4959 " ? ccccccccccccccc\n"
4960 " : ddddddddddddddd;");
4961 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4962 " ? aaaaaaaaaaaaaaa\n"
4963 " : (bbbbbbbbbbbbbbb //\n"
4964 " ? ccccccccccccccc\n"
4965 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004966 verifyFormat(
4967 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4968 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4969 " aaaaaaaaaaaaaaaaaaaaa +\n"
4970 " aaaaaaaaaaaaaaaaaaaaa\n"
4971 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004972 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004973 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4974 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4975 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004976
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004977 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004978 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004979 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004980 "void f() {\n"
4981 " g(aaa,\n"
4982 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4983 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4984 " ? aaaaaaaaaaaaaaa\n"
4985 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004986 "}",
4987 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004988 verifyFormat(
4989 "void f() {\n"
4990 " g(aaa,\n"
4991 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4992 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4993 " ?: aaaaaaaaaaaaaaa);\n"
4994 "}",
4995 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004996
4997 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4998 " // comment.\n"
4999 " ccccccccccccccccccccccccccccccccccccccc\n"
5000 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5001 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00005002
5003 // Assignments in conditional expressions. Apparently not uncommon :-(.
5004 verifyFormat("return a != b\n"
5005 " // comment\n"
5006 " ? a = b\n"
5007 " : a = b;");
5008 verifyFormat("return a != b\n"
5009 " // comment\n"
5010 " ? a = a != b\n"
5011 " // comment\n"
5012 " ? a = b\n"
5013 " : a\n"
5014 " : a;\n");
5015 verifyFormat("return a != b\n"
5016 " // comment\n"
5017 " ? a\n"
5018 " : a = a != b\n"
5019 " // comment\n"
5020 " ? a = b\n"
5021 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00005022}
5023
Daniel Jasper165b29e2013-11-08 00:57:11 +00005024TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
5025 FormatStyle Style = getLLVMStyle();
5026 Style.BreakBeforeTernaryOperators = false;
5027 Style.ColumnLimit = 70;
5028 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005029 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5030 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5031 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5032 Style);
5033 verifyFormat(
5034 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005035 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5036 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005037 Style);
5038 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005039 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5040 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5041 Style);
5042 verifyFormat(
5043 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005044 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5045 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005046 Style);
5047 verifyFormat(
5048 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
5049 " aaaaaaaaaaaaa);",
5050 Style);
5051 verifyFormat(
5052 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5053 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5054 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5055 " aaaaaaaaaaaaa);",
5056 Style);
5057 verifyFormat(
5058 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5059 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5060 " aaaaaaaaaaaaa);",
5061 Style);
5062 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5063 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5064 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5065 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5066 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5067 Style);
5068 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5069 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5070 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5071 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5072 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5073 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5074 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5075 Style);
5076 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5077 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
5078 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5079 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5080 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5081 Style);
5082 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5083 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5084 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5085 Style);
5086 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00005087 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00005088 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5089 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5090 Style);
5091 verifyFormat(
5092 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5093 " aaaaaaaaaaaaaaa :\n"
5094 " aaaaaaaaaaaaaaa;",
5095 Style);
5096 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5097 " aaaaaaaaa ?\n"
5098 " b :\n"
5099 " c);",
5100 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00005101 verifyFormat("unsigned Indent =\n"
5102 " format(TheLine.First,\n"
5103 " IndentForLevel[TheLine.Level] >= 0 ?\n"
5104 " IndentForLevel[TheLine.Level] :\n"
5105 " TheLine * 2,\n"
5106 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
5107 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005108 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5109 " aaaaaaaaaaaaaaa :\n"
5110 " bbbbbbbbbbbbbbb ? //\n"
5111 " ccccccccccccccc :\n"
5112 " ddddddddddddddd;",
5113 Style);
5114 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5115 " aaaaaaaaaaaaaaa :\n"
5116 " (bbbbbbbbbbbbbbb ? //\n"
5117 " ccccccccccccccc :\n"
5118 " ddddddddddddddd);",
5119 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00005120 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5121 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
5122 " ccccccccccccccccccccccccccc;",
5123 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00005124 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5125 " aaaaa :\n"
5126 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
5127 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005128}
5129
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005130TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
5131 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
5132 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
5133 verifyFormat("bool a = true, b = false;");
5134
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005135 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005136 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005137 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00005138 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005139 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00005140 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005141 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00005142 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00005143 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
5144 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
5145 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5146 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
5147 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
5148 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005149
Daniel Jasperbea1ab42015-03-01 18:55:26 +00005150 FormatStyle Style = getGoogleStyle();
5151 Style.PointerAlignment = FormatStyle::PAS_Left;
5152 Style.DerivePointerAlignment = false;
5153 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5154 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
5155 " *b = bbbbbbbbbbbbbbbbbbb;",
5156 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00005157 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5158 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
5159 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00005160 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00005161 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005162}
5163
Nico Weber4a5030c2013-01-12 01:28:06 +00005164TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
5165 verifyFormat("arr[foo ? bar : baz];");
5166 verifyFormat("f()[foo ? bar : baz];");
5167 verifyFormat("(a + b)[foo ? bar : baz];");
5168 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
5169}
5170
Daniel Jasperf7935112012-12-03 18:12:45 +00005171TEST_F(FormatTest, AlignsStringLiterals) {
5172 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
5173 " \"short literal\");");
5174 verifyFormat(
5175 "looooooooooooooooooooooooongFunction(\n"
5176 " \"short literal\"\n"
5177 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005178 verifyFormat("someFunction(\"Always break between multi-line\"\n"
5179 " \" string literals\",\n"
5180 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005181 EXPECT_EQ("fun + \"1243\" /* comment */\n"
5182 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005183 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00005184 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005185 getLLVMStyleWithColumns(28)));
5186 EXPECT_EQ(
5187 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
5188 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
5189 " \"aaaaaaaaaaaaaaaa\";",
5190 format("aaaaaa ="
5191 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
5192 "aaaaaaaaaaaaaaaaaaaaa\" "
5193 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005194 verifyFormat("a = a + \"a\"\n"
5195 " \"a\"\n"
5196 " \"a\";");
5197 verifyFormat("f(\"a\", \"b\"\n"
5198 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005199
5200 verifyFormat(
5201 "#define LL_FORMAT \"ll\"\n"
5202 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
5203 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00005204
5205 verifyFormat("#define A(X) \\\n"
5206 " \"aaaaa\" #X \"bbbbbb\" \\\n"
5207 " \"ccccc\"",
5208 getLLVMStyleWithColumns(23));
5209 verifyFormat("#define A \"def\"\n"
5210 "f(\"abc\" A \"ghi\"\n"
5211 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005212
5213 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005214 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005215 verifyFormat("#define A(X) \\\n"
5216 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
5217 " L\"ccccc\"",
5218 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00005219
5220 verifyFormat("f(@\"a\"\n"
5221 " @\"b\");");
5222 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00005223 " @\"b\"\n"
5224 " @\"c\";");
5225 verifyFormat("NSString s = @\"a\"\n"
5226 " \"b\"\n"
5227 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00005228}
5229
Zachary Turner448592e2015-12-18 22:20:15 +00005230TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005231 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005232 // No declarations or definitions should be moved to own line.
5233 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
5234 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005235 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005236 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005237 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005238 "int f() { return 1; }\n"
5239 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005240 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00005241
5242 // All declarations and definitions should have the return type moved to its
5243 // own
5244 // line.
5245 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
5246 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005247 " int\n"
5248 " f() {\n"
5249 " return 1;\n"
5250 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005251 " int\n"
5252 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005253 "};\n"
5254 "int\n"
5255 "f() {\n"
5256 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005257 "}\n"
5258 "int\n"
5259 "g();\n",
5260 Style);
5261
5262 // Top-level definitions, and no kinds of declarations should have the
5263 // return type moved to its own line.
5264 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
5265 verifyFormat("class B {\n"
5266 " int f() { return 1; }\n"
5267 " int g();\n"
5268 "};\n"
5269 "int\n"
5270 "f() {\n"
5271 " return 1;\n"
5272 "}\n"
5273 "int g();\n",
5274 Style);
5275
5276 // Top-level definitions and declarations should have the return type moved
5277 // to its own line.
5278 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
5279 verifyFormat("class C {\n"
5280 " int f() { return 1; }\n"
5281 " int g();\n"
5282 "};\n"
5283 "int\n"
5284 "f() {\n"
5285 " return 1;\n"
5286 "}\n"
5287 "int\n"
5288 "g();\n",
5289 Style);
5290
5291 // All definitions should have the return type moved to its own line, but no
5292 // kinds of declarations.
5293 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5294 verifyFormat("class D {\n"
5295 " int\n"
5296 " f() {\n"
5297 " return 1;\n"
5298 " }\n"
5299 " int g();\n"
5300 "};\n"
5301 "int\n"
5302 "f() {\n"
5303 " return 1;\n"
5304 "}\n"
5305 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005306 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005307 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005308 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005309 " return \"\";\n"
5310 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005311 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005312 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005313 verifyFormat("template <class T>\n"
5314 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005315 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005316 " return NULL;\n"
5317 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005318 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005319 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00005320 verifyFormat("class C {\n"
5321 " int\n"
5322 " operator+() {\n"
5323 " return 1;\n"
5324 " }\n"
5325 " int\n"
5326 " operator()() {\n"
5327 " return 1;\n"
5328 " }\n"
5329 "};\n",
5330 Style);
5331 verifyFormat("void\n"
5332 "A::operator()() {}\n"
5333 "void\n"
5334 "A::operator>>() {}\n"
5335 "void\n"
5336 "A::operator+() {}\n",
5337 Style);
5338 verifyFormat("void *operator new(std::size_t s);", // No break here.
5339 Style);
5340 verifyFormat("void *\n"
5341 "operator new(std::size_t s) {}",
5342 Style);
5343 verifyFormat("void *\n"
5344 "operator delete[](void *ptr) {}",
5345 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005346 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005347 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005348 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005349 "{\n"
5350 " return \"\";\n"
5351 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005352 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005353 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005354 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005355 "T *\n" // Problem here: no line break
5356 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005357 "{\n"
5358 " return NULL;\n"
5359 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005360 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005361 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005362}
5363
Alexander Kornienko58611712013-07-04 12:02:44 +00005364TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5365 FormatStyle NoBreak = getLLVMStyle();
5366 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5367 FormatStyle Break = getLLVMStyle();
5368 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005369 verifyFormat("aaaa = \"bbbb\"\n"
5370 " \"cccc\";",
5371 NoBreak);
5372 verifyFormat("aaaa =\n"
5373 " \"bbbb\"\n"
5374 " \"cccc\";",
5375 Break);
5376 verifyFormat("aaaa(\"bbbb\"\n"
5377 " \"cccc\");",
5378 NoBreak);
5379 verifyFormat("aaaa(\n"
5380 " \"bbbb\"\n"
5381 " \"cccc\");",
5382 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005383 verifyFormat("aaaa(qqq, \"bbbb\"\n"
5384 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005385 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005386 verifyFormat("aaaa(qqq,\n"
5387 " \"bbbb\"\n"
5388 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005389 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005390 verifyFormat("aaaa(qqq,\n"
5391 " L\"bbbb\"\n"
5392 " L\"cccc\");",
5393 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005394 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5395 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005396 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005397 verifyFormat("string s = someFunction(\n"
5398 " \"abc\"\n"
5399 " \"abc\");",
5400 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005401
Daniel Jasper3251fff2014-06-10 06:27:23 +00005402 // As we break before unary operators, breaking right after them is bad.
5403 verifyFormat("string foo = abc ? \"x\"\n"
5404 " \"blah blah blah blah blah blah\"\n"
5405 " : \"y\";",
5406 Break);
5407
Daniel Jasperc834c702013-07-17 15:38:19 +00005408 // Don't break if there is no column gain.
5409 verifyFormat("f(\"aaaa\"\n"
5410 " \"bbbb\");",
5411 Break);
5412
5413 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005414 EXPECT_EQ("x = \"a\\\n"
5415 "b\\\n"
5416 "c\";",
5417 format("x = \"a\\\n"
5418 "b\\\n"
5419 "c\";",
5420 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005421 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005422 " \"a\\\n"
5423 "b\\\n"
5424 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005425 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005426 "b\\\n"
5427 "c\";",
5428 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005429
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00005430 EXPECT_EQ("NSString *const kString =\n"
5431 " @\"aaaa\"\n"
5432 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005433 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005434 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005435 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005436
5437 Break.ColumnLimit = 0;
5438 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005439}
5440
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005441TEST_F(FormatTest, AlignsPipes) {
5442 verifyFormat(
5443 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5444 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5445 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5446 verifyFormat(
5447 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5448 " << aaaaaaaaaaaaaaaaaaaa;");
5449 verifyFormat(
5450 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5451 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5452 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005453 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5454 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5455 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005456 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5457 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5458 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5459 verifyFormat(
5460 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5461 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5462 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005463 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5464 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5465 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5466 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005467 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5468 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005469 verifyFormat(
5470 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5471 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00005472 verifyFormat(
5473 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
5474 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005475
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005476 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5477 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005478 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5479 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5480 " aaaaaaaaaaaaaaaaaaaaa)\n"
5481 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005482 verifyFormat("LOG_IF(aaa == //\n"
5483 " bbb)\n"
5484 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005485
Daniel Jasper467ddb12013-08-12 12:58:05 +00005486 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005487 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5488 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005489 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5490 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5491 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005492 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5493 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005494 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5495 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5496 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5497 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5498 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5499 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5500 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005501
Daniel Jasperc238c872013-04-02 14:33:13 +00005502 verifyFormat(
5503 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5504 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005505
5506 // Incomplete string literal.
5507 EXPECT_EQ("llvm::errs() << \"\n"
5508 " << a;",
5509 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005510
5511 verifyFormat("void f() {\n"
5512 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5513 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5514 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005515
5516 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005517 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5518 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5519 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005520
5521 // Handle '\n'.
5522 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5523 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5524 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5525 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5526 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5527 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5528 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005529}
5530
Daniel Jasper7209bb92016-12-13 11:16:42 +00005531TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5532 verifyFormat("return out << \"somepacket = {\\n\"\n"
5533 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5534 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5535 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5536 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5537 " << \"}\";");
5538
5539 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5540 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5541 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5542 verifyFormat(
5543 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5544 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5545 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5546 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5547 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5548 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5549 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5550 verifyFormat(
5551 "void f() {\n"
5552 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5553 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5554 "}");
5555
5556 // Breaking before the first "<<" is generally not desirable.
5557 verifyFormat(
5558 "llvm::errs()\n"
5559 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5560 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5561 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5562 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5563 getLLVMStyleWithColumns(70));
5564 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5565 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5566 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5567 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5568 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5569 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5570 getLLVMStyleWithColumns(70));
5571
5572 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5573 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5574 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5575 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5576 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5577 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005578 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5579 " (aaaa + aaaa);",
5580 getLLVMStyleWithColumns(40));
5581 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5582 " (aaaaaaa + aaaaa));",
5583 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005584 verifyFormat(
5585 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5586 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5587 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005588}
5589
Daniel Jasperf7935112012-12-03 18:12:45 +00005590TEST_F(FormatTest, UnderstandsEquals) {
5591 verifyFormat(
5592 "aaaaaaaaaaaaaaaaa =\n"
5593 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5594 verifyFormat(
5595 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005596 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005597 verifyFormat(
5598 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005599 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005600 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005601 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5602 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005603
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005604 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5605 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005606}
5607
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005608TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005609 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5610 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005611
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005612 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5613 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005614
5615 verifyFormat(
5616 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5617 " Parameter2);");
5618
5619 verifyFormat(
5620 "ShortObject->shortFunction(\n"
5621 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5622 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5623
5624 verifyFormat("loooooooooooooongFunction(\n"
5625 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5626
5627 verifyFormat(
5628 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5629 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5630
Daniel Jasper687af3b2013-02-14 14:26:07 +00005631 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5632 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005633 verifyFormat("void f() {\n"
5634 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5635 " .Times(2)\n"
5636 " .WillRepeatedly(Return(SomeValue));\n"
5637 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005638 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5639 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005640 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005641 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5642 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005643 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005644 verifyFormat("void f() {\n"
5645 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5646 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5647 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005648 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5649 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5650 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5651 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5652 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005653 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5654 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5655 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5656 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5657 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005658
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005659 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005660 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005661 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005662 verifyFormat(
5663 "aaaaaaaaaaa->aaaaaaaaa(\n"
5664 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5665 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005666
5667 verifyFormat(
5668 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5669 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005670 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5671 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5672 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5673 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005674
Daniel Jasper9b334242013-03-15 14:57:30 +00005675 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005676 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5677 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005678
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005679 FormatStyle NoBinPacking = getLLVMStyle();
5680 NoBinPacking.BinPackParameters = false;
5681 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5682 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5683 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5684 " aaaaaaaaaaaaaaaaaaa,\n"
5685 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5686 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005687
5688 // If there is a subsequent call, change to hanging indentation.
5689 verifyFormat(
5690 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5691 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5692 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5693 verifyFormat(
5694 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5695 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005696 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5697 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5698 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5699 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5700 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5701 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005702}
5703
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005704TEST_F(FormatTest, WrapsTemplateDeclarations) {
5705 verifyFormat("template <typename T>\n"
5706 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005707 verifyFormat("template <typename T>\n"
5708 "// T should be one of {A, B}.\n"
5709 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005710 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005711 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005712 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005713 verifyFormat("template <typename T>\n"
5714 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5715 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005716 verifyFormat(
5717 "template <typename T>\n"
5718 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5719 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005720 verifyFormat(
5721 "template <typename T>\n"
5722 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5723 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5724 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005725 verifyFormat("template <typename T>\n"
5726 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005727 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005728 verifyFormat(
5729 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5730 " typename T4 = char>\n"
5731 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005732 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5733 " template <typename> class cccccccccccccccccccccc,\n"
5734 " typename ddddddddddddd>\n"
5735 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005736 verifyFormat(
5737 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5738 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005739
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005740 verifyFormat("void f() {\n"
5741 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5742 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5743 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005744
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005745 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005746 verifyFormat("template <typename T> void f();");
5747 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005748 verifyFormat(
5749 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5750 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5751 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5752 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5753 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5754 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5755 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5756 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005757 EXPECT_EQ("static_cast<A< //\n"
5758 " B> *>(\n"
5759 "\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00005760 ");",
Daniel Jasperfcfac102014-07-15 09:00:34 +00005761 format("static_cast<A<//\n"
5762 " B>*>(\n"
5763 "\n"
5764 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005765 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5766 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005767
5768 FormatStyle AlwaysBreak = getLLVMStyle();
Francois Ferrand58e6fe52018-05-16 08:25:03 +00005769 AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005770 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5771 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5772 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5773 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5774 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5775 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5776 verifyFormat("template <template <typename> class Fooooooo,\n"
5777 " template <typename> class Baaaaaaar>\n"
5778 "struct C {};",
5779 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005780 verifyFormat("template <typename T> // T can be A, B or C.\n"
5781 "struct C {};",
5782 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005783 verifyFormat("template <enum E> class A {\n"
5784 "public:\n"
5785 " E *f();\n"
5786 "};");
Francois Ferrand58e6fe52018-05-16 08:25:03 +00005787
5788 FormatStyle NeverBreak = getLLVMStyle();
5789 NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No;
5790 verifyFormat("template <typename T> class C {};", NeverBreak);
5791 verifyFormat("template <typename T> void f();", NeverBreak);
5792 verifyFormat("template <typename T> void f() {}", NeverBreak);
5793 verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",
5794 NeverBreak);
5795 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5796 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5797 " ccccccccccccccccccccccccccccccccccccccccccccccc);",
5798 NeverBreak);
5799 verifyFormat("template <template <typename> class Fooooooo,\n"
5800 " template <typename> class Baaaaaaar>\n"
5801 "struct C {};",
5802 NeverBreak);
5803 verifyFormat("template <typename T> // T can be A, B or C.\n"
5804 "struct C {};",
5805 NeverBreak);
5806 verifyFormat("template <enum E> class A {\n"
5807 "public:\n"
5808 " E *f();\n"
5809 "};", NeverBreak);
5810 NeverBreak.PenaltyBreakTemplateDeclaration = 100;
5811 verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",
5812 NeverBreak);
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005813}
5814
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005815TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) {
5816 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
5817 Style.ColumnLimit = 60;
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005818 EXPECT_EQ("// Baseline - no comments.\n"
5819 "template <\n"
5820 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
5821 "void f() {}",
5822 format("// Baseline - no comments.\n"
5823 "template <\n"
5824 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
5825 "void f() {}",
5826 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005827
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005828 EXPECT_EQ("template <\n"
5829 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5830 "void f() {}",
5831 format("template <\n"
5832 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5833 "void f() {}",
5834 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005835
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005836 EXPECT_EQ(
5837 "template <\n"
5838 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
5839 "void f() {}",
5840 format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
5841 "void f() {}",
5842 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005843
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005844 EXPECT_EQ(
5845 "template <\n"
5846 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5847 " // multiline\n"
5848 "void f() {}",
5849 format("template <\n"
5850 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5851 " // multiline\n"
5852 "void f() {}",
5853 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005854
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005855 EXPECT_EQ(
5856 "template <typename aaaaaaaaaa<\n"
5857 " bbbbbbbbbbbb>::value> // trailing loooong\n"
5858 "void f() {}",
5859 format(
5860 "template <\n"
5861 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n"
5862 "void f() {}",
5863 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005864}
5865
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00005866TEST_F(FormatTest, WrapsTemplateParameters) {
5867 FormatStyle Style = getLLVMStyle();
5868 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5869 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5870 verifyFormat(
5871 "template <typename... a> struct q {};\n"
5872 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5873 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5874 " y;",
5875 Style);
5876 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5877 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5878 verifyFormat(
5879 "template <typename... a> struct r {};\n"
5880 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5881 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5882 " y;",
5883 Style);
5884 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5885 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5886 verifyFormat(
5887 "template <typename... a> struct s {};\n"
5888 "extern s<\n"
5889 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5890 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5891 " y;",
5892 Style);
5893 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5894 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5895 verifyFormat(
5896 "template <typename... a> struct t {};\n"
5897 "extern t<\n"
5898 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5899 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5900 " y;",
5901 Style);
5902}
5903
Daniel Jasper45797022013-01-25 10:57:27 +00005904TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5905 verifyFormat(
5906 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5907 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5908 verifyFormat(
5909 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5910 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5911 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5912
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005913 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005914 verifyFormat(
5915 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5916 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005917 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005918
Daniel Jasper45797022013-01-25 10:57:27 +00005919 verifyFormat(
5920 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005921 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005922
5923 // Breaking at nested name specifiers is generally not desirable.
5924 verifyFormat(
5925 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5926 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005927
5928 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005929 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5930 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5931 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005932 " aaaaaaaaaaaaaaaaaaaaa);",
5933 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005934
5935 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5936 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5937 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005938}
5939
Daniel Jasperf7935112012-12-03 18:12:45 +00005940TEST_F(FormatTest, UnderstandsTemplateParameters) {
5941 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005942 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005943 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5944 verifyFormat("bool x = a < 1 || 2 > a;");
5945 verifyFormat("bool x = 5 < f<int>();");
5946 verifyFormat("bool x = f<int>() > 5;");
5947 verifyFormat("bool x = 5 < a<int>::x;");
5948 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5949 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5950
5951 verifyGoogleFormat("A<A<int>> a;");
5952 verifyGoogleFormat("A<A<A<int>>> a;");
5953 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005954 verifyGoogleFormat("A<A<int> > a;");
5955 verifyGoogleFormat("A<A<A<int> > > a;");
5956 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005957 verifyGoogleFormat("A<::A<int>> a;");
5958 verifyGoogleFormat("A<::A> a;");
5959 verifyGoogleFormat("A< ::A> a;");
5960 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005961 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5962 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005963 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5964 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005965 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5966 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005967
Nico Weber7533b4d2014-09-24 17:17:32 +00005968 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5969
Daniel Jasperf7935112012-12-03 18:12:45 +00005970 verifyFormat("test >> a >> b;");
5971 verifyFormat("test << a >> b;");
5972
5973 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005974 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005975 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005976 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5977 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005978 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005979 verifyFormat("f(a.operator()<A>());");
5980 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5981 " .template operator()<A>());",
5982 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005983
5984 // Not template parameters.
5985 verifyFormat("return a < b && c > d;");
5986 verifyFormat("void f() {\n"
5987 " while (a < b && c > d) {\n"
5988 " }\n"
5989 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005990 verifyFormat("template <typename... Types>\n"
5991 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005992
5993 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5994 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5995 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005996 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005997 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005998 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005999}
6000
Malcolm Parsons6af3f142016-11-03 16:57:30 +00006001TEST_F(FormatTest, BitshiftOperatorWidth) {
6002 EXPECT_EQ("int a = 1 << 2; /* foo\n"
6003 " bar */",
6004 format("int a=1<<2; /* foo\n"
6005 " bar */"));
6006
6007 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
6008 " bar */",
6009 format("int b =256>>1 ; /* foo\n"
6010 " bar */"));
6011}
6012
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006013TEST_F(FormatTest, UnderstandsBinaryOperators) {
6014 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00006015 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00006016}
6017
6018TEST_F(FormatTest, UnderstandsPointersToMembers) {
6019 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006020 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006021 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006022 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006023 verifyFormat("void f() {\n"
6024 " (a->*f)();\n"
6025 " a->*x;\n"
6026 " (a.*f)();\n"
6027 " ((*a).*f)();\n"
6028 " a.*x;\n"
6029 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00006030 verifyFormat("void f() {\n"
6031 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
6032 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
6033 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00006034 verifyFormat(
6035 "(aaaaaaaaaa->*bbbbbbb)(\n"
6036 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006037 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006038 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006039 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006040}
6041
Daniel Jasper8dd40472012-12-21 09:41:31 +00006042TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00006043 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00006044 verifyFormat("f(-1, -2, -3);");
6045 verifyFormat("a[-1] = 5;");
6046 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006047 verifyFormat("if (i == -1) {\n}");
6048 verifyFormat("if (i != -1) {\n}");
6049 verifyFormat("if (i > -1) {\n}");
6050 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00006051 verifyFormat("++(a->f());");
6052 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00006053 verifyFormat("(a->f())++;");
6054 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006055 verifyFormat("if (!(a->f())) {\n}");
Krasimir Georgiev446d6ec2018-03-06 13:56:28 +00006056 verifyFormat("if (!+i) {\n}");
6057 verifyFormat("~&a;");
Daniel Jasper8dd40472012-12-21 09:41:31 +00006058
6059 verifyFormat("a-- > b;");
6060 verifyFormat("b ? -a : c;");
6061 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006062 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00006063 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006064 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00006065
6066 verifyFormat("return -1;");
6067 verifyFormat("switch (a) {\n"
6068 "case -1:\n"
6069 " break;\n"
6070 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00006071 verifyFormat("#define X -1");
6072 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00006073
Chandler Carruthf8b72662014-03-02 12:37:31 +00006074 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
6075 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00006076
6077 verifyFormat("int a = /* confusing comment */ -1;");
6078 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
6079 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006080}
6081
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006082TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00006083 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006084 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00006085 "}");
6086 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00006087 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00006088 verifyFormat("*aaa = aaaaaaa( // break\n"
6089 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00006090}
6091
Daniel Jasper8863ada2013-08-26 08:10:17 +00006092TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00006093 verifyFormat("bool operator<();");
6094 verifyFormat("bool operator>();");
6095 verifyFormat("bool operator=();");
6096 verifyFormat("bool operator==();");
6097 verifyFormat("bool operator!=();");
6098 verifyFormat("int operator+();");
6099 verifyFormat("int operator++();");
Daniel Jasperbbf5f4e2017-11-06 12:11:51 +00006100 verifyFormat("int operator++(int) volatile noexcept;");
Daniel Jasper804a2762016-01-09 15:56:40 +00006101 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006102 verifyFormat("bool operator();");
6103 verifyFormat("bool operator()();");
6104 verifyFormat("bool operator[]();");
6105 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006106 verifyFormat("operator int();");
6107 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006108 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006109 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006110 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006111 verifyFormat("void *operator new(std::size_t size);");
6112 verifyFormat("void *operator new[](std::size_t size);");
6113 verifyFormat("void operator delete(void *ptr);");
6114 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00006115 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
6116 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00006117 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00006118 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006119
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006120 verifyFormat(
6121 "ostream &operator<<(ostream &OutputStream,\n"
6122 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00006123 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
6124 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
6125 " return left.group < right.group;\n"
6126 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00006127 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00006128 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006129
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006130 verifyGoogleFormat("operator void*();");
6131 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00006132 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00006133
6134 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00006135 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
6136 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006137}
6138
Daniel Jasper1c220482015-02-25 10:30:06 +00006139TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00006140 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
6141 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
6142 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
6143 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
6144 verifyFormat("Deleted &operator=(const Deleted &) &;");
6145 verifyFormat("Deleted &operator=(const Deleted &) &&;");
6146 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
6147 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
6148 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
6149 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
6150 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00006151 verifyFormat("void Fn(T const &) const &;");
6152 verifyFormat("void Fn(T const volatile &&) const volatile &&;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00006153 verifyFormat("template <typename T>\n"
6154 "void F(T) && = delete;",
6155 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00006156
Daniel Jasperaf642c62015-08-25 13:40:51 +00006157 FormatStyle AlignLeft = getLLVMStyle();
6158 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00006159 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00006160 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
6161 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
6162 AlignLeft);
6163 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
6164 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006165 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
6166 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
6167 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
6168 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00006169 verifyFormat("void Fn(T const&) const&;", AlignLeft);
6170 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00006171
6172 FormatStyle Spaces = getLLVMStyle();
6173 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006174 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
6175 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
6176 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
6177 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006178
6179 Spaces.SpacesInCStyleCastParentheses = false;
6180 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006181 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
6182 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
6183 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
6184 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006185}
6186
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006187TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00006188 verifyFormat("void f() {\n"
6189 " A *a = new A;\n"
6190 " A *a = new (placement) A;\n"
6191 " delete a;\n"
6192 " delete (A *)a;\n"
6193 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00006194 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6195 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00006196 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6197 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6198 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00006199 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006200}
6201
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006202TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006203 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006204 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006205 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006206 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006207 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006208 verifyIndependentOfContext("int a = b * 10;");
6209 verifyIndependentOfContext("int a = 10 * b;");
6210 verifyIndependentOfContext("int a = b * c;");
6211 verifyIndependentOfContext("int a += b * c;");
6212 verifyIndependentOfContext("int a -= b * c;");
6213 verifyIndependentOfContext("int a *= b * c;");
6214 verifyIndependentOfContext("int a /= b * c;");
6215 verifyIndependentOfContext("int a = *b;");
6216 verifyIndependentOfContext("int a = *b * c;");
6217 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00006218 verifyIndependentOfContext("int a = b * (10);");
6219 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006220 verifyIndependentOfContext("return 10 * b;");
6221 verifyIndependentOfContext("return *b * *c;");
6222 verifyIndependentOfContext("return a & ~b;");
6223 verifyIndependentOfContext("f(b ? *c : *d);");
6224 verifyIndependentOfContext("int a = b ? *c : *d;");
6225 verifyIndependentOfContext("*b = a;");
6226 verifyIndependentOfContext("a * ~b;");
6227 verifyIndependentOfContext("a * !b;");
6228 verifyIndependentOfContext("a * +b;");
6229 verifyIndependentOfContext("a * -b;");
6230 verifyIndependentOfContext("a * ++b;");
6231 verifyIndependentOfContext("a * --b;");
6232 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00006233 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006234 verifyIndependentOfContext("f() * b;");
6235 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006236 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006237 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00006238 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006239 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00006240 verifyIndependentOfContext("return sizeof(int **);");
6241 verifyIndependentOfContext("return sizeof(int ******);");
6242 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00006243 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006244 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00006245 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00006246 verifyGoogleFormat("return sizeof(int**);");
6247 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
6248 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006249 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00006250 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00006251 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00006252 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00006253 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00006254 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00006255 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00006256 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00006257 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00006258 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00006259 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00006260 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00006261 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00006262 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00006263 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00006264 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00006265 verifyFormat("void f(const MyOverride &override);");
6266 verifyFormat("void f(const MyFinal &final);");
6267 verifyIndependentOfContext("bool a = f() && override.f();");
6268 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00006269
Daniel Jasper5b49f472013-01-23 12:10:53 +00006270 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00006271
Daniel Jasper5b49f472013-01-23 12:10:53 +00006272 verifyIndependentOfContext("A<int *> a;");
6273 verifyIndependentOfContext("A<int **> a;");
6274 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00006275 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006276 verifyIndependentOfContext(
6277 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006278 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00006279 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00006280 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00006281 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00006282 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00006283
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00006284 verifyFormat(
6285 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6286 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6287
Daniel Jasper1f5d6372016-06-13 14:45:12 +00006288 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00006289 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00006290 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006291 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00006292 verifyGoogleFormat("A<int*> a;");
6293 verifyGoogleFormat("A<int**> a;");
6294 verifyGoogleFormat("A<int*, int*> a;");
6295 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006296 verifyGoogleFormat("f(b ? *c : *d);");
6297 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00006298 verifyGoogleFormat("Type* t = **x;");
6299 verifyGoogleFormat("Type* t = *++*x;");
6300 verifyGoogleFormat("*++*x;");
6301 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
6302 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006303 verifyGoogleFormat(
6304 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00006305 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00006306 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
6307 verifyGoogleFormat("template <typename T>\n"
6308 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00006309
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006310 FormatStyle Left = getLLVMStyle();
6311 Left.PointerAlignment = FormatStyle::PAS_Left;
6312 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00006313 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00006314 verifyFormat("return *this += 1;", Left);
Manuel Klimek06b575c2017-07-17 15:27:53 +00006315 verifyFormat("throw *x;", Left);
Krasimir Georgiev9b5a89b2017-08-14 11:06:07 +00006316 verifyFormat("delete *x;", Left);
6317 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
6318 verifyFormat("[](const decltype(*a)* ptr) {}", Left);
6319 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006320
Daniel Jasper5b49f472013-01-23 12:10:53 +00006321 verifyIndependentOfContext("a = *(x + y);");
6322 verifyIndependentOfContext("a = &(x + y);");
6323 verifyIndependentOfContext("*(x + y).call();");
6324 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006325 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00006326
Daniel Jasper5b49f472013-01-23 12:10:53 +00006327 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00006328 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00006329 "int *MyValues = {\n"
6330 " *A, // Operator detection might be confused by the '{'\n"
6331 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00006332 "};");
Nico Weber80a82762013-01-17 17:17:19 +00006333
Daniel Jasper5b49f472013-01-23 12:10:53 +00006334 verifyIndependentOfContext("if (int *a = &b)");
6335 verifyIndependentOfContext("if (int &a = *b)");
6336 verifyIndependentOfContext("if (a & b[i])");
6337 verifyIndependentOfContext("if (a::b::c::d & b[i])");
6338 verifyIndependentOfContext("if (*b[i])");
6339 verifyIndependentOfContext("if (int *a = (&b))");
6340 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00006341 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00006342 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00006343 verifyFormat("void f() {\n"
6344 " for (const int &v : Values) {\n"
6345 " }\n"
6346 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006347 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
6348 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00006349 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00006350
Daniel Jaspera98da3d2013-11-07 19:56:07 +00006351 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006352 verifyFormat("#define MACRO \\\n"
6353 " int *i = a * b; \\\n"
6354 " void f(a *b);",
6355 getLLVMStyleWithColumns(19));
6356
Daniel Jasper97b89482013-03-13 07:49:51 +00006357 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006358 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006359 verifyIndependentOfContext("T **t = new T *;");
6360 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00006361 verifyGoogleFormat("A = new SomeType*[Length]();");
6362 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006363 verifyGoogleFormat("T** t = new T*;");
6364 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006365
Daniel Jaspera65e8872014-03-25 10:52:45 +00006366 verifyFormat("STATIC_ASSERT((a & b) == 0);");
6367 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006368 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006369 "typename t::if<x && y>::type f() {}");
6370 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006371 verifyFormat("vector<int *> v;");
6372 verifyFormat("vector<int *const> v;");
6373 verifyFormat("vector<int *const **const *> v;");
6374 verifyFormat("vector<int *volatile> v;");
6375 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006376 verifyFormat("foo<b && false>();");
6377 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00006378 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00006379 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006380 "template <class T, class = typename std::enable_if<\n"
6381 " std::is_integral<T>::value &&\n"
6382 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
6383 "void F();",
6384 getLLVMStyleWithColumns(70));
6385 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00006386 "template <class T,\n"
6387 " class = typename std::enable_if<\n"
6388 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006389 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
6390 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006391 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00006392 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006393 verifyFormat(
6394 "template <class T,\n"
6395 " class = typename ::std::enable_if<\n"
6396 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6397 "void F();",
6398 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006399
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006400 verifyIndependentOfContext("MACRO(int *i);");
6401 verifyIndependentOfContext("MACRO(auto *a);");
6402 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00006403 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00006404 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00006405 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006406 // FIXME: Is there a way to make this work?
6407 // verifyIndependentOfContext("MACRO(A *a);");
6408
Daniel Jasper32ccb032014-06-23 07:36:18 +00006409 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00006410 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00006411
Daniel Jasper866468a2014-04-14 13:15:29 +00006412 EXPECT_EQ("#define OP(x) \\\n"
6413 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6414 " return s << a.DebugString(); \\\n"
6415 " }",
6416 format("#define OP(x) \\\n"
6417 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6418 " return s << a.DebugString(); \\\n"
6419 " }",
6420 getLLVMStyleWithColumns(50)));
6421
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006422 // FIXME: We cannot handle this case yet; we might be able to figure out that
6423 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00006424 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00006425
6426 FormatStyle PointerMiddle = getLLVMStyle();
6427 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6428 verifyFormat("delete *x;", PointerMiddle);
6429 verifyFormat("int * x;", PointerMiddle);
Ben Hamilton9dc78162018-04-03 14:07:11 +00006430 verifyFormat("int *[] x;", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006431 verifyFormat("template <int * y> f() {}", PointerMiddle);
6432 verifyFormat("int * f(int * a) {}", PointerMiddle);
6433 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6434 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6435 verifyFormat("A<int *> a;", PointerMiddle);
6436 verifyFormat("A<int **> a;", PointerMiddle);
6437 verifyFormat("A<int *, int *> a;", PointerMiddle);
Ben Hamilton9dc78162018-04-03 14:07:11 +00006438 verifyFormat("A<int *[]> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006439 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6440 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006441 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006442
6443 // Member function reference qualifiers aren't binary operators.
6444 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006445 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006446 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006447 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006448 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006449 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006450}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006451
Daniel Jasperee6d6502013-07-17 20:25:02 +00006452TEST_F(FormatTest, UnderstandsAttributes) {
6453 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006454 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6455 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006456 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006457 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006458 verifyFormat("__attribute__((nodebug)) void\n"
6459 "foo() {}\n",
6460 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006461}
6462
Ben Hamiltonb060ad82018-03-12 15:42:38 +00006463TEST_F(FormatTest, UnderstandsSquareAttributes) {
6464 verifyFormat("SomeType s [[unused]] (InitValue);");
6465 verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
6466 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
6467 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
6468 verifyFormat("void f() [[deprecated(\"so sorry\")]];");
6469 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6470 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Manuel Klimekd0f3fe52018-04-11 14:51:54 +00006471
6472 // Make sure we do not mistake attributes for array subscripts.
6473 verifyFormat("int a() {}\n"
6474 "[[unused]] int b() {}\n");
Yan Zhange2d56dc2018-11-09 23:19:14 +00006475 verifyFormat("NSArray *arr;\n"
6476 "arr[[Foo() bar]];");
Manuel Klimekd0f3fe52018-04-11 14:51:54 +00006477
6478 // On the other hand, we still need to correctly find array subscripts.
6479 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];");
6480
6481 // Make sure we do not parse attributes as lambda introducers.
6482 FormatStyle MultiLineFunctions = getLLVMStyle();
6483 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
6484 verifyFormat("[[unused]] int b() {\n"
6485 " return 42;\n"
6486 "}\n",
6487 MultiLineFunctions);
Ben Hamiltonb060ad82018-03-12 15:42:38 +00006488}
6489
Daniel Jasper10cd5812013-05-06 06:35:44 +00006490TEST_F(FormatTest, UnderstandsEllipsis) {
6491 verifyFormat("int printf(const char *fmt, ...);");
6492 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006493 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6494
6495 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006496 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006497 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006498}
6499
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006500TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006501 EXPECT_EQ("int *a;\n"
6502 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006503 "int *a;",
6504 format("int *a;\n"
6505 "int* a;\n"
6506 "int *a;",
6507 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006508 EXPECT_EQ("int* a;\n"
6509 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006510 "int* a;",
6511 format("int* a;\n"
6512 "int* a;\n"
6513 "int *a;",
6514 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006515 EXPECT_EQ("int *a;\n"
6516 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006517 "int *a;",
6518 format("int *a;\n"
6519 "int * a;\n"
6520 "int * a;",
6521 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006522 EXPECT_EQ("auto x = [] {\n"
6523 " int *a;\n"
6524 " int *a;\n"
6525 " int *a;\n"
6526 "};",
6527 format("auto x=[]{int *a;\n"
6528 "int * a;\n"
6529 "int * a;};",
6530 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006531}
6532
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006533TEST_F(FormatTest, UnderstandsRvalueReferences) {
6534 verifyFormat("int f(int &&a) {}");
6535 verifyFormat("int f(int a, char &&b) {}");
6536 verifyFormat("void f() { int &&a = b; }");
6537 verifyGoogleFormat("int f(int a, char&& b) {}");
6538 verifyGoogleFormat("void f() { int&& a = b; }");
6539
Daniel Jasper1eff9082013-05-27 16:36:33 +00006540 verifyIndependentOfContext("A<int &&> a;");
6541 verifyIndependentOfContext("A<int &&, int &&> a;");
6542 verifyGoogleFormat("A<int&&> a;");
6543 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006544
6545 // Not rvalue references:
6546 verifyFormat("template <bool B, bool C> class A {\n"
6547 " static_assert(B && C, \"Something is wrong\");\n"
6548 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006549 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6550 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006551 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006552}
6553
Manuel Klimekc1237a82013-01-23 14:08:21 +00006554TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6555 verifyFormat("void f() {\n"
6556 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006557 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006558 "}",
6559 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006560}
6561
Daniel Jasperef906a92013-01-13 08:01:36 +00006562TEST_F(FormatTest, FormatsCasts) {
6563 verifyFormat("Type *A = static_cast<Type *>(P);");
6564 verifyFormat("Type *A = (Type *)P;");
6565 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6566 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006567 verifyFormat("int a = (int)2.0f;");
6568 verifyFormat("x[(int32)y];");
6569 verifyFormat("x = (int32)y;");
6570 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6571 verifyFormat("int a = (int)*b;");
6572 verifyFormat("int a = (int)2.0f;");
6573 verifyFormat("int a = (int)~0;");
6574 verifyFormat("int a = (int)++a;");
6575 verifyFormat("int a = (int)sizeof(int);");
6576 verifyFormat("int a = (int)+2;");
6577 verifyFormat("my_int a = (my_int)2.0f;");
6578 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006579 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006580 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006581 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006582 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006583 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006584
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006585 verifyFormat("void f() { my_int a = (my_int)*b; }");
6586 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6587 verifyFormat("my_int a = (my_int)~0;");
6588 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006589 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006590 verifyFormat("my_int a = (my_int)1;");
6591 verifyFormat("my_int a = (my_int *)1;");
6592 verifyFormat("my_int a = (const my_int)-1;");
6593 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006594 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006595 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006596 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006597 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006598
6599 // FIXME: single value wrapped with paren will be treated as cast.
6600 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006601
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006602 verifyFormat("{ (void)F; }");
6603
Daniel Jasper998cabc2013-07-18 14:46:07 +00006604 // Don't break after a cast's
6605 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6606 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6607 " bbbbbbbbbbbbbbbbbbbbbb);");
6608
Daniel Jasperef906a92013-01-13 08:01:36 +00006609 // These are not casts.
6610 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006611 verifyFormat("f(foo)->b;");
6612 verifyFormat("f(foo).b;");
6613 verifyFormat("f(foo)(b);");
6614 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006615 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006616 verifyFormat("(*funptr)(foo)[4];");
6617 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006618 verifyFormat("void f(int *);");
6619 verifyFormat("void f(int *) = 0;");
6620 verifyFormat("void f(SmallVector<int>) {}");
6621 verifyFormat("void f(SmallVector<int>);");
6622 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006623 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006624 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006625 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006626 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6627 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006628 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006629
Daniel Jasperba0bda92013-02-23 08:07:18 +00006630 // These are not casts, but at some point were confused with casts.
6631 verifyFormat("virtual void foo(int *) override;");
6632 verifyFormat("virtual void foo(char &) const;");
6633 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006634 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006635 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006636 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006637 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006638
6639 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6640 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006641 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006642 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006643 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6644 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6645 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006646}
6647
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006648TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006649 verifyFormat("A<bool()> a;");
6650 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006651 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006652 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006653 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006654 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006655 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006656 verifyFormat("template <class CallbackClass>\n"
6657 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006658
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006659 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6660 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006661 verifyGoogleFormat(
6662 "template <class CallbackClass>\n"
6663 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006664
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006665 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006666 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006667 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006668 verifyFormat("some_var = function(*some_pointer_var)[0];");
6669 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006670 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006671 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00006672 verifyFormat("std::function<\n"
6673 " LooooooooooongTemplatedType<\n"
6674 " SomeType>*(\n"
6675 " LooooooooooooooooongType type)>\n"
6676 " function;",
6677 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006678}
6679
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006680TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6681 verifyFormat("A (*foo_)[6];");
6682 verifyFormat("vector<int> (*foo_)[6];");
6683}
6684
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006685TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6686 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6687 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6688 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6689 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006690 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6691 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006692
6693 // Different ways of ()-initializiation.
6694 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6695 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6696 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6697 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6698 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6699 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006700 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6701 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00006702
6703 // Lambdas should not confuse the variable declaration heuristic.
6704 verifyFormat("LooooooooooooooooongType\n"
6705 " variable(nullptr, [](A *a) {});",
6706 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006707}
6708
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006709TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006710 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006711 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006712 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006713 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006714 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006715 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006716 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6717 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006718 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6719 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006720 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6721 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006722 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6723 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006724 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6725 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006726 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6727 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6728 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6729 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006730 FormatStyle Indented = getLLVMStyle();
6731 Indented.IndentWrappedFunctionNames = true;
6732 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6733 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6734 Indented);
6735 verifyFormat(
6736 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6737 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6738 Indented);
6739 verifyFormat(
6740 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6741 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6742 Indented);
6743 verifyFormat(
6744 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6745 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6746 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006747
6748 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006749 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6750 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6751 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006752
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006753 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006754 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006755 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006756 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6757 " SourceLocation L, IdentifierIn *II,\n"
6758 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006759 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006760 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006761 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006762 " const SomeType<string, SomeOtherTemplateParameter>\n"
6763 " &ReallyReallyLongParameterName,\n"
6764 " const SomeType<string, SomeOtherTemplateParameter>\n"
6765 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006766 verifyFormat("template <typename A>\n"
6767 "SomeLoooooooooooooooooooooongType<\n"
6768 " typename some_namespace::SomeOtherType<A>::Type>\n"
6769 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006770
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006771 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006772 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6773 " aaaaaaaaaaaaaaaaaaaaaaa;");
6774 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006775 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6776 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006777 verifyGoogleFormat(
6778 "some_namespace::LongReturnType\n"
6779 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006780 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006781
6782 verifyGoogleFormat("template <typename T>\n"
6783 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006784 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006785 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6786 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006787
6788 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006789 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6790 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006791 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6792 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6793 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6794 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6795 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6796 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6797 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006798
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00006799 verifyFormat("template <typename T> // Templates on own line.\n"
6800 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006801 "MyFunction(int a);",
6802 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00006803}
6804
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006805TEST_F(FormatTest, FormatsArrays) {
6806 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6807 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006808 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6809 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006810 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6811 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006812 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6813 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6814 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6815 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6816 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6817 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6818 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6819 verifyFormat(
6820 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6821 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6822 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006823 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6824 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006825
6826 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6827 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006828 verifyFormat(
6829 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6830 " .aaaaaaa[0]\n"
6831 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006832 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006833
6834 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006835
6836 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6837 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006838}
6839
Daniel Jaspere9de2602012-12-06 09:56:08 +00006840TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6841 verifyFormat("(a)->b();");
6842 verifyFormat("--a;");
6843}
6844
Daniel Jasper8b529712012-12-04 13:02:32 +00006845TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006846 verifyFormat("#include <string>\n"
6847 "#include <a/b/c.h>\n"
6848 "#include \"a/b/string\"\n"
6849 "#include \"string.h\"\n"
6850 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006851 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006852 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006853 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006854 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006855 "#include \"some long include\" // with a comment\n"
Manuel Klimek45ab5592017-11-14 09:19:53 +00006856 "#include \"some very long include path\"\n"
6857 "#include <some/very/long/include/path>\n",
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006858 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006859 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6860 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006861
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006862 verifyFormat("#import <string>");
6863 verifyFormat("#import <a/b/c.h>");
6864 verifyFormat("#import \"a/b/string\"");
6865 verifyFormat("#import \"string.h\"");
6866 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006867 verifyFormat("#if __has_include(<strstream>)\n"
6868 "#include <strstream>\n"
6869 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006870
Daniel Jasper343643b2014-08-13 08:29:18 +00006871 verifyFormat("#define MY_IMPORT <a/b>");
6872
Nico Weber21088802017-02-10 19:36:52 +00006873 verifyFormat("#if __has_include(<a/b>)");
6874 verifyFormat("#if __has_include_next(<a/b>)");
6875 verifyFormat("#define F __has_include(<a/b>)");
6876 verifyFormat("#define F __has_include_next(<a/b>)");
6877
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006878 // Protocol buffer definition or missing "#".
6879 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6880 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006881
6882 FormatStyle Style = getLLVMStyle();
6883 Style.AlwaysBreakBeforeMultilineStrings = true;
6884 Style.ColumnLimit = 0;
6885 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006886
6887 // But 'import' might also be a regular C++ namespace.
6888 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6889 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006890}
6891
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006892//===----------------------------------------------------------------------===//
6893// Error recovery tests.
6894//===----------------------------------------------------------------------===//
6895
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006896TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006897 FormatStyle NoBinPacking = getLLVMStyle();
6898 NoBinPacking.BinPackParameters = false;
6899 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6900 " double *min_x,\n"
6901 " double *max_x,\n"
6902 " double *min_y,\n"
6903 " double *max_y,\n"
6904 " double *min_z,\n"
6905 " double *max_z, ) {}",
6906 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006907}
6908
Daniel Jasper83a54d22013-01-10 09:26:47 +00006909TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006910 verifyFormat("void f() { return; }\n42");
6911 verifyFormat("void f() {\n"
6912 " if (0)\n"
6913 " return;\n"
6914 "}\n"
6915 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006916 verifyFormat("void f() { return }\n42");
6917 verifyFormat("void f() {\n"
6918 " if (0)\n"
6919 " return\n"
6920 "}\n"
6921 "42");
6922}
6923
6924TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6925 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6926 EXPECT_EQ("void f() {\n"
6927 " if (a)\n"
6928 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006929 "}",
6930 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006931 EXPECT_EQ("namespace N {\n"
6932 "void f()\n"
6933 "}",
6934 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006935 EXPECT_EQ("namespace N {\n"
6936 "void f() {}\n"
6937 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006938 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006939 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006940}
6941
Daniel Jasper2df93312013-01-09 10:16:05 +00006942TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6943 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006944 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006945 " b;",
6946 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006947 verifyFormat("function(\n"
6948 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006949 " LoooooooooooongArgument);\n",
6950 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006951}
6952
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006953TEST_F(FormatTest, IncorrectAccessSpecifier) {
6954 verifyFormat("public:");
6955 verifyFormat("class A {\n"
6956 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006957 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006958 "};");
6959 verifyFormat("public\n"
6960 "int qwerty;");
6961 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006962 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006963 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006964 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006965 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006966 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006967}
Daniel Jasperf7935112012-12-03 18:12:45 +00006968
Daniel Jasper291f9362013-03-20 15:58:10 +00006969TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6970 verifyFormat("{");
6971 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006972 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006973}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006974
Krasimir Georgiev067ec702018-05-22 11:44:03 +00006975TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) {
6976 // Found by oss-fuzz:
6977 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212
6978 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
6979 Style.ColumnLimit = 60;
6980 verifyNoCrash(
6981 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20"
6982 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20"
6983 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a",
6984 Style);
6985}
6986
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006987TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006988 verifyFormat("do {\n}");
6989 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006990 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006991 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006992 "wheeee(fun);");
6993 verifyFormat("do {\n"
6994 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006995 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006996}
6997
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006998TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006999 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00007000 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007001 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00007002 verifyFormat("while {\n foo;\n foo();\n}");
7003 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00007004}
7005
Daniel Jasperc0880a92013-01-04 18:52:56 +00007006TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007007 verifyIncompleteFormat("namespace {\n"
7008 "class Foo { Foo (\n"
7009 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00007010 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00007011}
7012
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007013TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007014 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007015 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
7016 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007017 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007018
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007019 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007020 " {\n"
7021 " breakme(\n"
7022 " qwe);\n"
7023 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007024 format("{\n"
7025 " {\n"
7026 " breakme(qwe);\n"
7027 "}\n",
7028 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007029}
7030
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00007031TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007032 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007033 " avariable,\n"
7034 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007035 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00007036}
7037
Manuel Klimek762dd182013-01-21 10:07:49 +00007038TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007039 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00007040}
7041
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007042TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007043 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00007044 verifyFormat("vector<int> x{\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00007045 " 1,\n"
7046 " 2,\n"
7047 " 3,\n"
7048 " 4,\n"
Daniel Jaspera125d532014-03-21 12:38:57 +00007049 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007050 verifyFormat("vector<T> x{{}, {}, {}, {}};");
7051 verifyFormat("f({1, 2});");
7052 verifyFormat("auto v = Foo{-1};");
7053 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
7054 verifyFormat("Class::Class : member{1, 2, 3} {}");
7055 verifyFormat("new vector<int>{1, 2, 3};");
7056 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00007057 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007058 verifyFormat("return {arg1, arg2};");
7059 verifyFormat("return {arg1, SomeType{parameter}};");
7060 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
7061 verifyFormat("new T{arg1, arg2};");
7062 verifyFormat("f(MyMap[{composite, key}]);");
7063 verifyFormat("class Class {\n"
7064 " T member = {arg1, arg2};\n"
7065 "};");
7066 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00007067 verifyFormat("const struct A a = {.a = 1, .b = 2};");
7068 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00007069 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
7070 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00007071
Daniel Jasper438059e2014-05-22 12:11:13 +00007072 verifyFormat("int foo(int i) { return fo1{}(i); }");
7073 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007074 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00007075 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00007076 verifyFormat("Node n{1, Node{1000}, //\n"
7077 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00007078 verifyFormat("Aaaa aaaaaaa{\n"
7079 " {\n"
7080 " aaaa,\n"
7081 " },\n"
7082 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00007083 verifyFormat("class C : public D {\n"
7084 " SomeClass SC{2};\n"
7085 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00007086 verifyFormat("class C : public A {\n"
7087 " class D : public B {\n"
7088 " void f() { int i{2}; }\n"
7089 " };\n"
7090 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00007091 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00007092
Francois Ferrandf92f8062018-05-16 08:03:52 +00007093 // Avoid breaking between equal sign and opening brace
7094 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle();
7095 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200;
7096 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n"
7097 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n"
7098 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n"
7099 " {\"ccccccccccccccccccccc\", 2}};",
7100 AvoidBreakingFirstArgument);
7101
Francois Ferrandd2130f52017-06-30 20:00:02 +00007102 // Binpacking only if there is no trailing comma
7103 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
7104 " cccccccccc, dddddddddd};",
7105 getLLVMStyleWithColumns(50));
7106 verifyFormat("const Aaaaaa aaaaa = {\n"
7107 " aaaaaaaaaaa,\n"
7108 " bbbbbbbbbbb,\n"
7109 " ccccccccccc,\n"
7110 " ddddddddddd,\n"
7111 "};", getLLVMStyleWithColumns(50));
7112
Daniel Jaspere4ada022016-12-13 10:05:03 +00007113 // Cases where distinguising braced lists and blocks is hard.
7114 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
7115 verifyFormat("void f() {\n"
7116 " return; // comment\n"
7117 "}\n"
7118 "SomeType t;");
7119 verifyFormat("void f() {\n"
7120 " if (a) {\n"
7121 " f();\n"
7122 " }\n"
7123 "}\n"
7124 "SomeType t;");
7125
Daniel Jasper08434342015-05-26 07:26:26 +00007126 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007127 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00007128 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007129 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
7130 " bbbbb,\n"
7131 " ccccc,\n"
7132 " ddddd,\n"
7133 " eeeee,\n"
7134 " ffffff,\n"
7135 " ggggg,\n"
7136 " hhhhhh,\n"
7137 " iiiiii,\n"
7138 " jjjjjj,\n"
7139 " kkkkkk};",
7140 NoBinPacking);
7141 verifyFormat("const Aaaaaa aaaaa = {\n"
7142 " aaaaa,\n"
7143 " bbbbb,\n"
7144 " ccccc,\n"
7145 " ddddd,\n"
7146 " eeeee,\n"
7147 " ffffff,\n"
7148 " ggggg,\n"
7149 " hhhhhh,\n"
7150 " iiiiii,\n"
7151 " jjjjjj,\n"
7152 " kkkkkk,\n"
7153 "};",
7154 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00007155 verifyFormat(
7156 "const Aaaaaa aaaaa = {\n"
7157 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
7158 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
7159 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
7160 "};",
7161 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007162
Chandler Carruthf8b72662014-03-02 12:37:31 +00007163 // FIXME: The alignment of these trailing comments might be bad. Then again,
7164 // this might be utterly useless in real code.
7165 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00007166 " : some_value{ //\n"
7167 " aaaaaaa, //\n"
7168 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00007169
Chandler Carruthf8b72662014-03-02 12:37:31 +00007170 // In braced lists, the first comment is always assumed to belong to the
7171 // first element. Thus, it can be moved to the next or previous line as
7172 // appropriate.
7173 EXPECT_EQ("function({// First element:\n"
7174 " 1,\n"
7175 " // Second element:\n"
7176 " 2});",
7177 format("function({\n"
7178 " // First element:\n"
7179 " 1,\n"
7180 " // Second element:\n"
7181 " 2});"));
7182 EXPECT_EQ("std::vector<int> MyNumbers{\n"
7183 " // First element:\n"
7184 " 1,\n"
7185 " // Second element:\n"
7186 " 2};",
7187 format("std::vector<int> MyNumbers{// First element:\n"
7188 " 1,\n"
7189 " // Second element:\n"
7190 " 2};",
7191 getLLVMStyleWithColumns(30)));
Francois Ferrandd2130f52017-06-30 20:00:02 +00007192 // A trailing comma should still lead to an enforced line break and no
7193 // binpacking.
Daniel Jasper64a328e2014-11-11 19:34:57 +00007194 EXPECT_EQ("vector<int> SomeVector = {\n"
7195 " // aaa\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00007196 " 1,\n"
7197 " 2,\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00007198 "};",
7199 format("vector<int> SomeVector = { // aaa\n"
7200 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00007201
Chandler Carruthf8b72662014-03-02 12:37:31 +00007202 FormatStyle ExtraSpaces = getLLVMStyle();
7203 ExtraSpaces.Cpp11BracedListStyle = false;
7204 ExtraSpaces.ColumnLimit = 75;
7205 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
7206 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
7207 verifyFormat("f({ 1, 2 });", ExtraSpaces);
7208 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
7209 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
7210 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
7211 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
7212 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
7213 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
7214 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
7215 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
7216 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
7217 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
7218 verifyFormat("class Class {\n"
7219 " T member = { arg1, arg2 };\n"
7220 "};",
7221 ExtraSpaces);
7222 verifyFormat(
7223 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7224 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
7225 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
7226 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
7227 ExtraSpaces);
7228 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00007229 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007230 ExtraSpaces);
7231 verifyFormat(
7232 "someFunction(OtherParam,\n"
7233 " BracedList{ // comment 1 (Forcing interesting break)\n"
7234 " param1, param2,\n"
7235 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00007236 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007237 ExtraSpaces);
7238 verifyFormat(
7239 "std::this_thread::sleep_for(\n"
7240 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
7241 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00007242 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00007243 " aaaaaaa,\n"
7244 " aaaaaaaaaa,\n"
7245 " aaaaa,\n"
7246 " aaaaaaaaaaaaaaa,\n"
7247 " aaa,\n"
7248 " aaaaaaaaaa,\n"
7249 " a,\n"
7250 " aaaaaaaaaaaaaaaaaaaaa,\n"
7251 " aaaaaaaaaaaa,\n"
7252 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
7253 " aaaaaaa,\n"
7254 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007255 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Francois Ferrand5f07f442017-06-19 14:41:21 +00007256 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
7257 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
Francois Ferrandf92f8062018-05-16 08:03:52 +00007258
7259 // Avoid breaking between initializer/equal sign and opening brace
7260 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200;
7261 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n"
7262 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
7263 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
7264 " { \"ccccccccccccccccccccc\", 2 }\n"
7265 "};",
7266 ExtraSpaces);
7267 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n"
7268 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
7269 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
7270 " { \"ccccccccccccccccccccc\", 2 }\n"
7271 "};",
7272 ExtraSpaces);
Hans Wennborgbfc34062018-06-14 08:01:09 +00007273
7274 FormatStyle SpaceBeforeBrace = getLLVMStyle();
7275 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true;
7276 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace);
7277 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace);
Manuel Klimekab419912013-05-23 09:41:43 +00007278}
7279
Daniel Jasper33b909c2013-10-25 14:29:37 +00007280TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007281 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7282 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7283 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7284 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7285 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7286 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007287 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007288 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00007289 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007290 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7291 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007292 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007293 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7294 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7295 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
7296 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7297 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7298 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7299 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007300 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007301 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7302 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007303 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7304 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7305 " // Separating comment.\n"
7306 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
7307 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7308 " // Leading comment\n"
7309 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7310 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007311 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7312 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007313 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00007314 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7315 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007316 getLLVMStyleWithColumns(38));
7317 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007318 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
7319 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007320 verifyFormat(
7321 "static unsigned SomeValues[10][3] = {\n"
7322 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
7323 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
7324 verifyFormat("static auto fields = new vector<string>{\n"
7325 " \"aaaaaaaaaaaaa\",\n"
7326 " \"aaaaaaaaaaaaa\",\n"
7327 " \"aaaaaaaaaaaa\",\n"
7328 " \"aaaaaaaaaaaaaa\",\n"
7329 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7330 " \"aaaaaaaaaaaa\",\n"
7331 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7332 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00007333 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
7334 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
7335 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
7336 " 3, cccccccccccccccccccccc};",
7337 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00007338
7339 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00007340 verifyFormat("vector<int> x = {\n"
7341 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
7342 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00007343 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00007344 verifyFormat("vector<int> x = {\n"
7345 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00007346 "};",
7347 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00007348 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7349 " 1, 1, 1, 1,\n"
7350 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00007351 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007352
Daniel Jasper60c27072015-05-13 08:16:00 +00007353 // Trailing comment in the first line.
7354 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
7355 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
7356 " 111111111, 222222222, 3333333333, 444444444, //\n"
7357 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00007358 // Trailing comment in the last line.
7359 verifyFormat("int aaaaa[] = {\n"
7360 " 1, 2, 3, // comment\n"
7361 " 4, 5, 6 // comment\n"
7362 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00007363
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007364 // With nested lists, we should either format one item per line or all nested
7365 // lists one on line.
7366 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007367 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
7368 " {aaaaaaaaaaaaaaaaaaa},\n"
7369 " {aaaaaaaaaaaaaaaaaaaaa},\n"
7370 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00007371 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00007372 verifyFormat(
7373 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007374 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
7375 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
7376 " {aaa, aaa},\n"
7377 " {aaa, aaa},\n"
7378 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
7379 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7380 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00007381
7382 // No column layout should be used here.
Francois Ferrandd2130f52017-06-30 20:00:02 +00007383 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007384 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00007385
7386 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00007387
Daniel Jaspereb65e912015-12-21 18:31:15 +00007388 // No braced initializer here.
7389 verifyFormat("void f() {\n"
7390 " struct Dummy {};\n"
7391 " f(v);\n"
7392 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00007393
7394 // Long lists should be formatted in columns even if they are nested.
7395 verifyFormat(
7396 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7397 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7398 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7399 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7400 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7401 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00007402
7403 // Allow "single-column" layout even if that violates the column limit. There
7404 // isn't going to be a better way.
7405 verifyFormat("std::vector<int> a = {\n"
7406 " aaaaaaaa,\n"
7407 " aaaaaaaa,\n"
7408 " aaaaaaaa,\n"
7409 " aaaaaaaa,\n"
7410 " aaaaaaaaaa,\n"
7411 " aaaaaaaa,\n"
7412 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
7413 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00007414 verifyFormat("vector<int> aaaa = {\n"
7415 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7416 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7417 " aaaaaa.aaaaaaa,\n"
7418 " aaaaaa.aaaaaaa,\n"
7419 " aaaaaa.aaaaaaa,\n"
7420 " aaaaaa.aaaaaaa,\n"
7421 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007422
7423 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00007424 verifyFormat("someFunction(Param, {List1, List2,\n"
7425 " List3});",
7426 getLLVMStyleWithColumns(35));
7427 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007428 " {List1, List2,\n"
7429 " List3});",
7430 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00007431 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
7432 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007433}
7434
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007435TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007436 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00007437 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007438
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007439 verifyFormat("void f() { return 42; }");
7440 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007441 " return 42;\n"
7442 "}",
7443 DoNotMerge);
7444 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007445 " // Comment\n"
7446 "}");
7447 verifyFormat("{\n"
7448 "#error {\n"
7449 " int a;\n"
7450 "}");
7451 verifyFormat("{\n"
7452 " int a;\n"
7453 "#error {\n"
7454 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00007455 verifyFormat("void f() {} // comment");
7456 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00007457 verifyFormat("void f() {\n"
7458 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007459 DoNotMerge);
7460 verifyFormat("void f() {\n"
7461 " int a;\n"
7462 "} // comment",
7463 DoNotMerge);
7464 verifyFormat("void f() {\n"
7465 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00007466 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007467
7468 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7469 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7470
7471 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7472 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007473 verifyFormat("class C {\n"
7474 " C()\n"
7475 " : iiiiiiii(nullptr),\n"
7476 " kkkkkkk(nullptr),\n"
7477 " mmmmmmm(nullptr),\n"
7478 " nnnnnnn(nullptr) {}\n"
7479 "};",
7480 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007481
7482 FormatStyle NoColumnLimit = getLLVMStyle();
7483 NoColumnLimit.ColumnLimit = 0;
7484 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7485 EXPECT_EQ("class C {\n"
7486 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007487 "};",
7488 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007489 EXPECT_EQ("A()\n"
7490 " : b(0) {\n"
7491 "}",
7492 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7493
7494 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007495 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7496 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007497 EXPECT_EQ("A()\n"
7498 " : b(0) {\n"
7499 "}",
7500 format("A():b(0){}", DoNotMergeNoColumnLimit));
7501 EXPECT_EQ("A()\n"
7502 " : b(0) {\n"
7503 "}",
7504 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007505
7506 verifyFormat("#define A \\\n"
7507 " void f() { \\\n"
7508 " int i; \\\n"
7509 " }",
7510 getLLVMStyleWithColumns(20));
7511 verifyFormat("#define A \\\n"
7512 " void f() { int i; }",
7513 getLLVMStyleWithColumns(21));
7514 verifyFormat("#define A \\\n"
7515 " void f() { \\\n"
7516 " int i; \\\n"
7517 " } \\\n"
7518 " int j;",
7519 getLLVMStyleWithColumns(22));
7520 verifyFormat("#define A \\\n"
7521 " void f() { int i; } \\\n"
7522 " int j;",
7523 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007524}
7525
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007526TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
7527 FormatStyle MergeEmptyOnly = getLLVMStyle();
7528 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7529 verifyFormat("class C {\n"
7530 " int f() {}\n"
7531 "};",
7532 MergeEmptyOnly);
7533 verifyFormat("class C {\n"
7534 " int f() {\n"
7535 " return 42;\n"
7536 " }\n"
7537 "};",
7538 MergeEmptyOnly);
7539 verifyFormat("int f() {}", MergeEmptyOnly);
7540 verifyFormat("int f() {\n"
7541 " return 42;\n"
7542 "}",
7543 MergeEmptyOnly);
7544
7545 // Also verify behavior when BraceWrapping.AfterFunction = true
7546 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7547 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
7548 verifyFormat("int f() {}", MergeEmptyOnly);
7549 verifyFormat("class C {\n"
7550 " int f() {}\n"
7551 "};",
7552 MergeEmptyOnly);
7553}
7554
Daniel Jasperd74cf402014-04-08 12:46:38 +00007555TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7556 FormatStyle MergeInlineOnly = getLLVMStyle();
7557 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7558 verifyFormat("class C {\n"
7559 " int f() { return 42; }\n"
7560 "};",
7561 MergeInlineOnly);
7562 verifyFormat("int f() {\n"
7563 " return 42;\n"
7564 "}",
7565 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007566
7567 // SFS_Inline implies SFS_Empty
7568 verifyFormat("class C {\n"
7569 " int f() {}\n"
7570 "};",
7571 MergeInlineOnly);
7572 verifyFormat("int f() {}", MergeInlineOnly);
7573
7574 // Also verify behavior when BraceWrapping.AfterFunction = true
7575 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7576 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7577 verifyFormat("class C {\n"
7578 " int f() { return 42; }\n"
7579 "};",
7580 MergeInlineOnly);
7581 verifyFormat("int f()\n"
7582 "{\n"
7583 " return 42;\n"
7584 "}",
7585 MergeInlineOnly);
7586
7587 // SFS_Inline implies SFS_Empty
7588 verifyFormat("int f() {}", MergeInlineOnly);
7589 verifyFormat("class C {\n"
7590 " int f() {}\n"
7591 "};",
7592 MergeInlineOnly);
7593}
7594
Francois Ferrandd3f0e3d2017-06-21 13:56:02 +00007595TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
7596 FormatStyle MergeInlineOnly = getLLVMStyle();
7597 MergeInlineOnly.AllowShortFunctionsOnASingleLine =
7598 FormatStyle::SFS_InlineOnly;
7599 verifyFormat("class C {\n"
7600 " int f() { return 42; }\n"
7601 "};",
7602 MergeInlineOnly);
7603 verifyFormat("int f() {\n"
7604 " return 42;\n"
7605 "}",
7606 MergeInlineOnly);
7607
7608 // SFS_InlineOnly does not imply SFS_Empty
7609 verifyFormat("class C {\n"
7610 " int f() {}\n"
7611 "};",
7612 MergeInlineOnly);
7613 verifyFormat("int f() {\n"
7614 "}",
7615 MergeInlineOnly);
7616
7617 // Also verify behavior when BraceWrapping.AfterFunction = true
7618 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7619 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7620 verifyFormat("class C {\n"
7621 " int f() { return 42; }\n"
7622 "};",
7623 MergeInlineOnly);
7624 verifyFormat("int f()\n"
7625 "{\n"
7626 " return 42;\n"
7627 "}",
7628 MergeInlineOnly);
7629
7630 // SFS_InlineOnly does not imply SFS_Empty
7631 verifyFormat("int f()\n"
7632 "{\n"
7633 "}",
7634 MergeInlineOnly);
7635 verifyFormat("class C {\n"
7636 " int f() {}\n"
7637 "};",
7638 MergeInlineOnly);
7639}
7640
Francois Ferrandad722562017-06-30 20:25:55 +00007641TEST_F(FormatTest, SplitEmptyFunction) {
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007642 FormatStyle Style = getLLVMStyle();
7643 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7644 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7645 Style.BraceWrapping.AfterFunction = true;
Francois Ferrandad722562017-06-30 20:25:55 +00007646 Style.BraceWrapping.SplitEmptyFunction = false;
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007647 Style.ColumnLimit = 40;
7648
7649 verifyFormat("int f()\n"
7650 "{}",
7651 Style);
7652 verifyFormat("int f()\n"
7653 "{\n"
7654 " return 42;\n"
7655 "}",
7656 Style);
7657 verifyFormat("int f()\n"
7658 "{\n"
7659 " // some comment\n"
7660 "}",
7661 Style);
7662
7663 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7664 verifyFormat("int f() {}", Style);
7665 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7666 "{}",
7667 Style);
7668 verifyFormat("int f()\n"
7669 "{\n"
7670 " return 0;\n"
7671 "}",
7672 Style);
7673
7674 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7675 verifyFormat("class Foo {\n"
7676 " int f() {}\n"
7677 "};\n",
7678 Style);
7679 verifyFormat("class Foo {\n"
7680 " int f() { return 0; }\n"
7681 "};\n",
7682 Style);
7683 verifyFormat("class Foo {\n"
7684 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7685 " {}\n"
7686 "};\n",
7687 Style);
7688 verifyFormat("class Foo {\n"
7689 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7690 " {\n"
7691 " return 0;\n"
7692 " }\n"
7693 "};\n",
7694 Style);
7695
7696 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7697 verifyFormat("int f() {}", Style);
7698 verifyFormat("int f() { return 0; }", Style);
7699 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7700 "{}",
7701 Style);
7702 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7703 "{\n"
7704 " return 0;\n"
7705 "}",
7706 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00007707}
Krasimir Georgiev6a1c9d52017-10-02 15:53:37 +00007708TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
7709 FormatStyle Style = getLLVMStyle();
7710 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7711 verifyFormat("#ifdef A\n"
7712 "int f() {}\n"
7713 "#else\n"
7714 "int g() {}\n"
7715 "#endif",
7716 Style);
7717}
Daniel Jasperd74cf402014-04-08 12:46:38 +00007718
Francois Ferrandad722562017-06-30 20:25:55 +00007719TEST_F(FormatTest, SplitEmptyClass) {
7720 FormatStyle Style = getLLVMStyle();
7721 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7722 Style.BraceWrapping.AfterClass = true;
7723 Style.BraceWrapping.SplitEmptyRecord = false;
7724
7725 verifyFormat("class Foo\n"
7726 "{};",
7727 Style);
7728 verifyFormat("/* something */ class Foo\n"
7729 "{};",
7730 Style);
7731 verifyFormat("template <typename X> class Foo\n"
7732 "{};",
7733 Style);
7734 verifyFormat("class Foo\n"
7735 "{\n"
7736 " Foo();\n"
7737 "};",
7738 Style);
7739 verifyFormat("typedef class Foo\n"
7740 "{\n"
7741 "} Foo_t;",
7742 Style);
7743}
7744
7745TEST_F(FormatTest, SplitEmptyStruct) {
7746 FormatStyle Style = getLLVMStyle();
7747 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7748 Style.BraceWrapping.AfterStruct = true;
7749 Style.BraceWrapping.SplitEmptyRecord = false;
7750
7751 verifyFormat("struct Foo\n"
7752 "{};",
7753 Style);
7754 verifyFormat("/* something */ struct Foo\n"
7755 "{};",
7756 Style);
7757 verifyFormat("template <typename X> struct Foo\n"
7758 "{};",
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_t;",
7768 Style);
7769 //typedef struct Bar {} Bar_t;
7770}
7771
7772TEST_F(FormatTest, SplitEmptyUnion) {
7773 FormatStyle Style = getLLVMStyle();
7774 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7775 Style.BraceWrapping.AfterUnion = true;
7776 Style.BraceWrapping.SplitEmptyRecord = false;
7777
7778 verifyFormat("union Foo\n"
7779 "{};",
7780 Style);
7781 verifyFormat("/* something */ union Foo\n"
7782 "{};",
7783 Style);
7784 verifyFormat("union Foo\n"
7785 "{\n"
7786 " A,\n"
7787 "};",
7788 Style);
7789 verifyFormat("typedef union Foo\n"
7790 "{\n"
7791 "} Foo_t;",
7792 Style);
7793}
7794
7795TEST_F(FormatTest, SplitEmptyNamespace) {
7796 FormatStyle Style = getLLVMStyle();
7797 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7798 Style.BraceWrapping.AfterNamespace = true;
7799 Style.BraceWrapping.SplitEmptyNamespace = false;
7800
7801 verifyFormat("namespace Foo\n"
7802 "{};",
7803 Style);
7804 verifyFormat("/* something */ namespace Foo\n"
7805 "{};",
7806 Style);
7807 verifyFormat("inline namespace Foo\n"
7808 "{};",
7809 Style);
Sam McCall6f3778c2018-09-05 07:44:02 +00007810 verifyFormat("/* something */ inline namespace Foo\n"
7811 "{};",
7812 Style);
7813 verifyFormat("export namespace Foo\n"
7814 "{};",
7815 Style);
Francois Ferrandad722562017-06-30 20:25:55 +00007816 verifyFormat("namespace Foo\n"
7817 "{\n"
7818 "void Bar();\n"
7819 "};",
7820 Style);
7821}
7822
7823TEST_F(FormatTest, NeverMergeShortRecords) {
7824 FormatStyle Style = getLLVMStyle();
7825
7826 verifyFormat("class Foo {\n"
7827 " Foo();\n"
7828 "};",
7829 Style);
7830 verifyFormat("typedef class Foo {\n"
7831 " Foo();\n"
7832 "} Foo_t;",
7833 Style);
7834 verifyFormat("struct Foo {\n"
7835 " Foo();\n"
7836 "};",
7837 Style);
7838 verifyFormat("typedef struct Foo {\n"
7839 " Foo();\n"
7840 "} Foo_t;",
7841 Style);
7842 verifyFormat("union Foo {\n"
7843 " A,\n"
7844 "};",
7845 Style);
7846 verifyFormat("typedef union Foo {\n"
7847 " A,\n"
7848 "} Foo_t;",
7849 Style);
7850 verifyFormat("namespace Foo {\n"
7851 "void Bar();\n"
7852 "};",
7853 Style);
7854
7855 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7856 Style.BraceWrapping.AfterClass = true;
7857 Style.BraceWrapping.AfterStruct = true;
7858 Style.BraceWrapping.AfterUnion = true;
7859 Style.BraceWrapping.AfterNamespace = true;
7860 verifyFormat("class Foo\n"
7861 "{\n"
7862 " Foo();\n"
7863 "};",
7864 Style);
7865 verifyFormat("typedef class Foo\n"
7866 "{\n"
7867 " Foo();\n"
7868 "} Foo_t;",
7869 Style);
7870 verifyFormat("struct Foo\n"
7871 "{\n"
7872 " Foo();\n"
7873 "};",
7874 Style);
7875 verifyFormat("typedef struct Foo\n"
7876 "{\n"
7877 " Foo();\n"
7878 "} Foo_t;",
7879 Style);
7880 verifyFormat("union Foo\n"
7881 "{\n"
7882 " A,\n"
7883 "};",
7884 Style);
7885 verifyFormat("typedef union Foo\n"
7886 "{\n"
7887 " A,\n"
7888 "} Foo_t;",
7889 Style);
7890 verifyFormat("namespace Foo\n"
7891 "{\n"
7892 "void Bar();\n"
7893 "};",
7894 Style);
7895}
7896
Manuel Klimeke01bab52013-01-15 13:38:33 +00007897TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7898 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007899 verifyFormat("struct foo a = {bar};\nint n;");
7900 verifyFormat("class foo a = {bar};\nint n;");
7901 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007902
7903 // Elaborate types inside function definitions.
7904 verifyFormat("struct foo f() {}\nint n;");
7905 verifyFormat("class foo f() {}\nint n;");
7906 verifyFormat("union foo f() {}\nint n;");
7907
7908 // Templates.
7909 verifyFormat("template <class X> void f() {}\nint n;");
7910 verifyFormat("template <struct X> void f() {}\nint n;");
7911 verifyFormat("template <union X> void f() {}\nint n;");
7912
7913 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007914 verifyFormat("struct {\n} n;");
7915 verifyFormat(
7916 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007917 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007918 verifyFormat("class MACRO Z {\n} n;");
7919 verifyFormat("class MACRO(X) Z {\n} n;");
7920 verifyFormat("class __attribute__(X) Z {\n} n;");
7921 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007922 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007923 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007924 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7925 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007926
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007927 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007928 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007929
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007930 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007931 verifyFormat(
7932 "template <typename F>\n"
7933 "Matcher(const Matcher<F> &Other,\n"
7934 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7935 " !is_same<F, T>::value>::type * = 0)\n"
7936 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7937
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007938 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007939 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007940 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007941
7942 // FIXME:
7943 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007944 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007945
Manuel Klimeke01bab52013-01-15 13:38:33 +00007946 // Elaborate types where incorrectly parsing the structural element would
7947 // break the indent.
7948 verifyFormat("if (true)\n"
7949 " class X x;\n"
7950 "else\n"
7951 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007952
7953 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007954 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007955}
7956
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007957TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007958 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7959 format("#error Leave all white!!!!! space* alone!\n"));
7960 EXPECT_EQ(
7961 "#warning Leave all white!!!!! space* alone!\n",
7962 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007963 EXPECT_EQ("#error 1", format(" # error 1"));
7964 EXPECT_EQ("#warning 1", format(" # warning 1"));
7965}
7966
Daniel Jasper4431aa92013-04-23 13:54:04 +00007967TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007968 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007969 verifyFormat("#if (AAAA && BBBB)");
7970 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007971 // FIXME: Come up with a better indentation for #elif.
7972 verifyFormat(
7973 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7974 " defined(BBBBBBBB)\n"
7975 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7976 " defined(BBBBBBBB)\n"
7977 "#endif",
7978 getLLVMStyleWithColumns(65));
7979}
7980
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007981TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7982 FormatStyle AllowsMergedIf = getGoogleStyle();
7983 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7984 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7985 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007986 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7987 EXPECT_EQ("if (true) return 42;",
7988 format("if (true)\nreturn 42;", AllowsMergedIf));
7989 FormatStyle ShortMergedIf = AllowsMergedIf;
7990 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007991 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007992 " if (true) return 42;",
7993 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007994 verifyFormat("#define A \\\n"
7995 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007996 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007997 "#define B",
7998 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007999 verifyFormat("#define A \\\n"
8000 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00008001 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00008002 "g();",
8003 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00008004 verifyFormat("{\n"
8005 "#ifdef A\n"
8006 " // Comment\n"
8007 " if (true) continue;\n"
8008 "#endif\n"
8009 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00008010 " if (true) continue;\n"
8011 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00008012 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00008013 ShortMergedIf.ColumnLimit = 33;
8014 verifyFormat("#define A \\\n"
8015 " if constexpr (true) return 42;",
8016 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00008017 ShortMergedIf.ColumnLimit = 29;
8018 verifyFormat("#define A \\\n"
8019 " if (aaaaaaaaaa) return 1; \\\n"
8020 " return 2;",
8021 ShortMergedIf);
8022 ShortMergedIf.ColumnLimit = 28;
8023 verifyFormat("#define A \\\n"
8024 " if (aaaaaaaaaa) \\\n"
8025 " return 1; \\\n"
8026 " return 2;",
8027 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00008028 verifyFormat("#define A \\\n"
8029 " if constexpr (aaaaaaa) \\\n"
8030 " return 1; \\\n"
8031 " return 2;",
8032 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00008033}
8034
Manuel Klimekd33516e2013-01-23 10:09:28 +00008035TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00008036 verifyFormat("void f(int *a);");
8037 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00008038 verifyFormat("class A {\n void f(int *a);\n};");
8039 verifyFormat("class A {\n int *a;\n};");
8040 verifyFormat("namespace a {\n"
8041 "namespace b {\n"
8042 "class A {\n"
8043 " void f() {}\n"
8044 " int *a;\n"
8045 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00008046 "} // namespace b\n"
8047 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00008048}
8049
Manuel Klimekd33516e2013-01-23 10:09:28 +00008050TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
8051 verifyFormat("while");
8052 verifyFormat("operator");
8053}
8054
Daniel Jasperfda47cd2016-10-31 13:23:00 +00008055TEST_F(FormatTest, SkipsDeeplyNestedLines) {
8056 // This code would be painfully slow to format if we didn't skip it.
8057 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
8058 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8059 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8060 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8061 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8062 "A(1, 1)\n"
8063 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
8064 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8065 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8066 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8067 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8068 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8069 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8070 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8071 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8072 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
8073 // Deeply nested part is untouched, rest is formatted.
8074 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
8075 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00008076 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00008077}
8078
Nico Weber7e6a7a12013-01-08 17:56:31 +00008079//===----------------------------------------------------------------------===//
8080// Objective-C tests.
8081//===----------------------------------------------------------------------===//
8082
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00008083TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
8084 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
8085 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
8086 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00008087 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00008088 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
8089 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
8090 format("-(NSInteger)Method3:(id)anObject;"));
8091 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
8092 format("-(NSInteger)Method4:(id)anObject;"));
8093 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
8094 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
8095 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
8096 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00008097 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
8098 "forAllCells:(BOOL)flag;",
8099 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
8100 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00008101
8102 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00008103 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
8104 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00008105 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
8106 " inRange:(NSRange)range\n"
8107 " outRange:(NSRange)out_range\n"
8108 " outRange1:(NSRange)out_range1\n"
8109 " outRange2:(NSRange)out_range2\n"
8110 " outRange3:(NSRange)out_range3\n"
8111 " outRange4:(NSRange)out_range4\n"
8112 " outRange5:(NSRange)out_range5\n"
8113 " outRange6:(NSRange)out_range6\n"
8114 " outRange7:(NSRange)out_range7\n"
8115 " outRange8:(NSRange)out_range8\n"
8116 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00008117
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008118 // When the function name has to be wrapped.
8119 FormatStyle Style = getLLVMStyle();
Ben Hamilton416348e2018-04-12 15:11:48 +00008120 // ObjC ignores IndentWrappedFunctionNames when wrapping methods
8121 // and always indents instead.
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008122 Style.IndentWrappedFunctionNames = false;
8123 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
Ben Hamilton416348e2018-04-12 15:11:48 +00008124 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
8125 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008126 "}",
8127 Style);
8128 Style.IndentWrappedFunctionNames = true;
8129 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
Ben Hamilton416348e2018-04-12 15:11:48 +00008130 " veryLooooooooooongName:(NSString)cccccccccccccc\n"
8131 " anotherName:(NSString)dddddddddddddd {\n"
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008132 "}",
8133 Style);
8134
Nico Weberd6f962f2013-01-10 20:18:33 +00008135 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00008136 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00008137 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
8138 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00008139 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00008140
Daniel Jasper37194282013-05-28 08:33:00 +00008141 verifyFormat("- (int (*)())foo:(int (*)())f;");
8142 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00008143
8144 // If there's no return type (very rare in practice!), LLVM and Google style
8145 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00008146 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00008147 verifyFormat("- foo:(int)f;");
8148 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00008149}
8150
Nico Weber0588b502013-02-07 00:19:29 +00008151
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008152TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00008153 EXPECT_EQ("\"some text \"\n"
8154 "\"other\";",
8155 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00008156 EXPECT_EQ("\"some text \"\n"
8157 "\"other\";",
8158 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008159 EXPECT_EQ(
8160 "#define A \\\n"
8161 " \"some \" \\\n"
8162 " \"text \" \\\n"
8163 " \"other\";",
8164 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
8165 EXPECT_EQ(
8166 "#define A \\\n"
8167 " \"so \" \\\n"
8168 " \"text \" \\\n"
8169 " \"other\";",
8170 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
8171
8172 EXPECT_EQ("\"some text\"",
8173 format("\"some text\"", getLLVMStyleWithColumns(1)));
8174 EXPECT_EQ("\"some text\"",
8175 format("\"some text\"", getLLVMStyleWithColumns(11)));
8176 EXPECT_EQ("\"some \"\n"
8177 "\"text\"",
8178 format("\"some text\"", getLLVMStyleWithColumns(10)));
8179 EXPECT_EQ("\"some \"\n"
8180 "\"text\"",
8181 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00008182 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008183 "\" tex\"\n"
8184 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008185 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00008186 EXPECT_EQ("\"some\"\n"
8187 "\" tex\"\n"
8188 "\" and\"",
8189 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
8190 EXPECT_EQ("\"some\"\n"
8191 "\"/tex\"\n"
8192 "\"/and\"",
8193 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008194
8195 EXPECT_EQ("variable =\n"
8196 " \"long string \"\n"
8197 " \"literal\";",
8198 format("variable = \"long string literal\";",
8199 getLLVMStyleWithColumns(20)));
8200
8201 EXPECT_EQ("variable = f(\n"
8202 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00008203 " \"literal\",\n"
8204 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00008205 " loooooooooooooooooooong);",
8206 format("variable = f(\"long string literal\", short, "
8207 "loooooooooooooooooooong);",
8208 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008209
Daniel Jaspera44991332015-04-29 13:06:49 +00008210 EXPECT_EQ(
8211 "f(g(\"long string \"\n"
8212 " \"literal\"),\n"
8213 " b);",
8214 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008215 EXPECT_EQ("f(g(\"long string \"\n"
8216 " \"literal\",\n"
8217 " a),\n"
8218 " b);",
8219 format("f(g(\"long string literal\", a), b);",
8220 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008221 EXPECT_EQ(
8222 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00008223 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008224 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
8225 EXPECT_EQ("f(\"one two three four five six \"\n"
8226 " \"seven\".split(\n"
8227 " really_looooong_variable));",
8228 format("f(\"one two three four five six seven\"."
8229 "split(really_looooong_variable));",
8230 getLLVMStyleWithColumns(33)));
8231
8232 EXPECT_EQ("f(\"some \"\n"
8233 " \"text\",\n"
8234 " other);",
8235 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00008236
8237 // Only break as a last resort.
8238 verifyFormat(
8239 "aaaaaaaaaaaaaaaaaaaa(\n"
8240 " aaaaaaaaaaaaaaaaaaaa,\n"
8241 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00008242
Daniel Jaspera44991332015-04-29 13:06:49 +00008243 EXPECT_EQ("\"splitmea\"\n"
8244 "\"trandomp\"\n"
8245 "\"oint\"",
8246 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00008247
Daniel Jaspera44991332015-04-29 13:06:49 +00008248 EXPECT_EQ("\"split/\"\n"
8249 "\"pathat/\"\n"
8250 "\"slashes\"",
8251 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008252
Daniel Jaspera44991332015-04-29 13:06:49 +00008253 EXPECT_EQ("\"split/\"\n"
8254 "\"pathat/\"\n"
8255 "\"slashes\"",
8256 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00008257 EXPECT_EQ("\"split at \"\n"
8258 "\"spaces/at/\"\n"
8259 "\"slashes.at.any$\"\n"
8260 "\"non-alphanumeric%\"\n"
8261 "\"1111111111characte\"\n"
8262 "\"rs\"",
8263 format("\"split at "
8264 "spaces/at/"
8265 "slashes.at."
8266 "any$non-"
8267 "alphanumeric%"
8268 "1111111111characte"
8269 "rs\"",
8270 getLLVMStyleWithColumns(20)));
8271
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008272 // Verify that splitting the strings understands
8273 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00008274 EXPECT_EQ(
8275 "aaaaaaaaaaaa(\n"
8276 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8277 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8278 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8279 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8280 "aaaaaaaaaaaaaaaaaaaaaa\");",
8281 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00008282 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8283 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8284 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8285 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8286 "aaaaaaaaaaaaaaaaaaaaaa\";",
8287 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00008288 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8289 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8290 format("llvm::outs() << "
8291 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8292 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00008293 EXPECT_EQ("ffff(\n"
8294 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8295 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8296 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8297 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8298 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008299
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008300 FormatStyle Style = getLLVMStyleWithColumns(12);
8301 Style.BreakStringLiterals = false;
8302 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8303
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008304 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008305 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00008306 EXPECT_EQ("#define A \\\n"
8307 " \"some \" \\\n"
8308 " \"text \" \\\n"
8309 " \"other\";",
8310 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008311}
8312
Manuel Klimek93699f42017-11-29 14:29:43 +00008313TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
8314 EXPECT_EQ("C a = \"some more \"\n"
8315 " \"text\";",
8316 format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
8317}
8318
Manuel Klimek9e321992015-07-28 15:50:24 +00008319TEST_F(FormatTest, FullyRemoveEmptyLines) {
8320 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8321 NoEmptyLines.MaxEmptyLinesToKeep = 0;
8322 EXPECT_EQ("int i = a(b());",
8323 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8324}
8325
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008326TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8327 EXPECT_EQ(
8328 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8329 "(\n"
8330 " \"x\t\");",
8331 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8332 "aaaaaaa("
8333 "\"x\t\");"));
8334}
8335
Daniel Jasper174b0122014-01-09 14:18:12 +00008336TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00008337 EXPECT_EQ(
8338 "u8\"utf8 string \"\n"
8339 "u8\"literal\";",
8340 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8341 EXPECT_EQ(
8342 "u\"utf16 string \"\n"
8343 "u\"literal\";",
8344 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8345 EXPECT_EQ(
8346 "U\"utf32 string \"\n"
8347 "U\"literal\";",
8348 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8349 EXPECT_EQ("L\"wide string \"\n"
8350 "L\"literal\";",
8351 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00008352 EXPECT_EQ("@\"NSString \"\n"
8353 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00008354 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00008355 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00008356
8357 // This input makes clang-format try to split the incomplete unicode escape
8358 // sequence, which used to lead to a crasher.
8359 verifyNoCrash(
8360 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8361 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008362}
8363
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00008364TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8365 FormatStyle Style = getGoogleStyleWithColumns(15);
8366 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8367 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8368 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8369 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8370 EXPECT_EQ("u8R\"x(raw literal)x\";",
8371 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008372}
8373
8374TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8375 FormatStyle Style = getLLVMStyleWithColumns(20);
8376 EXPECT_EQ(
8377 "_T(\"aaaaaaaaaaaaaa\")\n"
8378 "_T(\"aaaaaaaaaaaaaa\")\n"
8379 "_T(\"aaaaaaaaaaaa\")",
8380 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00008381 EXPECT_EQ("f(x,\n"
8382 " _T(\"aaaaaaaaaaaa\")\n"
8383 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00008384 " z);",
8385 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8386
8387 // FIXME: Handle embedded spaces in one iteration.
8388 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8389 // "_T(\"aaaaaaaaaaaaa\")\n"
8390 // "_T(\"aaaaaaaaaaaaa\")\n"
8391 // "_T(\"a\")",
8392 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8393 // getLLVMStyleWithColumns(20)));
8394 EXPECT_EQ(
8395 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8396 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008397 EXPECT_EQ("f(\n"
8398 "#if !TEST\n"
8399 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8400 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00008401 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008402 format("f(\n"
8403 "#if !TEST\n"
8404 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8405 "#endif\n"
8406 ");"));
8407 EXPECT_EQ("f(\n"
8408 "\n"
8409 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8410 format("f(\n"
8411 "\n"
8412 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008413}
8414
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00008415TEST_F(FormatTest, BreaksStringLiteralOperands) {
8416 // In a function call with two operands, the second can be broken with no line
8417 // break before it.
8418 EXPECT_EQ("func(a, \"long long \"\n"
8419 " \"long long\");",
8420 format("func(a, \"long long long long\");",
8421 getLLVMStyleWithColumns(24)));
8422 // In a function call with three operands, the second must be broken with a
8423 // line break before it.
8424 EXPECT_EQ("func(a,\n"
8425 " \"long long long \"\n"
8426 " \"long\",\n"
8427 " c);",
8428 format("func(a, \"long long long long\", c);",
8429 getLLVMStyleWithColumns(24)));
8430 // In a function call with three operands, the third must be broken with a
8431 // line break before it.
8432 EXPECT_EQ("func(a, b,\n"
8433 " \"long long long \"\n"
8434 " \"long\");",
8435 format("func(a, b, \"long long long long\");",
8436 getLLVMStyleWithColumns(24)));
8437 // In a function call with three operands, both the second and the third must
8438 // be broken with a line break before them.
8439 EXPECT_EQ("func(a,\n"
8440 " \"long long long \"\n"
8441 " \"long\",\n"
8442 " \"long long long \"\n"
8443 " \"long\");",
8444 format("func(a, \"long long long long\", \"long long long long\");",
8445 getLLVMStyleWithColumns(24)));
8446 // In a chain of << with two operands, the second can be broken with no line
8447 // break before it.
8448 EXPECT_EQ("a << \"line line \"\n"
8449 " \"line\";",
8450 format("a << \"line line line\";",
8451 getLLVMStyleWithColumns(20)));
8452 // In a chain of << with three operands, the second can be broken with no line
8453 // break before it.
8454 EXPECT_EQ("abcde << \"line \"\n"
8455 " \"line line\"\n"
8456 " << c;",
8457 format("abcde << \"line line line\" << c;",
8458 getLLVMStyleWithColumns(20)));
8459 // In a chain of << with three operands, the third must be broken with a line
8460 // break before it.
8461 EXPECT_EQ("a << b\n"
8462 " << \"line line \"\n"
8463 " \"line\";",
8464 format("a << b << \"line line line\";",
8465 getLLVMStyleWithColumns(20)));
8466 // In a chain of << with three operands, the second can be broken with no line
8467 // break before it and the third must be broken with a line break before it.
8468 EXPECT_EQ("abcd << \"line line \"\n"
8469 " \"line\"\n"
8470 " << \"line line \"\n"
8471 " \"line\";",
8472 format("abcd << \"line line line\" << \"line line line\";",
8473 getLLVMStyleWithColumns(20)));
8474 // In a chain of binary operators with two operands, the second can be broken
8475 // with no line break before it.
8476 EXPECT_EQ("abcd + \"line line \"\n"
8477 " \"line line\";",
8478 format("abcd + \"line line line line\";",
8479 getLLVMStyleWithColumns(20)));
8480 // In a chain of binary operators with three operands, the second must be
8481 // broken with a line break before it.
8482 EXPECT_EQ("abcd +\n"
8483 " \"line line \"\n"
8484 " \"line line\" +\n"
8485 " e;",
8486 format("abcd + \"line line line line\" + e;",
8487 getLLVMStyleWithColumns(20)));
8488 // In a function call with two operands, with AlignAfterOpenBracket enabled,
8489 // the first must be broken with a line break before it.
8490 FormatStyle Style = getLLVMStyleWithColumns(25);
8491 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8492 EXPECT_EQ("someFunction(\n"
8493 " \"long long long \"\n"
8494 " \"long\",\n"
8495 " a);",
8496 format("someFunction(\"long long long long\", a);", Style));
8497}
8498
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008499TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008500 EXPECT_EQ(
8501 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8502 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8503 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8504 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8505 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8506 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8507}
8508
8509TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8510 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008511 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008512 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8513 "multiline raw string literal xxxxxxxxxxxxxx\n"
8514 ")x\",\n"
8515 " a),\n"
8516 " b);",
8517 format("fffffffffff(g(R\"x(\n"
8518 "multiline raw string literal xxxxxxxxxxxxxx\n"
8519 ")x\", a), b);",
8520 getGoogleStyleWithColumns(20)));
8521 EXPECT_EQ("fffffffffff(\n"
8522 " g(R\"x(qqq\n"
8523 "multiline raw string literal xxxxxxxxxxxxxx\n"
8524 ")x\",\n"
8525 " a),\n"
8526 " b);",
8527 format("fffffffffff(g(R\"x(qqq\n"
8528 "multiline raw string literal xxxxxxxxxxxxxx\n"
8529 ")x\", a), b);",
8530 getGoogleStyleWithColumns(20)));
8531
8532 EXPECT_EQ("fffffffffff(R\"x(\n"
8533 "multiline raw string literal xxxxxxxxxxxxxx\n"
8534 ")x\");",
8535 format("fffffffffff(R\"x(\n"
8536 "multiline raw string literal xxxxxxxxxxxxxx\n"
8537 ")x\");",
8538 getGoogleStyleWithColumns(20)));
8539 EXPECT_EQ("fffffffffff(R\"x(\n"
8540 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008541 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008542 format("fffffffffff(R\"x(\n"
8543 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008544 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008545 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008546 EXPECT_EQ("fffffffffff(\n"
8547 " R\"x(\n"
8548 "multiline raw string literal xxxxxxxxxxxxxx\n"
8549 ")x\" +\n"
8550 " bbbbbb);",
8551 format("fffffffffff(\n"
8552 " R\"x(\n"
8553 "multiline raw string literal xxxxxxxxxxxxxx\n"
8554 ")x\" + bbbbbb);",
8555 getGoogleStyleWithColumns(20)));
Daniel Jasperfd327672018-03-22 14:43:54 +00008556 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
8557 format("fffffffffff(\n"
8558 " R\"(single line raw string)\" + bbbbbb);"));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008559}
8560
Alexander Kornienkobe633902013-06-14 11:46:10 +00008561TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008562 verifyFormat("string a = \"unterminated;");
8563 EXPECT_EQ("function(\"unterminated,\n"
8564 " OtherParameter);",
8565 format("function( \"unterminated,\n"
8566 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008567}
8568
8569TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008570 FormatStyle Style = getLLVMStyle();
8571 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008572 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008573 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008574}
8575
Daniel Jaspera44991332015-04-29 13:06:49 +00008576TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008577
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008578TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8579 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8580 " \"ddeeefff\");",
8581 format("someFunction(\"aaabbbcccdddeeefff\");",
8582 getLLVMStyleWithColumns(25)));
8583 EXPECT_EQ("someFunction1234567890(\n"
8584 " \"aaabbbcccdddeeefff\");",
8585 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8586 getLLVMStyleWithColumns(26)));
8587 EXPECT_EQ("someFunction1234567890(\n"
8588 " \"aaabbbcccdddeeeff\"\n"
8589 " \"f\");",
8590 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8591 getLLVMStyleWithColumns(25)));
8592 EXPECT_EQ("someFunction1234567890(\n"
8593 " \"aaabbbcccdddeeeff\"\n"
8594 " \"f\");",
8595 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8596 getLLVMStyleWithColumns(24)));
Manuel Klimek77866142017-11-17 11:17:15 +00008597 EXPECT_EQ("someFunction(\n"
8598 " \"aaabbbcc ddde \"\n"
8599 " \"efff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008600 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008601 getLLVMStyleWithColumns(25)));
8602 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8603 " \"ddeeefff\");",
8604 format("someFunction(\"aaabbbccc ddeeefff\");",
8605 getLLVMStyleWithColumns(25)));
8606 EXPECT_EQ("someFunction1234567890(\n"
8607 " \"aaabb \"\n"
8608 " \"cccdddeeefff\");",
8609 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8610 getLLVMStyleWithColumns(25)));
8611 EXPECT_EQ("#define A \\\n"
8612 " string s = \\\n"
8613 " \"123456789\" \\\n"
8614 " \"0\"; \\\n"
8615 " int i;",
8616 format("#define A string s = \"1234567890\"; int i;",
8617 getLLVMStyleWithColumns(20)));
Manuel Klimek77866142017-11-17 11:17:15 +00008618 EXPECT_EQ("someFunction(\n"
8619 " \"aaabbbcc \"\n"
8620 " \"dddeeefff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008621 format("someFunction(\"aaabbbcc dddeeefff\");",
8622 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008623}
8624
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008625TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008626 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8627 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008628 EXPECT_EQ("\"test\"\n"
8629 "\"\\n\"",
8630 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8631 EXPECT_EQ("\"tes\\\\\"\n"
8632 "\"n\"",
8633 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8634 EXPECT_EQ("\"\\\\\\\\\"\n"
8635 "\"\\n\"",
8636 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008637 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008638 EXPECT_EQ("\"\\uff01\"\n"
8639 "\"test\"",
8640 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8641 EXPECT_EQ("\"\\Uff01ff02\"",
8642 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8643 EXPECT_EQ("\"\\x000000000001\"\n"
8644 "\"next\"",
8645 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8646 EXPECT_EQ("\"\\x000000000001next\"",
8647 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8648 EXPECT_EQ("\"\\x000000000001\"",
8649 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8650 EXPECT_EQ("\"test\"\n"
8651 "\"\\000000\"\n"
8652 "\"000001\"",
8653 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8654 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008655 "\"00000000\"\n"
8656 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008657 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008658}
8659
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008660TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8661 verifyFormat("void f() {\n"
8662 " return g() {}\n"
8663 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008664 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008665 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008666 "}");
8667}
8668
Manuel Klimek421147e2014-01-24 09:25:23 +00008669TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8670 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008671 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008672}
8673
Manuel Klimek13b97d82013-05-13 08:42:42 +00008674TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8675 verifyFormat("class X {\n"
8676 " void f() {\n"
8677 " }\n"
8678 "};",
8679 getLLVMStyleWithColumns(12));
8680}
8681
8682TEST_F(FormatTest, ConfigurableIndentWidth) {
8683 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8684 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008685 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008686 verifyFormat("void f() {\n"
8687 " someFunction();\n"
8688 " if (true) {\n"
8689 " f();\n"
8690 " }\n"
8691 "}",
8692 EightIndent);
8693 verifyFormat("class X {\n"
8694 " void f() {\n"
8695 " }\n"
8696 "};",
8697 EightIndent);
8698 verifyFormat("int x[] = {\n"
8699 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008700 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008701 EightIndent);
8702}
8703
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008704TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008705 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008706 "f();",
8707 getLLVMStyleWithColumns(8));
8708}
8709
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008710TEST_F(FormatTest, ConfigurableUseOfTab) {
8711 FormatStyle Tab = getLLVMStyleWithColumns(42);
8712 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008713 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008714 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008715
8716 EXPECT_EQ("if (aaaaaaaa && // q\n"
8717 " bb)\t\t// w\n"
8718 "\t;",
8719 format("if (aaaaaaaa &&// q\n"
8720 "bb)// w\n"
8721 ";",
8722 Tab));
8723 EXPECT_EQ("if (aaa && bbb) // w\n"
8724 "\t;",
8725 format("if(aaa&&bbb)// w\n"
8726 ";",
8727 Tab));
8728
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008729 verifyFormat("class X {\n"
8730 "\tvoid f() {\n"
8731 "\t\tsomeFunction(parameter1,\n"
8732 "\t\t\t parameter2);\n"
8733 "\t}\n"
8734 "};",
8735 Tab);
8736 verifyFormat("#define A \\\n"
8737 "\tvoid f() { \\\n"
8738 "\t\tsomeFunction( \\\n"
8739 "\t\t parameter1, \\\n"
8740 "\t\t parameter2); \\\n"
8741 "\t}",
8742 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008743
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008744 Tab.TabWidth = 4;
8745 Tab.IndentWidth = 8;
8746 verifyFormat("class TabWidth4Indent8 {\n"
8747 "\t\tvoid f() {\n"
8748 "\t\t\t\tsomeFunction(parameter1,\n"
8749 "\t\t\t\t\t\t\t parameter2);\n"
8750 "\t\t}\n"
8751 "};",
8752 Tab);
8753
8754 Tab.TabWidth = 4;
8755 Tab.IndentWidth = 4;
8756 verifyFormat("class TabWidth4Indent4 {\n"
8757 "\tvoid f() {\n"
8758 "\t\tsomeFunction(parameter1,\n"
8759 "\t\t\t\t\t parameter2);\n"
8760 "\t}\n"
8761 "};",
8762 Tab);
8763
8764 Tab.TabWidth = 8;
8765 Tab.IndentWidth = 4;
8766 verifyFormat("class TabWidth8Indent4 {\n"
8767 " void f() {\n"
8768 "\tsomeFunction(parameter1,\n"
8769 "\t\t parameter2);\n"
8770 " }\n"
8771 "};",
8772 Tab);
8773
Alexander Kornienko39856b72013-09-10 09:38:25 +00008774 Tab.TabWidth = 8;
8775 Tab.IndentWidth = 8;
8776 EXPECT_EQ("/*\n"
8777 "\t a\t\tcomment\n"
8778 "\t in multiple lines\n"
8779 " */",
8780 format(" /*\t \t \n"
8781 " \t \t a\t\tcomment\t \t\n"
8782 " \t \t in multiple lines\t\n"
8783 " \t */",
8784 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008785
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008786 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008787 verifyFormat("{\n"
8788 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8789 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8790 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8791 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8792 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8793 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008794 "};",
8795 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008796 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008797 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008798 "\ta2,\n"
8799 "\ta3\n"
8800 "};",
8801 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008802 EXPECT_EQ("if (aaaaaaaa && // q\n"
8803 " bb) // w\n"
8804 "\t;",
8805 format("if (aaaaaaaa &&// q\n"
8806 "bb)// w\n"
8807 ";",
8808 Tab));
8809 verifyFormat("class X {\n"
8810 "\tvoid f() {\n"
8811 "\t\tsomeFunction(parameter1,\n"
8812 "\t\t parameter2);\n"
8813 "\t}\n"
8814 "};",
8815 Tab);
8816 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008817 "\tQ(\n"
8818 "\t {\n"
8819 "\t\t int a;\n"
8820 "\t\t someFunction(aaaaaaaa,\n"
8821 "\t\t bbbbbbb);\n"
8822 "\t },\n"
8823 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008824 "}",
8825 Tab);
8826 EXPECT_EQ("{\n"
8827 "\t/* aaaa\n"
8828 "\t bbbb */\n"
8829 "}",
8830 format("{\n"
8831 "/* aaaa\n"
8832 " bbbb */\n"
8833 "}",
8834 Tab));
8835 EXPECT_EQ("{\n"
8836 "\t/*\n"
8837 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8838 "\t bbbbbbbbbbbbb\n"
8839 "\t*/\n"
8840 "}",
8841 format("{\n"
8842 "/*\n"
8843 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8844 "*/\n"
8845 "}",
8846 Tab));
8847 EXPECT_EQ("{\n"
8848 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8849 "\t// bbbbbbbbbbbbb\n"
8850 "}",
8851 format("{\n"
8852 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8853 "}",
8854 Tab));
8855 EXPECT_EQ("{\n"
8856 "\t/*\n"
8857 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8858 "\t bbbbbbbbbbbbb\n"
8859 "\t*/\n"
8860 "}",
8861 format("{\n"
8862 "\t/*\n"
8863 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8864 "\t*/\n"
8865 "}",
8866 Tab));
8867 EXPECT_EQ("{\n"
8868 "\t/*\n"
8869 "\n"
8870 "\t*/\n"
8871 "}",
8872 format("{\n"
8873 "\t/*\n"
8874 "\n"
8875 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008876 "}",
8877 Tab));
8878 EXPECT_EQ("{\n"
8879 "\t/*\n"
8880 " asdf\n"
8881 "\t*/\n"
8882 "}",
8883 format("{\n"
8884 "\t/*\n"
8885 " asdf\n"
8886 "\t*/\n"
8887 "}",
8888 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008889
8890 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008891 EXPECT_EQ("/*\n"
8892 " a\t\tcomment\n"
8893 " in multiple lines\n"
8894 " */",
8895 format(" /*\t \t \n"
8896 " \t \t a\t\tcomment\t \t\n"
8897 " \t \t in multiple lines\t\n"
8898 " \t */",
8899 Tab));
8900 EXPECT_EQ("/* some\n"
8901 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008902 format(" \t \t /* some\n"
8903 " \t \t comment */",
8904 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008905 EXPECT_EQ("int a; /* some\n"
8906 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008907 format(" \t \t int a; /* some\n"
8908 " \t \t comment */",
8909 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008910
Alexander Kornienko39856b72013-09-10 09:38:25 +00008911 EXPECT_EQ("int a; /* some\n"
8912 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008913 format(" \t \t int\ta; /* some\n"
8914 " \t \t comment */",
8915 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008916 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8917 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008918 format(" \t \t f(\"\t\t\"); /* some\n"
8919 " \t \t comment */",
8920 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008921 EXPECT_EQ("{\n"
8922 " /*\n"
8923 " * Comment\n"
8924 " */\n"
8925 " int i;\n"
8926 "}",
8927 format("{\n"
8928 "\t/*\n"
8929 "\t * Comment\n"
8930 "\t */\n"
8931 "\t int i;\n"
8932 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008933
8934 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8935 Tab.TabWidth = 8;
8936 Tab.IndentWidth = 8;
8937 EXPECT_EQ("if (aaaaaaaa && // q\n"
8938 " bb) // w\n"
8939 "\t;",
8940 format("if (aaaaaaaa &&// q\n"
8941 "bb)// w\n"
8942 ";",
8943 Tab));
8944 EXPECT_EQ("if (aaa && bbb) // w\n"
8945 "\t;",
8946 format("if(aaa&&bbb)// w\n"
8947 ";",
8948 Tab));
8949 verifyFormat("class X {\n"
8950 "\tvoid f() {\n"
8951 "\t\tsomeFunction(parameter1,\n"
8952 "\t\t\t parameter2);\n"
8953 "\t}\n"
8954 "};",
8955 Tab);
8956 verifyFormat("#define A \\\n"
8957 "\tvoid f() { \\\n"
8958 "\t\tsomeFunction( \\\n"
8959 "\t\t parameter1, \\\n"
8960 "\t\t parameter2); \\\n"
8961 "\t}",
8962 Tab);
8963 Tab.TabWidth = 4;
8964 Tab.IndentWidth = 8;
8965 verifyFormat("class TabWidth4Indent8 {\n"
8966 "\t\tvoid f() {\n"
8967 "\t\t\t\tsomeFunction(parameter1,\n"
8968 "\t\t\t\t\t\t\t parameter2);\n"
8969 "\t\t}\n"
8970 "};",
8971 Tab);
8972 Tab.TabWidth = 4;
8973 Tab.IndentWidth = 4;
8974 verifyFormat("class TabWidth4Indent4 {\n"
8975 "\tvoid f() {\n"
8976 "\t\tsomeFunction(parameter1,\n"
8977 "\t\t\t\t\t parameter2);\n"
8978 "\t}\n"
8979 "};",
8980 Tab);
8981 Tab.TabWidth = 8;
8982 Tab.IndentWidth = 4;
8983 verifyFormat("class TabWidth8Indent4 {\n"
8984 " void f() {\n"
8985 "\tsomeFunction(parameter1,\n"
8986 "\t\t parameter2);\n"
8987 " }\n"
8988 "};",
8989 Tab);
8990 Tab.TabWidth = 8;
8991 Tab.IndentWidth = 8;
8992 EXPECT_EQ("/*\n"
8993 "\t a\t\tcomment\n"
8994 "\t in multiple lines\n"
8995 " */",
8996 format(" /*\t \t \n"
8997 " \t \t a\t\tcomment\t \t\n"
8998 " \t \t in multiple lines\t\n"
8999 " \t */",
9000 Tab));
9001 verifyFormat("{\n"
9002 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9003 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9004 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9005 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9006 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9007 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9008 "};",
9009 Tab);
9010 verifyFormat("enum AA {\n"
9011 "\ta1, // Force multiple lines\n"
9012 "\ta2,\n"
9013 "\ta3\n"
9014 "};",
9015 Tab);
9016 EXPECT_EQ("if (aaaaaaaa && // q\n"
9017 " bb) // w\n"
9018 "\t;",
9019 format("if (aaaaaaaa &&// q\n"
9020 "bb)// w\n"
9021 ";",
9022 Tab));
9023 verifyFormat("class X {\n"
9024 "\tvoid f() {\n"
9025 "\t\tsomeFunction(parameter1,\n"
9026 "\t\t\t parameter2);\n"
9027 "\t}\n"
9028 "};",
9029 Tab);
9030 verifyFormat("{\n"
9031 "\tQ(\n"
9032 "\t {\n"
9033 "\t\t int a;\n"
9034 "\t\t someFunction(aaaaaaaa,\n"
9035 "\t\t\t\t bbbbbbb);\n"
9036 "\t },\n"
9037 "\t p);\n"
9038 "}",
9039 Tab);
9040 EXPECT_EQ("{\n"
9041 "\t/* aaaa\n"
9042 "\t bbbb */\n"
9043 "}",
9044 format("{\n"
9045 "/* aaaa\n"
9046 " bbbb */\n"
9047 "}",
9048 Tab));
9049 EXPECT_EQ("{\n"
9050 "\t/*\n"
9051 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9052 "\t bbbbbbbbbbbbb\n"
9053 "\t*/\n"
9054 "}",
9055 format("{\n"
9056 "/*\n"
9057 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9058 "*/\n"
9059 "}",
9060 Tab));
9061 EXPECT_EQ("{\n"
9062 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9063 "\t// bbbbbbbbbbbbb\n"
9064 "}",
9065 format("{\n"
9066 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9067 "}",
9068 Tab));
9069 EXPECT_EQ("{\n"
9070 "\t/*\n"
9071 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9072 "\t bbbbbbbbbbbbb\n"
9073 "\t*/\n"
9074 "}",
9075 format("{\n"
9076 "\t/*\n"
9077 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9078 "\t*/\n"
9079 "}",
9080 Tab));
9081 EXPECT_EQ("{\n"
9082 "\t/*\n"
9083 "\n"
9084 "\t*/\n"
9085 "}",
9086 format("{\n"
9087 "\t/*\n"
9088 "\n"
9089 "\t*/\n"
9090 "}",
9091 Tab));
9092 EXPECT_EQ("{\n"
9093 "\t/*\n"
9094 " asdf\n"
9095 "\t*/\n"
9096 "}",
9097 format("{\n"
9098 "\t/*\n"
9099 " asdf\n"
9100 "\t*/\n"
9101 "}",
9102 Tab));
9103 EXPECT_EQ("/*\n"
9104 "\t a\t\tcomment\n"
9105 "\t in multiple lines\n"
9106 " */",
9107 format(" /*\t \t \n"
9108 " \t \t a\t\tcomment\t \t\n"
9109 " \t \t in multiple lines\t\n"
9110 " \t */",
9111 Tab));
9112 EXPECT_EQ("/* some\n"
9113 " comment */",
9114 format(" \t \t /* some\n"
9115 " \t \t comment */",
9116 Tab));
9117 EXPECT_EQ("int a; /* some\n"
9118 " comment */",
9119 format(" \t \t int a; /* some\n"
9120 " \t \t comment */",
9121 Tab));
9122 EXPECT_EQ("int a; /* some\n"
9123 "comment */",
9124 format(" \t \t int\ta; /* some\n"
9125 " \t \t comment */",
9126 Tab));
9127 EXPECT_EQ("f(\"\t\t\"); /* some\n"
9128 " comment */",
9129 format(" \t \t f(\"\t\t\"); /* some\n"
9130 " \t \t comment */",
9131 Tab));
9132 EXPECT_EQ("{\n"
9133 " /*\n"
9134 " * Comment\n"
9135 " */\n"
9136 " int i;\n"
9137 "}",
9138 format("{\n"
9139 "\t/*\n"
9140 "\t * Comment\n"
9141 "\t */\n"
9142 "\t int i;\n"
9143 "}"));
9144 Tab.AlignConsecutiveAssignments = true;
9145 Tab.AlignConsecutiveDeclarations = true;
9146 Tab.TabWidth = 4;
9147 Tab.IndentWidth = 4;
9148 verifyFormat("class Assign {\n"
9149 "\tvoid f() {\n"
9150 "\t\tint x = 123;\n"
9151 "\t\tint random = 4;\n"
9152 "\t\tstd::string alphabet =\n"
9153 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
9154 "\t}\n"
9155 "};",
9156 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00009157}
9158
Alexander Kornienko917f9e02013-09-10 12:29:48 +00009159TEST_F(FormatTest, CalculatesOriginalColumn) {
9160 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9161 "q\"; /* some\n"
9162 " comment */",
9163 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9164 "q\"; /* some\n"
9165 " comment */",
9166 getLLVMStyle()));
9167 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
9168 "/* some\n"
9169 " comment */",
9170 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
9171 " /* some\n"
9172 " comment */",
9173 getLLVMStyle()));
9174 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9175 "qqq\n"
9176 "/* some\n"
9177 " comment */",
9178 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9179 "qqq\n"
9180 " /* some\n"
9181 " comment */",
9182 getLLVMStyle()));
9183 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9184 "wwww; /* some\n"
9185 " comment */",
9186 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9187 "wwww; /* some\n"
9188 " comment */",
9189 getLLVMStyle()));
9190}
9191
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009192TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00009193 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009194 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009195
9196 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009197 " continue;",
9198 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009199 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009200 " continue;",
9201 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009202 verifyFormat("if(true)\n"
9203 " f();\n"
9204 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009205 " f();",
9206 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009207 verifyFormat("do {\n"
9208 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009209 "} while(something());",
9210 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009211 verifyFormat("switch(x) {\n"
9212 "default:\n"
9213 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009214 "}",
9215 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00009216 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00009217 verifyFormat("size_t x = sizeof(x);", NoSpace);
9218 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
9219 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
9220 verifyFormat("alignas(128) char a[128];", NoSpace);
9221 verifyFormat("size_t x = alignof(MyType);", NoSpace);
9222 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
9223 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00009224 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00009225 verifyFormat("T A::operator()();", NoSpace);
9226 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009227
9228 FormatStyle Space = getLLVMStyle();
9229 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
9230
9231 verifyFormat("int f ();", Space);
9232 verifyFormat("void f (int a, T b) {\n"
9233 " while (true)\n"
9234 " continue;\n"
9235 "}",
9236 Space);
9237 verifyFormat("if (true)\n"
9238 " f ();\n"
9239 "else if (true)\n"
9240 " f ();",
9241 Space);
9242 verifyFormat("do {\n"
9243 " do_something ();\n"
9244 "} while (something ());",
9245 Space);
9246 verifyFormat("switch (x) {\n"
9247 "default:\n"
9248 " break;\n"
9249 "}",
9250 Space);
9251 verifyFormat("A::A () : a (1) {}", Space);
9252 verifyFormat("void f () __attribute__ ((asdf));", Space);
9253 verifyFormat("*(&a + 1);\n"
9254 "&((&a)[1]);\n"
9255 "a[(b + c) * d];\n"
9256 "(((a + 1) * 2) + 3) * 4;",
9257 Space);
9258 verifyFormat("#define A(x) x", Space);
9259 verifyFormat("#define A (x) x", Space);
9260 verifyFormat("#if defined(x)\n"
9261 "#endif",
9262 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00009263 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00009264 verifyFormat("size_t x = sizeof (x);", Space);
9265 verifyFormat("auto f (int x) -> decltype (x);", Space);
9266 verifyFormat("int f (T x) noexcept (x.create ());", Space);
9267 verifyFormat("alignas (128) char a[128];", Space);
9268 verifyFormat("size_t x = alignof (MyType);", Space);
9269 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
9270 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00009271 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00009272 verifyFormat("T A::operator() ();", Space);
9273 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009274}
9275
9276TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
9277 FormatStyle Spaces = getLLVMStyle();
9278
9279 Spaces.SpacesInParentheses = true;
Daniel Jasperd5e9ff42018-03-22 14:30:28 +00009280 verifyFormat("do_something( ::globalVar );", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009281 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009282 verifyFormat("call();", Spaces);
9283 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00009284 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
9285 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009286 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009287 " continue;",
9288 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009289 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009290 " continue;",
9291 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009292 verifyFormat("if ( true )\n"
9293 " f();\n"
9294 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009295 " f();",
9296 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009297 verifyFormat("do {\n"
9298 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009299 "} while ( something() );",
9300 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009301 verifyFormat("switch ( x ) {\n"
9302 "default:\n"
9303 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009304 "}",
9305 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009306
9307 Spaces.SpacesInParentheses = false;
9308 Spaces.SpacesInCStyleCastParentheses = true;
9309 verifyFormat("Type *A = ( Type * )P;", Spaces);
9310 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
9311 verifyFormat("x = ( int32 )y;", Spaces);
9312 verifyFormat("int a = ( int )(2.0f);", Spaces);
9313 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
9314 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
9315 verifyFormat("#define x (( int )-1)", Spaces);
9316
Daniel Jasper92e09822015-03-18 12:59:19 +00009317 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00009318 Spaces.SpacesInParentheses = false;
9319 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009320 Spaces.SpacesInCStyleCastParentheses = true;
9321 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009322 verifyFormat("call( );", Spaces);
9323 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009324 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009325 " continue;",
9326 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009327 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009328 " continue;",
9329 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009330 verifyFormat("if (true)\n"
9331 " f( );\n"
9332 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009333 " f( );",
9334 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009335 verifyFormat("do {\n"
9336 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009337 "} while (something( ));",
9338 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009339 verifyFormat("switch (x) {\n"
9340 "default:\n"
9341 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009342 "}",
9343 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009344
Daniel Jasper92e09822015-03-18 12:59:19 +00009345 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009346 Spaces.SpaceAfterCStyleCast = true;
9347 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009348 verifyFormat("call( );", Spaces);
9349 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009350 verifyFormat("while (( bool ) 1)\n"
9351 " continue;",
9352 Spaces);
9353 verifyFormat("for (;;)\n"
9354 " continue;",
9355 Spaces);
9356 verifyFormat("if (true)\n"
9357 " f( );\n"
9358 "else if (true)\n"
9359 " f( );",
9360 Spaces);
9361 verifyFormat("do {\n"
9362 " do_something(( int ) i);\n"
9363 "} while (something( ));",
9364 Spaces);
9365 verifyFormat("switch (x) {\n"
9366 "default:\n"
9367 " break;\n"
9368 "}",
9369 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009370
9371 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009372 Spaces.SpacesInCStyleCastParentheses = false;
9373 Spaces.SpaceAfterCStyleCast = true;
9374 verifyFormat("while ((bool) 1)\n"
9375 " continue;",
9376 Spaces);
9377 verifyFormat("do {\n"
9378 " do_something((int) i);\n"
9379 "} while (something( ));",
9380 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009381}
9382
Daniel Jasperad981f82014-08-26 11:41:14 +00009383TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9384 verifyFormat("int a[5];");
9385 verifyFormat("a[3] += 42;");
9386
9387 FormatStyle Spaces = getLLVMStyle();
9388 Spaces.SpacesInSquareBrackets = true;
9389 // Lambdas unchanged.
9390 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9391 verifyFormat("return [i, args...] {};", Spaces);
9392
9393 // Not lambdas.
9394 verifyFormat("int a[ 5 ];", Spaces);
9395 verifyFormat("a[ 3 ] += 42;", Spaces);
9396 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9397 verifyFormat("double &operator[](int i) { return 0; }\n"
9398 "int i;",
9399 Spaces);
9400 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9401 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9402 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9403}
9404
Daniel Jasperd94bff32013-09-25 15:15:02 +00009405TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9406 verifyFormat("int a = 5;");
9407 verifyFormat("a += 42;");
9408 verifyFormat("a or_eq 8;");
9409
9410 FormatStyle Spaces = getLLVMStyle();
9411 Spaces.SpaceBeforeAssignmentOperators = false;
9412 verifyFormat("int a= 5;", Spaces);
9413 verifyFormat("a+= 42;", Spaces);
9414 verifyFormat("a or_eq 8;", Spaces);
9415}
9416
Francois Ferrand2a9ea782018-03-01 10:09:13 +00009417TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
9418 verifyFormat("class Foo : public Bar {};");
9419 verifyFormat("Foo::Foo() : foo(1) {}");
9420 verifyFormat("for (auto a : b) {\n}");
9421 verifyFormat("int x = a ? b : c;");
9422 verifyFormat("{\n"
9423 "label0:\n"
9424 " int x = 0;\n"
9425 "}");
9426 verifyFormat("switch (x) {\n"
9427 "case 1:\n"
9428 "default:\n"
9429 "}");
9430
9431 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
9432 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
9433 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
9434 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
9435 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
9436 verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
9437 verifyFormat("{\n"
9438 "label1:\n"
9439 " int x = 0;\n"
9440 "}",
9441 CtorInitializerStyle);
9442 verifyFormat("switch (x) {\n"
9443 "case 1:\n"
9444 "default:\n"
9445 "}",
9446 CtorInitializerStyle);
9447 CtorInitializerStyle.BreakConstructorInitializers =
9448 FormatStyle::BCIS_AfterColon;
9449 verifyFormat("Fooooooooooo::Fooooooooooo():\n"
9450 " aaaaaaaaaaaaaaaa(1),\n"
9451 " bbbbbbbbbbbbbbbb(2) {}",
9452 CtorInitializerStyle);
9453 CtorInitializerStyle.BreakConstructorInitializers =
9454 FormatStyle::BCIS_BeforeComma;
9455 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9456 " : aaaaaaaaaaaaaaaa(1)\n"
9457 " , bbbbbbbbbbbbbbbb(2) {}",
9458 CtorInitializerStyle);
9459 CtorInitializerStyle.BreakConstructorInitializers =
9460 FormatStyle::BCIS_BeforeColon;
9461 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9462 " : aaaaaaaaaaaaaaaa(1),\n"
9463 " bbbbbbbbbbbbbbbb(2) {}",
9464 CtorInitializerStyle);
9465 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
9466 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9467 ": aaaaaaaaaaaaaaaa(1),\n"
9468 " bbbbbbbbbbbbbbbb(2) {}",
9469 CtorInitializerStyle);
9470
Francois Ferrand6bb103f2018-06-11 14:41:26 +00009471 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30);
Francois Ferrand2a9ea782018-03-01 10:09:13 +00009472 InheritanceStyle.SpaceBeforeInheritanceColon = false;
9473 verifyFormat("class Foo: public Bar {};", InheritanceStyle);
9474 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
9475 verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
9476 verifyFormat("int x = a ? b : c;", InheritanceStyle);
9477 verifyFormat("{\n"
9478 "label2:\n"
9479 " int x = 0;\n"
9480 "}",
9481 InheritanceStyle);
9482 verifyFormat("switch (x) {\n"
9483 "case 1:\n"
9484 "default:\n"
9485 "}",
9486 InheritanceStyle);
Francois Ferrand6bb103f2018-06-11 14:41:26 +00009487 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon;
9488 verifyFormat("class Foooooooooooooooooooooo:\n"
9489 " public aaaaaaaaaaaaaaaaaa,\n"
9490 " public bbbbbbbbbbbbbbbbbb {\n"
9491 "}",
9492 InheritanceStyle);
9493 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
9494 verifyFormat("class Foooooooooooooooooooooo\n"
9495 " : public aaaaaaaaaaaaaaaaaa\n"
9496 " , public bbbbbbbbbbbbbbbbbb {\n"
9497 "}",
9498 InheritanceStyle);
9499 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
9500 verifyFormat("class Foooooooooooooooooooooo\n"
9501 " : public aaaaaaaaaaaaaaaaaa,\n"
9502 " public bbbbbbbbbbbbbbbbbb {\n"
9503 "}",
9504 InheritanceStyle);
9505 InheritanceStyle.ConstructorInitializerIndentWidth = 0;
9506 verifyFormat("class Foooooooooooooooooooooo\n"
9507 ": public aaaaaaaaaaaaaaaaaa,\n"
9508 " public bbbbbbbbbbbbbbbbbb {}",
9509 InheritanceStyle);
Francois Ferrand2a9ea782018-03-01 10:09:13 +00009510
9511 FormatStyle ForLoopStyle = getLLVMStyle();
9512 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
9513 verifyFormat("class Foo : public Bar {};", ForLoopStyle);
9514 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
9515 verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
9516 verifyFormat("int x = a ? b : c;", ForLoopStyle);
9517 verifyFormat("{\n"
9518 "label2:\n"
9519 " int x = 0;\n"
9520 "}",
9521 ForLoopStyle);
9522 verifyFormat("switch (x) {\n"
9523 "case 1:\n"
9524 "default:\n"
9525 "}",
9526 ForLoopStyle);
9527
9528 FormatStyle NoSpaceStyle = getLLVMStyle();
9529 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
9530 NoSpaceStyle.SpaceBeforeInheritanceColon = false;
9531 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
9532 verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
9533 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
9534 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
9535 verifyFormat("int x = a ? b : c;", NoSpaceStyle);
9536 verifyFormat("{\n"
9537 "label3:\n"
9538 " int x = 0;\n"
9539 "}",
9540 NoSpaceStyle);
9541 verifyFormat("switch (x) {\n"
9542 "case 1:\n"
9543 "default:\n"
9544 "}",
9545 NoSpaceStyle);
9546}
9547
Daniel Jaspera44991332015-04-29 13:06:49 +00009548TEST_F(FormatTest, AlignConsecutiveAssignments) {
9549 FormatStyle Alignment = getLLVMStyle();
9550 Alignment.AlignConsecutiveAssignments = false;
9551 verifyFormat("int a = 5;\n"
9552 "int oneTwoThree = 123;",
9553 Alignment);
9554 verifyFormat("int a = 5;\n"
9555 "int oneTwoThree = 123;",
9556 Alignment);
9557
9558 Alignment.AlignConsecutiveAssignments = true;
9559 verifyFormat("int a = 5;\n"
9560 "int oneTwoThree = 123;",
9561 Alignment);
9562 verifyFormat("int a = method();\n"
9563 "int oneTwoThree = 133;",
9564 Alignment);
9565 verifyFormat("a &= 5;\n"
9566 "bcd *= 5;\n"
9567 "ghtyf += 5;\n"
9568 "dvfvdb -= 5;\n"
9569 "a /= 5;\n"
9570 "vdsvsv %= 5;\n"
9571 "sfdbddfbdfbb ^= 5;\n"
9572 "dvsdsv |= 5;\n"
9573 "int dsvvdvsdvvv = 123;",
9574 Alignment);
9575 verifyFormat("int i = 1, j = 10;\n"
9576 "something = 2000;",
9577 Alignment);
9578 verifyFormat("something = 2000;\n"
9579 "int i = 1, j = 10;\n",
9580 Alignment);
9581 verifyFormat("something = 2000;\n"
9582 "another = 911;\n"
9583 "int i = 1, j = 10;\n"
9584 "oneMore = 1;\n"
9585 "i = 2;",
9586 Alignment);
9587 verifyFormat("int a = 5;\n"
9588 "int one = 1;\n"
9589 "method();\n"
9590 "int oneTwoThree = 123;\n"
9591 "int oneTwo = 12;",
9592 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009593 verifyFormat("int oneTwoThree = 123;\n"
9594 "int oneTwo = 12;\n"
9595 "method();\n",
9596 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009597 verifyFormat("int oneTwoThree = 123; // comment\n"
9598 "int oneTwo = 12; // comment",
9599 Alignment);
9600 EXPECT_EQ("int a = 5;\n"
9601 "\n"
9602 "int oneTwoThree = 123;",
9603 format("int a = 5;\n"
9604 "\n"
9605 "int oneTwoThree= 123;",
9606 Alignment));
9607 EXPECT_EQ("int a = 5;\n"
9608 "int one = 1;\n"
9609 "\n"
9610 "int oneTwoThree = 123;",
9611 format("int a = 5;\n"
9612 "int one = 1;\n"
9613 "\n"
9614 "int oneTwoThree = 123;",
9615 Alignment));
9616 EXPECT_EQ("int a = 5;\n"
9617 "int one = 1;\n"
9618 "\n"
9619 "int oneTwoThree = 123;\n"
9620 "int oneTwo = 12;",
9621 format("int a = 5;\n"
9622 "int one = 1;\n"
9623 "\n"
9624 "int oneTwoThree = 123;\n"
9625 "int oneTwo = 12;",
9626 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009627 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9628 verifyFormat("#define A \\\n"
9629 " int aaaa = 12; \\\n"
9630 " int b = 23; \\\n"
9631 " int ccc = 234; \\\n"
9632 " int dddddddddd = 2345;",
9633 Alignment);
9634 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00009635 verifyFormat("#define A \\\n"
9636 " int aaaa = 12; \\\n"
9637 " int b = 23; \\\n"
9638 " int ccc = 234; \\\n"
9639 " int dddddddddd = 2345;",
9640 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009641 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00009642 verifyFormat("#define A "
9643 " \\\n"
9644 " int aaaa = 12; "
9645 " \\\n"
9646 " int b = 23; "
9647 " \\\n"
9648 " int ccc = 234; "
9649 " \\\n"
9650 " int dddddddddd = 2345;",
9651 Alignment);
9652 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9653 "k = 4, int l = 5,\n"
9654 " int m = 6) {\n"
9655 " int j = 10;\n"
9656 " otherThing = 1;\n"
9657 "}",
9658 Alignment);
9659 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9660 " int i = 1;\n"
9661 " int j = 2;\n"
9662 " int big = 10000;\n"
9663 "}",
9664 Alignment);
9665 verifyFormat("class C {\n"
9666 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009667 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009668 " virtual void f() = 0;\n"
9669 "};",
9670 Alignment);
9671 verifyFormat("int i = 1;\n"
9672 "if (SomeType t = getSomething()) {\n"
9673 "}\n"
9674 "int j = 2;\n"
9675 "int big = 10000;",
9676 Alignment);
9677 verifyFormat("int j = 7;\n"
9678 "for (int k = 0; k < N; ++k) {\n"
9679 "}\n"
9680 "int j = 2;\n"
9681 "int big = 10000;\n"
9682 "}",
9683 Alignment);
9684 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9685 verifyFormat("int i = 1;\n"
9686 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9687 " = someLooooooooooooooooongFunction();\n"
9688 "int j = 2;",
9689 Alignment);
9690 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9691 verifyFormat("int i = 1;\n"
9692 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9693 " someLooooooooooooooooongFunction();\n"
9694 "int j = 2;",
9695 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009696
9697 verifyFormat("auto lambda = []() {\n"
9698 " auto i = 0;\n"
9699 " return 0;\n"
9700 "};\n"
9701 "int i = 0;\n"
9702 "auto v = type{\n"
9703 " i = 1, //\n"
9704 " (i = 2), //\n"
9705 " i = 3 //\n"
9706 "};",
9707 Alignment);
9708
Daniel Jaspera44991332015-04-29 13:06:49 +00009709 verifyFormat(
9710 "int i = 1;\n"
9711 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9712 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009713 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00009714 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009715
9716 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9717 " typename B = very_long_type_name_1,\n"
9718 " typename T_2 = very_long_type_name_2>\n"
9719 "auto foo() {}\n",
9720 Alignment);
9721 verifyFormat("int a, b = 1;\n"
9722 "int c = 2;\n"
9723 "int dd = 3;\n",
9724 Alignment);
9725 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9726 "float b[1][] = {{3.f}};\n",
9727 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009728 verifyFormat("for (int i = 0; i < 1; i++)\n"
9729 " int x = 1;\n",
9730 Alignment);
9731 verifyFormat("for (i = 0; i < 1; i++)\n"
9732 " x = 1;\n"
9733 "y = 1;\n",
9734 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009735}
9736
Daniel Jaspere12597c2015-10-01 10:06:54 +00009737TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9738 FormatStyle Alignment = getLLVMStyle();
9739 Alignment.AlignConsecutiveDeclarations = false;
9740 verifyFormat("float const a = 5;\n"
9741 "int oneTwoThree = 123;",
9742 Alignment);
9743 verifyFormat("int a = 5;\n"
9744 "float const oneTwoThree = 123;",
9745 Alignment);
9746
9747 Alignment.AlignConsecutiveDeclarations = true;
9748 verifyFormat("float const a = 5;\n"
9749 "int oneTwoThree = 123;",
9750 Alignment);
9751 verifyFormat("int a = method();\n"
9752 "float const oneTwoThree = 133;",
9753 Alignment);
9754 verifyFormat("int i = 1, j = 10;\n"
9755 "something = 2000;",
9756 Alignment);
9757 verifyFormat("something = 2000;\n"
9758 "int i = 1, j = 10;\n",
9759 Alignment);
9760 verifyFormat("float something = 2000;\n"
9761 "double another = 911;\n"
9762 "int i = 1, j = 10;\n"
9763 "const int *oneMore = 1;\n"
9764 "unsigned i = 2;",
9765 Alignment);
9766 verifyFormat("float a = 5;\n"
9767 "int one = 1;\n"
9768 "method();\n"
9769 "const double oneTwoThree = 123;\n"
9770 "const unsigned int oneTwo = 12;",
9771 Alignment);
9772 verifyFormat("int oneTwoThree{0}; // comment\n"
9773 "unsigned oneTwo; // comment",
9774 Alignment);
9775 EXPECT_EQ("float const a = 5;\n"
9776 "\n"
9777 "int oneTwoThree = 123;",
9778 format("float const a = 5;\n"
9779 "\n"
9780 "int oneTwoThree= 123;",
9781 Alignment));
9782 EXPECT_EQ("float a = 5;\n"
9783 "int one = 1;\n"
9784 "\n"
9785 "unsigned oneTwoThree = 123;",
9786 format("float a = 5;\n"
9787 "int one = 1;\n"
9788 "\n"
9789 "unsigned oneTwoThree = 123;",
9790 Alignment));
9791 EXPECT_EQ("float a = 5;\n"
9792 "int one = 1;\n"
9793 "\n"
9794 "unsigned oneTwoThree = 123;\n"
9795 "int oneTwo = 12;",
9796 format("float a = 5;\n"
9797 "int one = 1;\n"
9798 "\n"
9799 "unsigned oneTwoThree = 123;\n"
9800 "int oneTwo = 12;",
9801 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009802 // Function prototype alignment
9803 verifyFormat("int a();\n"
9804 "double b();",
9805 Alignment);
9806 verifyFormat("int a(int x);\n"
9807 "double b();",
9808 Alignment);
9809 unsigned OldColumnLimit = Alignment.ColumnLimit;
9810 // We need to set ColumnLimit to zero, in order to stress nested alignments,
9811 // otherwise the function parameters will be re-flowed onto a single line.
9812 Alignment.ColumnLimit = 0;
9813 EXPECT_EQ("int a(int x,\n"
9814 " float y);\n"
9815 "double b(int x,\n"
9816 " double y);",
9817 format("int a(int x,\n"
9818 " float y);\n"
9819 "double b(int x,\n"
9820 " double y);",
9821 Alignment));
9822 // This ensures that function parameters of function declarations are
9823 // correctly indented when their owning functions are indented.
9824 // The failure case here is for 'double y' to not be indented enough.
9825 EXPECT_EQ("double a(int x);\n"
9826 "int b(int y,\n"
9827 " double z);",
9828 format("double a(int x);\n"
9829 "int b(int y,\n"
9830 " double z);",
9831 Alignment));
9832 // Set ColumnLimit low so that we induce wrapping immediately after
9833 // the function name and opening paren.
9834 Alignment.ColumnLimit = 13;
9835 verifyFormat("int function(\n"
9836 " int x,\n"
9837 " bool y);",
9838 Alignment);
9839 Alignment.ColumnLimit = OldColumnLimit;
9840 // Ensure function pointers don't screw up recursive alignment
9841 verifyFormat("int a(int x, void (*fp)(int y));\n"
9842 "double b();",
9843 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009844 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009845 // Ensure recursive alignment is broken by function braces, so that the
9846 // "a = 1" does not align with subsequent assignments inside the function
9847 // body.
9848 verifyFormat("int func(int a = 1) {\n"
9849 " int b = 2;\n"
9850 " int cc = 3;\n"
9851 "}",
9852 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009853 verifyFormat("float something = 2000;\n"
9854 "double another = 911;\n"
9855 "int i = 1, j = 10;\n"
9856 "const int *oneMore = 1;\n"
9857 "unsigned i = 2;",
9858 Alignment);
9859 verifyFormat("int oneTwoThree = {0}; // comment\n"
9860 "unsigned oneTwo = 0; // comment",
9861 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009862 // Make sure that scope is correctly tracked, in the absence of braces
9863 verifyFormat("for (int i = 0; i < n; i++)\n"
9864 " j = i;\n"
9865 "double x = 1;\n",
9866 Alignment);
9867 verifyFormat("if (int i = 0)\n"
9868 " j = i;\n"
9869 "double x = 1;\n",
9870 Alignment);
9871 // Ensure operator[] and operator() are comprehended
9872 verifyFormat("struct test {\n"
9873 " long long int foo();\n"
9874 " int operator[](int a);\n"
9875 " double bar();\n"
9876 "};\n",
9877 Alignment);
9878 verifyFormat("struct test {\n"
9879 " long long int foo();\n"
9880 " int operator()(int a);\n"
9881 " double bar();\n"
9882 "};\n",
9883 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009884 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9885 " int const i = 1;\n"
9886 " int * j = 2;\n"
9887 " int big = 10000;\n"
9888 "\n"
9889 " unsigned oneTwoThree = 123;\n"
9890 " int oneTwo = 12;\n"
9891 " method();\n"
9892 " float k = 2;\n"
9893 " int ll = 10000;\n"
9894 "}",
9895 format("void SomeFunction(int parameter= 0) {\n"
9896 " int const i= 1;\n"
9897 " int *j=2;\n"
9898 " int big = 10000;\n"
9899 "\n"
9900 "unsigned oneTwoThree =123;\n"
9901 "int oneTwo = 12;\n"
9902 " method();\n"
9903 "float k= 2;\n"
9904 "int ll=10000;\n"
9905 "}",
9906 Alignment));
9907 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009908 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9909 verifyFormat("#define A \\\n"
9910 " int aaaa = 12; \\\n"
9911 " float b = 23; \\\n"
9912 " const int ccc = 234; \\\n"
9913 " unsigned dddddddddd = 2345;",
9914 Alignment);
9915 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009916 verifyFormat("#define A \\\n"
9917 " int aaaa = 12; \\\n"
9918 " float b = 23; \\\n"
9919 " const int ccc = 234; \\\n"
9920 " unsigned dddddddddd = 2345;",
9921 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009922 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009923 Alignment.ColumnLimit = 30;
9924 verifyFormat("#define A \\\n"
9925 " int aaaa = 12; \\\n"
9926 " float b = 23; \\\n"
9927 " const int ccc = 234; \\\n"
9928 " int dddddddddd = 2345;",
9929 Alignment);
9930 Alignment.ColumnLimit = 80;
9931 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9932 "k = 4, int l = 5,\n"
9933 " int m = 6) {\n"
9934 " const int j = 10;\n"
9935 " otherThing = 1;\n"
9936 "}",
9937 Alignment);
9938 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9939 " int const i = 1;\n"
9940 " int * j = 2;\n"
9941 " int big = 10000;\n"
9942 "}",
9943 Alignment);
9944 verifyFormat("class C {\n"
9945 "public:\n"
9946 " int i = 1;\n"
9947 " virtual void f() = 0;\n"
9948 "};",
9949 Alignment);
9950 verifyFormat("float i = 1;\n"
9951 "if (SomeType t = getSomething()) {\n"
9952 "}\n"
9953 "const unsigned j = 2;\n"
9954 "int big = 10000;",
9955 Alignment);
9956 verifyFormat("float j = 7;\n"
9957 "for (int k = 0; k < N; ++k) {\n"
9958 "}\n"
9959 "unsigned j = 2;\n"
9960 "int big = 10000;\n"
9961 "}",
9962 Alignment);
9963 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9964 verifyFormat("float i = 1;\n"
9965 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9966 " = someLooooooooooooooooongFunction();\n"
9967 "int j = 2;",
9968 Alignment);
9969 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9970 verifyFormat("int i = 1;\n"
9971 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9972 " someLooooooooooooooooongFunction();\n"
9973 "int j = 2;",
9974 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009975
9976 Alignment.AlignConsecutiveAssignments = true;
9977 verifyFormat("auto lambda = []() {\n"
9978 " auto ii = 0;\n"
9979 " float j = 0;\n"
9980 " return 0;\n"
9981 "};\n"
9982 "int i = 0;\n"
9983 "float i2 = 0;\n"
9984 "auto v = type{\n"
9985 " i = 1, //\n"
9986 " (i = 2), //\n"
9987 " i = 3 //\n"
9988 "};",
9989 Alignment);
9990 Alignment.AlignConsecutiveAssignments = false;
9991
Daniel Jaspere12597c2015-10-01 10:06:54 +00009992 verifyFormat(
9993 "int i = 1;\n"
9994 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9995 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009996 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00009997 Alignment);
9998
9999 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
10000 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +000010001 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +000010002 // happens.
10003 Alignment.AlignConsecutiveAssignments = true;
10004 Alignment.ColumnLimit = 30;
10005 verifyFormat("float ii = 1;\n"
10006 "unsigned j = 2;\n"
10007 "int someVerylongVariable = 1;\n"
10008 "AnotherLongType ll = 123456;\n"
10009 "VeryVeryLongType k = 2;\n"
10010 "int myvar = 1;",
10011 Alignment);
10012 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +000010013 Alignment.AlignConsecutiveAssignments = false;
10014
10015 verifyFormat(
10016 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
10017 " typename LongType, typename B>\n"
10018 "auto foo() {}\n",
10019 Alignment);
10020 verifyFormat("float a, b = 1;\n"
10021 "int c = 2;\n"
10022 "int dd = 3;\n",
10023 Alignment);
10024 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
10025 "float b[1][] = {{3.f}};\n",
10026 Alignment);
10027 Alignment.AlignConsecutiveAssignments = true;
10028 verifyFormat("float a, b = 1;\n"
10029 "int c = 2;\n"
10030 "int dd = 3;\n",
10031 Alignment);
10032 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
10033 "float b[1][] = {{3.f}};\n",
10034 Alignment);
10035 Alignment.AlignConsecutiveAssignments = false;
10036
10037 Alignment.ColumnLimit = 30;
10038 Alignment.BinPackParameters = false;
10039 verifyFormat("void foo(float a,\n"
10040 " float b,\n"
10041 " int c,\n"
10042 " uint32_t *d) {\n"
10043 " int * e = 0;\n"
10044 " float f = 0;\n"
10045 " double g = 0;\n"
10046 "}\n"
10047 "void bar(ino_t a,\n"
10048 " int b,\n"
10049 " uint32_t *c,\n"
10050 " bool d) {}\n",
10051 Alignment);
10052 Alignment.BinPackParameters = true;
10053 Alignment.ColumnLimit = 80;
Daniel Jasper4917af62017-08-25 19:14:53 +000010054
10055 // Bug 33507
10056 Alignment.PointerAlignment = FormatStyle::PAS_Middle;
10057 verifyFormat(
10058 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
10059 " static const Version verVs2017;\n"
10060 " return true;\n"
10061 "});\n",
10062 Alignment);
10063 Alignment.PointerAlignment = FormatStyle::PAS_Right;
Ilya Biryukovf16a6fa2018-08-01 15:32:56 +000010064
10065 // See llvm.org/PR35641
10066 Alignment.AlignConsecutiveDeclarations = true;
10067 verifyFormat("int func() { //\n"
10068 " int b;\n"
10069 " unsigned c;\n"
10070 "}",
10071 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010072}
10073
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010074TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010075 FormatStyle LinuxBraceStyle = getLLVMStyle();
10076 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010077 verifyFormat("namespace a\n"
10078 "{\n"
10079 "class A\n"
10080 "{\n"
10081 " void f()\n"
10082 " {\n"
10083 " if (true) {\n"
10084 " a();\n"
10085 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +000010086 " } else {\n"
10087 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010088 " }\n"
10089 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +000010090 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010091 "};\n"
10092 "struct B {\n"
10093 " int x;\n"
10094 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010095 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010096 LinuxBraceStyle);
10097 verifyFormat("enum X {\n"
10098 " Y = 0,\n"
10099 "}\n",
10100 LinuxBraceStyle);
10101 verifyFormat("struct S {\n"
10102 " int Type;\n"
10103 " union {\n"
10104 " int x;\n"
10105 " double y;\n"
10106 " } Value;\n"
10107 " class C\n"
10108 " {\n"
10109 " MyFavoriteType Value;\n"
10110 " } Class;\n"
10111 "}\n",
10112 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010113}
10114
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010115TEST_F(FormatTest, MozillaBraceBreaking) {
10116 FormatStyle MozillaBraceStyle = getLLVMStyle();
10117 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +000010118 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010119 verifyFormat("namespace a {\n"
10120 "class A\n"
10121 "{\n"
10122 " void f()\n"
10123 " {\n"
10124 " if (true) {\n"
10125 " a();\n"
10126 " b();\n"
10127 " }\n"
10128 " }\n"
10129 " void g() { return; }\n"
10130 "};\n"
10131 "enum E\n"
10132 "{\n"
10133 " A,\n"
10134 " // foo\n"
10135 " B,\n"
10136 " C\n"
10137 "};\n"
10138 "struct B\n"
10139 "{\n"
10140 " int x;\n"
10141 "};\n"
10142 "}\n",
10143 MozillaBraceStyle);
10144 verifyFormat("struct S\n"
10145 "{\n"
10146 " int Type;\n"
10147 " union\n"
10148 " {\n"
10149 " int x;\n"
10150 " double y;\n"
10151 " } Value;\n"
10152 " class C\n"
10153 " {\n"
10154 " MyFavoriteType Value;\n"
10155 " } Class;\n"
10156 "}\n",
10157 MozillaBraceStyle);
10158}
10159
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010160TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010161 FormatStyle StroustrupBraceStyle = getLLVMStyle();
10162 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010163 verifyFormat("namespace a {\n"
10164 "class A {\n"
10165 " void f()\n"
10166 " {\n"
10167 " if (true) {\n"
10168 " a();\n"
10169 " b();\n"
10170 " }\n"
10171 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +000010172 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010173 "};\n"
10174 "struct B {\n"
10175 " int x;\n"
10176 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +000010177 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010178 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010179
Daniel Jasperd9670872014-08-05 12:06:20 +000010180 verifyFormat("void foo()\n"
10181 "{\n"
10182 " if (a) {\n"
10183 " a();\n"
10184 " }\n"
10185 " else {\n"
10186 " b();\n"
10187 " }\n"
10188 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010189 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +000010190
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010191 verifyFormat("#ifdef _DEBUG\n"
10192 "int foo(int i = 0)\n"
10193 "#else\n"
10194 "int foo(int i = 5)\n"
10195 "#endif\n"
10196 "{\n"
10197 " return i;\n"
10198 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010199 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010200
10201 verifyFormat("void foo() {}\n"
10202 "void bar()\n"
10203 "#ifdef _DEBUG\n"
10204 "{\n"
10205 " foo();\n"
10206 "}\n"
10207 "#else\n"
10208 "{\n"
10209 "}\n"
10210 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010211 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010212
10213 verifyFormat("void foobar() { int i = 5; }\n"
10214 "#ifdef _DEBUG\n"
10215 "void bar() {}\n"
10216 "#else\n"
10217 "void bar() { foobar(); }\n"
10218 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010219 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010220}
10221
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010222TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010223 FormatStyle AllmanBraceStyle = getLLVMStyle();
10224 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010225
10226 EXPECT_EQ("namespace a\n"
10227 "{\n"
10228 "void f();\n"
10229 "void g();\n"
10230 "} // namespace a\n",
10231 format("namespace a\n"
10232 "{\n"
10233 "void f();\n"
10234 "void g();\n"
10235 "}\n",
10236 AllmanBraceStyle));
10237
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010238 verifyFormat("namespace a\n"
10239 "{\n"
10240 "class A\n"
10241 "{\n"
10242 " void f()\n"
10243 " {\n"
10244 " if (true)\n"
10245 " {\n"
10246 " a();\n"
10247 " b();\n"
10248 " }\n"
10249 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +000010250 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010251 "};\n"
10252 "struct B\n"
10253 "{\n"
10254 " int x;\n"
10255 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010256 "} // namespace a",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010257 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010258
10259 verifyFormat("void f()\n"
10260 "{\n"
10261 " if (true)\n"
10262 " {\n"
10263 " a();\n"
10264 " }\n"
10265 " else if (false)\n"
10266 " {\n"
10267 " b();\n"
10268 " }\n"
10269 " else\n"
10270 " {\n"
10271 " c();\n"
10272 " }\n"
10273 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010274 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010275
10276 verifyFormat("void f()\n"
10277 "{\n"
10278 " for (int i = 0; i < 10; ++i)\n"
10279 " {\n"
10280 " a();\n"
10281 " }\n"
10282 " while (false)\n"
10283 " {\n"
10284 " b();\n"
10285 " }\n"
10286 " do\n"
10287 " {\n"
10288 " c();\n"
10289 " } while (false)\n"
10290 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010291 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010292
10293 verifyFormat("void f(int a)\n"
10294 "{\n"
10295 " switch (a)\n"
10296 " {\n"
10297 " case 0:\n"
10298 " break;\n"
10299 " case 1:\n"
10300 " {\n"
10301 " break;\n"
10302 " }\n"
10303 " case 2:\n"
10304 " {\n"
10305 " }\n"
10306 " break;\n"
10307 " default:\n"
10308 " break;\n"
10309 " }\n"
10310 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010311 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +000010312
10313 verifyFormat("enum X\n"
10314 "{\n"
10315 " Y = 0,\n"
10316 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010317 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +000010318 verifyFormat("enum X\n"
10319 "{\n"
10320 " Y = 0\n"
10321 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010322 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +000010323
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010324 verifyFormat("@interface BSApplicationController ()\n"
10325 "{\n"
10326 "@private\n"
10327 " id _extraIvar;\n"
10328 "}\n"
10329 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010330 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010331
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010332 verifyFormat("#ifdef _DEBUG\n"
10333 "int foo(int i = 0)\n"
10334 "#else\n"
10335 "int foo(int i = 5)\n"
10336 "#endif\n"
10337 "{\n"
10338 " return i;\n"
10339 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010340 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010341
10342 verifyFormat("void foo() {}\n"
10343 "void bar()\n"
10344 "#ifdef _DEBUG\n"
10345 "{\n"
10346 " foo();\n"
10347 "}\n"
10348 "#else\n"
10349 "{\n"
10350 "}\n"
10351 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010352 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010353
10354 verifyFormat("void foobar() { int i = 5; }\n"
10355 "#ifdef _DEBUG\n"
10356 "void bar() {}\n"
10357 "#else\n"
10358 "void bar() { foobar(); }\n"
10359 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010360 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010361
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010362 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +000010363 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010364 " // ...\n"
10365 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010366 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010367 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +000010368 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010369 " // ...\n"
10370 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010371 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010372 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010373 // .. or dict literals.
10374 verifyFormat("void f()\n"
10375 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +000010376 " // ...\n"
10377 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
10378 "}",
10379 AllmanBraceStyle);
10380 verifyFormat("void f()\n"
10381 "{\n"
10382 " // ...\n"
10383 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010384 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010385 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +000010386 verifyFormat("int f()\n"
10387 "{ // comment\n"
10388 " return 42;\n"
10389 "}",
10390 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +000010391
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010392 AllmanBraceStyle.ColumnLimit = 19;
10393 verifyFormat("void f() { int i; }", AllmanBraceStyle);
10394 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +000010395 verifyFormat("void f()\n"
10396 "{\n"
10397 " int i;\n"
10398 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010399 AllmanBraceStyle);
10400 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +000010401
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010402 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +000010403 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
10404 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
10405 verifyFormat("void f(bool b)\n"
10406 "{\n"
10407 " if (b)\n"
10408 " {\n"
10409 " return;\n"
10410 " }\n"
10411 "}\n",
10412 BreakBeforeBraceShortIfs);
10413 verifyFormat("void f(bool b)\n"
10414 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000010415 " if constexpr (b)\n"
10416 " {\n"
10417 " return;\n"
10418 " }\n"
10419 "}\n",
10420 BreakBeforeBraceShortIfs);
10421 verifyFormat("void f(bool b)\n"
10422 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +000010423 " if (b) return;\n"
10424 "}\n",
10425 BreakBeforeBraceShortIfs);
10426 verifyFormat("void f(bool b)\n"
10427 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000010428 " if constexpr (b) return;\n"
10429 "}\n",
10430 BreakBeforeBraceShortIfs);
10431 verifyFormat("void f(bool b)\n"
10432 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +000010433 " while (b)\n"
10434 " {\n"
10435 " return;\n"
10436 " }\n"
10437 "}\n",
10438 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010439}
10440
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010441TEST_F(FormatTest, GNUBraceBreaking) {
10442 FormatStyle GNUBraceStyle = getLLVMStyle();
10443 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
10444 verifyFormat("namespace a\n"
10445 "{\n"
10446 "class A\n"
10447 "{\n"
10448 " void f()\n"
10449 " {\n"
10450 " int a;\n"
10451 " {\n"
10452 " int b;\n"
10453 " }\n"
10454 " if (true)\n"
10455 " {\n"
10456 " a();\n"
10457 " b();\n"
10458 " }\n"
10459 " }\n"
10460 " void g() { return; }\n"
10461 "}\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010462 "} // namespace a",
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010463 GNUBraceStyle);
10464
10465 verifyFormat("void f()\n"
10466 "{\n"
10467 " if (true)\n"
10468 " {\n"
10469 " a();\n"
10470 " }\n"
10471 " else if (false)\n"
10472 " {\n"
10473 " b();\n"
10474 " }\n"
10475 " else\n"
10476 " {\n"
10477 " c();\n"
10478 " }\n"
10479 "}\n",
10480 GNUBraceStyle);
10481
10482 verifyFormat("void f()\n"
10483 "{\n"
10484 " for (int i = 0; i < 10; ++i)\n"
10485 " {\n"
10486 " a();\n"
10487 " }\n"
10488 " while (false)\n"
10489 " {\n"
10490 " b();\n"
10491 " }\n"
10492 " do\n"
10493 " {\n"
10494 " c();\n"
10495 " }\n"
10496 " while (false);\n"
10497 "}\n",
10498 GNUBraceStyle);
10499
10500 verifyFormat("void f(int a)\n"
10501 "{\n"
10502 " switch (a)\n"
10503 " {\n"
10504 " case 0:\n"
10505 " break;\n"
10506 " case 1:\n"
10507 " {\n"
10508 " break;\n"
10509 " }\n"
10510 " case 2:\n"
10511 " {\n"
10512 " }\n"
10513 " break;\n"
10514 " default:\n"
10515 " break;\n"
10516 " }\n"
10517 "}\n",
10518 GNUBraceStyle);
10519
10520 verifyFormat("enum X\n"
10521 "{\n"
10522 " Y = 0,\n"
10523 "}\n",
10524 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010525
10526 verifyFormat("@interface BSApplicationController ()\n"
10527 "{\n"
10528 "@private\n"
10529 " id _extraIvar;\n"
10530 "}\n"
10531 "@end\n",
10532 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010533
10534 verifyFormat("#ifdef _DEBUG\n"
10535 "int foo(int i = 0)\n"
10536 "#else\n"
10537 "int foo(int i = 5)\n"
10538 "#endif\n"
10539 "{\n"
10540 " return i;\n"
10541 "}",
10542 GNUBraceStyle);
10543
10544 verifyFormat("void foo() {}\n"
10545 "void bar()\n"
10546 "#ifdef _DEBUG\n"
10547 "{\n"
10548 " foo();\n"
10549 "}\n"
10550 "#else\n"
10551 "{\n"
10552 "}\n"
10553 "#endif",
10554 GNUBraceStyle);
10555
10556 verifyFormat("void foobar() { int i = 5; }\n"
10557 "#ifdef _DEBUG\n"
10558 "void bar() {}\n"
10559 "#else\n"
10560 "void bar() { foobar(); }\n"
10561 "#endif",
10562 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010563}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010564
10565TEST_F(FormatTest, WebKitBraceBreaking) {
10566 FormatStyle WebKitBraceStyle = getLLVMStyle();
10567 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +000010568 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010569 verifyFormat("namespace a {\n"
10570 "class A {\n"
10571 " void f()\n"
10572 " {\n"
10573 " if (true) {\n"
10574 " a();\n"
10575 " b();\n"
10576 " }\n"
10577 " }\n"
10578 " void g() { return; }\n"
10579 "};\n"
10580 "enum E {\n"
10581 " A,\n"
10582 " // foo\n"
10583 " B,\n"
10584 " C\n"
10585 "};\n"
10586 "struct B {\n"
10587 " int x;\n"
10588 "};\n"
10589 "}\n",
10590 WebKitBraceStyle);
10591 verifyFormat("struct S {\n"
10592 " int Type;\n"
10593 " union {\n"
10594 " int x;\n"
10595 " double y;\n"
10596 " } Value;\n"
10597 " class C {\n"
10598 " MyFavoriteType Value;\n"
10599 " } Class;\n"
10600 "};\n",
10601 WebKitBraceStyle);
10602}
10603
Manuel Klimekd5735502013-08-12 03:51:17 +000010604TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10605 verifyFormat("void f() {\n"
10606 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010607 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010608 " }\n"
10609 "}\n",
10610 getLLVMStyle());
10611}
10612
Daniel Jasper9613c812013-08-07 16:29:23 +000010613TEST_F(FormatTest, UnderstandsPragmas) {
10614 verifyFormat("#pragma omp reduction(| : var)");
10615 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010616
10617 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10618 "(including parentheses).",
10619 format("#pragma mark Any non-hyphenated or hyphenated string "
10620 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010621}
10622
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010623TEST_F(FormatTest, UnderstandPragmaOption) {
10624 verifyFormat("#pragma option -C -A");
10625
10626 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10627}
10628
Manuel Klimek77866142017-11-17 11:17:15 +000010629TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
10630 FormatStyle Style = getLLVMStyle();
10631 Style.ColumnLimit = 20;
10632
10633 verifyFormat("int a; // the\n"
10634 " // comment", Style);
10635 EXPECT_EQ("int a; /* first line\n"
10636 " * second\n"
10637 " * line third\n"
10638 " * line\n"
10639 " */",
10640 format("int a; /* first line\n"
10641 " * second\n"
10642 " * line third\n"
10643 " * line\n"
10644 " */",
10645 Style));
10646 EXPECT_EQ("int a; // first line\n"
10647 " // second\n"
10648 " // line third\n"
10649 " // line",
10650 format("int a; // first line\n"
10651 " // second line\n"
10652 " // third line",
10653 Style));
10654
10655 Style.PenaltyExcessCharacter = 90;
10656 verifyFormat("int a; // the comment", Style);
Manuel Klimek93699f42017-11-29 14:29:43 +000010657 EXPECT_EQ("int a; // the comment\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010658 " // aaa",
10659 format("int a; // the comment aaa", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010660 EXPECT_EQ("int a; /* first line\n"
10661 " * second line\n"
10662 " * third line\n"
10663 " */",
10664 format("int a; /* first line\n"
10665 " * second line\n"
10666 " * third line\n"
10667 " */",
10668 Style));
Manuel Klimek93699f42017-11-29 14:29:43 +000010669 EXPECT_EQ("int a; // first line\n"
10670 " // second line\n"
10671 " // third line",
10672 format("int a; // first line\n"
10673 " // second line\n"
10674 " // third line",
10675 Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010676 // FIXME: Investigate why this is not getting the same layout as the test
10677 // above.
10678 EXPECT_EQ("int a; /* first line\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010679 " * second line\n"
10680 " * third line\n"
Manuel Klimek77866142017-11-17 11:17:15 +000010681 " */",
10682 format("int a; /* first line second line third line"
10683 "\n*/",
10684 Style));
10685
10686 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010687 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010688 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010689 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010690 Style));
10691 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010692 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010693 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010694 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010695 Style));
10696
10697 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
10698 // next one.
Manuel Klimek93699f42017-11-29 14:29:43 +000010699 EXPECT_EQ("// foo bar baz bazfoo\n"
10700 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010701 format("// foo bar baz bazfoo bar\n"
10702 "// foo bar\n",
10703 Style));
10704
10705 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010706 "// foo bar baz bazfoo\n"
10707 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010708 format("// foo bar baz bazfoo\n"
10709 "// foo bar baz bazfoo bar\n"
10710 "// foo bar\n",
10711 Style));
10712
Manuel Klimek77866142017-11-17 11:17:15 +000010713 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010714 "// foo bar baz bazfoo\n"
10715 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010716 format("// foo bar baz bazfoo\n"
10717 "// foo bar baz bazfoo bar\n"
10718 "// foo bar\n",
10719 Style));
Manuel Klimek0b58c322017-12-01 13:28:08 +000010720
10721 // Make sure we do not keep protruding characters if strict mode reflow is
10722 // cheaper than keeping protruding characters.
10723 Style.ColumnLimit = 21;
10724 EXPECT_EQ("// foo foo foo foo\n"
10725 "// foo foo foo foo\n"
10726 "// foo foo foo foo\n",
10727 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n",
10728 Style));
10729
10730 EXPECT_EQ("int a = /* long block\n"
10731 " comment */\n"
10732 " 42;",
10733 format("int a = /* long block comment */ 42;", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010734}
10735
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010736#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10737 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010738 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10739 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010740
10741TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010742 SmallVector<FormatStyle, 3> Styles;
10743 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010744
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010745 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010746 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10747 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10748 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010749
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010750 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010751 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10752 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10753 EXPECT_ALL_STYLES_EQUAL(Styles);
10754
Nico Weber514ecc82014-02-02 20:50:45 +000010755 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010756 EXPECT_TRUE(
10757 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10758 EXPECT_TRUE(
10759 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10760 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010761
Nico Weber514ecc82014-02-02 20:50:45 +000010762 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010763 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10764 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10765 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010766
10767 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010768 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10769 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10770 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010771
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010772 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010773 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10774 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10775 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010776
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010777 Styles[0] = getGNUStyle();
10778 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10779 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10780 EXPECT_ALL_STYLES_EQUAL(Styles);
10781
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010782 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10783}
10784
10785TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10786 SmallVector<FormatStyle, 8> Styles;
10787 Styles.resize(2);
10788
10789 Styles[0] = getGoogleStyle();
10790 Styles[1] = getLLVMStyle();
10791 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10792 EXPECT_ALL_STYLES_EQUAL(Styles);
10793
10794 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010795 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010796 Styles[1] = getLLVMStyle();
10797 Styles[1].Language = FormatStyle::LK_JavaScript;
10798 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10799
10800 Styles[2] = getLLVMStyle();
10801 Styles[2].Language = FormatStyle::LK_JavaScript;
10802 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10803 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010804 &Styles[2])
10805 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010806
10807 Styles[3] = getLLVMStyle();
10808 Styles[3].Language = FormatStyle::LK_JavaScript;
10809 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10810 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010811 &Styles[3])
10812 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010813
10814 Styles[4] = getLLVMStyle();
10815 Styles[4].Language = FormatStyle::LK_JavaScript;
10816 EXPECT_EQ(0, parseConfiguration("---\n"
10817 "BasedOnStyle: LLVM\n"
10818 "IndentWidth: 123\n"
10819 "---\n"
10820 "BasedOnStyle: Google\n"
10821 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010822 &Styles[4])
10823 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010824 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010825}
10826
Daniel Jasper91881d92014-09-29 08:07:46 +000010827#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010828 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010829 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010830 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010831 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010832 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010833
Daniel Jasper91881d92014-09-29 08:07:46 +000010834#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10835
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010836#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10837 Style.STRUCT.FIELD = false; \
10838 EXPECT_EQ(0, \
10839 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10840 .value()); \
10841 EXPECT_TRUE(Style.STRUCT.FIELD); \
10842 EXPECT_EQ(0, \
10843 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10844 .value()); \
10845 EXPECT_FALSE(Style.STRUCT.FIELD);
10846
10847#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10848 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10849
Daniel Jasper00853002014-09-16 16:22:30 +000010850#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10851 EXPECT_NE(VALUE, Style.FIELD); \
10852 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10853 EXPECT_EQ(VALUE, Style.FIELD)
10854
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010855TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010856 FormatStyle Style = {};
10857 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +000010858 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010859 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010860 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010861 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010862 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010863 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010864 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010865 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010866 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper18210d72014-10-09 09:52:05 +000010867 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010868 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010869 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010870 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010871 CHECK_PARSE_BOOL(BreakStringLiterals);
Francois Ferrande56a8292017-06-14 12:29:47 +000010872 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010873 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010874 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010875 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010876 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010877 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010878 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010879 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010880 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010881 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010882 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010883 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010884 CHECK_PARSE_BOOL(SortIncludes);
Krasimir Georgievac16a202017-06-23 11:46:03 +000010885 CHECK_PARSE_BOOL(SortUsingDeclarations);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010886 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010887 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010888 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010889 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010890 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010891 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010892 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010893 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010894 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Hans Wennborgbfc34062018-06-14 08:01:09 +000010895 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList);
Francois Ferrand2a9ea782018-03-01 10:09:13 +000010896 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
10897 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
10898 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010899
10900 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10901 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10902 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10903 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10904 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10905 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10906 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10907 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
Krasimir Georgievd6ce9372017-09-15 11:23:50 +000010908 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010909 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10910 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10911 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrandad722562017-06-30 20:25:55 +000010912 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
10913 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
10914 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010915}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010916
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010917#undef CHECK_PARSE_BOOL
10918
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010919TEST_F(FormatTest, ParsesConfiguration) {
10920 FormatStyle Style = {};
10921 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010922 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010923 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10924 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010925 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010926 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10927 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +000010928 CHECK_PARSE("PenaltyBreakAssignment: 1234",
10929 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010930 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10931 PenaltyBreakBeforeFirstCallParameter, 1234u);
Francois Ferrand58e6fe52018-05-16 08:25:03 +000010932 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234",
10933 PenaltyBreakTemplateDeclaration, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010934 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10935 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10936 PenaltyReturnTypeOnItsOwnLine, 1234u);
10937 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10938 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010939 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010940 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010941 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010942
Daniel Jasper553d4872014-06-17 12:40:34 +000010943 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010944 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10945 FormatStyle::PAS_Left);
10946 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10947 FormatStyle::PAS_Right);
10948 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10949 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010950 // For backward compatibility:
10951 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10952 FormatStyle::PAS_Left);
10953 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10954 FormatStyle::PAS_Right);
10955 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10956 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010957
Alexander Kornienkod6538332013-05-07 15:32:14 +000010958 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010959 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10960 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010961 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10962 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10963 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10964
Daniel Jasperac043c92014-09-15 11:11:00 +000010965 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010966 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10967 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010968 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10969 FormatStyle::BOS_None);
10970 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10971 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010972 // For backward compatibility:
10973 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10974 FormatStyle::BOS_None);
10975 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10976 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010977
Francois Ferranda6b6d512017-05-24 11:36:58 +000010978 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
10979 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
10980 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10981 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
10982 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
10983 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
10984 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
10985 // For backward compatibility:
10986 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
10987 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10988
Francois Ferrand6bb103f2018-06-11 14:41:26 +000010989 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
10990 CHECK_PARSE("BreakInheritanceList: BeforeComma",
10991 BreakInheritanceList, FormatStyle::BILS_BeforeComma);
10992 CHECK_PARSE("BreakInheritanceList: AfterColon",
10993 BreakInheritanceList, FormatStyle::BILS_AfterColon);
10994 CHECK_PARSE("BreakInheritanceList: BeforeColon",
10995 BreakInheritanceList, FormatStyle::BILS_BeforeColon);
10996 // For backward compatibility:
10997 CHECK_PARSE("BreakBeforeInheritanceComma: true",
10998 BreakInheritanceList, FormatStyle::BILS_BeforeComma);
10999
Daniel Jasper6501f7e2015-10-27 12:38:37 +000011000 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
11001 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
11002 FormatStyle::BAS_Align);
11003 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
11004 FormatStyle::BAS_DontAlign);
11005 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
11006 FormatStyle::BAS_AlwaysBreak);
11007 // For backward compatibility:
11008 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
11009 FormatStyle::BAS_DontAlign);
11010 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
11011 FormatStyle::BAS_Align);
11012
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +000011013 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
11014 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
11015 FormatStyle::ENAS_DontAlign);
11016 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
11017 FormatStyle::ENAS_Left);
11018 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
11019 FormatStyle::ENAS_Right);
11020 // For backward compatibility:
11021 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
11022 FormatStyle::ENAS_Left);
11023 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
11024 FormatStyle::ENAS_Right);
11025
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000011026 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000011027 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
11028 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
11029 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000011030 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
11031 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000011032 // For backward compatibility:
11033 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
11034 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000011035
Daniel Jasperd74cf402014-04-08 12:46:38 +000011036 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000011037 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
11038 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
11039 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
11040 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000011041 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
11042 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000011043 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
11044 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000011045 // For backward compatibility:
11046 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
11047 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
11048 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
11049 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000011050
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000011051 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
11052 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
11053 FormatStyle::SBPO_Never);
11054 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
11055 FormatStyle::SBPO_Always);
11056 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
11057 FormatStyle::SBPO_ControlStatements);
11058 // For backward compatibility:
11059 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
11060 FormatStyle::SBPO_Never);
11061 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
11062 FormatStyle::SBPO_ControlStatements);
11063
Alexander Kornienkod6538332013-05-07 15:32:14 +000011064 Style.ColumnLimit = 123;
11065 FormatStyle BaseStyle = getLLVMStyle();
11066 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
11067 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
11068
Manuel Klimeka8eb9142013-05-13 12:51:40 +000011069 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
11070 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
11071 FormatStyle::BS_Attach);
11072 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
11073 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000011074 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
11075 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000011076 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
11077 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000011078 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
11079 FormatStyle::BS_Allman);
11080 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000011081 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
11082 FormatStyle::BS_WebKit);
11083 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
11084 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000011085
Zachary Turner448592e2015-12-18 22:20:15 +000011086 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
11087 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
11088 FormatStyle::RTBS_None);
11089 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
11090 FormatStyle::RTBS_All);
11091 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000011092 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000011093 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
11094 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
11095 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
11096 AlwaysBreakAfterReturnType,
11097 FormatStyle::RTBS_TopLevelDefinitions);
11098
Francois Ferrand58e6fe52018-05-16 08:25:03 +000011099 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
11100 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", AlwaysBreakTemplateDeclarations,
11101 FormatStyle::BTDS_No);
11102 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", AlwaysBreakTemplateDeclarations,
11103 FormatStyle::BTDS_MultiLine);
11104 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", AlwaysBreakTemplateDeclarations,
11105 FormatStyle::BTDS_Yes);
11106 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", AlwaysBreakTemplateDeclarations,
11107 FormatStyle::BTDS_MultiLine);
11108 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", AlwaysBreakTemplateDeclarations,
11109 FormatStyle::BTDS_Yes);
11110
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000011111 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
11112 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
11113 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
11114 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
11115 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
11116 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
11117 AlwaysBreakAfterDefinitionReturnType,
11118 FormatStyle::DRTBS_TopLevel);
11119
Daniel Jasper65ee3472013-07-31 23:16:02 +000011120 Style.NamespaceIndentation = FormatStyle::NI_All;
11121 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
11122 FormatStyle::NI_None);
11123 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
11124 FormatStyle::NI_Inner);
11125 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
11126 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000011127
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000011128 // FIXME: This is required because parsing a configuration simply overwrites
11129 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000011130 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000011131 std::vector<std::string> BoostForeach;
11132 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000011133 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000011134 std::vector<std::string> BoostAndQForeach;
11135 BoostAndQForeach.push_back("BOOST_FOREACH");
11136 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000011137 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
11138 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000011139
Francois Ferrand6f40e212018-10-02 16:37:51 +000011140 Style.StatementMacros.clear();
11141 CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros,
11142 std::vector<std::string>{"QUNUSED"});
11143 CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros,
11144 std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"}));
11145
Eric Liu9d92c022018-05-14 19:51:33 +000011146 Style.IncludeStyle.IncludeCategories.clear();
11147 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = {
11148 {"abc/.*", 2}, {".*", 1}};
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000011149 CHECK_PARSE("IncludeCategories:\n"
11150 " - Regex: abc/.*\n"
11151 " Priority: 2\n"
11152 " - Regex: .*\n"
11153 " Priority: 1",
Eric Liu9d92c022018-05-14 19:51:33 +000011154 IncludeStyle.IncludeCategories, ExpectedCategories);
11155 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex,
11156 "abc$");
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000011157
11158 Style.RawStringFormats.clear();
11159 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011160 {
11161 FormatStyle::LK_TextProto,
11162 {"pb", "proto"},
11163 {"PARSE_TEXT_PROTO"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000011164 /*CanonicalDelimiter=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011165 "llvm",
11166 },
11167 {
11168 FormatStyle::LK_Cpp,
11169 {"cc", "cpp"},
11170 {"C_CODEBLOCK", "CPPEVAL"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000011171 /*CanonicalDelimiter=*/"cc",
11172 /*BasedOnStyle=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011173 },
Krasimir Georgiev4527f132018-01-17 12:24:59 +000011174 };
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000011175
11176 CHECK_PARSE("RawStringFormats:\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000011177 " - Language: TextProto\n"
11178 " Delimiters:\n"
11179 " - 'pb'\n"
11180 " - 'proto'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011181 " EnclosingFunctions:\n"
11182 " - 'PARSE_TEXT_PROTO'\n"
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000011183 " BasedOnStyle: llvm\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000011184 " - Language: Cpp\n"
11185 " Delimiters:\n"
11186 " - 'cc'\n"
11187 " - 'cpp'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011188 " EnclosingFunctions:\n"
11189 " - 'C_CODEBLOCK'\n"
Krasimir Georgiev412ed092018-01-19 16:18:47 +000011190 " - 'CPPEVAL'\n"
11191 " CanonicalDelimiter: 'cc'",
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000011192 RawStringFormats, ExpectedRawStringFormats);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011193}
11194
11195TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
11196 FormatStyle Style = {};
11197 Style.Language = FormatStyle::LK_Cpp;
11198 CHECK_PARSE("Language: Cpp\n"
11199 "IndentWidth: 12",
11200 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000011201 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
11202 "IndentWidth: 34",
11203 &Style),
11204 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011205 EXPECT_EQ(12u, Style.IndentWidth);
11206 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
11207 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
11208
11209 Style.Language = FormatStyle::LK_JavaScript;
11210 CHECK_PARSE("Language: JavaScript\n"
11211 "IndentWidth: 12",
11212 IndentWidth, 12u);
11213 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000011214 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
11215 "IndentWidth: 34",
11216 &Style),
11217 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011218 EXPECT_EQ(23u, Style.IndentWidth);
11219 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
11220 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
11221
11222 CHECK_PARSE("BasedOnStyle: LLVM\n"
11223 "IndentWidth: 67",
11224 IndentWidth, 67u);
11225
11226 CHECK_PARSE("---\n"
11227 "Language: JavaScript\n"
11228 "IndentWidth: 12\n"
11229 "---\n"
11230 "Language: Cpp\n"
11231 "IndentWidth: 34\n"
11232 "...\n",
11233 IndentWidth, 12u);
11234
11235 Style.Language = FormatStyle::LK_Cpp;
11236 CHECK_PARSE("---\n"
11237 "Language: JavaScript\n"
11238 "IndentWidth: 12\n"
11239 "---\n"
11240 "Language: Cpp\n"
11241 "IndentWidth: 34\n"
11242 "...\n",
11243 IndentWidth, 34u);
11244 CHECK_PARSE("---\n"
11245 "IndentWidth: 78\n"
11246 "---\n"
11247 "Language: JavaScript\n"
11248 "IndentWidth: 56\n"
11249 "...\n",
11250 IndentWidth, 78u);
11251
11252 Style.ColumnLimit = 123;
11253 Style.IndentWidth = 234;
11254 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
11255 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000011256 EXPECT_FALSE(parseConfiguration("---\n"
11257 "IndentWidth: 456\n"
11258 "BreakBeforeBraces: Allman\n"
11259 "---\n"
11260 "Language: JavaScript\n"
11261 "IndentWidth: 111\n"
11262 "TabWidth: 111\n"
11263 "---\n"
11264 "Language: Cpp\n"
11265 "BreakBeforeBraces: Stroustrup\n"
11266 "TabWidth: 789\n"
11267 "...\n",
11268 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011269 EXPECT_EQ(123u, Style.ColumnLimit);
11270 EXPECT_EQ(456u, Style.IndentWidth);
11271 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
11272 EXPECT_EQ(789u, Style.TabWidth);
11273
Rafael Espindola1f243172014-06-12 11:35:17 +000011274 EXPECT_EQ(parseConfiguration("---\n"
11275 "Language: JavaScript\n"
11276 "IndentWidth: 56\n"
11277 "---\n"
11278 "IndentWidth: 78\n"
11279 "...\n",
11280 &Style),
11281 ParseError::Error);
11282 EXPECT_EQ(parseConfiguration("---\n"
11283 "Language: JavaScript\n"
11284 "IndentWidth: 56\n"
11285 "---\n"
11286 "Language: JavaScript\n"
11287 "IndentWidth: 78\n"
11288 "...\n",
11289 &Style),
11290 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011291
11292 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
11293}
Daniel Jasper65ee3472013-07-31 23:16:02 +000011294
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011295#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011296
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000011297TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
11298 FormatStyle Style = {};
11299 Style.Language = FormatStyle::LK_JavaScript;
11300 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011301 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000011302 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011303
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000011304 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011305 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000011306 "BasedOnStyle: Google\n"
11307 "---\n"
11308 "Language: JavaScript\n"
11309 "IndentWidth: 76\n"
11310 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011311 &Style)
11312 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000011313 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000011314 EXPECT_EQ(76u, Style.IndentWidth);
11315 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
11316}
11317
Alexander Kornienkod6538332013-05-07 15:32:14 +000011318TEST_F(FormatTest, ConfigurationRoundTripTest) {
11319 FormatStyle Style = getLLVMStyle();
11320 std::string YAML = configurationAsText(Style);
11321 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011322 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000011323 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
11324 EXPECT_EQ(Style, ParsedStyle);
11325}
11326
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011327TEST_F(FormatTest, WorksFor8bitEncodings) {
11328 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
11329 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
11330 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
11331 "\"\xef\xee\xf0\xf3...\"",
11332 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
11333 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
11334 "\xef\xee\xf0\xf3...\"",
11335 getLLVMStyleWithColumns(12)));
11336}
11337
Alexander Kornienko393e3082013-11-13 14:04:17 +000011338TEST_F(FormatTest, HandlesUTF8BOM) {
11339 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
11340 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
11341 format("\xef\xbb\xbf#include <iostream>"));
11342 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
11343 format("\xef\xbb\xbf\n#include <iostream>"));
11344}
11345
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000011346// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
11347#if !defined(_MSC_VER)
11348
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011349TEST_F(FormatTest, CountsUTF8CharactersProperly) {
11350 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
11351 getLLVMStyleWithColumns(35));
11352 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011353 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011354 verifyFormat("// Однажды в студёную зимнюю пору...",
11355 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000011356 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011357 verifyFormat("/* Однажды в студёную зимнюю пору... */",
11358 getLLVMStyleWithColumns(39));
11359 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011360 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011361}
11362
11363TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000011364 // Non-printable characters' width is currently considered to be the length in
11365 // bytes in UTF8. The characters can be displayed in very different manner
11366 // (zero-width, single width with a substitution glyph, expanded to their code
11367 // (e.g. "<8d>"), so there's no single correct way to handle them.
11368 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000011369 "\"\xc2\x8d\";",
11370 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000011371 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000011372 "\"\xc2\x8d\";",
11373 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000011374 EXPECT_EQ("\"Однажды, в \"\n"
11375 "\"студёную \"\n"
11376 "\"зимнюю \"\n"
11377 "\"пору,\"",
11378 format("\"Однажды, в студёную зимнюю пору,\"",
11379 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011380 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000011381 "\"一 二 三 \"\n"
11382 "\"四 五六 \"\n"
11383 "\"七 八 九 \"\n"
11384 "\"十\"",
11385 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Manuel Klimek93699f42017-11-29 14:29:43 +000011386 EXPECT_EQ("\"一\t\"\n"
11387 "\"二 \t\"\n"
11388 "\"三 四 \"\n"
11389 "\"五\t\"\n"
11390 "\"六 \t\"\n"
11391 "\"七 \"\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011392 "\"八九十\tqq\"",
11393 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
11394 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000011395
11396 // UTF8 character in an escape sequence.
11397 EXPECT_EQ("\"aaaaaa\"\n"
11398 "\"\\\xC2\x8D\"",
11399 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011400}
11401
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011402TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
11403 EXPECT_EQ("const char *sssss =\n"
11404 " \"一二三四五六七八\\\n"
11405 " 九 十\";",
11406 format("const char *sssss = \"一二三四五六七八\\\n"
11407 " 九 十\";",
11408 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011409}
11410
11411TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000011412 EXPECT_EQ("// aaaaÄ\xc2\x8d",
11413 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011414 EXPECT_EQ("// Я из лесу\n"
11415 "// вышел; был\n"
11416 "// сильный\n"
11417 "// мороз.",
11418 format("// Я из лесу вышел; был сильный мороз.",
11419 getLLVMStyleWithColumns(13)));
11420 EXPECT_EQ("// 一二三\n"
11421 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011422 "// 八 九\n"
11423 "// 十",
11424 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011425}
11426
11427TEST_F(FormatTest, SplitsUTF8BlockComments) {
11428 EXPECT_EQ("/* Гляжу,\n"
11429 " * поднимается\n"
11430 " * медленно в\n"
11431 " * гору\n"
11432 " * Лошадка,\n"
11433 " * везущая\n"
11434 " * хворосту\n"
11435 " * воз. */",
11436 format("/* Гляжу, поднимается медленно в гору\n"
11437 " * Лошадка, везущая хворосту воз. */",
11438 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011439 EXPECT_EQ(
11440 "/* 一二三\n"
11441 " * 四五六七\n"
11442 " * 八 九\n"
11443 " * 十 */",
11444 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000011445 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
11446 " * 𝕓𝕪𝕥𝕖\n"
11447 " * 𝖀𝕿𝕱-𝟠 */",
11448 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011449}
11450
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011451#endif // _MSC_VER
11452
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011453TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
11454 FormatStyle Style = getLLVMStyle();
11455
11456 Style.ConstructorInitializerIndentWidth = 4;
11457 verifyFormat(
11458 "SomeClass::Constructor()\n"
11459 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11460 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11461 Style);
11462
11463 Style.ConstructorInitializerIndentWidth = 2;
11464 verifyFormat(
11465 "SomeClass::Constructor()\n"
11466 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11467 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11468 Style);
11469
11470 Style.ConstructorInitializerIndentWidth = 0;
11471 verifyFormat(
11472 "SomeClass::Constructor()\n"
11473 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11474 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11475 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000011476 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
11477 verifyFormat(
11478 "SomeLongTemplateVariableName<\n"
11479 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
11480 Style);
11481 verifyFormat(
11482 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
11483 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
11484 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000011485}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011486
Daniel Jasper00853002014-09-16 16:22:30 +000011487TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
11488 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +000011489 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011490 Style.ConstructorInitializerIndentWidth = 4;
11491 verifyFormat("SomeClass::Constructor()\n"
11492 " : a(a)\n"
11493 " , b(b)\n"
11494 " , c(c) {}",
11495 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011496 verifyFormat("SomeClass::Constructor()\n"
11497 " : a(a) {}",
11498 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011499
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011500 Style.ColumnLimit = 0;
11501 verifyFormat("SomeClass::Constructor()\n"
11502 " : a(a) {}",
11503 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000011504 verifyFormat("SomeClass::Constructor() noexcept\n"
11505 " : a(a) {}",
11506 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011507 verifyFormat("SomeClass::Constructor()\n"
11508 " : a(a)\n"
11509 " , b(b)\n"
11510 " , c(c) {}",
11511 Style);
11512 verifyFormat("SomeClass::Constructor()\n"
11513 " : a(a) {\n"
11514 " foo();\n"
11515 " bar();\n"
11516 "}",
11517 Style);
11518
Daniel Jasperd74cf402014-04-08 12:46:38 +000011519 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011520 verifyFormat("SomeClass::Constructor()\n"
11521 " : a(a)\n"
11522 " , b(b)\n"
11523 " , c(c) {\n}",
11524 Style);
11525 verifyFormat("SomeClass::Constructor()\n"
11526 " : a(a) {\n}",
11527 Style);
11528
11529 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000011530 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011531 Style.ConstructorInitializerIndentWidth = 2;
11532 verifyFormat("SomeClass::Constructor()\n"
11533 " : a(a)\n"
11534 " , b(b)\n"
11535 " , c(c) {}",
11536 Style);
11537
11538 Style.ConstructorInitializerIndentWidth = 0;
11539 verifyFormat("SomeClass::Constructor()\n"
11540 ": a(a)\n"
11541 ", b(b)\n"
11542 ", c(c) {}",
11543 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011544
11545 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
11546 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011547 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
11548 verifyFormat(
11549 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
11550 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011551 verifyFormat(
11552 "SomeClass::Constructor()\n"
11553 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
11554 Style);
11555 Style.ConstructorInitializerIndentWidth = 4;
11556 Style.ColumnLimit = 60;
11557 verifyFormat("SomeClass::Constructor()\n"
11558 " : aaaaaaaa(aaaaaaaa)\n"
11559 " , aaaaaaaa(aaaaaaaa)\n"
11560 " , aaaaaaaa(aaaaaaaa) {}",
11561 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011562}
11563
Daniel Jasper38efc132014-10-21 07:51:54 +000011564TEST_F(FormatTest, Destructors) {
11565 verifyFormat("void F(int &i) { i.~int(); }");
11566 verifyFormat("void F(int &i) { i->~int(); }");
11567}
11568
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011569TEST_F(FormatTest, FormatsWithWebKitStyle) {
11570 FormatStyle Style = getWebKitStyle();
11571
11572 // Don't indent in outer namespaces.
11573 verifyFormat("namespace outer {\n"
11574 "int i;\n"
11575 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000011576 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011577 "} // namespace inner\n"
11578 "} // namespace outer\n"
11579 "namespace other_outer {\n"
11580 "int i;\n"
11581 "}",
11582 Style);
11583
11584 // Don't indent case labels.
11585 verifyFormat("switch (variable) {\n"
11586 "case 1:\n"
11587 "case 2:\n"
11588 " doSomething();\n"
11589 " break;\n"
11590 "default:\n"
11591 " ++variable;\n"
11592 "}",
11593 Style);
11594
11595 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000011596 EXPECT_EQ("void f()\n"
11597 "{\n"
11598 " if (aaaaaaaaaaaaaaaa\n"
11599 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
11600 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11601 " return;\n"
11602 "}",
11603 format("void f() {\n"
11604 "if (aaaaaaaaaaaaaaaa\n"
11605 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
11606 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11607 "return;\n"
11608 "}",
11609 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011610
Daniel Jasper35995672014-04-29 14:05:20 +000011611 // Allow functions on a single line.
11612 verifyFormat("void f() { return; }", Style);
11613
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011614 // Constructor initializers are formatted one per line with the "," on the
11615 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011616 verifyFormat("Constructor()\n"
11617 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
11618 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000011619 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011620 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
11621 "{\n"
11622 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011623 Style);
11624 verifyFormat("SomeClass::Constructor()\n"
11625 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011626 "{\n"
11627 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011628 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000011629 EXPECT_EQ("SomeClass::Constructor()\n"
11630 " : a(a)\n"
11631 "{\n"
11632 "}",
11633 format("SomeClass::Constructor():a(a){}", Style));
11634 verifyFormat("SomeClass::Constructor()\n"
11635 " : a(a)\n"
11636 " , b(b)\n"
11637 " , c(c)\n"
11638 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000011639 "}",
11640 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011641 verifyFormat("SomeClass::Constructor()\n"
11642 " : a(a)\n"
11643 "{\n"
11644 " foo();\n"
11645 " bar();\n"
11646 "}",
11647 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011648
Daniel Jasper65ee3472013-07-31 23:16:02 +000011649 // Access specifiers should be aligned left.
11650 verifyFormat("class C {\n"
11651 "public:\n"
11652 " int i;\n"
11653 "};",
11654 Style);
11655
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011656 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000011657 verifyFormat("int a; // Do not\n"
11658 "double b; // align comments.",
11659 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011660
Daniel Jasper3219e432014-12-02 13:24:51 +000011661 // Do not align operands.
11662 EXPECT_EQ("ASSERT(aaaa\n"
11663 " || bbbb);",
11664 format("ASSERT ( aaaa\n||bbbb);", Style));
11665
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011666 // Accept input's line breaks.
11667 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
11668 " || bbbbbbbbbbbbbbb) {\n"
11669 " i++;\n"
11670 "}",
11671 format("if (aaaaaaaaaaaaaaa\n"
11672 "|| bbbbbbbbbbbbbbb) { i++; }",
11673 Style));
11674 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
11675 " i++;\n"
11676 "}",
11677 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000011678
11679 // Don't automatically break all macro definitions (llvm.org/PR17842).
11680 verifyFormat("#define aNumber 10", Style);
11681 // However, generally keep the line breaks that the user authored.
11682 EXPECT_EQ("#define aNumber \\\n"
11683 " 10",
11684 format("#define aNumber \\\n"
11685 " 10",
11686 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000011687
11688 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011689 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
11690 " copyItems:YES];",
11691 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
11692 "copyItems:YES];",
11693 Style));
11694 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
11695 " copyItems:YES];",
11696 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
11697 " copyItems:YES];",
11698 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000011699 // FIXME: This does not seem right, there should be more indentation before
11700 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011701 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000011702 " @\"a\",\n"
11703 " @\"a\"\n"
11704 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011705 " copyItems:YES];",
11706 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
11707 " @\"a\",\n"
11708 " @\"a\"\n"
11709 " ]\n"
11710 " copyItems:YES];",
11711 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011712 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011713 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11714 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011715 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11716 " copyItems:YES];",
11717 Style));
11718
11719 verifyFormat("[self.a b:c c:d];", Style);
11720 EXPECT_EQ("[self.a b:c\n"
11721 " c:d];",
11722 format("[self.a b:c\n"
11723 "c:d];",
11724 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011725}
11726
Manuel Klimekffdeb592013-09-03 15:10:01 +000011727TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011728 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
11729 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
11730 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
11731 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
11732 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000011733 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Manuel Klimek9f0a4e52017-09-19 09:59:30 +000011734 verifyFormat("auto c = [a = [b = 42] {}] {};\n");
11735 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000011736 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011737 verifyFormat("void f() {\n"
11738 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
11739 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011740 verifyFormat("void f() {\n"
11741 " other(x.begin(), //\n"
11742 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000011743 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011744 "}\n");
Krasimir Georgiev5528cac2018-10-31 17:56:57 +000011745 verifyFormat("void f() {\n"
11746 " other.other.other.other.other(\n"
11747 " x.begin(), x.end(),\n"
11748 " [something, rather](int, int, int, int, int, int, int) { return 1; });\n"
11749 "}\n");
11750 verifyFormat("void f() {\n"
11751 " other.other.other.other.other(\n"
11752 " x.begin(), x.end(),\n"
11753 " [something, rather](int, int, int, int, int, int, int) {\n"
11754 " //\n"
11755 " });\n"
11756 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000011757 verifyFormat("SomeFunction([]() { // A cool function...\n"
11758 " return 43;\n"
11759 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000011760 EXPECT_EQ("SomeFunction([]() {\n"
11761 "#define A a\n"
11762 " return 43;\n"
11763 "});",
11764 format("SomeFunction([](){\n"
11765 "#define A a\n"
11766 "return 43;\n"
11767 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000011768 verifyFormat("void f() {\n"
11769 " SomeFunction([](decltype(x), A *a) {});\n"
11770 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011771 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11772 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000011773 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
11774 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
11775 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000011776 verifyFormat("Constructor()\n"
11777 " : Field([] { // comment\n"
11778 " int i;\n"
11779 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000011780 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
11781 " return some_parameter.size();\n"
11782 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000011783 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
11784 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000011785 verifyFormat("int i = aaaaaa ? 1 //\n"
11786 " : [] {\n"
11787 " return 2; //\n"
11788 " }();");
11789 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11790 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11791 " return x == 2; // force break\n"
11792 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011793 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11794 " [=](int iiiiiiiiiiii) {\n"
11795 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
11796 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
11797 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011798 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011799 verifyFormat("SomeFunction({[&] {\n"
11800 " // comment\n"
11801 " },\n"
11802 " [&] {\n"
11803 " // comment\n"
11804 " }});");
11805 verifyFormat("SomeFunction({[&] {\n"
11806 " // comment\n"
11807 "}});");
Krasimir Georgiev5528cac2018-10-31 17:56:57 +000011808 verifyFormat("virtual aaaaaaaaaaaaaaaa(\n"
11809 " std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n"
11810 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011811
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011812 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011813 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011814 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011815 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11816 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011817 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011818 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011819 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11820 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011821 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011822 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11823 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011824 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011825 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011826 verifyFormat(
11827 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11828 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11829 " return aaaaaaaaaaaaaaaaa;\n"
11830 " });",
11831 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011832 verifyFormat("[]() //\n"
11833 " -> int {\n"
11834 " return 1; //\n"
11835 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011836
Krasimir Georgiev5528cac2018-10-31 17:56:57 +000011837 // Multiple lambdas in the same parentheses change indentation rules. These
11838 // lambdas are forced to start on new lines.
Daniel Jasper4b444492014-11-21 13:38:53 +000011839 verifyFormat("SomeFunction(\n"
11840 " []() {\n"
Krasimir Georgiev5528cac2018-10-31 17:56:57 +000011841 " //\n"
Daniel Jasper4b444492014-11-21 13:38:53 +000011842 " },\n"
11843 " []() {\n"
Krasimir Georgiev5528cac2018-10-31 17:56:57 +000011844 " //\n"
Daniel Jasper4b444492014-11-21 13:38:53 +000011845 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011846
Krasimir Georgiev5528cac2018-10-31 17:56:57 +000011847 // A lambda passed as arg0 is always pushed to the next line.
11848 verifyFormat("SomeFunction(\n"
11849 " [this] {\n"
11850 " //\n"
11851 " },\n"
11852 " 1);\n");
11853
11854 // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like the arg0
11855 // case above.
11856 auto Style = getGoogleStyle();
11857 Style.BinPackArguments = false;
11858 verifyFormat("SomeFunction(\n"
11859 " a,\n"
11860 " [this] {\n"
11861 " //\n"
11862 " },\n"
11863 " b);\n",
11864 Style);
11865 verifyFormat("SomeFunction(\n"
11866 " a,\n"
11867 " [this] {\n"
11868 " //\n"
11869 " },\n"
11870 " b);\n");
11871
11872 // A lambda with a very long line forces arg0 to be pushed out irrespective of
11873 // the BinPackArguments value (as long as the code is wide enough).
11874 verifyFormat("something->SomeFunction(\n"
11875 " a,\n"
11876 " [this] {\n"
11877 " D0000000000000000000000000000000000000000000000000000000000001();\n"
11878 " },\n"
11879 " b);\n");
11880
11881 // A multi-line lambda is pulled up as long as the introducer fits on the previous
11882 // line and there are no further args.
11883 verifyFormat("function(1, [this, that] {\n"
11884 " //\n"
11885 "});\n");
11886 verifyFormat("function([this, that] {\n"
11887 " //\n"
11888 "});\n");
11889 // FIXME: this format is not ideal and we should consider forcing the first arg
11890 // onto its own line.
11891 verifyFormat("function(a, b, c, //\n"
11892 " d, [this, that] {\n"
11893 " //\n"
11894 " });\n");
11895
11896 // Multiple lambdas are treated correctly even when there is a short arg0.
11897 verifyFormat("SomeFunction(\n"
11898 " 1,\n"
11899 " [this] {\n"
11900 " //\n"
11901 " },\n"
11902 " [this] {\n"
11903 " //\n"
11904 " },\n"
11905 " 1);\n");
11906
Daniel Jasperda18fd82014-06-10 06:39:03 +000011907 // More complex introducers.
11908 verifyFormat("return [i, args...] {};");
11909
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011910 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011911 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011912 verifyFormat("double &operator[](int i) { return 0; }\n"
11913 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011914 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011915 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011916 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011917
11918 // Other corner cases.
11919 verifyFormat("void f() {\n"
11920 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000011921 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000011922 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011923
11924 // Lambdas created through weird macros.
11925 verifyFormat("void f() {\n"
11926 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011927 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011928 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011929
11930 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11931 " doo_dah();\n"
11932 " doo_dah();\n"
11933 " })) {\n"
11934 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000011935 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
11936 " doo_dah();\n"
11937 " doo_dah();\n"
11938 " })) {\n"
11939 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011940 verifyFormat("auto lambda = []() {\n"
11941 " int a = 2\n"
11942 "#if A\n"
11943 " + 2\n"
11944 "#endif\n"
11945 " ;\n"
11946 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011947
11948 // Lambdas with complex multiline introducers.
11949 verifyFormat(
11950 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11951 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
11952 " -> ::std::unordered_set<\n"
11953 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
11954 " //\n"
11955 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011956}
11957
Martin Probsta004b3f2017-11-17 18:06:33 +000011958TEST_F(FormatTest, EmptyLinesInLambdas) {
11959 verifyFormat("auto lambda = []() {\n"
11960 " x(); //\n"
11961 "};",
11962 "auto lambda = []() {\n"
11963 "\n"
11964 " x(); //\n"
11965 "\n"
11966 "};");
11967}
11968
Manuel Klimek516e0542013-09-04 13:25:30 +000011969TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011970 FormatStyle ShortBlocks = getLLVMStyle();
11971 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11972 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11973 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11974 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11975 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11976 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11977 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011978
Daniel Jasper76284682014-10-22 09:12:44 +000011979 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11980 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11981 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011982
Daniel Jasper76284682014-10-22 09:12:44 +000011983 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011984 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011985 "}];");
11986 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011987 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011988 "}]};");
11989 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011990 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011991 "}];");
11992 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011993 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011994 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011995 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011996 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011997 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011998 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011999 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000012000
12001 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012002 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000012003 "}];",
12004 getLLVMStyleWithColumns(60));
12005 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012006 " NSString *path = [self sessionFilePath];\n"
12007 " if (path) {\n"
12008 " // ...\n"
12009 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000012010 "});");
12011 verifyFormat("[[SessionService sharedService]\n"
12012 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012013 " if (window) {\n"
12014 " [self windowDidLoad:window];\n"
12015 " } else {\n"
12016 " [self errorLoadingWindow];\n"
12017 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000012018 " }];");
12019 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012020 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000012021 "};\n",
12022 getLLVMStyleWithColumns(40));
12023 verifyFormat("[[SessionService sharedService]\n"
12024 " loadWindowWithCompletionBlock: //\n"
12025 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012026 " if (window) {\n"
12027 " [self windowDidLoad:window];\n"
12028 " } else {\n"
12029 " [self errorLoadingWindow];\n"
12030 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000012031 " }];",
12032 getLLVMStyleWithColumns(60));
12033 verifyFormat("[myObject doSomethingWith:arg1\n"
12034 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012035 " // ...\n"
12036 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000012037 " }\n"
12038 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012039 " // ...\n"
12040 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000012041 " }\n"
12042 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012043 " // ...\n"
12044 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000012045 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000012046 verifyFormat("[myObject doSomethingWith:arg1\n"
12047 " firstBlock:-1\n"
12048 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012049 " // ...\n"
12050 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000012051 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000012052
12053 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012054 " @autoreleasepool {\n"
12055 " if (a) {\n"
12056 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000012057 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012058 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000012059 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000012060 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000012061 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
12062 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000012063
12064 FormatStyle FourIndent = getLLVMStyle();
12065 FourIndent.ObjCBlockIndentWidth = 4;
12066 verifyFormat("[operation setCompletionBlock:^{\n"
12067 " [self onOperationDone];\n"
12068 "}];",
12069 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000012070}
12071
Daniel Jasper289afc02015-04-23 09:23:17 +000012072TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
12073 FormatStyle ZeroColumn = getLLVMStyle();
12074 ZeroColumn.ColumnLimit = 0;
12075
12076 verifyFormat("[[SessionService sharedService] "
12077 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
12078 " if (window) {\n"
12079 " [self windowDidLoad:window];\n"
12080 " } else {\n"
12081 " [self errorLoadingWindow];\n"
12082 " }\n"
12083 "}];",
12084 ZeroColumn);
12085 EXPECT_EQ("[[SessionService sharedService]\n"
12086 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
12087 " if (window) {\n"
12088 " [self windowDidLoad:window];\n"
12089 " } else {\n"
12090 " [self errorLoadingWindow];\n"
12091 " }\n"
12092 " }];",
12093 format("[[SessionService sharedService]\n"
12094 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
12095 " if (window) {\n"
12096 " [self windowDidLoad:window];\n"
12097 " } else {\n"
12098 " [self errorLoadingWindow];\n"
12099 " }\n"
12100 "}];",
12101 ZeroColumn));
12102 verifyFormat("[myObject doSomethingWith:arg1\n"
12103 " firstBlock:^(Foo *a) {\n"
12104 " // ...\n"
12105 " int i;\n"
12106 " }\n"
12107 " secondBlock:^(Bar *b) {\n"
12108 " // ...\n"
12109 " int i;\n"
12110 " }\n"
12111 " thirdBlock:^Foo(Bar *b) {\n"
12112 " // ...\n"
12113 " int i;\n"
12114 " }];",
12115 ZeroColumn);
12116 verifyFormat("f(^{\n"
12117 " @autoreleasepool {\n"
12118 " if (a) {\n"
12119 " g();\n"
12120 " }\n"
12121 " }\n"
12122 "});",
12123 ZeroColumn);
12124 verifyFormat("void (^largeBlock)(void) = ^{\n"
12125 " // ...\n"
12126 "};",
12127 ZeroColumn);
12128
12129 ZeroColumn.AllowShortBlocksOnASingleLine = true;
12130 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000012131 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000012132 ZeroColumn.AllowShortBlocksOnASingleLine = false;
12133 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
12134 " int i;\n"
12135 "};",
12136 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
12137}
12138
Alexander Kornienko9e649af2013-09-11 12:25:57 +000012139TEST_F(FormatTest, SupportsCRLF) {
12140 EXPECT_EQ("int a;\r\n"
12141 "int b;\r\n"
12142 "int c;\r\n",
12143 format("int a;\r\n"
12144 " int b;\r\n"
12145 " int c;\r\n",
12146 getLLVMStyle()));
12147 EXPECT_EQ("int a;\r\n"
12148 "int b;\r\n"
12149 "int c;\r\n",
12150 format("int a;\r\n"
12151 " int b;\n"
12152 " int c;\r\n",
12153 getLLVMStyle()));
12154 EXPECT_EQ("int a;\n"
12155 "int b;\n"
12156 "int c;\n",
12157 format("int a;\r\n"
12158 " int b;\n"
12159 " int c;\n",
12160 getLLVMStyle()));
12161 EXPECT_EQ("\"aaaaaaa \"\r\n"
12162 "\"bbbbbbb\";\r\n",
12163 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
12164 EXPECT_EQ("#define A \\\r\n"
12165 " b; \\\r\n"
12166 " c; \\\r\n"
12167 " d;\r\n",
12168 format("#define A \\\r\n"
12169 " b; \\\r\n"
12170 " c; d; \r\n",
12171 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000012172
12173 EXPECT_EQ("/*\r\n"
12174 "multi line block comments\r\n"
12175 "should not introduce\r\n"
12176 "an extra carriage return\r\n"
12177 "*/\r\n",
12178 format("/*\r\n"
12179 "multi line block comments\r\n"
12180 "should not introduce\r\n"
12181 "an extra carriage return\r\n"
12182 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000012183}
12184
Manuel Klimekb212f3b2013-10-12 22:46:56 +000012185TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
12186 verifyFormat("MY_CLASS(C) {\n"
12187 " int i;\n"
12188 " int j;\n"
12189 "};");
12190}
12191
Daniel Jasper6633ab82013-10-18 10:38:14 +000012192TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
12193 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
12194 TwoIndent.ContinuationIndentWidth = 2;
12195
12196 EXPECT_EQ("int i =\n"
12197 " longFunction(\n"
12198 " arg);",
12199 format("int i = longFunction(arg);", TwoIndent));
12200
12201 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
12202 SixIndent.ContinuationIndentWidth = 6;
12203
12204 EXPECT_EQ("int i =\n"
12205 " longFunction(\n"
12206 " arg);",
12207 format("int i = longFunction(arg);", SixIndent));
12208}
12209
Daniel Jasperdd978ae2013-10-29 14:52:02 +000012210TEST_F(FormatTest, SpacesInAngles) {
12211 FormatStyle Spaces = getLLVMStyle();
12212 Spaces.SpacesInAngles = true;
12213
12214 verifyFormat("static_cast< int >(arg);", Spaces);
12215 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
12216 verifyFormat("f< int, float >();", Spaces);
12217 verifyFormat("template <> g() {}", Spaces);
12218 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000012219 verifyFormat("std::function< void(int, int) > fct;", Spaces);
12220 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
12221 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000012222
12223 Spaces.Standard = FormatStyle::LS_Cpp03;
12224 Spaces.SpacesInAngles = true;
12225 verifyFormat("A< A< int > >();", Spaces);
12226
12227 Spaces.SpacesInAngles = false;
12228 verifyFormat("A<A<int> >();", Spaces);
12229
12230 Spaces.Standard = FormatStyle::LS_Cpp11;
12231 Spaces.SpacesInAngles = true;
12232 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000012233
Daniel Jasperdd978ae2013-10-29 14:52:02 +000012234 Spaces.SpacesInAngles = false;
12235 verifyFormat("A<A<int>>();", Spaces);
12236}
12237
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000012238TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
12239 FormatStyle Style = getLLVMStyle();
12240 Style.SpaceAfterTemplateKeyword = false;
12241 verifyFormat("template<int> void foo();", Style);
12242}
12243
Jacques Pienaarfc275112015-02-18 23:48:37 +000012244TEST_F(FormatTest, TripleAngleBrackets) {
12245 verifyFormat("f<<<1, 1>>>();");
12246 verifyFormat("f<<<1, 1, 1, s>>>();");
12247 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000012248 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000012249 verifyFormat("f<param><<<1, 1>>>();");
12250 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000012251 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000012252 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
12253 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000012254 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
12255 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000012256}
12257
12258TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000012259 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000012260 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000012261 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
12262 "aaallvm::outs() <<");
12263 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
12264 "aaaallvm::outs()\n <<");
12265}
12266
Manuel Klimek819788d2014-03-18 11:22:45 +000012267TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
12268 std::string code = "#if A\n"
12269 "#if B\n"
12270 "a.\n"
12271 "#endif\n"
12272 " a = 1;\n"
12273 "#else\n"
12274 "#endif\n"
12275 "#if C\n"
12276 "#else\n"
12277 "#endif\n";
12278 EXPECT_EQ(code, format(code));
12279}
12280
Manuel Klimek68b03042014-04-14 09:14:11 +000012281TEST_F(FormatTest, HandleConflictMarkers) {
12282 // Git/SVN conflict markers.
12283 EXPECT_EQ("int a;\n"
12284 "void f() {\n"
12285 " callme(some(parameter1,\n"
12286 "<<<<<<< text by the vcs\n"
12287 " parameter2),\n"
12288 "||||||| text by the vcs\n"
12289 " parameter2),\n"
12290 " parameter3,\n"
12291 "======= text by the vcs\n"
12292 " parameter2, parameter3),\n"
12293 ">>>>>>> text by the vcs\n"
12294 " otherparameter);\n",
12295 format("int a;\n"
12296 "void f() {\n"
12297 " callme(some(parameter1,\n"
12298 "<<<<<<< text by the vcs\n"
12299 " parameter2),\n"
12300 "||||||| text by the vcs\n"
12301 " parameter2),\n"
12302 " parameter3,\n"
12303 "======= text by the vcs\n"
12304 " parameter2,\n"
12305 " parameter3),\n"
12306 ">>>>>>> text by the vcs\n"
12307 " otherparameter);\n"));
12308
12309 // Perforce markers.
12310 EXPECT_EQ("void f() {\n"
12311 " function(\n"
12312 ">>>> text by the vcs\n"
12313 " parameter,\n"
12314 "==== text by the vcs\n"
12315 " parameter,\n"
12316 "==== text by the vcs\n"
12317 " parameter,\n"
12318 "<<<< text by the vcs\n"
12319 " parameter);\n",
12320 format("void f() {\n"
12321 " function(\n"
12322 ">>>> text by the vcs\n"
12323 " parameter,\n"
12324 "==== text by the vcs\n"
12325 " parameter,\n"
12326 "==== text by the vcs\n"
12327 " parameter,\n"
12328 "<<<< text by the vcs\n"
12329 " parameter);\n"));
12330
12331 EXPECT_EQ("<<<<<<<\n"
12332 "|||||||\n"
12333 "=======\n"
12334 ">>>>>>>",
12335 format("<<<<<<<\n"
12336 "|||||||\n"
12337 "=======\n"
12338 ">>>>>>>"));
12339
12340 EXPECT_EQ("<<<<<<<\n"
12341 "|||||||\n"
12342 "int i;\n"
12343 "=======\n"
12344 ">>>>>>>",
12345 format("<<<<<<<\n"
12346 "|||||||\n"
12347 "int i;\n"
12348 "=======\n"
12349 ">>>>>>>"));
12350
12351 // FIXME: Handle parsing of macros around conflict markers correctly:
12352 EXPECT_EQ("#define Macro \\\n"
12353 "<<<<<<<\n"
12354 "Something \\\n"
12355 "|||||||\n"
12356 "Else \\\n"
12357 "=======\n"
12358 "Other \\\n"
12359 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000012360 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000012361 format("#define Macro \\\n"
12362 "<<<<<<<\n"
12363 " Something \\\n"
12364 "|||||||\n"
12365 " Else \\\n"
12366 "=======\n"
12367 " Other \\\n"
12368 ">>>>>>>\n"
12369 " End\n"
12370 "int i;\n"));
12371}
12372
Daniel Jasper471894432014-08-06 13:40:26 +000012373TEST_F(FormatTest, DisableRegions) {
12374 EXPECT_EQ("int i;\n"
12375 "// clang-format off\n"
12376 " int j;\n"
12377 "// clang-format on\n"
12378 "int k;",
12379 format(" int i;\n"
12380 " // clang-format off\n"
12381 " int j;\n"
12382 " // clang-format on\n"
12383 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000012384 EXPECT_EQ("int i;\n"
12385 "/* clang-format off */\n"
12386 " int j;\n"
12387 "/* clang-format on */\n"
12388 "int k;",
12389 format(" int i;\n"
12390 " /* clang-format off */\n"
12391 " int j;\n"
12392 " /* clang-format on */\n"
12393 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000012394
12395 // Don't reflow comments within disabled regions.
12396 EXPECT_EQ(
12397 "// clang-format off\n"
12398 "// long long long long long long line\n"
12399 "/* clang-format on */\n"
12400 "/* long long long\n"
12401 " * long long long\n"
12402 " * line */\n"
12403 "int i;\n"
12404 "/* clang-format off */\n"
12405 "/* long long long long long long line */\n",
12406 format("// clang-format off\n"
12407 "// long long long long long long line\n"
12408 "/* clang-format on */\n"
12409 "/* long long long long long long line */\n"
12410 "int i;\n"
12411 "/* clang-format off */\n"
12412 "/* long long long long long long line */\n",
12413 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000012414}
12415
Manuel Klimekf0c95b32015-06-11 10:14:13 +000012416TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
12417 format("? ) =");
12418 verifyNoCrash("#define a\\\n /**/}");
12419}
Manuel Klimek5f594f82014-08-13 14:00:41 +000012420
Daniel Jasper498f5582015-12-25 08:53:31 +000012421TEST_F(FormatTest, FormatsTableGenCode) {
12422 FormatStyle Style = getLLVMStyle();
12423 Style.Language = FormatStyle::LK_TableGen;
12424 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
12425}
12426
Nico Weberb2673a12016-11-10 21:49:25 +000012427TEST_F(FormatTest, ArrayOfTemplates) {
12428 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
12429 format("auto a = new unique_ptr<int > [ 10];"));
12430
12431 FormatStyle Spaces = getLLVMStyle();
12432 Spaces.SpacesInSquareBrackets = true;
12433 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
12434 format("auto a = new unique_ptr<int > [10];", Spaces));
12435}
12436
12437TEST_F(FormatTest, ArrayAsTemplateType) {
12438 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
12439 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
12440
12441 FormatStyle Spaces = getLLVMStyle();
12442 Spaces.SpacesInSquareBrackets = true;
12443 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
12444 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
12445}
12446
Martin Probstc9c51c42017-03-16 10:21:35 +000012447TEST_F(FormatTest, NoSpaceAfterSuper) {
12448 verifyFormat("__super::FooBar();");
12449}
12450
Ben Hamilton07e58362018-02-21 21:27:27 +000012451TEST(FormatStyle, GetStyleWithEmptyFileName) {
Jonas Devliegherefc514902018-10-10 13:27:25 +000012452 llvm::vfs::InMemoryFileSystem FS;
Bjorn Pettersson0b2f7742018-02-26 14:14:11 +000012453 auto Style1 = getStyle("file", "", "Google", "", &FS);
Ben Hamilton07e58362018-02-21 21:27:27 +000012454 ASSERT_TRUE((bool)Style1);
12455 ASSERT_EQ(*Style1, getGoogleStyle());
12456}
12457
Eric Liu547d8792016-03-24 13:22:42 +000012458TEST(FormatStyle, GetStyleOfFile) {
Jonas Devliegherefc514902018-10-10 13:27:25 +000012459 llvm::vfs::InMemoryFileSystem FS;
Eric Liu547d8792016-03-24 13:22:42 +000012460 // Test 1: format file in the same directory.
12461 ASSERT_TRUE(
12462 FS.addFile("/a/.clang-format", 0,
12463 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
12464 ASSERT_TRUE(
12465 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000012466 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000012467 ASSERT_TRUE((bool)Style1);
12468 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000012469
Antonio Maiorano7eb75072017-01-20 01:22:42 +000012470 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000012471 ASSERT_TRUE(
12472 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000012473 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000012474 ASSERT_TRUE((bool)Style2);
12475 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000012476
Antonio Maiorano7eb75072017-01-20 01:22:42 +000012477 // Test 2.2: no format on 'none' fallback style.
12478 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
12479 ASSERT_TRUE((bool)Style2);
12480 ASSERT_EQ(*Style2, getNoStyle());
12481
12482 // Test 2.3: format if config is found with no based style while fallback is
12483 // 'none'.
12484 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
12485 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
12486 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
12487 ASSERT_TRUE((bool)Style2);
12488 ASSERT_EQ(*Style2, getLLVMStyle());
12489
12490 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
12491 Style2 = getStyle("{}", "a.h", "none", "", &FS);
12492 ASSERT_TRUE((bool)Style2);
12493 ASSERT_EQ(*Style2, getLLVMStyle());
12494
Eric Liu547d8792016-03-24 13:22:42 +000012495 // Test 3: format file in parent directory.
12496 ASSERT_TRUE(
12497 FS.addFile("/c/.clang-format", 0,
12498 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
12499 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
12500 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000012501 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000012502 ASSERT_TRUE((bool)Style3);
12503 ASSERT_EQ(*Style3, getGoogleStyle());
12504
12505 // Test 4: error on invalid fallback style
12506 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
12507 ASSERT_FALSE((bool)Style4);
12508 llvm::consumeError(Style4.takeError());
12509
12510 // Test 5: error on invalid yaml on command line
12511 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
12512 ASSERT_FALSE((bool)Style5);
12513 llvm::consumeError(Style5.takeError());
12514
12515 // Test 6: error on invalid style
12516 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
12517 ASSERT_FALSE((bool)Style6);
12518 llvm::consumeError(Style6.takeError());
12519
12520 // Test 7: found config file, error on parsing it
12521 ASSERT_TRUE(
12522 FS.addFile("/d/.clang-format", 0,
12523 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
12524 "InvalidKey: InvalidValue")));
12525 ASSERT_TRUE(
12526 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
12527 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
12528 ASSERT_FALSE((bool)Style7);
12529 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000012530}
12531
Manuel Klimekb12e5a52016-03-01 12:37:30 +000012532TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
12533 // Column limit is 20.
12534 std::string Code = "Type *a =\n"
12535 " new Type();\n"
12536 "g(iiiii, 0, jjjjj,\n"
12537 " 0, kkkkk, 0, mm);\n"
12538 "int bad = format ;";
12539 std::string Expected = "auto a = new Type();\n"
12540 "g(iiiii, nullptr,\n"
12541 " jjjjj, nullptr,\n"
12542 " kkkkk, nullptr,\n"
12543 " mm);\n"
12544 "int bad = format ;";
12545 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000012546 tooling::Replacements Replaces = toReplacements(
12547 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
12548 "auto "),
12549 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
12550 "nullptr"),
12551 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
12552 "nullptr"),
12553 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
12554 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000012555
12556 format::FormatStyle Style = format::getLLVMStyle();
12557 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000012558 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
12559 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
12560 << llvm::toString(FormattedReplaces.takeError()) << "\n";
12561 auto Result = applyAllReplacements(Code, *FormattedReplaces);
12562 EXPECT_TRUE(static_cast<bool>(Result));
12563 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000012564}
12565
Eric Liubaf58c22016-05-18 13:43:48 +000012566TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
12567 std::string Code = "#include \"a.h\"\n"
12568 "#include \"c.h\"\n"
12569 "\n"
12570 "int main() {\n"
12571 " return 0;\n"
12572 "}";
12573 std::string Expected = "#include \"a.h\"\n"
12574 "#include \"b.h\"\n"
12575 "#include \"c.h\"\n"
12576 "\n"
12577 "int main() {\n"
12578 " return 0;\n"
12579 "}";
12580 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000012581 tooling::Replacements Replaces = toReplacements(
12582 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
12583 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000012584
12585 format::FormatStyle Style = format::getLLVMStyle();
12586 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000012587 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
12588 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
12589 << llvm::toString(FormattedReplaces.takeError()) << "\n";
12590 auto Result = applyAllReplacements(Code, *FormattedReplaces);
12591 EXPECT_TRUE(static_cast<bool>(Result));
12592 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000012593}
12594
Krasimir Georgievac16a202017-06-23 11:46:03 +000012595TEST_F(FormatTest, FormatSortsUsingDeclarations) {
12596 EXPECT_EQ("using std::cin;\n"
12597 "using std::cout;",
12598 format("using std::cout;\n"
12599 "using std::cin;", getGoogleStyle()));
12600}
12601
Nico Weberdc065182017-04-05 18:10:42 +000012602TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
12603 format::FormatStyle Style = format::getLLVMStyle();
12604 Style.Standard = FormatStyle::LS_Cpp03;
12605 // cpp03 recognize this string as identifier u8 and literal character 'a'
12606 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
12607}
12608
12609TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
12610 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
12611 // all modes, including C++11, C++14 and C++17
12612 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
12613}
12614
Krasimir Georgieva2e7d0d2017-08-29 13:51:38 +000012615TEST_F(FormatTest, DoNotFormatLikelyXml) {
12616 EXPECT_EQ("<!-- ;> -->",
12617 format("<!-- ;> -->", getGoogleStyle()));
12618 EXPECT_EQ(" <!-- >; -->",
12619 format(" <!-- >; -->", getGoogleStyle()));
12620}
12621
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012622TEST_F(FormatTest, StructuredBindings) {
12623 // Structured bindings is a C++17 feature.
12624 // all modes, including C++11, C++14 and C++17
12625 verifyFormat("auto [a, b] = f();");
12626 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
12627 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();"));
12628 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();"));
12629 EXPECT_EQ("auto const volatile [a, b] = f();",
12630 format("auto const volatile[a, b] = f();"));
12631 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012632 EXPECT_EQ("auto &[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012633 format("auto &[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012634 EXPECT_EQ("auto &&[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012635 format("auto &&[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012636 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();"));
12637 EXPECT_EQ("auto const volatile &&[a, b] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012638 format("auto const volatile &&[a, b] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012639 EXPECT_EQ("auto const &&[a, b] = f();", format("auto const && [a, b] = f();"));
12640 EXPECT_EQ("const auto &[a, b] = f();", format("const auto & [a, b] = f();"));
12641 EXPECT_EQ("const auto volatile &&[a, b] = f();",
12642 format("const auto volatile &&[a, b] = f();"));
12643 EXPECT_EQ("volatile const auto &&[a, b] = f();",
12644 format("volatile const auto &&[a, b] = f();"));
12645 EXPECT_EQ("const auto &&[a, b] = f();", format("const auto && [a, b] = f();"));
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012646
Manuel Klimeke411aa82017-09-20 09:29:37 +000012647 // Make sure we don't mistake structured bindings for lambdas.
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012648 FormatStyle PointerMiddle = getLLVMStyle();
12649 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
12650 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
12651 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
12652 verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
12653 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
12654 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
12655 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
12656 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
12657 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
12658 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
12659 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
12660 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
12661 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
12662
12663 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
12664 format("for (const auto && [a, b] : some_range) {\n}"));
12665 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
12666 format("for (const auto & [a, b] : some_range) {\n}"));
12667 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
12668 format("for (const auto[a, b] : some_range) {\n}"));
12669 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);"));
12670 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);"));
12671 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);"));
12672 EXPECT_EQ("auto const &[x, y](expr);", format("auto const & [x,y] (expr);"));
12673 EXPECT_EQ("auto const &&[x, y](expr);", format("auto const && [x,y] (expr);"));
12674 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};"));
12675 EXPECT_EQ("auto const &[x, y]{expr};", format("auto const & [x,y] {expr};"));
12676 EXPECT_EQ("auto const &&[x, y]{expr};", format("auto const && [x,y] {expr};"));
Manuel Klimeke411aa82017-09-20 09:29:37 +000012677
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012678 format::FormatStyle Spaces = format::getLLVMStyle();
12679 Spaces.SpacesInSquareBrackets = true;
12680 verifyFormat("auto [ a, b ] = f();", Spaces);
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012681 verifyFormat("auto &&[ a, b ] = f();", Spaces);
12682 verifyFormat("auto &[ a, b ] = f();", Spaces);
12683 verifyFormat("auto const &&[ a, b ] = f();", Spaces);
12684 verifyFormat("auto const &[ a, b ] = f();", Spaces);
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012685}
12686
Ben Hamilton6e066352018-02-27 15:56:40 +000012687TEST_F(FormatTest, FileAndCode) {
12688 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
12689 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
12690 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
12691 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
12692 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@interface Foo\n@end\n"));
Ben Hamiltonb1a79192018-04-12 15:11:53 +000012693 EXPECT_EQ(
12694 FormatStyle::LK_ObjC,
12695 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }"));
12696 EXPECT_EQ(FormatStyle::LK_ObjC,
12697 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))"));
12698 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;"));
Ben Hamilton6e066352018-02-27 15:56:40 +000012699 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
12700 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo", "@interface Foo\n@end\n"));
Ben Hamilton19c782d2018-03-22 03:25:22 +000012701 EXPECT_EQ(FormatStyle::LK_ObjC,
12702 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
12703 EXPECT_EQ(
12704 FormatStyle::LK_ObjC,
12705 guessLanguage("foo.h",
12706 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
Ben Hamilton9dc78162018-04-03 14:07:11 +000012707 EXPECT_EQ(
12708 FormatStyle::LK_Cpp,
12709 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
Ben Hamilton3b345c32018-02-21 15:54:31 +000012710}
12711
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012712TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
12713 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
12714 EXPECT_EQ(FormatStyle::LK_ObjC,
12715 guessLanguage("foo.h", "array[[calculator getIndex]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012716 EXPECT_EQ(FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012717 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012718 EXPECT_EQ(
12719 FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012720 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
12721 EXPECT_EQ(FormatStyle::LK_ObjC,
12722 guessLanguage("foo.h", "[[noreturn foo] bar];"));
12723 EXPECT_EQ(FormatStyle::LK_Cpp,
12724 guessLanguage("foo.h", "[[clang::fallthrough]];"));
12725 EXPECT_EQ(FormatStyle::LK_ObjC,
12726 guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
12727 EXPECT_EQ(FormatStyle::LK_Cpp,
12728 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
12729 EXPECT_EQ(FormatStyle::LK_Cpp,
12730 guessLanguage("foo.h", "[[using clang: fallthrough]];"));
12731 EXPECT_EQ(FormatStyle::LK_ObjC,
12732 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
12733 EXPECT_EQ(FormatStyle::LK_Cpp,
12734 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
12735 EXPECT_EQ(
12736 FormatStyle::LK_Cpp,
12737 guessLanguage("foo.h",
12738 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
12739 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012740}
12741
Ben Hamilton788a2222018-03-12 15:42:40 +000012742TEST_F(FormatTest, GuessLanguageWithCaret) {
12743 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
12744 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
12745 EXPECT_EQ(FormatStyle::LK_ObjC,
12746 guessLanguage("foo.h", "int(^)(char, float);"));
12747 EXPECT_EQ(FormatStyle::LK_ObjC,
12748 guessLanguage("foo.h", "int(^foo)(char, float);"));
12749 EXPECT_EQ(FormatStyle::LK_ObjC,
12750 guessLanguage("foo.h", "int(^foo[10])(char, float);"));
12751 EXPECT_EQ(FormatStyle::LK_ObjC,
12752 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
12753 EXPECT_EQ(
12754 FormatStyle::LK_ObjC,
12755 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
12756}
12757
Krasimir Georgiev28e2dbb2018-11-13 15:38:12 +000012758TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) {
12759 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
12760 "void f() {\n"
12761 " asm (\"mov %[e], %[d]\"\n"
12762 " : [d] \"=rm\" (d)\n"
12763 " [e] \"rm\" (*e));\n"
12764 "}"));
12765 EXPECT_EQ(FormatStyle::LK_Cpp,
12766 guessLanguage("foo.h", "void f() {\n"
12767 " asm volatile (\"mov %[e], %[d]\"\n"
12768 " : [d] \"=rm\" (d)\n"
12769 " [e] \"rm\" (*e));\n"
12770 "}"));
12771}
12772
Ben Hamilton6432afe2018-03-22 17:37:19 +000012773TEST_F(FormatTest, GuessLanguageWithChildLines) {
12774 EXPECT_EQ(FormatStyle::LK_Cpp,
12775 guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
12776 EXPECT_EQ(FormatStyle::LK_ObjC,
12777 guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
Ben Hamiltonea7a27b2018-03-27 15:01:21 +000012778 EXPECT_EQ(
12779 FormatStyle::LK_Cpp,
12780 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })"));
12781 EXPECT_EQ(
12782 FormatStyle::LK_ObjC,
12783 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })"));
Ben Hamilton6432afe2018-03-22 17:37:19 +000012784}
12785
Daniel Jasperd246a5a2015-06-15 15:25:11 +000012786} // end namespace
12787} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000012788} // end namespace clang