blob: bae7fba0a607fd0dd5ef5399e98337175a008305 [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) {
Manuel Klimek24998102013-01-16 14:55:28 +000042 DEBUG(llvm::errs() << "---\n");
Manuel Klimek71814b42013-10-11 21:25:45 +000043 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));
56 DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
57 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
Manuel Klimekb69e3c62013-01-02 18:33:23 +000073 void verifyFormat(llvm::StringRef Code,
74 const FormatStyle &Style = getLLVMStyle()) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000075 EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
Nico Weberd96ae862017-02-24 19:10:12 +000076 if (Style.Language == FormatStyle::LK_Cpp) {
77 // Objective-C++ is a superset of C++, so everything checked for C++
78 // needs to be checked for Objective-C++ as well.
79 FormatStyle ObjCStyle = Style;
80 ObjCStyle.Language = FormatStyle::LK_ObjC;
81 EXPECT_EQ(Code.str(), format(test::messUp(Code), ObjCStyle));
82 }
Daniel Jasperf7935112012-12-03 18:12:45 +000083 }
84
Manuel Klimekec5c3db2015-05-07 12:26:30 +000085 void verifyIncompleteFormat(llvm::StringRef Code,
86 const FormatStyle &Style = getLLVMStyle()) {
87 EXPECT_EQ(Code.str(),
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000088 format(test::messUp(Code), Style, SC_ExpectIncomplete));
Manuel Klimekec5c3db2015-05-07 12:26:30 +000089 }
90
Daniel Jasperf7935112012-12-03 18:12:45 +000091 void verifyGoogleFormat(llvm::StringRef Code) {
Manuel Klimekb69e3c62013-01-02 18:33:23 +000092 verifyFormat(Code, getGoogleStyle());
Daniel Jasperf7935112012-12-03 18:12:45 +000093 }
Daniel Jasper5b49f472013-01-23 12:10:53 +000094
95 void verifyIndependentOfContext(llvm::StringRef text) {
96 verifyFormat(text);
97 verifyFormat(llvm::Twine("void f() { " + text + " }").str());
98 }
Daniel Jasper7b038a22013-01-30 09:46:12 +000099
Daniel Jasper675b4f82015-01-19 10:51:23 +0000100 /// \brief Verify that clang-format does not crash on the given input.
101 void verifyNoCrash(llvm::StringRef Code,
102 const FormatStyle &Style = getLLVMStyle()) {
Krasimir Georgievbcda54b2017-04-21 14:35:20 +0000103 format(Code, Style, SC_DoNotCheck);
Daniel Jasper675b4f82015-01-19 10:51:23 +0000104 }
105
Daniel Jasper7b038a22013-01-30 09:46:12 +0000106 int ReplacementCount;
Daniel Jasperf7935112012-12-03 18:12:45 +0000107};
108
Manuel Klimek52b15152013-01-09 15:25:02 +0000109TEST_F(FormatTest, MessUp) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +0000110 EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
111 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
112 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
113 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
114 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
Manuel Klimek52b15152013-01-09 15:25:02 +0000115}
116
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000117//===----------------------------------------------------------------------===//
118// Basic function tests.
119//===----------------------------------------------------------------------===//
120
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +0000121TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000122 EXPECT_EQ(";", format(";"));
123}
124
125TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
126 EXPECT_EQ("int i;", format(" int i;"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +0000127 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000128 EXPECT_EQ("int i;\nint j;", format(" int i; int j;"));
129 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;"));
130}
131
132TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
133 EXPECT_EQ("int i;", format("int\ni;"));
134}
135
136TEST_F(FormatTest, FormatsNestedBlockStatements) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000137 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000138}
139
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000140TEST_F(FormatTest, FormatsNestedCall) {
141 verifyFormat("Method(f1, f2(f3));");
142 verifyFormat("Method(f1(f2, f3()));");
Daniel Jasper48cb3b92013-01-13 08:19:51 +0000143 verifyFormat("Method(f1(f2, (f3())));");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000144}
145
Daniel Jasper14556742013-02-07 21:08:36 +0000146TEST_F(FormatTest, NestedNameSpecifiers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +0000147 verifyFormat("vector<::Type> v;");
Daniel Jasper14556742013-02-07 21:08:36 +0000148 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
Daniel Jasper11be8ac2013-08-28 07:07:07 +0000149 verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
Daniel Jasperf322eb52014-10-23 20:22:22 +0000150 verifyFormat("bool a = 2 < ::SomeFunction();");
Daniel Jasper23c2b5a2017-02-17 10:44:07 +0000151 verifyFormat("ALWAYS_INLINE ::std::string getName();");
152 verifyFormat("some::string getName();");
Daniel Jasper736c14f2013-01-16 07:19:28 +0000153}
154
Daniel Jasper7b038a22013-01-30 09:46:12 +0000155TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
156 EXPECT_EQ("if (a) {\n"
157 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000158 "}",
159 format("if(a){f();}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000160 EXPECT_EQ(4, ReplacementCount);
161 EXPECT_EQ("if (a) {\n"
162 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000163 "}",
164 format("if (a) {\n"
165 " f();\n"
166 "}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000167 EXPECT_EQ(0, ReplacementCount);
Daniel Jasperd6e61882015-06-17 12:23:15 +0000168 EXPECT_EQ("/*\r\n"
169 "\r\n"
170 "*/\r\n",
171 format("/*\r\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +0000172 "\r\n"
173 "*/\r\n"));
Daniel Jasperd6e61882015-06-17 12:23:15 +0000174 EXPECT_EQ(0, ReplacementCount);
Daniel Jasper7b038a22013-01-30 09:46:12 +0000175}
176
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000177TEST_F(FormatTest, RemovesEmptyLines) {
178 EXPECT_EQ("class C {\n"
179 " int i;\n"
180 "};",
181 format("class C {\n"
182 " int i;\n"
183 "\n"
184 "};"));
185
Nico Weber34272652014-11-13 16:25:37 +0000186 // Don't remove empty lines at the start of namespaces or extern "C" blocks.
Daniel Jasper01b35482014-03-21 13:03:33 +0000187 EXPECT_EQ("namespace N {\n"
188 "\n"
189 "int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000190 "}",
Daniel Jasper01b35482014-03-21 13:03:33 +0000191 format("namespace N {\n"
192 "\n"
193 "int i;\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000194 "}",
195 getGoogleStyle()));
Nico Weber34272652014-11-13 16:25:37 +0000196 EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
197 "\n"
198 "int i;\n"
199 "}",
200 format("extern /**/ \"C\" /**/ {\n"
201 "\n"
202 "int i;\n"
203 "}",
204 getGoogleStyle()));
205
206 // ...but do keep inlining and removing empty lines for non-block extern "C"
207 // functions.
208 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
209 EXPECT_EQ("extern \"C\" int f() {\n"
210 " int i = 42;\n"
211 " return i;\n"
212 "}",
213 format("extern \"C\" int f() {\n"
214 "\n"
215 " int i = 42;\n"
216 " return i;\n"
217 "}",
218 getGoogleStyle()));
Daniel Jasper01b35482014-03-21 13:03:33 +0000219
Daniel Jasper11164bd2014-03-21 12:58:53 +0000220 // Remove empty lines at the beginning and end of blocks.
221 EXPECT_EQ("void f() {\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000222 "\n"
223 " if (a) {\n"
224 "\n"
225 " f();\n"
226 " }\n"
227 "}",
228 format("void f() {\n"
229 "\n"
230 " if (a) {\n"
231 "\n"
232 " f();\n"
233 "\n"
234 " }\n"
235 "\n"
236 "}",
237 getLLVMStyle()));
238 EXPECT_EQ("void f() {\n"
Daniel Jasper11164bd2014-03-21 12:58:53 +0000239 " if (a) {\n"
240 " f();\n"
241 " }\n"
242 "}",
243 format("void f() {\n"
244 "\n"
245 " if (a) {\n"
246 "\n"
247 " f();\n"
248 "\n"
249 " }\n"
250 "\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000251 "}",
252 getGoogleStyle()));
Daniel Jasper11164bd2014-03-21 12:58:53 +0000253
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000254 // Don't remove empty lines in more complex control statements.
255 EXPECT_EQ("void f() {\n"
256 " if (a) {\n"
257 " f();\n"
258 "\n"
259 " } else if (b) {\n"
260 " f();\n"
261 " }\n"
262 "}",
263 format("void f() {\n"
264 " if (a) {\n"
265 " f();\n"
266 "\n"
267 " } else if (b) {\n"
268 " f();\n"
269 "\n"
270 " }\n"
271 "\n"
272 "}"));
273
274 // FIXME: This is slightly inconsistent.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000275 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
276 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000277 EXPECT_EQ("namespace {\n"
278 "int i;\n"
279 "}",
280 format("namespace {\n"
281 "int i;\n"
282 "\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000283 "}", LLVMWithNoNamespaceFix));
284 EXPECT_EQ("namespace {\n"
285 "int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000286 "}",
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000287 format("namespace {\n"
288 "int i;\n"
289 "\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000290 "}"));
291 EXPECT_EQ("namespace {\n"
292 "int i;\n"
293 "\n"
294 "} // namespace",
295 format("namespace {\n"
296 "int i;\n"
297 "\n"
298 "} // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000299
300 FormatStyle Style = getLLVMStyle();
301 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
302 Style.MaxEmptyLinesToKeep = 2;
303 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
304 Style.BraceWrapping.AfterClass = true;
305 Style.BraceWrapping.AfterFunction = true;
306 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
307
308 EXPECT_EQ("class Foo\n"
309 "{\n"
310 " Foo() {}\n"
311 "\n"
312 " void funk() {}\n"
313 "};",
314 format("class Foo\n"
315 "{\n"
316 " Foo()\n"
317 " {\n"
318 " }\n"
319 "\n"
320 " void funk() {}\n"
321 "};",
322 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000323}
324
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000325TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000326 verifyFormat("x = (a) and (b);");
327 verifyFormat("x = (a) or (b);");
328 verifyFormat("x = (a) bitand (b);");
329 verifyFormat("x = (a) bitor (b);");
330 verifyFormat("x = (a) not_eq (b);");
331 verifyFormat("x = (a) and_eq (b);");
332 verifyFormat("x = (a) or_eq (b);");
333 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000334}
335
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000336//===----------------------------------------------------------------------===//
337// Tests for control statements.
338//===----------------------------------------------------------------------===//
339
Daniel Jaspercdd06622013-05-14 10:31:09 +0000340TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000341 verifyFormat("if (true)\n f();\ng();");
342 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000343 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000344 verifyFormat("if constexpr (true)\n"
345 " f();\ng();");
346 verifyFormat("if constexpr (a)\n"
347 " if constexpr (b)\n"
348 " if constexpr (c)\n"
349 " g();\n"
350 "h();");
351 verifyFormat("if constexpr (a)\n"
352 " if constexpr (b) {\n"
353 " f();\n"
354 " }\n"
355 "g();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000356
Daniel Jasper3a685df2013-05-16 12:12:21 +0000357 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +0000358 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jasperced17f82013-01-16 15:44:34 +0000359 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
360 verifyFormat("if (a)\n"
361 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000362 " f();",
363 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000364 verifyFormat("{\n"
365 " if (a)\n"
366 " label:\n"
367 " f();\n"
368 "}",
369 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000370 verifyFormat("#define A \\\n"
371 " if (a) \\\n"
372 " label: \\\n"
373 " f()",
374 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000375 verifyFormat("if (a)\n"
376 " ;",
377 AllowsMergedIf);
378 verifyFormat("if (a)\n"
379 " if (b) return;",
380 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000381
Daniel Jasper3a685df2013-05-16 12:12:21 +0000382 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000383 " f();\n",
384 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000385 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000386 " f();",
387 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000388 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000389 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000390 "}",
391 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000392 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000393 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000394 "}",
395 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000396
397 AllowsMergedIf.ColumnLimit = 14;
398 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000399 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000400 " return;",
401 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000402
403 AllowsMergedIf.ColumnLimit = 13;
404 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000405}
406
Daniel Jasper3a685df2013-05-16 12:12:21 +0000407TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
408 FormatStyle AllowsMergedLoops = getLLVMStyle();
409 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
410 verifyFormat("while (true) continue;", AllowsMergedLoops);
411 verifyFormat("for (;;) continue;", AllowsMergedLoops);
412 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
413 verifyFormat("while (true)\n"
414 " ;",
415 AllowsMergedLoops);
416 verifyFormat("for (;;)\n"
417 " ;",
418 AllowsMergedLoops);
419 verifyFormat("for (;;)\n"
420 " for (;;) continue;",
421 AllowsMergedLoops);
422 verifyFormat("for (;;) // Can't merge this\n"
423 " continue;",
424 AllowsMergedLoops);
425 verifyFormat("for (;;) /* still don't merge */\n"
426 " continue;",
427 AllowsMergedLoops);
428}
429
Daniel Jasper17605d32014-05-14 09:33:35 +0000430TEST_F(FormatTest, FormatShortBracedStatements) {
431 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
432 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
433
434 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
435 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
436
437 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000438 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000439 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
440 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
441 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000442 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000443 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
444 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
445 verifyFormat("if (true) { //\n"
446 " f();\n"
447 "}",
448 AllowSimpleBracedStatements);
449 verifyFormat("if (true) {\n"
450 " f();\n"
451 " f();\n"
452 "}",
453 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000454 verifyFormat("if (true) {\n"
455 " f();\n"
456 "} else {\n"
457 " f();\n"
458 "}",
459 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000460
Daniel Jasperf92659e2017-06-19 07:45:41 +0000461 verifyFormat("struct A2 {\n"
462 " int X;\n"
463 "};",
464 AllowSimpleBracedStatements);
465 verifyFormat("typedef struct A2 {\n"
466 " int X;\n"
467 "} A2_t;",
468 AllowSimpleBracedStatements);
Daniel Jasperbd630732014-05-22 13:25:26 +0000469 verifyFormat("template <int> struct A2 {\n"
470 " struct B {};\n"
471 "};",
472 AllowSimpleBracedStatements);
473
Daniel Jasper17605d32014-05-14 09:33:35 +0000474 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
475 verifyFormat("if (true) {\n"
476 " f();\n"
477 "}",
478 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000479 verifyFormat("if (true) {\n"
480 " f();\n"
481 "} else {\n"
482 " f();\n"
483 "}",
484 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000485
486 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
487 verifyFormat("while (true) {\n"
488 " f();\n"
489 "}",
490 AllowSimpleBracedStatements);
491 verifyFormat("for (;;) {\n"
492 " f();\n"
493 "}",
494 AllowSimpleBracedStatements);
495}
496
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000497TEST_F(FormatTest, ParseIfElse) {
498 verifyFormat("if (true)\n"
499 " if (true)\n"
500 " if (true)\n"
501 " f();\n"
502 " else\n"
503 " g();\n"
504 " else\n"
505 " h();\n"
506 "else\n"
507 " i();");
508 verifyFormat("if (true)\n"
509 " if (true)\n"
510 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000511 " if (true)\n"
512 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000513 " } else {\n"
514 " g();\n"
515 " }\n"
516 " else\n"
517 " h();\n"
518 "else {\n"
519 " i();\n"
520 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000521 verifyFormat("if (true)\n"
522 " if constexpr (true)\n"
523 " if (true) {\n"
524 " if constexpr (true)\n"
525 " f();\n"
526 " } else {\n"
527 " g();\n"
528 " }\n"
529 " else\n"
530 " h();\n"
531 "else {\n"
532 " i();\n"
533 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000534 verifyFormat("void f() {\n"
535 " if (a) {\n"
536 " } else {\n"
537 " }\n"
538 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000539}
540
541TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000542 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000543 verifyFormat("if (a)\n"
544 " f();\n"
545 "else if (b)\n"
546 " g();\n"
547 "else\n"
548 " h();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000549 verifyFormat("if constexpr (a)\n"
550 " f();\n"
551 "else if constexpr (b)\n"
552 " g();\n"
553 "else\n"
554 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000555 verifyFormat("if (a) {\n"
556 " f();\n"
557 "}\n"
558 "// or else ..\n"
559 "else {\n"
560 " g()\n"
561 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000562
563 verifyFormat("if (a) {\n"
564 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
565 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
566 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000567 verifyFormat("if (a) {\n"
568 "} else if (\n"
569 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
570 "}",
571 getLLVMStyleWithColumns(62));
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000572 verifyFormat("if (a) {\n"
573 "} else if constexpr (\n"
574 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
575 "}",
576 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000577}
578
Daniel Jasperf7935112012-12-03 18:12:45 +0000579TEST_F(FormatTest, FormatsForLoop) {
580 verifyFormat(
581 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000582 " ++VeryVeryLongLoopVariable)\n"
583 " ;");
584 verifyFormat("for (;;)\n"
585 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000586 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000587 verifyFormat("for (;;) {\n"
588 " f();\n"
589 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000590 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000591
592 verifyFormat(
593 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
594 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000595 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000596
597 verifyFormat(
598 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000599 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000600 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
601 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000602 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000603 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
604 " I = FD->getDeclsInPrototypeScope().begin(),\n"
605 " E = FD->getDeclsInPrototypeScope().end();\n"
606 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000607 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
608 " I = Container.begin(),\n"
609 " E = Container.end();\n"
610 " I != E; ++I) {\n}",
611 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000612
Daniel Jasper48c62f92013-01-28 17:30:17 +0000613 verifyFormat(
614 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
615 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000616 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
617 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000618 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000619 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
620 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
621 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000622 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
623 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
624 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000625 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
626 " aaaaaaaaaa);\n"
627 " iter; ++iter) {\n"
628 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000629 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
630 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
631 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
632 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000633
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000634 FormatStyle NoBinPacking = getLLVMStyle();
635 NoBinPacking.BinPackParameters = false;
636 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
637 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
638 " aaaaaaaaaaaaaaaa,\n"
639 " aaaaaaaaaaaaaaaa,\n"
640 " aaaaaaaaaaaaaaaa);\n"
641 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
642 "}",
643 NoBinPacking);
644 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000645 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
646 " E = UnwrappedLines.end();\n"
647 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000648 " ++I) {\n}",
649 NoBinPacking);
Daniel Jasperf7935112012-12-03 18:12:45 +0000650}
651
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000652TEST_F(FormatTest, RangeBasedForLoops) {
653 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
654 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
655 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
656 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000657 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
658 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000659 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
660 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000661}
662
Daniel Jaspere1e43192014-04-01 12:55:11 +0000663TEST_F(FormatTest, ForEachLoops) {
664 verifyFormat("void f() {\n"
665 " foreach (Item *item, itemlist) {}\n"
666 " Q_FOREACH (Item *item, itemlist) {}\n"
667 " BOOST_FOREACH (Item *item, itemlist) {}\n"
668 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
669 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000670
671 // As function-like macros.
672 verifyFormat("#define foreach(x, y)\n"
673 "#define Q_FOREACH(x, y)\n"
674 "#define BOOST_FOREACH(x, y)\n"
675 "#define UNKNOWN_FOREACH(x, y)\n");
676
677 // Not as function-like macros.
678 verifyFormat("#define foreach (x, y)\n"
679 "#define Q_FOREACH (x, y)\n"
680 "#define BOOST_FOREACH (x, y)\n"
681 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000682}
683
Daniel Jasperf7935112012-12-03 18:12:45 +0000684TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000685 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000686 verifyFormat("while (true)\n"
687 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000688 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000689 verifyFormat("while () {\n"
690 " f();\n"
691 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000692}
693
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000694TEST_F(FormatTest, FormatsDoWhile) {
695 verifyFormat("do {\n"
696 " do_something();\n"
697 "} while (something());");
698 verifyFormat("do\n"
699 " do_something();\n"
700 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000701}
702
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000703TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000704 verifyFormat("switch (x) {\n"
705 "case 1:\n"
706 " f();\n"
707 " break;\n"
708 "case kFoo:\n"
709 "case ns::kBar:\n"
710 "case kBaz:\n"
711 " break;\n"
712 "default:\n"
713 " g();\n"
714 " break;\n"
715 "}");
716 verifyFormat("switch (x) {\n"
717 "case 1: {\n"
718 " f();\n"
719 " break;\n"
720 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000721 "case 2: {\n"
722 " break;\n"
723 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000724 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000725 verifyFormat("switch (x) {\n"
726 "case 1: {\n"
727 " f();\n"
728 " {\n"
729 " g();\n"
730 " h();\n"
731 " }\n"
732 " break;\n"
733 "}\n"
734 "}");
735 verifyFormat("switch (x) {\n"
736 "case 1: {\n"
737 " f();\n"
738 " if (foo) {\n"
739 " g();\n"
740 " h();\n"
741 " }\n"
742 " break;\n"
743 "}\n"
744 "}");
745 verifyFormat("switch (x) {\n"
746 "case 1: {\n"
747 " f();\n"
748 " g();\n"
749 "} break;\n"
750 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000751 verifyFormat("switch (test)\n"
752 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000753 verifyFormat("switch (x) {\n"
754 "default: {\n"
755 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000756 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000757 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000758 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000759 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000760 "// if 1, do f()\n"
761 "case 1:\n"
762 " f();\n"
763 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000764 verifyFormat("switch (x) {\n"
765 "case 1:\n"
766 " // Do amazing stuff\n"
767 " {\n"
768 " f();\n"
769 " g();\n"
770 " }\n"
771 " break;\n"
772 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000773 verifyFormat("#define A \\\n"
774 " switch (x) { \\\n"
775 " case a: \\\n"
776 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000777 " }",
778 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000779 verifyFormat("#define OPERATION_CASE(name) \\\n"
780 " case OP_name: \\\n"
781 " return operations::Operation##name\n",
782 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000783 verifyFormat("switch (x) {\n"
784 "case 1:;\n"
785 "default:;\n"
786 " int i;\n"
787 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000788
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000789 verifyGoogleFormat("switch (x) {\n"
790 " case 1:\n"
791 " f();\n"
792 " break;\n"
793 " case kFoo:\n"
794 " case ns::kBar:\n"
795 " case kBaz:\n"
796 " break;\n"
797 " default:\n"
798 " g();\n"
799 " break;\n"
800 "}");
801 verifyGoogleFormat("switch (x) {\n"
802 " case 1: {\n"
803 " f();\n"
804 " break;\n"
805 " }\n"
806 "}");
807 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000808 " ;");
809
810 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
811 " case OP_name: \\\n"
812 " return operations::Operation##name\n");
813 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
814 " // Get the correction operation class.\n"
815 " switch (OpCode) {\n"
816 " CASE(Add);\n"
817 " CASE(Subtract);\n"
818 " default:\n"
819 " return operations::Unknown;\n"
820 " }\n"
821 "#undef OPERATION_CASE\n"
822 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000823 verifyFormat("DEBUG({\n"
824 " switch (x) {\n"
825 " case A:\n"
826 " f();\n"
827 " break;\n"
828 " // On B:\n"
829 " case B:\n"
830 " g();\n"
831 " break;\n"
832 " }\n"
833 "});");
Daniel Jasper031e2402014-04-28 07:48:36 +0000834 verifyFormat("switch (a) {\n"
835 "case (b):\n"
836 " return;\n"
837 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000838
839 verifyFormat("switch (a) {\n"
840 "case some_namespace::\n"
841 " some_constant:\n"
842 " return;\n"
843 "}",
844 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000845}
846
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000847TEST_F(FormatTest, CaseRanges) {
848 verifyFormat("switch (x) {\n"
849 "case 'A' ... 'Z':\n"
850 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000851 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000852 " break;\n"
853 "}");
854}
855
Daniel Jasperb87899b2014-09-10 13:11:45 +0000856TEST_F(FormatTest, ShortCaseLabels) {
857 FormatStyle Style = getLLVMStyle();
858 Style.AllowShortCaseLabelsOnASingleLine = true;
859 verifyFormat("switch (a) {\n"
860 "case 1: x = 1; break;\n"
861 "case 2: return;\n"
862 "case 3:\n"
863 "case 4:\n"
864 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +0000865 "case 6: // comment\n"
866 " return;\n"
867 "case 7:\n"
868 " // comment\n"
869 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +0000870 "case 8:\n"
871 " x = 8; // comment\n"
872 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000873 "default: y = 1; break;\n"
874 "}",
875 Style);
876 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +0000877 "#if FOO\n"
878 "case 0: return 0;\n"
879 "#endif\n"
880 "}",
881 Style);
882 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000883 "case 1: {\n"
884 "}\n"
885 "case 2: {\n"
886 " return;\n"
887 "}\n"
888 "case 3: {\n"
889 " x = 1;\n"
890 " return;\n"
891 "}\n"
892 "case 4:\n"
893 " if (x)\n"
894 " return;\n"
895 "}",
896 Style);
897 Style.ColumnLimit = 21;
898 verifyFormat("switch (a) {\n"
899 "case 1: x = 1; break;\n"
900 "case 2: return;\n"
901 "case 3:\n"
902 "case 4:\n"
903 "case 5: return;\n"
904 "default:\n"
905 " y = 1;\n"
906 " break;\n"
907 "}",
908 Style);
909}
910
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000911TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000912 verifyFormat("void f() {\n"
913 " some_code();\n"
914 "test_label:\n"
915 " some_other_code();\n"
916 " {\n"
917 " some_more_code();\n"
918 " another_label:\n"
919 " some_more_code();\n"
920 " }\n"
921 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +0000922 verifyFormat("{\n"
923 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000924 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +0000925 " some_other_code();\n"
926 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000927 verifyFormat("{\n"
928 " some_code();\n"
929 "test_label:;\n"
930 " int i = 0;\n"
931 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000932}
933
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000934//===----------------------------------------------------------------------===//
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000935// Tests for classes, namespaces, etc.
936//===----------------------------------------------------------------------===//
937
938TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +0000939 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000940}
941
942TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
943 verifyFormat("class A {\n"
944 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +0000945 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000946 "protected:\n"
947 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000948 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000949 "};");
950 verifyGoogleFormat("class A {\n"
951 " public:\n"
952 " protected:\n"
953 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000954 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000955 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +0000956 verifyFormat("class A {\n"
957 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +0000958 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +0000959 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +0000960 " void f2() {}\n"
961 "protected slots:\n"
962 " void f3() {}\n"
963 "protected Q_SLOTS:\n"
964 " void f4() {}\n"
965 "private slots:\n"
966 " void f5() {}\n"
967 "private Q_SLOTS:\n"
968 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +0000969 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +0000970 " void g1();\n"
971 "Q_SIGNALS:\n"
972 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +0000973 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +0000974
975 // Don't interpret 'signals' the wrong way.
976 verifyFormat("signals.set();");
977 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +0000978 verifyFormat("{\n"
979 " signals.set(); // This needs indentation.\n"
980 "}");
Daniel Jasper31343832016-07-27 10:13:24 +0000981 verifyFormat("void f() {\n"
982 "label:\n"
983 " signals.baz();\n"
984 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000985}
986
Alexander Kornienkofd433362013-03-27 17:08:02 +0000987TEST_F(FormatTest, SeparatesLogicalBlocks) {
988 EXPECT_EQ("class A {\n"
989 "public:\n"
990 " void f();\n"
991 "\n"
992 "private:\n"
993 " void g() {}\n"
994 " // test\n"
995 "protected:\n"
996 " int h;\n"
997 "};",
998 format("class A {\n"
999 "public:\n"
1000 "void f();\n"
1001 "private:\n"
1002 "void g() {}\n"
1003 "// test\n"
1004 "protected:\n"
1005 "int h;\n"
1006 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00001007 EXPECT_EQ("class A {\n"
1008 "protected:\n"
1009 "public:\n"
1010 " void f();\n"
1011 "};",
1012 format("class A {\n"
1013 "protected:\n"
1014 "\n"
1015 "public:\n"
1016 "\n"
1017 " void f();\n"
1018 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00001019
1020 // Even ensure proper spacing inside macros.
1021 EXPECT_EQ("#define B \\\n"
1022 " class A { \\\n"
1023 " protected: \\\n"
1024 " public: \\\n"
1025 " void f(); \\\n"
1026 " };",
1027 format("#define B \\\n"
1028 " class A { \\\n"
1029 " protected: \\\n"
1030 " \\\n"
1031 " public: \\\n"
1032 " \\\n"
1033 " void f(); \\\n"
1034 " };",
1035 getGoogleStyle()));
1036 // But don't remove empty lines after macros ending in access specifiers.
1037 EXPECT_EQ("#define A private:\n"
1038 "\n"
1039 "int i;",
1040 format("#define A private:\n"
1041 "\n"
1042 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00001043}
1044
Daniel Jasper83193602013-04-05 17:22:09 +00001045TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001046 verifyFormat("class A : public B {};");
1047 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001048
1049 verifyFormat(
1050 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001051 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00001052 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1053 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001054 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001055 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001056 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001057 verifyFormat("class AAAAAAAAAAAA : public B,\n"
1058 " public C,\n"
1059 " public D,\n"
1060 " public E,\n"
1061 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001062 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00001063
1064 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00001065 " ReallyReallyLongClassName {\n"
1066 " int i;\n"
1067 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00001068 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00001069 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1070 " aaaaaaaaaaaaaaaa> {};");
1071 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1072 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1073 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00001074 verifyFormat("template <class R, class C>\n"
1075 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1076 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00001077 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00001078}
1079
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00001080TEST_F(FormatTest, BreakBeforeInheritanceComma) {
1081 FormatStyle StyleWithInheritanceBreak = getLLVMStyle();
1082 StyleWithInheritanceBreak.BreakBeforeInheritanceComma = true;
1083
1084 verifyFormat("class MyClass : public X {};", StyleWithInheritanceBreak);
1085 verifyFormat("class MyClass\n"
1086 " : public X\n"
1087 " , public Y {};",
1088 StyleWithInheritanceBreak);
1089}
1090
Manuel Klimek28cacc72013-01-07 18:10:23 +00001091TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00001092 verifyFormat("class A {\n} a, b;");
1093 verifyFormat("struct A {\n} a, b;");
1094 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00001095}
1096
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001097TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001098 verifyFormat("enum {\n"
1099 " Zero,\n"
1100 " One = 1,\n"
1101 " Two = One + 1,\n"
1102 " Three = (One + Two),\n"
1103 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1104 " Five = (One, Two, Three, Four, 5)\n"
1105 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001106 verifyGoogleFormat("enum {\n"
1107 " Zero,\n"
1108 " One = 1,\n"
1109 " Two = One + 1,\n"
1110 " Three = (One + Two),\n"
1111 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1112 " Five = (One, Two, Three, Four, 5)\n"
1113 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001114 verifyFormat("enum Enum {};");
1115 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001116 verifyFormat("enum X E {} d;");
1117 verifyFormat("enum __attribute__((...)) E {} d;");
1118 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00001119 verifyFormat("enum {\n"
1120 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001121 "};",
1122 getLLVMStyleWithColumns(30));
1123
1124 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00001125 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001126
1127 EXPECT_EQ("enum KeepEmptyLines {\n"
1128 " ONE,\n"
1129 "\n"
1130 " TWO,\n"
1131 "\n"
1132 " THREE\n"
1133 "}",
1134 format("enum KeepEmptyLines {\n"
1135 " ONE,\n"
1136 "\n"
1137 " TWO,\n"
1138 "\n"
1139 "\n"
1140 " THREE\n"
1141 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00001142 verifyFormat("enum E { // comment\n"
1143 " ONE,\n"
1144 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00001145 "};\n"
1146 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001147 // Not enums.
1148 verifyFormat("enum X f() {\n"
1149 " a();\n"
1150 " return 42;\n"
1151 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00001152 verifyFormat("enum X Type::f() {\n"
1153 " a();\n"
1154 " return 42;\n"
1155 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001156 verifyFormat("enum ::X f() {\n"
1157 " a();\n"
1158 " return 42;\n"
1159 "}");
1160 verifyFormat("enum ns::X f() {\n"
1161 " a();\n"
1162 " return 42;\n"
1163 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001164}
1165
Daniel Jasperb7150872013-08-30 10:10:19 +00001166TEST_F(FormatTest, FormatsEnumsWithErrors) {
1167 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001168 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001169 " Two = 1;\n"
1170 "};");
1171 verifyFormat("namespace n {\n"
1172 "enum Type {\n"
1173 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001174 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001175 " int i;\n"
1176 "}\n"
1177 "void g() {}");
1178}
1179
Daniel Jasper2b41a822013-08-20 12:42:50 +00001180TEST_F(FormatTest, FormatsEnumStruct) {
1181 verifyFormat("enum struct {\n"
1182 " Zero,\n"
1183 " One = 1,\n"
1184 " Two = One + 1,\n"
1185 " Three = (One + Two),\n"
1186 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1187 " Five = (One, Two, Three, Four, 5)\n"
1188 "};");
1189 verifyFormat("enum struct Enum {};");
1190 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001191 verifyFormat("enum struct X E {} d;");
1192 verifyFormat("enum struct __attribute__((...)) E {} d;");
1193 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001194 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
1195}
1196
1197TEST_F(FormatTest, FormatsEnumClass) {
1198 verifyFormat("enum class {\n"
1199 " Zero,\n"
1200 " One = 1,\n"
1201 " Two = One + 1,\n"
1202 " Three = (One + Two),\n"
1203 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1204 " Five = (One, Two, Three, Four, 5)\n"
1205 "};");
1206 verifyFormat("enum class Enum {};");
1207 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001208 verifyFormat("enum class X E {} d;");
1209 verifyFormat("enum class __attribute__((...)) E {} d;");
1210 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001211 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
1212}
1213
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001214TEST_F(FormatTest, FormatsEnumTypes) {
1215 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001216 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001217 " B\n"
1218 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00001219 verifyFormat("enum X : int { A, B };");
1220 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001221}
1222
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001223TEST_F(FormatTest, FormatsNSEnums) {
1224 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1225 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1226 " // Information about someDecentlyLongValue.\n"
1227 " someDecentlyLongValue,\n"
1228 " // Information about anotherDecentlyLongValue.\n"
1229 " anotherDecentlyLongValue,\n"
1230 " // Information about aThirdDecentlyLongValue.\n"
1231 " aThirdDecentlyLongValue\n"
1232 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00001233 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1234 " a = 1,\n"
1235 " b = 2,\n"
1236 " c = 3,\n"
1237 "};");
1238 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1239 " a = 1,\n"
1240 " b = 2,\n"
1241 " c = 3,\n"
1242 "};");
1243 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1244 " a = 1,\n"
1245 " b = 2,\n"
1246 " c = 3,\n"
1247 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001248}
1249
Nico Weber7769a902013-01-14 05:49:49 +00001250TEST_F(FormatTest, FormatsBitfields) {
1251 verifyFormat("struct Bitfields {\n"
1252 " unsigned sClass : 8;\n"
1253 " unsigned ValueKind : 2;\n"
1254 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00001255 verifyFormat("struct A {\n"
1256 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1257 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1258 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00001259 verifyFormat("struct MyStruct {\n"
1260 " uchar data;\n"
1261 " uchar : 8;\n"
1262 " uchar : 8;\n"
1263 " uchar other;\n"
1264 "};");
Nico Weber7769a902013-01-14 05:49:49 +00001265}
1266
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001267TEST_F(FormatTest, FormatsNamespaces) {
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001268 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1269 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1270
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001271 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001272 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001273 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001274 "}",
1275 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001276 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001277 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001278 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001279 "}",
1280 LLVMWithNoNamespaceFix);
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001281 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001282 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001283 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001284 "}",
1285 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001286 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001287 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001288 "void f() { f(); }",
1289 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001290
1291 // This code is more common than we thought; if we
1292 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001293 // its own line, which is undesirable.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001294 verifyFormat("namespace {};",
1295 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001296 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001297 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001298 "};",
1299 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001300
1301 verifyFormat("namespace {\n"
1302 "int SomeVariable = 0; // comment\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001303 "} // namespace",
1304 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001305 EXPECT_EQ("#ifndef HEADER_GUARD\n"
1306 "#define HEADER_GUARD\n"
1307 "namespace my_namespace {\n"
1308 "int i;\n"
1309 "} // my_namespace\n"
1310 "#endif // HEADER_GUARD",
1311 format("#ifndef HEADER_GUARD\n"
1312 " #define HEADER_GUARD\n"
1313 " namespace my_namespace {\n"
1314 "int i;\n"
1315 "} // my_namespace\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001316 "#endif // HEADER_GUARD",
1317 LLVMWithNoNamespaceFix));
Daniel Jasper65ee3472013-07-31 23:16:02 +00001318
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001319 EXPECT_EQ("namespace A::B {\n"
1320 "class C {};\n"
1321 "}",
1322 format("namespace A::B {\n"
1323 "class C {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001324 "}",
1325 LLVMWithNoNamespaceFix));
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001326
Daniel Jasper65ee3472013-07-31 23:16:02 +00001327 FormatStyle Style = getLLVMStyle();
1328 Style.NamespaceIndentation = FormatStyle::NI_All;
1329 EXPECT_EQ("namespace out {\n"
1330 " int i;\n"
1331 " namespace in {\n"
1332 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001333 " } // namespace in\n"
1334 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001335 format("namespace out {\n"
1336 "int i;\n"
1337 "namespace in {\n"
1338 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001339 "} // namespace in\n"
1340 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001341 Style));
1342
1343 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1344 EXPECT_EQ("namespace out {\n"
1345 "int i;\n"
1346 "namespace in {\n"
1347 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001348 "} // namespace in\n"
1349 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001350 format("namespace out {\n"
1351 "int i;\n"
1352 "namespace in {\n"
1353 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001354 "} // namespace in\n"
1355 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001356 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001357}
1358
Francois Ferrande56a8292017-06-14 12:29:47 +00001359TEST_F(FormatTest, FormatsCompactNamespaces) {
1360 FormatStyle Style = getLLVMStyle();
1361 Style.CompactNamespaces = true;
1362
1363 verifyFormat("namespace A { namespace B {\n"
1364 "}} // namespace A::B",
1365 Style);
1366
1367 EXPECT_EQ("namespace out { namespace in {\n"
1368 "}} // namespace out::in",
1369 format("namespace out {\n"
1370 "namespace in {\n"
1371 "} // namespace in\n"
1372 "} // namespace out",
1373 Style));
1374
1375 // Only namespaces which have both consecutive opening and end get compacted
1376 EXPECT_EQ("namespace out {\n"
1377 "namespace in1 {\n"
1378 "} // namespace in1\n"
1379 "namespace in2 {\n"
1380 "} // namespace in2\n"
1381 "} // namespace out",
1382 format("namespace out {\n"
1383 "namespace in1 {\n"
1384 "} // namespace in1\n"
1385 "namespace in2 {\n"
1386 "} // namespace in2\n"
1387 "} // namespace out",
1388 Style));
1389
1390 EXPECT_EQ("namespace out {\n"
1391 "int i;\n"
1392 "namespace in {\n"
1393 "int j;\n"
1394 "} // namespace in\n"
1395 "int k;\n"
1396 "} // namespace out",
1397 format("namespace out { int i;\n"
1398 "namespace in { int j; } // namespace in\n"
1399 "int k; } // namespace out",
1400 Style));
1401
1402 EXPECT_EQ("namespace A { namespace B { namespace C {\n"
1403 "}}} // namespace A::B::C\n",
1404 format("namespace A { namespace B {\n"
1405 "namespace C {\n"
1406 "}} // namespace B::C\n"
1407 "} // namespace A\n",
1408 Style));
1409
1410 Style.ColumnLimit = 40;
1411 EXPECT_EQ("namespace aaaaaaaaaa {\n"
1412 "namespace bbbbbbbbbb {\n"
1413 "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
1414 format("namespace aaaaaaaaaa {\n"
1415 "namespace bbbbbbbbbb {\n"
1416 "} // namespace bbbbbbbbbb\n"
1417 "} // namespace aaaaaaaaaa",
1418 Style));
1419
1420 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
1421 "namespace cccccc {\n"
1422 "}}} // namespace aaaaaa::bbbbbb::cccccc",
1423 format("namespace aaaaaa {\n"
1424 "namespace bbbbbb {\n"
1425 "namespace cccccc {\n"
1426 "} // namespace cccccc\n"
1427 "} // namespace bbbbbb\n"
1428 "} // namespace aaaaaa",
1429 Style));
1430 Style.ColumnLimit = 80;
1431
1432 // Extra semicolon after 'inner' closing brace prevents merging
1433 EXPECT_EQ("namespace out { namespace in {\n"
1434 "}; } // namespace out::in",
1435 format("namespace out {\n"
1436 "namespace in {\n"
1437 "}; // namespace in\n"
1438 "} // namespace out",
1439 Style));
1440
1441 // Extra semicolon after 'outer' closing brace is conserved
1442 EXPECT_EQ("namespace out { namespace in {\n"
1443 "}}; // namespace out::in",
1444 format("namespace out {\n"
1445 "namespace in {\n"
1446 "} // namespace in\n"
1447 "}; // namespace out",
1448 Style));
1449
1450 Style.NamespaceIndentation = FormatStyle::NI_All;
1451 EXPECT_EQ("namespace out { namespace in {\n"
1452 " int i;\n"
1453 "}} // namespace out::in",
1454 format("namespace out {\n"
1455 "namespace in {\n"
1456 "int i;\n"
1457 "} // namespace in\n"
1458 "} // namespace out",
1459 Style));
1460 EXPECT_EQ("namespace out { namespace mid {\n"
1461 " namespace in {\n"
1462 " int j;\n"
1463 " } // namespace in\n"
1464 " int k;\n"
1465 "}} // namespace out::mid",
1466 format("namespace out { namespace mid {\n"
1467 "namespace in { int j; } // namespace in\n"
1468 "int k; }} // namespace out::mid",
1469 Style));
1470
1471 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1472 EXPECT_EQ("namespace out { namespace in {\n"
1473 " int i;\n"
1474 "}} // namespace out::in",
1475 format("namespace out {\n"
1476 "namespace in {\n"
1477 "int i;\n"
1478 "} // namespace in\n"
1479 "} // namespace out",
1480 Style));
1481 EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
1482 " int i;\n"
1483 "}}} // namespace out::mid::in",
1484 format("namespace out {\n"
1485 "namespace mid {\n"
1486 "namespace in {\n"
1487 "int i;\n"
1488 "} // namespace in\n"
1489 "} // namespace mid\n"
1490 "} // namespace out",
1491 Style));
1492}
1493
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001494TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00001495
Daniel Jasper40aacf42013-03-14 13:45:21 +00001496TEST_F(FormatTest, FormatsInlineASM) {
1497 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00001498 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00001499 verifyFormat(
1500 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1501 " \"cpuid\\n\\t\"\n"
1502 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00001503 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00001504 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00001505 EXPECT_EQ(
1506 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001507 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001508 " mov edx,[that] // vtable in edx\n"
1509 " mov eax,methodIndex\n"
1510 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001511 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001512 "}",
1513 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1514 " __asm {\n"
1515 " mov edx,[that] // vtable in edx\n"
1516 " mov eax,methodIndex\n"
1517 " call [edx][eax*4] // stdcall\n"
1518 " }\n"
1519 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00001520 EXPECT_EQ("_asm {\n"
1521 " xor eax, eax;\n"
1522 " cpuid;\n"
1523 "}",
1524 format("_asm {\n"
1525 " xor eax, eax;\n"
1526 " cpuid;\n"
1527 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00001528 verifyFormat("void function() {\n"
1529 " // comment\n"
1530 " asm(\"\");\n"
1531 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00001532 EXPECT_EQ("__asm {\n"
1533 "}\n"
1534 "int i;",
1535 format("__asm {\n"
1536 "}\n"
1537 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00001538}
1539
Nico Weberd5650bd2013-01-07 16:36:17 +00001540TEST_F(FormatTest, FormatTryCatch) {
1541 verifyFormat("try {\n"
1542 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001543 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001544 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001545 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001546 " exit(42);\n"
1547 "}");
1548
1549 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00001550 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001551 " return 5;\n"
1552 "}");
1553 verifyFormat("class A {\n"
1554 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001555 " A() try : a(0) {\n"
1556 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001557 " throw;\n"
1558 " }\n"
1559 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00001560
1561 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001562 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00001563}
1564
Nico Weberfac23712015-02-04 15:26:27 +00001565TEST_F(FormatTest, FormatSEHTryCatch) {
1566 verifyFormat("__try {\n"
1567 " int a = b * c;\n"
1568 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
1569 " // Do nothing.\n"
1570 "}");
1571
1572 verifyFormat("__try {\n"
1573 " int a = b * c;\n"
1574 "} __finally {\n"
1575 " // Do nothing.\n"
1576 "}");
1577
1578 verifyFormat("DEBUG({\n"
1579 " __try {\n"
1580 " } __finally {\n"
1581 " }\n"
1582 "});\n");
1583}
1584
Daniel Jasper04a71a42014-05-08 11:58:24 +00001585TEST_F(FormatTest, IncompleteTryCatchBlocks) {
1586 verifyFormat("try {\n"
1587 " f();\n"
1588 "} catch {\n"
1589 " g();\n"
1590 "}");
1591 verifyFormat("try {\n"
1592 " f();\n"
1593 "} catch (A a) MACRO(x) {\n"
1594 " g();\n"
1595 "} catch (B b) MACRO(x) {\n"
1596 " g();\n"
1597 "}");
1598}
1599
1600TEST_F(FormatTest, FormatTryCatchBraceStyles) {
1601 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00001602 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
1603 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00001604 Style.BreakBeforeBraces = BraceStyle;
1605 verifyFormat("try {\n"
1606 " // something\n"
1607 "} catch (...) {\n"
1608 " // something\n"
1609 "}",
1610 Style);
1611 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00001612 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
1613 verifyFormat("try {\n"
1614 " // something\n"
1615 "}\n"
1616 "catch (...) {\n"
1617 " // something\n"
1618 "}",
1619 Style);
Nico Weberfac23712015-02-04 15:26:27 +00001620 verifyFormat("__try {\n"
1621 " // something\n"
1622 "}\n"
1623 "__finally {\n"
1624 " // something\n"
1625 "}",
1626 Style);
Nico Weber33381f52015-02-07 01:57:32 +00001627 verifyFormat("@try {\n"
1628 " // something\n"
1629 "}\n"
1630 "@finally {\n"
1631 " // something\n"
1632 "}",
1633 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001634 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
1635 verifyFormat("try\n"
1636 "{\n"
1637 " // something\n"
1638 "}\n"
1639 "catch (...)\n"
1640 "{\n"
1641 " // something\n"
1642 "}",
1643 Style);
1644 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
1645 verifyFormat("try\n"
1646 " {\n"
1647 " // something\n"
1648 " }\n"
1649 "catch (...)\n"
1650 " {\n"
1651 " // something\n"
1652 " }",
1653 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00001654 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1655 Style.BraceWrapping.BeforeCatch = true;
1656 verifyFormat("try {\n"
1657 " // something\n"
1658 "}\n"
1659 "catch (...) {\n"
1660 " // something\n"
1661 "}",
1662 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001663}
1664
Daniel Jaspere25509f2012-12-17 11:29:41 +00001665TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001666 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00001667
Daniel Jaspera44991332015-04-29 13:06:49 +00001668 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
1669 " 100000000, "
1670 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00001671
Daniel Jasper473c62c2013-05-17 09:35:01 +00001672 // Here, everything other than the "}" would fit on a line.
1673 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001674 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001675 EXPECT_EQ("S s = {a,\n"
1676 "\n"
1677 " b};",
1678 format("S s = {\n"
1679 " a,\n"
1680 "\n"
1681 " b\n"
1682 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00001683
1684 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
1685 // line. However, the formatting looks a bit off and this probably doesn't
1686 // happen often in practice.
1687 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001688 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00001689 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001690}
1691
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001692TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001693 verifyFormat("const struct A a = {.a = 1, .b = 2};");
1694 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
1695 " .bbbbbbbbbb = 2,\n"
1696 " .cccccccccc = 3,\n"
1697 " .dddddddddd = 4,\n"
1698 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001699 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001700 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
1701 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
1702 " .ccccccccccccccccccccccccccc = 3,\n"
1703 " .ddddddddddddddddddddddddddd = 4,\n"
1704 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001705
1706 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
1707}
1708
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001709TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001710 verifyFormat("static A x = {{{}}};\n");
1711 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
1712 " {init1, init2, init3, init4}}};",
1713 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00001714
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001715 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001716 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1717 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1718 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
1719 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00001720 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001721 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1722 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1723 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00001724 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
1725 " {rect.fRight - rect.fLeft, rect.fBottom - "
1726 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001727
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001728 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001729 "SomeArrayOfSomeType a = {\n"
1730 " {{1, 2, 3},\n"
1731 " {1, 2, 3},\n"
1732 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
1733 " 333333333333333333333333333333},\n"
1734 " {1, 2, 3},\n"
1735 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00001736 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00001737 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00001738 " {{1, 2, 3}},\n"
1739 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001740 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
1741 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00001742 " {{1, 2, 3}},\n"
1743 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001744
Daniel Jaspera44991332015-04-29 13:06:49 +00001745 verifyFormat("struct {\n"
1746 " unsigned bit;\n"
1747 " const char *const name;\n"
1748 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
1749 " {kOsWin, \"Windows\"},\n"
1750 " {kOsLinux, \"Linux\"},\n"
1751 " {kOsCrOS, \"Chrome OS\"}};");
1752 verifyFormat("struct {\n"
1753 " unsigned bit;\n"
1754 " const char *const name;\n"
1755 "} kBitsToOs[] = {\n"
1756 " {kOsMac, \"Mac\"},\n"
1757 " {kOsWin, \"Windows\"},\n"
1758 " {kOsLinux, \"Linux\"},\n"
1759 " {kOsCrOS, \"Chrome OS\"},\n"
1760 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001761}
1762
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001763TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
1764 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
1765 " \\\n"
1766 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
1767}
1768
Daniel Jasperda16db32013-01-07 10:48:50 +00001769TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00001770 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
1771 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00001772
1773 // Do break defaulted and deleted functions.
1774 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1775 " default;",
1776 getLLVMStyleWithColumns(40));
1777 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1778 " delete;",
1779 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00001780}
1781
1782TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
1783 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
1784 getLLVMStyleWithColumns(40));
1785 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1786 getLLVMStyleWithColumns(40));
1787 EXPECT_EQ("#define Q \\\n"
1788 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
1789 " \"aaaaaaaa.cpp\"",
1790 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1791 getLLVMStyleWithColumns(40)));
1792}
1793
1794TEST_F(FormatTest, UnderstandsLinePPDirective) {
1795 EXPECT_EQ("# 123 \"A string literal\"",
1796 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00001797}
1798
Manuel Klimek591b5802013-01-31 15:58:48 +00001799TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00001800 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00001801 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001802}
1803
1804TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
1805 EXPECT_EQ("#line 42 \"test\"\n",
1806 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001807 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
1808 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001809}
1810
1811TEST_F(FormatTest, EndOfFileEndsPPDirective) {
1812 EXPECT_EQ("#line 42 \"test\"",
1813 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001814 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001815}
1816
Daniel Jasper877615c2013-10-11 19:45:02 +00001817TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
1818 verifyFormat("#define A \\x20");
1819 verifyFormat("#define A \\ x20");
1820 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
1821 verifyFormat("#define A ''");
1822 verifyFormat("#define A ''qqq");
1823 verifyFormat("#define A `qqq");
1824 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00001825 EXPECT_EQ("const char *c = STRINGIFY(\n"
1826 "\\na : b);",
1827 format("const char * c = STRINGIFY(\n"
1828 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00001829
1830 verifyFormat("a\r\\");
1831 verifyFormat("a\v\\");
1832 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00001833}
1834
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001835TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001836 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
1837 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001838 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001839 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00001840 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00001841
1842 verifyFormat("#define A A\n#define A A");
1843 verifyFormat("#define A(X) A\n#define A A");
1844
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001845 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
1846 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001847}
1848
1849TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001850 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001851 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001852 "#define A( \\\n"
1853 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001854 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001855 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001856 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001857 " #include \"a.h\"\n"
1858 "#define A(A,\\\n"
1859 " B)\n"
1860 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001861 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001862 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001863}
1864
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001865TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00001866
1867TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
1868 EXPECT_EQ("#define A \\\n"
1869 " c; \\\n"
1870 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001871 "f;",
1872 format("#define A c; e;\n"
1873 "f;",
1874 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00001875}
1876
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001877TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00001878
Manuel Klimek1abf7892013-01-04 23:34:14 +00001879TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00001880 EXPECT_EQ("int x,\n"
1881 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001882 " y;",
1883 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00001884}
1885
Manuel Klimek09e07972013-01-05 21:34:55 +00001886TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00001887 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00001888 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00001889 verifyFormat("#define A \\\n"
1890 " { \\\n"
1891 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001892 " }",
1893 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00001894
1895 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001896 " void function##X()",
1897 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00001898
1899 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001900 " void a##b##c()",
1901 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00001902
Daniel Jasper39825ea2013-01-14 15:40:57 +00001903 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00001904}
1905
Manuel Klimekd053c5b2013-01-23 14:37:36 +00001906TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00001907 EXPECT_EQ("#define A (x)", format("#define A (x)"));
1908 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00001909}
1910
Manuel Klimek0c137952013-02-11 12:33:24 +00001911TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
1912 EXPECT_EQ("#define A b;", format("#define A \\\n"
1913 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001914 " b;",
1915 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001916 EXPECT_EQ("#define A \\\n"
1917 " \\\n"
1918 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001919 " b;",
1920 format("#define A \\\n"
1921 " \\\n"
1922 " a; \\\n"
1923 " b;",
1924 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001925 EXPECT_EQ("#define A \\\n"
1926 " a; \\\n"
1927 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001928 " b;",
1929 format("#define A \\\n"
1930 " a; \\\n"
1931 " \\\n"
1932 " b;",
1933 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001934}
1935
Daniel Jasper00475962013-02-19 17:14:38 +00001936TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001937 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00001938 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00001939 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00001940 " case 2\n",
1941 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00001942 verifyFormat("#define MACRO(a) \\\n"
1943 " if (a) \\\n"
1944 " f(); \\\n"
1945 " else \\\n"
1946 " g()",
1947 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00001948 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001949 verifyIncompleteFormat("#define STR(x) #x\n"
1950 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00001951 verifyFormat("#pragma omp threadprivate( \\\n"
1952 " y)), // expected-warning",
1953 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00001954 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00001955 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001956 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00001957 "#define b \\\n"
1958 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001959 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00001960 "a",
1961 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00001962 verifyFormat("#define A \\\n"
1963 " { \\\n"
1964 " {\n"
1965 "#define B \\\n"
1966 " } \\\n"
1967 " }",
1968 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00001969 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00001970 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00001971 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00001972 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00001973}
1974
Daniel Jasper40e19212013-05-29 13:16:10 +00001975TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
1976 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
1977 EXPECT_EQ("class A : public QObject {\n"
1978 " Q_OBJECT\n"
1979 "\n"
1980 " A() {}\n"
1981 "};",
1982 format("class A : public QObject {\n"
1983 " Q_OBJECT\n"
1984 "\n"
1985 " A() {\n}\n"
1986 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00001987 EXPECT_EQ("MACRO\n"
1988 "/*static*/ int i;",
1989 format("MACRO\n"
1990 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00001991 EXPECT_EQ("SOME_MACRO\n"
1992 "namespace {\n"
1993 "void f();\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001994 "} // namespace",
Daniel Jasper41a0f782013-05-29 14:09:17 +00001995 format("SOME_MACRO\n"
1996 " namespace {\n"
1997 "void f( );\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001998 "} // namespace"));
Daniel Jasper40e19212013-05-29 13:16:10 +00001999 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00002000 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2001 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002002 // Only if everything is upper case.
2003 EXPECT_EQ("class A : public QObject {\n"
2004 " Q_Object A() {}\n"
2005 "};",
2006 format("class A : public QObject {\n"
2007 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00002008 " A() {\n}\n"
2009 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00002010
2011 // Only if the next line can actually start an unwrapped line.
2012 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2013 format("SOME_WEIRD_LOG_MACRO\n"
2014 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00002015
2016 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00002017 "(n, buffers))\n",
2018 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00002019}
2020
Alexander Kornienkode644272013-04-08 22:16:06 +00002021TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2022 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2023 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2024 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002025 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00002026 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2027 "int *createScopDetectionPass() { return 0; }",
2028 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2029 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2030 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2031 " class X {};\n"
2032 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2033 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002034 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2035 // braces, so that inner block is indented one level more.
2036 EXPECT_EQ("int q() {\n"
2037 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2038 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2039 " IPC_END_MESSAGE_MAP()\n"
2040 "}",
2041 format("int q() {\n"
2042 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2043 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2044 " IPC_END_MESSAGE_MAP()\n"
2045 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00002046
Daniel Jasper352dae12014-01-03 11:50:46 +00002047 // Same inside macros.
2048 EXPECT_EQ("#define LIST(L) \\\n"
2049 " L(A) \\\n"
2050 " L(B) \\\n"
2051 " L(C)",
2052 format("#define LIST(L) \\\n"
2053 " L(A) \\\n"
2054 " L(B) \\\n"
2055 " L(C)",
2056 getGoogleStyle()));
2057
Daniel Jasper545c6522013-09-17 09:26:07 +00002058 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002059 EXPECT_EQ("int q() {\n"
2060 " f(x);\n"
2061 " f(x) {}\n"
2062 " f(x)->g();\n"
2063 " f(x)->*g();\n"
2064 " f(x).g();\n"
2065 " f(x) = x;\n"
2066 " f(x) += x;\n"
2067 " f(x) -= x;\n"
2068 " f(x) *= x;\n"
2069 " f(x) /= x;\n"
2070 " f(x) %= x;\n"
2071 " f(x) &= x;\n"
2072 " f(x) |= x;\n"
2073 " f(x) ^= x;\n"
2074 " f(x) >>= x;\n"
2075 " f(x) <<= x;\n"
2076 " f(x)[y].z();\n"
2077 " LOG(INFO) << x;\n"
2078 " ifstream(x) >> x;\n"
2079 "}\n",
2080 format("int q() {\n"
2081 " f(x)\n;\n"
2082 " f(x)\n {}\n"
2083 " f(x)\n->g();\n"
2084 " f(x)\n->*g();\n"
2085 " f(x)\n.g();\n"
2086 " f(x)\n = x;\n"
2087 " f(x)\n += x;\n"
2088 " f(x)\n -= x;\n"
2089 " f(x)\n *= x;\n"
2090 " f(x)\n /= x;\n"
2091 " f(x)\n %= x;\n"
2092 " f(x)\n &= x;\n"
2093 " f(x)\n |= x;\n"
2094 " f(x)\n ^= x;\n"
2095 " f(x)\n >>= x;\n"
2096 " f(x)\n <<= x;\n"
2097 " f(x)\n[y].z();\n"
2098 " LOG(INFO)\n << x;\n"
2099 " ifstream(x)\n >> x;\n"
2100 "}\n"));
2101 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002102 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002103 " if (1) {\n"
2104 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002105 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002106 " while (1) {\n"
2107 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002108 " F(x)\n"
2109 " G(x);\n"
2110 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002111 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002112 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002113 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002114 " }\n"
2115 "}\n",
2116 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002117 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002118 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002119 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002120 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002121 "F(x)\n"
2122 "G(x);\n"
2123 "F(x)\n"
2124 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002125 "}\n"));
2126 EXPECT_EQ("class A {\n"
2127 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002128 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002129 " A(X x)\n" // FIXME: function-level try blocks are broken.
2130 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002131 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002132 " }\n"
2133 "};",
2134 format("class A {\n"
2135 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002136 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002137 " A(X x)\n"
2138 " try : t(0) {} catch (...) {}\n"
2139 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00002140 EXPECT_EQ("class SomeClass {\n"
2141 "public:\n"
2142 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2143 "};",
2144 format("class SomeClass {\n"
2145 "public:\n"
2146 " SomeClass()\n"
2147 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2148 "};"));
2149 EXPECT_EQ("class SomeClass {\n"
2150 "public:\n"
2151 " SomeClass()\n"
2152 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2153 "};",
2154 format("class SomeClass {\n"
2155 "public:\n"
2156 " SomeClass()\n"
2157 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2158 "};",
2159 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00002160
2161 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00002162}
2163
Manuel Klimek4fe43002013-05-22 12:51:29 +00002164TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2165 verifyFormat("#define A \\\n"
2166 " f({ \\\n"
2167 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00002168 " });",
2169 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00002170}
2171
Manuel Klimekef2cfb12013-01-05 22:14:16 +00002172TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
2173 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
2174}
2175
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002176TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002177 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002178}
2179
Manuel Klimek1058d982013-01-06 20:07:31 +00002180TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
2181 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
2182 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2183 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
2184 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2185}
Manuel Klimek1abf7892013-01-04 23:34:14 +00002186
Daniel Jaspere2408e32015-05-06 11:16:43 +00002187TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00002188 EXPECT_EQ(
2189 "#define A \\\n int i; \\\n int j;",
2190 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002191 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00002192 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00002193 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002194 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00002195}
2196
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002197TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2198 verifyFormat("#define A \\\n"
2199 " int v( \\\n"
2200 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002201 " int i;",
2202 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002203}
2204
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002205TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00002206 EXPECT_EQ(
2207 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2208 " \\\n"
2209 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2210 "\n"
2211 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2212 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2213 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
2214 "\\\n"
2215 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2216 " \n"
2217 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2218 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002219}
2220
Manuel Klimek52b15152013-01-09 15:25:02 +00002221TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2222 EXPECT_EQ("int\n"
2223 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002224 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002225 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002226 verifyFormat("functionCallTo(\n"
2227 " someOtherFunction(\n"
2228 " withSomeParameters, whichInSequence,\n"
2229 " areLongerThanALine(andAnotherCall,\n"
2230 "#define A B\n"
2231 " withMoreParamters,\n"
2232 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00002233 " andMoreParameters),\n"
2234 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002235 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00002236 verifyFormat("Foo::Foo()\n"
2237 "#ifdef BAR\n"
2238 " : baz(0)\n"
2239 "#endif\n"
2240 "{\n"
2241 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00002242 verifyFormat("void f() {\n"
2243 " if (true)\n"
2244 "#ifdef A\n"
2245 " f(42);\n"
2246 " x();\n"
2247 "#else\n"
2248 " g();\n"
2249 " x();\n"
2250 "#endif\n"
2251 "}");
2252 verifyFormat("void f(param1, param2,\n"
2253 " param3,\n"
2254 "#ifdef A\n"
2255 " param4(param5,\n"
2256 "#ifdef A1\n"
2257 " param6,\n"
2258 "#ifdef A2\n"
2259 " param7),\n"
2260 "#else\n"
2261 " param8),\n"
2262 " param9,\n"
2263 "#endif\n"
2264 " param10,\n"
2265 "#endif\n"
2266 " param11)\n"
2267 "#else\n"
2268 " param12)\n"
2269 "#endif\n"
2270 "{\n"
2271 " x();\n"
2272 "}",
2273 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00002274 verifyFormat("#if 1\n"
2275 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00002276 verifyFormat("#if 1\n"
2277 "#endif\n"
2278 "#if 1\n"
2279 "#else\n"
2280 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00002281 verifyFormat("DEBUG({\n"
2282 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2283 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2284 "});\n"
2285 "#if a\n"
2286 "#else\n"
2287 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00002288
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002289 verifyIncompleteFormat("void f(\n"
2290 "#if A\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00002291 ");\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002292 "#else\n"
2293 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00002294}
2295
Manuel Klimek14bd9172014-01-29 08:49:02 +00002296TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2297 verifyFormat("#endif\n"
2298 "#if B");
2299}
2300
Manuel Klimek88033d72013-10-21 08:11:15 +00002301TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2302 FormatStyle SingleLine = getLLVMStyle();
2303 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00002304 verifyFormat("#if 0\n"
2305 "#elif 1\n"
2306 "#endif\n"
2307 "void foo() {\n"
2308 " if (test) foo2();\n"
2309 "}",
2310 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00002311}
2312
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002313TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00002314 verifyFormat("functionCall({ int i; });");
2315 verifyFormat("functionCall({\n"
2316 " int i;\n"
2317 " int j;\n"
2318 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00002319 verifyFormat("functionCall(\n"
2320 " {\n"
2321 " int i;\n"
2322 " int j;\n"
2323 " },\n"
2324 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00002325 verifyFormat("functionA(functionB({\n"
2326 " int i;\n"
2327 " int j;\n"
2328 " }),\n"
2329 " aaaa, bbbb, cccc);");
2330 verifyFormat("functionCall(\n"
2331 " {\n"
2332 " int i;\n"
2333 " int j;\n"
2334 " },\n"
2335 " aaaa, bbbb, // comment\n"
2336 " cccc);");
2337 verifyFormat("functionA(functionB({\n"
2338 " int i;\n"
2339 " int j;\n"
2340 " }),\n"
2341 " aaaa, bbbb, // comment\n"
2342 " cccc);");
2343 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2344 verifyFormat("functionCall(aaaa, bbbb, {\n"
2345 " int i;\n"
2346 " int j;\n"
2347 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00002348 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00002349 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00002350 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002351 " int i; // break\n"
2352 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00002353 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2354 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002355 verifyFormat("DEBUG({\n"
2356 " if (a)\n"
2357 " f();\n"
2358 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002359}
2360
2361TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002362 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002363 "int i;",
2364 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002365}
2366
2367TEST_F(FormatTest, LayoutNestedBlocks) {
2368 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2369 " struct s {\n"
2370 " int i;\n"
2371 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002372 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002373 " for (int i = 0; i < 10; ++i)\n"
2374 " return;\n"
2375 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002376 verifyFormat("call(parameter, {\n"
2377 " something();\n"
2378 " // Comment using all columns.\n"
2379 " somethingelse();\n"
2380 "});",
2381 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00002382 verifyFormat("DEBUG( //\n"
2383 " { f(); }, a);");
2384 verifyFormat("DEBUG( //\n"
2385 " {\n"
2386 " f(); //\n"
2387 " },\n"
2388 " a);");
2389
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002390 EXPECT_EQ("call(parameter, {\n"
2391 " something();\n"
2392 " // Comment too\n"
2393 " // looooooooooong.\n"
2394 " somethingElse();\n"
2395 "});",
2396 format("call(parameter, {\n"
2397 " something();\n"
2398 " // Comment too looooooooooong.\n"
2399 " somethingElse();\n"
2400 "});",
2401 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002402 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00002403 EXPECT_EQ("DEBUG({ // comment\n"
2404 " int i;\n"
2405 "});",
2406 format("DEBUG({ // comment\n"
2407 "int i;\n"
2408 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002409 EXPECT_EQ("DEBUG({\n"
2410 " int i;\n"
2411 "\n"
2412 " // comment\n"
2413 " int j;\n"
2414 "});",
2415 format("DEBUG({\n"
2416 " int i;\n"
2417 "\n"
2418 " // comment\n"
2419 " int j;\n"
2420 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00002421
2422 verifyFormat("DEBUG({\n"
2423 " if (a)\n"
2424 " return;\n"
2425 "});");
2426 verifyGoogleFormat("DEBUG({\n"
2427 " if (a) return;\n"
2428 "});");
2429 FormatStyle Style = getGoogleStyle();
2430 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00002431 verifyFormat("Debug(aaaaa,\n"
2432 " {\n"
2433 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
2434 " },\n"
2435 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00002436 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002437
Daniel Jaspera87af7a2015-06-30 11:32:22 +00002438 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
2439
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002440 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00002441}
2442
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002443TEST_F(FormatTest, FormatNestedBlocksInMacros) {
2444 EXPECT_EQ("#define MACRO() \\\n"
2445 " Debug(aaa, /* force line break */ \\\n"
2446 " { \\\n"
2447 " int i; \\\n"
2448 " int j; \\\n"
2449 " })",
2450 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
2451 " { int i; int j; })",
2452 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00002453
2454 EXPECT_EQ("#define A \\\n"
2455 " [] { \\\n"
2456 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2457 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
2458 " }",
2459 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2460 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
2461 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002462}
2463
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002464TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
2465 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002466 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002467 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002468}
2469
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00002470TEST_F(FormatTest, FormatBeginBlockEndMacros) {
2471 FormatStyle Style = getLLVMStyle();
2472 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
2473 Style.MacroBlockEnd = "^[A-Z_]+_END$";
2474 verifyFormat("FOO_BEGIN\n"
2475 " FOO_ENTRY\n"
2476 "FOO_END", Style);
2477 verifyFormat("FOO_BEGIN\n"
2478 " NESTED_FOO_BEGIN\n"
2479 " NESTED_FOO_ENTRY\n"
2480 " NESTED_FOO_END\n"
2481 "FOO_END", Style);
2482 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
2483 " int x;\n"
2484 " x = 1;\n"
2485 "FOO_END(Baz)", Style);
2486}
2487
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002488//===----------------------------------------------------------------------===//
2489// Line break tests.
2490//===----------------------------------------------------------------------===//
2491
Daniel Jasperf79b0b12013-08-30 08:29:25 +00002492TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002493 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00002494 "void f() {\n"
2495 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
2496 " parameter, parameter, parameter)),\n"
2497 " SecondLongCall(parameter));\n"
2498 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002499 verifyFormat(
2500 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2501 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2502 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2503 " aaaaaaaaaaaaaaaaaaaaaaaa);");
2504 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00002505 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2506 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
2507 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
2508 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002509 verifyFormat(
2510 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
2511 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
2512 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
2513 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00002514 verifyFormat("int a = bbbb && ccc &&\n"
2515 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00002516 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00002517 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002518}
2519
Daniel Jasperd69fc772013-05-08 14:12:04 +00002520TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
2521 verifyFormat(
2522 "bool aaaaaaa =\n"
2523 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
2524 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002525 verifyFormat(
2526 "bool aaaaaaa =\n"
2527 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
2528 " bbbbbbbb();");
2529
Daniel Jasperd69fc772013-05-08 14:12:04 +00002530 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2531 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
2532 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002533 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2534 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
2535 " ccccccccc == ddddddddddd;");
2536 verifyFormat(
2537 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
2538 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
2539 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00002540
2541 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2542 " aaaaaa) &&\n"
2543 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00002544 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2545 " aaaaaa) >>\n"
2546 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00002547 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00002548 " SourceMgr.getSpellingColumnNumber(\n"
2549 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
2550 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00002551
Daniel Jasper68d888c2013-06-03 08:42:05 +00002552 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2553 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
2554 " cccccc) {\n}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00002555 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2556 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
2557 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00002558 verifyFormat("b = a &&\n"
2559 " // Comment\n"
2560 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00002561
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002562 // If the LHS of a comparison is not a binary expression itself, the
2563 // additional linebreak confuses many people.
2564 verifyFormat(
2565 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2566 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
2567 "}");
2568 verifyFormat(
2569 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2570 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2571 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00002572 verifyFormat(
2573 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
2574 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2575 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002576 // Even explicit parentheses stress the precedence enough to make the
2577 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00002578 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2579 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2580 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002581 // This cases is borderline, but with the indentation it is still readable.
2582 verifyFormat(
2583 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2584 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2585 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
2586 "}",
2587 getLLVMStyleWithColumns(75));
2588
2589 // If the LHS is a binary expression, we should still use the additional break
2590 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00002591 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2592 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2593 " 5) {\n"
2594 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002595
Daniel Jasper571f1af2013-05-14 20:39:56 +00002596 FormatStyle OnePerLine = getLLVMStyle();
2597 OnePerLine.BinPackParameters = false;
2598 verifyFormat(
2599 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2600 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2601 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
2602 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00002603
2604 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
2605 " .aaa(aaaaaaaaaaaaa) *\n"
2606 " aaaaaaa +\n"
2607 " aaaaaaa;",
2608 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00002609}
2610
Daniel Jasper6bee6822013-04-08 20:33:42 +00002611TEST_F(FormatTest, ExpressionIndentation) {
2612 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2613 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2614 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2615 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2616 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
2617 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
2618 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2619 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
2620 " ccccccccccccccccccccccccccccccccccccccccc;");
2621 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2622 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2623 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2624 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2625 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2626 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2627 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2628 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2629 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2630 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2631 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2632 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002633 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002634 "} else if (aaaaa && bbbbb > // break\n"
2635 " ccccc) {\n"
2636 "}");
2637 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00002638 "} else if (aaaaa &&\n"
2639 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002640 " ccccc &&\n"
2641 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002642 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00002643
2644 // Presence of a trailing comment used to change indentation of b.
2645 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
2646 " b;\n"
2647 "return aaaaaaaaaaaaaaaaaaa +\n"
2648 " b; //",
2649 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00002650}
2651
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002652TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
2653 // Not sure what the best system is here. Like this, the LHS can be found
2654 // immediately above an operator (everything with the same or a higher
2655 // indent). The RHS is aligned right of the operator and so compasses
2656 // everything until something with the same indent as the operator is found.
2657 // FIXME: Is this a good system?
2658 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00002659 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002660 verifyFormat(
2661 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002662 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2663 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2664 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2665 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2666 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002667 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002668 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2669 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002670 Style);
2671 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002672 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2673 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002674 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2675 Style);
2676 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002677 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2678 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002679 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2680 Style);
2681 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2682 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002683 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2684 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002685 Style);
2686 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00002687 "} else if (aaaaa\n"
2688 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002689 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002690 "}",
2691 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00002692 verifyFormat("return (a)\n"
2693 " // comment\n"
2694 " + b;",
2695 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00002696 verifyFormat(
2697 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2698 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2699 " + cc;",
2700 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00002701
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00002702 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2703 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
2704 Style);
2705
Daniel Jasper9e5ede02013-11-08 19:56:28 +00002706 // Forced by comments.
2707 verifyFormat(
2708 "unsigned ContentSize =\n"
2709 " sizeof(int16_t) // DWARF ARange version number\n"
2710 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
2711 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
2712 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00002713
2714 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
2715 " == boost::fusion::at_c<1>(iiii).second;",
2716 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00002717
2718 Style.ColumnLimit = 60;
2719 verifyFormat("zzzzzzzzzz\n"
2720 " = bbbbbbbbbbbbbbbbb\n"
2721 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
2722 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002723}
2724
Daniel Jasperb1270392017-02-01 23:27:37 +00002725TEST_F(FormatTest, EnforcedOperatorWraps) {
2726 // Here we'd like to wrap after the || operators, but a comment is forcing an
2727 // earlier wrap.
2728 verifyFormat("bool x = aaaaa //\n"
2729 " || bbbbb\n"
2730 " //\n"
2731 " || cccc;");
2732}
2733
Daniel Jasper3219e432014-12-02 13:24:51 +00002734TEST_F(FormatTest, NoOperandAlignment) {
2735 FormatStyle Style = getLLVMStyle();
2736 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00002737 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
2738 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2739 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
2740 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002741 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00002742 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2743 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2744 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2745 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2746 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2747 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2748 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2749 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2750 " > ccccccccccccccccccccccccccccccccccccccccc;",
2751 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002752
2753 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2754 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2755 " + cc;",
2756 Style);
2757 verifyFormat("int a = aa\n"
2758 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002759 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00002760 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00002761
Daniel Jasper6501f7e2015-10-27 12:38:37 +00002762 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00002763 verifyFormat("return (a > b\n"
2764 " // comment1\n"
2765 " // comment2\n"
2766 " || c);",
2767 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002768}
2769
Daniel Jasperac043c92014-09-15 11:11:00 +00002770TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
2771 FormatStyle Style = getLLVMStyle();
2772 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
2773 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
2774 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00002775 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
2776 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00002777}
2778
Daniel Jasper988e7e42017-05-08 15:07:52 +00002779TEST_F(FormatTest, AllowBinPackingInsideArguments) {
2780 FormatStyle Style = getLLVMStyle();
2781 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
2782 Style.BinPackArguments = false;
2783 Style.ColumnLimit = 40;
2784 verifyFormat("void test() {\n"
2785 " someFunction(\n"
2786 " this + argument + is + quite\n"
2787 " + long + so + it + gets + wrapped\n"
2788 " + but + remains + bin - packed);\n"
2789 "}",
2790 Style);
2791 verifyFormat("void test() {\n"
2792 " someFunction(arg1,\n"
2793 " this + argument + is\n"
2794 " + quite + long + so\n"
2795 " + it + gets + wrapped\n"
2796 " + but + remains + bin\n"
2797 " - packed,\n"
2798 " arg3);\n"
2799 "}",
2800 Style);
2801 verifyFormat("void test() {\n"
2802 " someFunction(\n"
2803 " arg1,\n"
2804 " this + argument + has\n"
2805 " + anotherFunc(nested,\n"
2806 " calls + whose\n"
2807 " + arguments\n"
2808 " + are + also\n"
2809 " + wrapped,\n"
2810 " in + addition)\n"
2811 " + to + being + bin - packed,\n"
2812 " arg3);\n"
2813 "}",
2814 Style);
2815
2816 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
2817 verifyFormat("void test() {\n"
2818 " someFunction(\n"
2819 " arg1,\n"
2820 " this + argument + has +\n"
2821 " anotherFunc(nested,\n"
2822 " calls + whose +\n"
2823 " arguments +\n"
2824 " are + also +\n"
2825 " wrapped,\n"
2826 " in + addition) +\n"
2827 " to + being + bin - packed,\n"
2828 " arg3);\n"
2829 "}",
2830 Style);
2831}
2832
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002833TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002834 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002835 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
2836 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002837 verifyFormat("Constructor()\n"
2838 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002839 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002840 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002841 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002842 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002843
Daniel Jasper7b259cd2015-08-27 11:59:31 +00002844 verifyFormat("template <typename T>\n"
2845 "Constructor() : Initializer(FitsOnTheLine) {}",
2846 getLLVMStyleWithColumns(45));
2847
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002848 verifyFormat(
2849 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002850 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002851
2852 verifyFormat(
2853 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002854 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002855 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002856 verifyFormat(
2857 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002858 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002859 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00002860 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2861 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2862 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002863
2864 verifyFormat("Constructor()\n"
2865 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2866 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2867 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002868 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002869
Daniel Jasper65585ed2013-01-28 13:31:35 +00002870 verifyFormat("Constructor()\n"
2871 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002872 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00002873
Daniel Jasper62e68172013-02-25 15:59:54 +00002874 verifyFormat("Constructor(int Parameter = 0)\n"
2875 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
2876 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00002877 verifyFormat("Constructor()\n"
2878 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
2879 "}",
2880 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00002881 verifyFormat("Constructor()\n"
2882 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2883 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00002884
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002885 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00002886 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00002887 verifyFormat("Constructor()\n"
2888 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
2889 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
2890 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002891
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002892 FormatStyle OnePerLine = getLLVMStyle();
2893 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00002894 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002895 verifyFormat("SomeClass::Constructor()\n"
2896 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
2897 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002898 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002899 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002900 verifyFormat("SomeClass::Constructor()\n"
2901 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
2902 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002903 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002904 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002905 verifyFormat("MyClass::MyClass(int var)\n"
2906 " : some_var_(var), // 4 space indent\n"
2907 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002908 "}",
2909 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00002910 verifyFormat("Constructor()\n"
2911 " : aaaaa(aaaaaa),\n"
2912 " aaaaa(aaaaaa),\n"
2913 " aaaaa(aaaaaa),\n"
2914 " aaaaa(aaaaaa),\n"
2915 " aaaaa(aaaaaa) {}",
2916 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00002917 verifyFormat("Constructor()\n"
2918 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
2919 " aaaaaaaaaaaaaaaaaaaaaa) {}",
2920 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00002921 OnePerLine.BinPackParameters = false;
2922 verifyFormat(
2923 "Constructor()\n"
2924 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2925 " aaaaaaaaaaa().aaa(),\n"
2926 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
2927 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00002928 OnePerLine.ColumnLimit = 60;
2929 verifyFormat("Constructor()\n"
2930 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
2931 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
2932 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00002933
2934 EXPECT_EQ("Constructor()\n"
2935 " : // Comment forcing unwanted break.\n"
2936 " aaaa(aaaa) {}",
2937 format("Constructor() :\n"
2938 " // Comment forcing unwanted break.\n"
2939 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00002940}
2941
Francois Ferranda6b6d512017-05-24 11:36:58 +00002942TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
2943 FormatStyle Style = getLLVMStyle();
2944 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
2945
2946 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
2947 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
2948 getStyleWithColumns(Style, 45));
2949 verifyFormat("Constructor() :\n"
2950 " Initializer(FitsOnTheLine) {}",
2951 getStyleWithColumns(Style, 44));
2952 verifyFormat("Constructor() :\n"
2953 " Initializer(FitsOnTheLine) {}",
2954 getStyleWithColumns(Style, 43));
2955
2956 verifyFormat("template <typename T>\n"
2957 "Constructor() : Initializer(FitsOnTheLine) {}",
2958 getStyleWithColumns(Style, 50));
2959
2960 verifyFormat(
2961 "SomeClass::Constructor() :\n"
2962 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
2963 Style);
2964
2965 verifyFormat(
2966 "SomeClass::Constructor() :\n"
2967 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
2968 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
2969 Style);
2970 verifyFormat(
2971 "SomeClass::Constructor() :\n"
2972 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2973 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
2974 Style);
2975 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2976 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
2977 " aaaaaaaaaa(aaaaaa) {}",
2978 Style);
2979
2980 verifyFormat("Constructor() :\n"
2981 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2982 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2983 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2984 " aaaaaaaaaaaaaaaaaaaaaaa() {}",
2985 Style);
2986
2987 verifyFormat("Constructor() :\n"
2988 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2989 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
2990 Style);
2991
2992 verifyFormat("Constructor(int Parameter = 0) :\n"
2993 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
2994 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
2995 Style);
2996 verifyFormat("Constructor() :\n"
2997 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
2998 "}",
2999 getStyleWithColumns(Style, 60));
3000 verifyFormat("Constructor() :\n"
3001 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3002 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
3003 Style);
3004
3005 // Here a line could be saved by splitting the second initializer onto two
3006 // lines, but that is not desirable.
3007 verifyFormat("Constructor() :\n"
3008 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3009 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3010 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3011 Style);
3012
3013 FormatStyle OnePerLine = Style;
3014 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3015 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3016 verifyFormat("SomeClass::Constructor() :\n"
3017 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3018 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3019 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3020 OnePerLine);
3021 verifyFormat("SomeClass::Constructor() :\n"
3022 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3023 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3024 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3025 OnePerLine);
3026 verifyFormat("MyClass::MyClass(int var) :\n"
3027 " some_var_(var), // 4 space indent\n"
3028 " some_other_var_(var + 1) { // lined up\n"
3029 "}",
3030 OnePerLine);
3031 verifyFormat("Constructor() :\n"
3032 " aaaaa(aaaaaa),\n"
3033 " aaaaa(aaaaaa),\n"
3034 " aaaaa(aaaaaa),\n"
3035 " aaaaa(aaaaaa),\n"
3036 " aaaaa(aaaaaa) {}",
3037 OnePerLine);
3038 verifyFormat("Constructor() :\n"
3039 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3040 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3041 OnePerLine);
3042 OnePerLine.BinPackParameters = false;
3043 verifyFormat(
3044 "Constructor() :\n"
3045 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3046 " aaaaaaaaaaa().aaa(),\n"
3047 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3048 OnePerLine);
3049 OnePerLine.ColumnLimit = 60;
3050 verifyFormat("Constructor() :\n"
3051 " aaaaaaaaaaaaaaaaaaaa(a),\n"
3052 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3053 OnePerLine);
3054
3055 EXPECT_EQ("Constructor() :\n"
3056 " // Comment forcing unwanted break.\n"
3057 " aaaa(aaaa) {}",
3058 format("Constructor() :\n"
3059 " // Comment forcing unwanted break.\n"
3060 " aaaa(aaaa) {}",
3061 Style));
3062
3063 Style.ColumnLimit = 0;
3064 verifyFormat("SomeClass::Constructor() :\n"
3065 " a(a) {}",
3066 Style);
3067 verifyFormat("SomeClass::Constructor() noexcept :\n"
3068 " a(a) {}",
3069 Style);
3070 verifyFormat("SomeClass::Constructor() :\n"
3071 " a(a), b(b), c(c) {}",
3072 Style);
3073 verifyFormat("SomeClass::Constructor() :\n"
3074 " a(a) {\n"
3075 " foo();\n"
3076 " bar();\n"
3077 "}",
3078 Style);
3079
3080 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
3081 verifyFormat("SomeClass::Constructor() :\n"
3082 " a(a), b(b), c(c) {\n"
3083 "}",
3084 Style);
3085 verifyFormat("SomeClass::Constructor() :\n"
3086 " a(a) {\n"
3087 "}",
3088 Style);
3089
3090 Style.ColumnLimit = 80;
3091 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
3092 Style.ConstructorInitializerIndentWidth = 2;
3093 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
3094 Style);
3095 verifyFormat("SomeClass::Constructor() :\n"
3096 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3097 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
3098 Style);
3099}
3100
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003101TEST_F(FormatTest, MemoizationTests) {
3102 // This breaks if the memoization lookup does not take \c Indent and
3103 // \c LastSpace into account.
3104 verifyFormat(
3105 "extern CFRunLoopTimerRef\n"
3106 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3107 " CFTimeInterval interval, CFOptionFlags flags,\n"
3108 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003109 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003110
3111 // Deep nesting somewhat works around our memoization.
3112 verifyFormat(
3113 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3114 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3115 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3116 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3117 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3118 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003119 verifyFormat(
3120 "aaaaa(\n"
3121 " aaaaa,\n"
3122 " aaaaa(\n"
3123 " aaaaa,\n"
3124 " aaaaa(\n"
3125 " aaaaa,\n"
3126 " aaaaa(\n"
3127 " aaaaa,\n"
3128 " aaaaa(\n"
3129 " aaaaa,\n"
3130 " aaaaa(\n"
3131 " aaaaa,\n"
3132 " aaaaa(\n"
3133 " aaaaa,\n"
3134 " aaaaa(\n"
3135 " aaaaa,\n"
3136 " aaaaa(\n"
3137 " aaaaa,\n"
3138 " aaaaa(\n"
3139 " aaaaa,\n"
3140 " aaaaa(\n"
3141 " aaaaa,\n"
3142 " aaaaa(\n"
3143 " aaaaa,\n"
3144 " aaaaa))))))))))));",
3145 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003146 verifyFormat(
3147 "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"
3148 " a),\n"
3149 " a),\n"
3150 " a),\n"
3151 " a),\n"
3152 " a),\n"
3153 " a),\n"
3154 " a),\n"
3155 " a),\n"
3156 " a),\n"
3157 " a),\n"
3158 " a),\n"
3159 " a),\n"
3160 " a),\n"
3161 " a),\n"
3162 " a),\n"
3163 " a),\n"
3164 " a)",
3165 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00003166
3167 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003168 FormatStyle OnePerLine = getLLVMStyle();
3169 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003170 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00003171 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00003172 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00003173 for (unsigned i = 0, e = 80; i != e; ++i) {
3174 input += " a,\n";
3175 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003176 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003177 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003178}
3179
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003180TEST_F(FormatTest, BreaksAsHighAsPossible) {
3181 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003182 "void f() {\n"
3183 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3184 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3185 " f();\n"
3186 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00003187 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003188 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003189}
3190
Daniel Jasper6728fc12013-04-11 14:29:13 +00003191TEST_F(FormatTest, BreaksFunctionDeclarations) {
3192 // Principially, we break function declarations in a certain order:
3193 // 1) break amongst arguments.
3194 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3195 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003196 verifyFormat("template <class TemplateIt>\n"
3197 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3198 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00003199
3200 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00003201 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003202 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003203 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003204 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003205
3206 // 3) break after (.
3207 verifyFormat(
3208 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00003209 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3210 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003211
3212 // 4) break before after nested name specifiers.
3213 verifyFormat(
3214 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003215 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3216 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003217 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003218
3219 // However, there are exceptions, if a sufficient amount of lines can be
3220 // saved.
3221 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3222 // more adjusting.
3223 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3224 " Cccccccccccccc cccccccccc,\n"
3225 " Cccccccccccccc cccccccccc,\n"
3226 " Cccccccccccccc cccccccccc,\n"
3227 " Cccccccccccccc cccccccccc);");
3228 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003229 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003230 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3231 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3232 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003233 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003234 verifyFormat(
3235 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3236 " Cccccccccccccc cccccccccc,\n"
3237 " Cccccccccccccc cccccccccc,\n"
3238 " Cccccccccccccc cccccccccc,\n"
3239 " Cccccccccccccc cccccccccc,\n"
3240 " Cccccccccccccc cccccccccc,\n"
3241 " Cccccccccccccc cccccccccc);");
3242 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3243 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3244 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3245 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3246 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00003247
3248 // Break after multi-line parameters.
3249 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3250 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3251 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3252 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00003253 verifyFormat("void SomeLoooooooooooongFunction(\n"
3254 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3255 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3256 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003257
3258 // Treat overloaded operators like other functions.
3259 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3260 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00003261 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3262 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00003263 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3264 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3265 verifyGoogleFormat(
3266 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3267 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003268 verifyGoogleFormat(
3269 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3270 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00003271 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3272 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3273 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3274 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00003275 verifyGoogleFormat(
3276 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
3277 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3278 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00003279 verifyGoogleFormat(
3280 "template <typename T>\n"
3281 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3282 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
3283 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00003284
3285 FormatStyle Style = getLLVMStyle();
3286 Style.PointerAlignment = FormatStyle::PAS_Left;
3287 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3288 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
3289 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003290 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3291 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3292 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00003293}
3294
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003295TEST_F(FormatTest, TrailingReturnType) {
3296 verifyFormat("auto foo() -> int;\n");
3297 verifyFormat("struct S {\n"
3298 " auto bar() const -> int;\n"
3299 "};");
3300 verifyFormat("template <size_t Order, typename T>\n"
3301 "auto load_img(const std::string &filename)\n"
3302 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00003303 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
3304 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00003305 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00003306 verifyFormat("template <typename T>\n"
3307 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
3308 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00003309
3310 // Not trailing return types.
3311 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003312}
3313
Daniel Jasper5be31f72013-05-21 09:16:31 +00003314TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003315 // Avoid breaking before trailing 'const' or other trailing annotations, if
3316 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00003317 FormatStyle Style = getGoogleStyle();
3318 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00003319 verifyFormat("void someLongFunction(\n"
3320 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00003321 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00003322 verifyFormat("LoooooongReturnType\n"
3323 "someLoooooooongFunction() const {}",
3324 getLLVMStyleWithColumns(47));
3325 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
3326 " const {}",
3327 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003328 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3329 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
3330 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3331 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
3332 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3333 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00003334 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
3335 " aaaaaaaaaaa aaaaa) const override;");
3336 verifyGoogleFormat(
3337 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3338 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003339
Daniel Jasper5550de62014-02-17 07:57:46 +00003340 // Even if the first parameter has to be wrapped.
3341 verifyFormat("void someLongFunction(\n"
3342 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003343 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00003344 verifyFormat("void someLongFunction(\n"
3345 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003346 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00003347 verifyFormat("void someLongFunction(\n"
3348 " int someLongParameter) override {}",
3349 Style);
3350 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003351 " int someLongParameter) OVERRIDE {}",
3352 Style);
3353 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003354 " int someLongParameter) final {}",
3355 Style);
3356 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003357 " int someLongParameter) FINAL {}",
3358 Style);
3359 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003360 " int parameter) const override {}",
3361 Style);
3362
Daniel Jaspere3f907f2014-06-02 09:52:08 +00003363 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3364 verifyFormat("void someLongFunction(\n"
3365 " int someLongParameter) const\n"
3366 "{\n"
3367 "}",
3368 Style);
3369
Daniel Jasper5550de62014-02-17 07:57:46 +00003370 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003371 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
3372 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3373 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00003374
3375 // Breaking before function-like trailing annotations is fine to keep them
3376 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00003377 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3378 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3379 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3380 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3381 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3382 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00003383 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
3384 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00003385 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003386
3387 verifyFormat(
3388 "void aaaaaaaaaaaaaaaaaa()\n"
3389 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
3390 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
3391 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3392 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003393 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003394 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003395 " GUARDED_BY(aaaaaaaaaaaa);");
3396 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00003397 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003398 " GUARDED_BY(aaaaaaaaaaaa);");
3399 verifyGoogleFormat(
3400 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3401 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00003402 verifyGoogleFormat(
3403 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3404 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003405}
3406
Daniel Jasperf090f032015-05-18 09:47:22 +00003407TEST_F(FormatTest, FunctionAnnotations) {
3408 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00003409 "int OldFunction(const string &parameter) {}");
3410 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00003411 "string OldFunction(const string &parameter) {}");
3412 verifyFormat("template <typename T>\n"
3413 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
3414 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00003415
3416 // Not function annotations.
3417 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3418 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00003419 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
3420 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00003421 verifyFormat("MACRO(abc).function() // wrap\n"
3422 " << abc;");
3423 verifyFormat("MACRO(abc)->function() // wrap\n"
3424 " << abc;");
3425 verifyFormat("MACRO(abc)::function() // wrap\n"
3426 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00003427}
3428
Daniel Jasperf7935112012-12-03 18:12:45 +00003429TEST_F(FormatTest, BreaksDesireably) {
3430 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
3431 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003432 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00003433 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3434 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
3435 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003436
3437 verifyFormat(
3438 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003439 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003440
3441 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3442 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3443 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00003444
3445 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003446 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3447 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3448 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00003449 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3450 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003451
3452 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3453 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3454
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003455 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003456 "void f() {\n"
3457 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
3458 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3459 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00003460 verifyFormat(
3461 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3462 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3463 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003464 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3465 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3466 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003467 "aaaaaa(aaa,\n"
3468 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003469 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3470 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003471 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3472 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3473 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003474
Daniel Jasper739b85f2015-06-29 10:42:59 +00003475 // Indent consistently independent of call expression and unary operator.
3476 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3477 " dddddddddddddddddddddddddddddd));");
3478 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3479 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003480 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003481 " dddddddddddddddddddddddddddddd));");
3482
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003483 // This test case breaks on an incorrect memoization, i.e. an optimization not
3484 // taking into account the StopAt value.
3485 verifyFormat(
3486 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003487 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3488 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3489 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00003490
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003491 verifyFormat("{\n {\n {\n"
3492 " Annotation.SpaceRequiredBefore =\n"
3493 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
3494 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
3495 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00003496
3497 // Break on an outer level if there was a break on an inner level.
3498 EXPECT_EQ("f(g(h(a, // comment\n"
3499 " b, c),\n"
3500 " d, e),\n"
3501 " x, y);",
3502 format("f(g(h(a, // comment\n"
3503 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00003504
3505 // Prefer breaking similar line breaks.
3506 verifyFormat(
3507 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
3508 " NSTrackingMouseEnteredAndExited |\n"
3509 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00003510}
3511
Daniel Jasper18210d72014-10-09 09:52:05 +00003512TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
3513 FormatStyle NoBinPacking = getGoogleStyle();
3514 NoBinPacking.BinPackParameters = false;
3515 NoBinPacking.BinPackArguments = true;
3516 verifyFormat("void f() {\n"
3517 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
3518 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3519 "}",
3520 NoBinPacking);
3521 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
3522 " int aaaaaaaaaaaaaaaaaaaa,\n"
3523 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3524 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003525
Daniel Jasper00693b082016-01-09 15:56:47 +00003526 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
3527 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3528 " vector<int> bbbbbbbbbbbbbbb);",
3529 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003530 // FIXME: This behavior difference is probably not wanted. However, currently
3531 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
3532 // template arguments from BreakBeforeParameter being set because of the
3533 // one-per-line formatting.
3534 verifyFormat(
3535 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3536 " aaaaaaaaaa> aaaaaaaaaa);",
3537 NoBinPacking);
3538 verifyFormat(
3539 "void fffffffffff(\n"
3540 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
3541 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00003542}
3543
Daniel Jasper9278eb92013-01-16 14:59:02 +00003544TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00003545 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003546 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00003547 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003548 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
3549 " aaaaaaaaaaaaaaaaaaaa,\n"
3550 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
3551 NoBinPacking);
3552 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
3553 " aaaaaaaaaaaaa,\n"
3554 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
3555 NoBinPacking);
3556 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003557 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3558 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3559 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
3560 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003561 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
3562 NoBinPacking);
3563 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3564 " .aaaaaaaaaaaaaaaaaa();",
3565 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003566 verifyFormat("void f() {\n"
3567 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3568 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
3569 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003570 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003571
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003572 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00003573 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3574 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003575 " aaaaaaaaaaaa);",
3576 NoBinPacking);
3577 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003578 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
3579 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003580 " test);",
3581 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003582
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003583 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3584 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00003585 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
3586 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003587 NoBinPacking);
3588 verifyFormat("a(\"a\"\n"
3589 " \"a\",\n"
3590 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00003591
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003592 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00003593 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00003594 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00003595 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003596 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00003597 verifyFormat(
3598 "void f() {\n"
3599 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3600 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003601 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003602 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00003603 verifyFormat(
3604 "template <class SomeType, class SomeOtherType>\n"
3605 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
3606 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003607}
3608
Daniel Jasperb10cbc42013-07-10 14:02:49 +00003609TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
3610 FormatStyle Style = getLLVMStyleWithColumns(15);
3611 Style.ExperimentalAutoDetectBinPacking = true;
3612 EXPECT_EQ("aaa(aaaa,\n"
3613 " aaaa,\n"
3614 " aaaa);\n"
3615 "aaa(aaaa,\n"
3616 " aaaa,\n"
3617 " aaaa);",
3618 format("aaa(aaaa,\n" // one-per-line
3619 " aaaa,\n"
3620 " aaaa );\n"
3621 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3622 Style));
3623 EXPECT_EQ("aaa(aaaa, aaaa,\n"
3624 " aaaa);\n"
3625 "aaa(aaaa, aaaa,\n"
3626 " aaaa);",
3627 format("aaa(aaaa, aaaa,\n" // bin-packed
3628 " aaaa );\n"
3629 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3630 Style));
3631}
3632
Daniel Jasper04468962013-01-18 10:56:38 +00003633TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00003634 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
3635 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
3636 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
3637 " .StartsWith(\".init\", ORDER_INIT)\n"
3638 " .StartsWith(\".fini\", ORDER_FINI)\n"
3639 " .StartsWith(\".hash\", ORDER_HASH)\n"
3640 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00003641
Daniel Jaspereb50c672013-02-15 20:33:06 +00003642 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003643 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00003644 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00003645 "aaaaaaa->aaaaaaa\n"
3646 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3647 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00003648 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00003649 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00003650 "aaaaaaa->aaaaaaa\n"
3651 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3652 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
3653 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00003654 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00003655 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00003656 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003657 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
3658 " aaaaaa->aaaaaaaaaaaa()\n"
3659 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00003660 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003661 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00003662 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003663 "void f() {\n"
3664 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003665 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003666 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003667 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003668 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003669 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003670 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003671 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003672 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003673 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003674 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003675 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00003676
3677 verifyFormat(
3678 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
3679 verifyFormat("aaaaaaaaaaaaaaa()\n"
3680 " .aaaaaaaaaaaaaaa()\n"
3681 " .aaaaaaaaaaaaaaa()\n"
3682 " .aaaaaaaaaaaaaaa()\n"
3683 " .aaaaaaaaaaaaaaa();");
3684 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3685 " .aaaaaaaaaaaaaaa()\n"
3686 " .aaaaaaaaaaaaaaa()\n"
3687 " .aaaaaaaaaaaaaaa();");
3688 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3689 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3690 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00003691 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
3692 " ->aaaaaaaaaaaaaae(0)\n"
3693 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00003694
Daniel Jasper775954b2015-04-24 10:08:09 +00003695 // Don't linewrap after very short segments.
3696 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3697 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3698 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3699 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3700 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3701 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3702 verifyFormat("aaa()\n"
3703 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3704 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3705 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3706
Daniel Jaspercc3114d2013-10-18 15:23:06 +00003707 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3708 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3709 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
3710 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3711 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003712 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00003713
Daniel Jaspera41aa532014-09-19 08:01:25 +00003714 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00003715 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
3716 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00003717
3718 // Prefer not to create "hanging" indents.
3719 verifyFormat(
3720 "return !soooooooooooooome_map\n"
3721 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3722 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00003723 verifyFormat(
3724 "return aaaaaaaaaaaaaaaa\n"
3725 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
3726 " .aaaa(aaaaaaaaaaaaaa);");
3727 // No hanging indent here.
3728 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
3729 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3730 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
3731 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00003732 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3733 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3734 getLLVMStyleWithColumns(60));
3735 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
3736 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3737 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3738 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00003739 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3740 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3741 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00003742}
3743
Daniel Jasperde5c2072012-12-24 00:13:23 +00003744TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
3745 verifyFormat(
3746 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003747 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003748 verifyFormat(
3749 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
3750 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
3751
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003752 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003753 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003754 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
3755 " ccccccccccccccccccccccccc) {\n}");
3756
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003757 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003758 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003759 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
3760 " ccccccccccccccccccccccccc) {\n}");
3761
Daniel Jasperde5c2072012-12-24 00:13:23 +00003762 verifyFormat(
3763 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003764 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003765 verifyFormat(
3766 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
3767 " ccccccccccccccccccccccccc) {\n}");
3768
Daniel Jasper400adc62013-02-08 15:28:42 +00003769 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
3770 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
3771 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
3772 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003773 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
3774 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
3775 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
3776 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
3777
Daniel Jasper400adc62013-02-08 15:28:42 +00003778 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
3779 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
3780 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003781 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
3782 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
3783 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00003784}
3785
Daniel Jasper43b65482013-01-23 12:27:43 +00003786TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00003787 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00003788 "unsigned Cost =\n"
3789 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
3790 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00003791 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00003792 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
3793 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00003794
3795 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003796 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
3797 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00003798 verifyFormat("unsigned OriginalStartColumn =\n"
3799 " SourceMgr.getSpellingColumnNumber(\n"
3800 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
3801 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00003802}
3803
Francois Ferrand9976efa2017-05-22 08:28:17 +00003804TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
3805 FormatStyle Style = getLLVMStyle();
3806 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3807 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
3808 Style);
3809
3810 Style.PenaltyBreakAssignment = 20;
3811 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3812 " cccccccccccccccccccccccccc;",
3813 Style);
3814}
3815
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003816TEST_F(FormatTest, AlignsAfterAssignments) {
3817 verifyFormat(
3818 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003819 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003820 verifyFormat(
3821 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003822 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003823 verifyFormat(
3824 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003825 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003826 verifyFormat(
3827 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003828 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00003829 verifyFormat(
3830 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3831 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3832 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003833}
3834
3835TEST_F(FormatTest, AlignsAfterReturn) {
3836 verifyFormat(
3837 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3838 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
3839 verifyFormat(
3840 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3841 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00003842 verifyFormat(
3843 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003844 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00003845 verifyFormat(
3846 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003847 " aaaaaaaaaaaaaaaaaaaaaa());");
3848 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3849 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3850 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3851 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
3852 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00003853 verifyFormat("return\n"
3854 " // true if code is one of a or b.\n"
3855 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003856}
3857
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003858TEST_F(FormatTest, AlignsAfterOpenBracket) {
3859 verifyFormat(
3860 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
3861 " aaaaaaaaa aaaaaaa) {}");
3862 verifyFormat(
3863 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
3864 " aaaaaaaaaaa aaaaaaaaa);");
3865 verifyFormat(
3866 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
3867 " aaaaaaaaaaaaaaaaaaaaa));");
3868 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003869 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00003870 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3871 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
3872 Style);
3873 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
3874 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
3875 Style);
3876 verifyFormat("SomeLongVariableName->someFunction(\n"
3877 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
3878 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003879 verifyFormat(
3880 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
3881 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3882 Style);
3883 verifyFormat(
3884 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
3885 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3886 Style);
3887 verifyFormat(
3888 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
3889 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
3890 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003891
Daniel Jasper2a9f7202016-02-08 09:52:54 +00003892 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
3893 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
3894 " b));",
3895 Style);
3896
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003897 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
3898 Style.BinPackArguments = false;
3899 Style.BinPackParameters = false;
3900 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3901 " aaaaaaaaaaa aaaaaaaa,\n"
3902 " aaaaaaaaa aaaaaaa,\n"
3903 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3904 Style);
3905 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
3906 " aaaaaaaaaaa aaaaaaaaa,\n"
3907 " aaaaaaaaaaa aaaaaaaaa,\n"
3908 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3909 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00003910 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
3911 " aaaaaaaaaaaaaaa,\n"
3912 " aaaaaaaaaaaaaaaaaaaaa,\n"
3913 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003914 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00003915 verifyFormat(
3916 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
3917 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
3918 Style);
3919 verifyFormat(
3920 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
3921 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
3922 Style);
3923 verifyFormat(
3924 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3925 " aaaaaaaaaaaaaaaaaaaaa(\n"
3926 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
3927 " aaaaaaaaaaaaaaaa);",
3928 Style);
3929 verifyFormat(
3930 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3931 " aaaaaaaaaaaaaaaaaaaaa(\n"
3932 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
3933 " aaaaaaaaaaaaaaaa);",
3934 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003935}
3936
Daniel Jasper3219e432014-12-02 13:24:51 +00003937TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
3938 FormatStyle Style = getLLVMStyleWithColumns(40);
3939 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3940 " bbbbbbbbbbbbbbbbbbbbbb);",
3941 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003942 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00003943 Style.AlignOperands = false;
3944 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3945 " bbbbbbbbbbbbbbbbbbbbbb);",
3946 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003947 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00003948 Style.AlignOperands = true;
3949 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3950 " bbbbbbbbbbbbbbbbbbbbbb);",
3951 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003952 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00003953 Style.AlignOperands = false;
3954 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3955 " bbbbbbbbbbbbbbbbbbbbbb);",
3956 Style);
3957}
3958
Daniel Jasper399d24b2013-01-09 07:06:56 +00003959TEST_F(FormatTest, BreaksConditionalExpressions) {
3960 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003961 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3962 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3963 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3964 verifyFormat(
3965 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003966 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3967 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00003968 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003969 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3970 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3971 verifyFormat(
3972 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003973 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3974 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00003975 verifyFormat(
3976 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
3977 " : aaaaaaaaaaaaa);");
3978 verifyFormat(
3979 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00003980 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00003981 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3982 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00003983 verifyFormat(
3984 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3985 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3986 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00003987 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3988 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3989 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3990 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3991 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3992 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3993 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3994 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3995 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3996 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3997 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3998 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00003999 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4000 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4001 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4002 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4003 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004004 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4005 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4006 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004007 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4008 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4009 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4010 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004011 verifyFormat(
4012 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4013 " ? aaaaaaaaaaaaaaa\n"
4014 " : aaaaaaaaaaaaaaa;");
4015 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004016 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004017 " ? b\n"
4018 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004019 verifyFormat("return aaaa == bbbb\n"
4020 " // comment\n"
4021 " ? aaaa\n"
4022 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004023 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004024 " format(TheLine.First,\n"
4025 " IndentForLevel[TheLine.Level] >= 0\n"
4026 " ? IndentForLevel[TheLine.Level]\n"
4027 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004028 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004029 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004030 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4031 " ? aaaaaaaaaaaaaaa\n"
4032 " : bbbbbbbbbbbbbbb //\n"
4033 " ? ccccccccccccccc\n"
4034 " : ddddddddddddddd;");
4035 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4036 " ? aaaaaaaaaaaaaaa\n"
4037 " : (bbbbbbbbbbbbbbb //\n"
4038 " ? ccccccccccccccc\n"
4039 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004040 verifyFormat(
4041 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4042 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4043 " aaaaaaaaaaaaaaaaaaaaa +\n"
4044 " aaaaaaaaaaaaaaaaaaaaa\n"
4045 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004046 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004047 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4048 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4049 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004050
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004051 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004052 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004053 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004054 "void f() {\n"
4055 " g(aaa,\n"
4056 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4057 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4058 " ? aaaaaaaaaaaaaaa\n"
4059 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004060 "}",
4061 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004062 verifyFormat(
4063 "void f() {\n"
4064 " g(aaa,\n"
4065 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4066 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4067 " ?: aaaaaaaaaaaaaaa);\n"
4068 "}",
4069 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004070
4071 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4072 " // comment.\n"
4073 " ccccccccccccccccccccccccccccccccccccccc\n"
4074 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4075 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004076
4077 // Assignments in conditional expressions. Apparently not uncommon :-(.
4078 verifyFormat("return a != b\n"
4079 " // comment\n"
4080 " ? a = b\n"
4081 " : a = b;");
4082 verifyFormat("return a != b\n"
4083 " // comment\n"
4084 " ? a = a != b\n"
4085 " // comment\n"
4086 " ? a = b\n"
4087 " : a\n"
4088 " : a;\n");
4089 verifyFormat("return a != b\n"
4090 " // comment\n"
4091 " ? a\n"
4092 " : a = a != b\n"
4093 " // comment\n"
4094 " ? a = b\n"
4095 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004096}
4097
Daniel Jasper165b29e2013-11-08 00:57:11 +00004098TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4099 FormatStyle Style = getLLVMStyle();
4100 Style.BreakBeforeTernaryOperators = false;
4101 Style.ColumnLimit = 70;
4102 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004103 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4104 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4105 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4106 Style);
4107 verifyFormat(
4108 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004109 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4110 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004111 Style);
4112 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004113 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4114 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4115 Style);
4116 verifyFormat(
4117 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004118 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4119 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004120 Style);
4121 verifyFormat(
4122 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4123 " aaaaaaaaaaaaa);",
4124 Style);
4125 verifyFormat(
4126 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4127 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4128 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4129 " aaaaaaaaaaaaa);",
4130 Style);
4131 verifyFormat(
4132 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4133 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4134 " aaaaaaaaaaaaa);",
4135 Style);
4136 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4137 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4138 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4139 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4140 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4141 Style);
4142 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4143 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4144 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4145 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4146 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4147 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4148 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4149 Style);
4150 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4151 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4152 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4153 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4154 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4155 Style);
4156 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4157 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4158 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4159 Style);
4160 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00004161 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00004162 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4163 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4164 Style);
4165 verifyFormat(
4166 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4167 " aaaaaaaaaaaaaaa :\n"
4168 " aaaaaaaaaaaaaaa;",
4169 Style);
4170 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4171 " aaaaaaaaa ?\n"
4172 " b :\n"
4173 " c);",
4174 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00004175 verifyFormat("unsigned Indent =\n"
4176 " format(TheLine.First,\n"
4177 " IndentForLevel[TheLine.Level] >= 0 ?\n"
4178 " IndentForLevel[TheLine.Level] :\n"
4179 " TheLine * 2,\n"
4180 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4181 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004182 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4183 " aaaaaaaaaaaaaaa :\n"
4184 " bbbbbbbbbbbbbbb ? //\n"
4185 " ccccccccccccccc :\n"
4186 " ddddddddddddddd;",
4187 Style);
4188 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4189 " aaaaaaaaaaaaaaa :\n"
4190 " (bbbbbbbbbbbbbbb ? //\n"
4191 " ccccccccccccccc :\n"
4192 " ddddddddddddddd);",
4193 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00004194 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4195 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4196 " ccccccccccccccccccccccccccc;",
4197 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00004198 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4199 " aaaaa :\n"
4200 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
4201 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004202}
4203
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004204TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4205 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4206 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4207 verifyFormat("bool a = true, b = false;");
4208
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004209 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004210 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004211 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00004212 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004213 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00004214 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004215 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00004216 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00004217 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4218 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4219 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4220 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4221 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4222 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004223
Daniel Jasperbea1ab42015-03-01 18:55:26 +00004224 FormatStyle Style = getGoogleStyle();
4225 Style.PointerAlignment = FormatStyle::PAS_Left;
4226 Style.DerivePointerAlignment = false;
4227 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4228 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4229 " *b = bbbbbbbbbbbbbbbbbbb;",
4230 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004231 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4232 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4233 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00004234 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00004235 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004236}
4237
Nico Weber4a5030c2013-01-12 01:28:06 +00004238TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4239 verifyFormat("arr[foo ? bar : baz];");
4240 verifyFormat("f()[foo ? bar : baz];");
4241 verifyFormat("(a + b)[foo ? bar : baz];");
4242 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4243}
4244
Daniel Jasperf7935112012-12-03 18:12:45 +00004245TEST_F(FormatTest, AlignsStringLiterals) {
4246 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4247 " \"short literal\");");
4248 verifyFormat(
4249 "looooooooooooooooooooooooongFunction(\n"
4250 " \"short literal\"\n"
4251 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004252 verifyFormat("someFunction(\"Always break between multi-line\"\n"
4253 " \" string literals\",\n"
4254 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004255 EXPECT_EQ("fun + \"1243\" /* comment */\n"
4256 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004257 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00004258 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004259 getLLVMStyleWithColumns(28)));
4260 EXPECT_EQ(
4261 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4262 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4263 " \"aaaaaaaaaaaaaaaa\";",
4264 format("aaaaaa ="
4265 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4266 "aaaaaaaaaaaaaaaaaaaaa\" "
4267 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004268 verifyFormat("a = a + \"a\"\n"
4269 " \"a\"\n"
4270 " \"a\";");
4271 verifyFormat("f(\"a\", \"b\"\n"
4272 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00004273
4274 verifyFormat(
4275 "#define LL_FORMAT \"ll\"\n"
4276 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
4277 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00004278
4279 verifyFormat("#define A(X) \\\n"
4280 " \"aaaaa\" #X \"bbbbbb\" \\\n"
4281 " \"ccccc\"",
4282 getLLVMStyleWithColumns(23));
4283 verifyFormat("#define A \"def\"\n"
4284 "f(\"abc\" A \"ghi\"\n"
4285 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004286
4287 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004288 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004289 verifyFormat("#define A(X) \\\n"
4290 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
4291 " L\"ccccc\"",
4292 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00004293
4294 verifyFormat("f(@\"a\"\n"
4295 " @\"b\");");
4296 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00004297 " @\"b\"\n"
4298 " @\"c\";");
4299 verifyFormat("NSString s = @\"a\"\n"
4300 " \"b\"\n"
4301 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00004302}
4303
Zachary Turner448592e2015-12-18 22:20:15 +00004304TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004305 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00004306 // No declarations or definitions should be moved to own line.
4307 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
4308 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004309 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004310 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004311 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004312 "int f() { return 1; }\n"
4313 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004314 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00004315
4316 // All declarations and definitions should have the return type moved to its
4317 // own
4318 // line.
4319 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
4320 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004321 " int\n"
4322 " f() {\n"
4323 " return 1;\n"
4324 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004325 " int\n"
4326 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004327 "};\n"
4328 "int\n"
4329 "f() {\n"
4330 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004331 "}\n"
4332 "int\n"
4333 "g();\n",
4334 Style);
4335
4336 // Top-level definitions, and no kinds of declarations should have the
4337 // return type moved to its own line.
4338 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
4339 verifyFormat("class B {\n"
4340 " int f() { return 1; }\n"
4341 " int g();\n"
4342 "};\n"
4343 "int\n"
4344 "f() {\n"
4345 " return 1;\n"
4346 "}\n"
4347 "int g();\n",
4348 Style);
4349
4350 // Top-level definitions and declarations should have the return type moved
4351 // to its own line.
4352 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
4353 verifyFormat("class C {\n"
4354 " int f() { return 1; }\n"
4355 " int g();\n"
4356 "};\n"
4357 "int\n"
4358 "f() {\n"
4359 " return 1;\n"
4360 "}\n"
4361 "int\n"
4362 "g();\n",
4363 Style);
4364
4365 // All definitions should have the return type moved to its own line, but no
4366 // kinds of declarations.
4367 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4368 verifyFormat("class D {\n"
4369 " int\n"
4370 " f() {\n"
4371 " return 1;\n"
4372 " }\n"
4373 " int g();\n"
4374 "};\n"
4375 "int\n"
4376 "f() {\n"
4377 " return 1;\n"
4378 "}\n"
4379 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004380 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004381 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004382 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004383 " return \"\";\n"
4384 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004385 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004386 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004387 verifyFormat("template <class T>\n"
4388 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004389 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004390 " return NULL;\n"
4391 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004392 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004393 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00004394 verifyFormat("class C {\n"
4395 " int\n"
4396 " operator+() {\n"
4397 " return 1;\n"
4398 " }\n"
4399 " int\n"
4400 " operator()() {\n"
4401 " return 1;\n"
4402 " }\n"
4403 "};\n",
4404 Style);
4405 verifyFormat("void\n"
4406 "A::operator()() {}\n"
4407 "void\n"
4408 "A::operator>>() {}\n"
4409 "void\n"
4410 "A::operator+() {}\n",
4411 Style);
4412 verifyFormat("void *operator new(std::size_t s);", // No break here.
4413 Style);
4414 verifyFormat("void *\n"
4415 "operator new(std::size_t s) {}",
4416 Style);
4417 verifyFormat("void *\n"
4418 "operator delete[](void *ptr) {}",
4419 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004420 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00004421 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004422 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004423 "{\n"
4424 " return \"\";\n"
4425 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004426 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004427 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004428 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004429 "T *\n" // Problem here: no line break
4430 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004431 "{\n"
4432 " return NULL;\n"
4433 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004434 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004435 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004436}
4437
Alexander Kornienko58611712013-07-04 12:02:44 +00004438TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
4439 FormatStyle NoBreak = getLLVMStyle();
4440 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
4441 FormatStyle Break = getLLVMStyle();
4442 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00004443 verifyFormat("aaaa = \"bbbb\"\n"
4444 " \"cccc\";",
4445 NoBreak);
4446 verifyFormat("aaaa =\n"
4447 " \"bbbb\"\n"
4448 " \"cccc\";",
4449 Break);
4450 verifyFormat("aaaa(\"bbbb\"\n"
4451 " \"cccc\");",
4452 NoBreak);
4453 verifyFormat("aaaa(\n"
4454 " \"bbbb\"\n"
4455 " \"cccc\");",
4456 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004457 verifyFormat("aaaa(qqq, \"bbbb\"\n"
4458 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004459 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004460 verifyFormat("aaaa(qqq,\n"
4461 " \"bbbb\"\n"
4462 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004463 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004464 verifyFormat("aaaa(qqq,\n"
4465 " L\"bbbb\"\n"
4466 " L\"cccc\");",
4467 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004468 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
4469 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00004470 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00004471 verifyFormat("string s = someFunction(\n"
4472 " \"abc\"\n"
4473 " \"abc\");",
4474 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00004475
Daniel Jasper3251fff2014-06-10 06:27:23 +00004476 // As we break before unary operators, breaking right after them is bad.
4477 verifyFormat("string foo = abc ? \"x\"\n"
4478 " \"blah blah blah blah blah blah\"\n"
4479 " : \"y\";",
4480 Break);
4481
Daniel Jasperc834c702013-07-17 15:38:19 +00004482 // Don't break if there is no column gain.
4483 verifyFormat("f(\"aaaa\"\n"
4484 " \"bbbb\");",
4485 Break);
4486
4487 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004488 EXPECT_EQ("x = \"a\\\n"
4489 "b\\\n"
4490 "c\";",
4491 format("x = \"a\\\n"
4492 "b\\\n"
4493 "c\";",
4494 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004495 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004496 " \"a\\\n"
4497 "b\\\n"
4498 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004499 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004500 "b\\\n"
4501 "c\";",
4502 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00004503
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00004504 EXPECT_EQ("NSString *const kString =\n"
4505 " @\"aaaa\"\n"
4506 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004507 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004508 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004509 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00004510
4511 Break.ColumnLimit = 0;
4512 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00004513}
4514
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004515TEST_F(FormatTest, AlignsPipes) {
4516 verifyFormat(
4517 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4518 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4519 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4520 verifyFormat(
4521 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
4522 " << aaaaaaaaaaaaaaaaaaaa;");
4523 verifyFormat(
4524 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4525 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4526 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00004527 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4528 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4529 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004530 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
4531 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
4532 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
4533 verifyFormat(
4534 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4535 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4536 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004537 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4538 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4539 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4540 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00004541 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
4542 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00004543 verifyFormat(
4544 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4545 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00004546 verifyFormat(
4547 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
4548 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00004549
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004550 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
4551 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00004552 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4553 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4554 " aaaaaaaaaaaaaaaaaaaaa)\n"
4555 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00004556 verifyFormat("LOG_IF(aaa == //\n"
4557 " bbb)\n"
4558 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004559
Daniel Jasper467ddb12013-08-12 12:58:05 +00004560 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00004561 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4562 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004563 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
4564 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4565 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00004566 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
4567 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00004568 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4569 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4570 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4571 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4572 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4573 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4574 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004575
Daniel Jasperc238c872013-04-02 14:33:13 +00004576 verifyFormat(
4577 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4578 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00004579
4580 // Incomplete string literal.
4581 EXPECT_EQ("llvm::errs() << \"\n"
4582 " << a;",
4583 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00004584
4585 verifyFormat("void f() {\n"
4586 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
4587 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
4588 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00004589
4590 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00004591 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
4592 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
4593 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00004594
4595 // Handle '\n'.
4596 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
4597 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
4598 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
4599 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
4600 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
4601 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
4602 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004603}
4604
Daniel Jasper7209bb92016-12-13 11:16:42 +00004605TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
4606 verifyFormat("return out << \"somepacket = {\\n\"\n"
4607 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
4608 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
4609 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
4610 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
4611 " << \"}\";");
4612
4613 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4614 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4615 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
4616 verifyFormat(
4617 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
4618 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
4619 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
4620 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
4621 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
4622 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
4623 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
4624 verifyFormat(
4625 "void f() {\n"
4626 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
4627 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4628 "}");
4629
4630 // Breaking before the first "<<" is generally not desirable.
4631 verifyFormat(
4632 "llvm::errs()\n"
4633 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4634 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4635 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4636 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4637 getLLVMStyleWithColumns(70));
4638 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4639 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4640 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4641 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4642 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4643 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4644 getLLVMStyleWithColumns(70));
4645
4646 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4647 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4648 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
4649 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4650 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4651 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00004652 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
4653 " (aaaa + aaaa);",
4654 getLLVMStyleWithColumns(40));
4655 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
4656 " (aaaaaaa + aaaaa));",
4657 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00004658 verifyFormat(
4659 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
4660 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
4661 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00004662}
4663
Daniel Jasperf7935112012-12-03 18:12:45 +00004664TEST_F(FormatTest, UnderstandsEquals) {
4665 verifyFormat(
4666 "aaaaaaaaaaaaaaaaa =\n"
4667 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4668 verifyFormat(
4669 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004670 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004671 verifyFormat(
4672 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004673 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00004674 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004675 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
4676 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004677
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004678 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4679 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004680}
4681
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004682TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004683 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4684 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004685
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004686 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4687 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004688
4689 verifyFormat(
4690 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
4691 " Parameter2);");
4692
4693 verifyFormat(
4694 "ShortObject->shortFunction(\n"
4695 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
4696 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
4697
4698 verifyFormat("loooooooooooooongFunction(\n"
4699 " LoooooooooooooongObject->looooooooooooooooongFunction());");
4700
4701 verifyFormat(
4702 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
4703 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
4704
Daniel Jasper687af3b2013-02-14 14:26:07 +00004705 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4706 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00004707 verifyFormat("void f() {\n"
4708 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4709 " .Times(2)\n"
4710 " .WillRepeatedly(Return(SomeValue));\n"
4711 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00004712 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
4713 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00004714 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00004715 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4716 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00004717 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004718 verifyFormat("void f() {\n"
4719 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4720 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
4721 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00004722 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4723 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4724 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4725 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4726 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00004727 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4728 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4729 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4730 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
4731 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00004732
Daniel Jasperc7345cc2013-01-07 07:13:20 +00004733 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004734 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004735 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00004736 verifyFormat(
4737 "aaaaaaaaaaa->aaaaaaaaa(\n"
4738 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4739 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00004740
4741 verifyFormat(
4742 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4743 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00004744 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
4745 " aaaaaaaaa()->aaaaaa()->aaaaa());");
4746 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
4747 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004748
Daniel Jasper9b334242013-03-15 14:57:30 +00004749 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00004750 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4751 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00004752
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004753 FormatStyle NoBinPacking = getLLVMStyle();
4754 NoBinPacking.BinPackParameters = false;
4755 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4756 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4757 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
4758 " aaaaaaaaaaaaaaaaaaa,\n"
4759 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4760 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00004761
4762 // If there is a subsequent call, change to hanging indentation.
4763 verifyFormat(
4764 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4765 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
4766 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4767 verifyFormat(
4768 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4769 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00004770 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4771 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4772 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4773 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4774 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4775 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004776}
4777
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004778TEST_F(FormatTest, WrapsTemplateDeclarations) {
4779 verifyFormat("template <typename T>\n"
4780 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00004781 verifyFormat("template <typename T>\n"
4782 "// T should be one of {A, B}.\n"
4783 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004784 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00004785 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00004786 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004787 verifyFormat("template <typename T>\n"
4788 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
4789 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004790 verifyFormat(
4791 "template <typename T>\n"
4792 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
4793 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00004794 verifyFormat(
4795 "template <typename T>\n"
4796 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
4797 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
4798 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00004799 verifyFormat("template <typename T>\n"
4800 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004801 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00004802 verifyFormat(
4803 "template <typename T1, typename T2 = char, typename T3 = char,\n"
4804 " typename T4 = char>\n"
4805 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00004806 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
4807 " template <typename> class cccccccccccccccccccccc,\n"
4808 " typename ddddddddddddd>\n"
4809 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004810 verifyFormat(
4811 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
4812 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00004813
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004814 verifyFormat("void f() {\n"
4815 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
4816 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
4817 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00004818
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00004819 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00004820 verifyFormat("template <typename T> void f();");
4821 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00004822 verifyFormat(
4823 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4824 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4825 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
4826 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4827 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4828 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
4829 " bbbbbbbbbbbbbbbbbbbbbbbb);",
4830 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00004831 EXPECT_EQ("static_cast<A< //\n"
4832 " B> *>(\n"
4833 "\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00004834 ");",
Daniel Jasperfcfac102014-07-15 09:00:34 +00004835 format("static_cast<A<//\n"
4836 " B>*>(\n"
4837 "\n"
4838 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00004839 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4840 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00004841
4842 FormatStyle AlwaysBreak = getLLVMStyle();
4843 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
4844 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
4845 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
4846 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
4847 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4848 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
4849 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
4850 verifyFormat("template <template <typename> class Fooooooo,\n"
4851 " template <typename> class Baaaaaaar>\n"
4852 "struct C {};",
4853 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00004854 verifyFormat("template <typename T> // T can be A, B or C.\n"
4855 "struct C {};",
4856 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00004857 verifyFormat("template <enum E> class A {\n"
4858 "public:\n"
4859 " E *f();\n"
4860 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004861}
4862
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00004863TEST_F(FormatTest, WrapsTemplateParameters) {
4864 FormatStyle Style = getLLVMStyle();
4865 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4866 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4867 verifyFormat(
4868 "template <typename... a> struct q {};\n"
4869 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
4870 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
4871 " y;",
4872 Style);
4873 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4874 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4875 verifyFormat(
4876 "template <typename... a> struct r {};\n"
4877 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
4878 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
4879 " y;",
4880 Style);
4881 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4882 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4883 verifyFormat(
4884 "template <typename... a> struct s {};\n"
4885 "extern s<\n"
4886 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4887 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
4888 " y;",
4889 Style);
4890 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4891 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4892 verifyFormat(
4893 "template <typename... a> struct t {};\n"
4894 "extern t<\n"
4895 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4896 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
4897 " y;",
4898 Style);
4899}
4900
Daniel Jasper45797022013-01-25 10:57:27 +00004901TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
4902 verifyFormat(
4903 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4904 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4905 verifyFormat(
4906 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4907 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4908 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
4909
Daniel Jasper0f0234e2013-05-08 10:00:18 +00004910 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00004911 verifyFormat(
4912 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4913 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00004914 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00004915
Daniel Jasper45797022013-01-25 10:57:27 +00004916 verifyFormat(
4917 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00004918 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00004919
4920 // Breaking at nested name specifiers is generally not desirable.
4921 verifyFormat(
4922 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4923 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004924
4925 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004926 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
4927 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4928 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004929 " aaaaaaaaaaaaaaaaaaaaa);",
4930 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00004931
4932 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4933 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4934 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00004935}
4936
Daniel Jasperf7935112012-12-03 18:12:45 +00004937TEST_F(FormatTest, UnderstandsTemplateParameters) {
4938 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00004939 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004940 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
4941 verifyFormat("bool x = a < 1 || 2 > a;");
4942 verifyFormat("bool x = 5 < f<int>();");
4943 verifyFormat("bool x = f<int>() > 5;");
4944 verifyFormat("bool x = 5 < a<int>::x;");
4945 verifyFormat("bool x = a < 4 ? a > 2 : false;");
4946 verifyFormat("bool x = f() ? a < 2 : a > 2;");
4947
4948 verifyGoogleFormat("A<A<int>> a;");
4949 verifyGoogleFormat("A<A<A<int>>> a;");
4950 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00004951 verifyGoogleFormat("A<A<int> > a;");
4952 verifyGoogleFormat("A<A<A<int> > > a;");
4953 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00004954 verifyGoogleFormat("A<::A<int>> a;");
4955 verifyGoogleFormat("A<::A> a;");
4956 verifyGoogleFormat("A< ::A> a;");
4957 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00004958 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
4959 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00004960 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
4961 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00004962 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
4963 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00004964
Nico Weber7533b4d2014-09-24 17:17:32 +00004965 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
4966
Daniel Jasperf7935112012-12-03 18:12:45 +00004967 verifyFormat("test >> a >> b;");
4968 verifyFormat("test << a >> b;");
4969
4970 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004971 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00004972 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00004973 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
4974 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00004975 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00004976 verifyFormat("f(a.operator()<A>());");
4977 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4978 " .template operator()<A>());",
4979 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00004980
4981 // Not template parameters.
4982 verifyFormat("return a < b && c > d;");
4983 verifyFormat("void f() {\n"
4984 " while (a < b && c > d) {\n"
4985 " }\n"
4986 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00004987 verifyFormat("template <typename... Types>\n"
4988 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00004989
4990 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4991 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
4992 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00004993 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00004994 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00004995 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00004996}
4997
Malcolm Parsons6af3f142016-11-03 16:57:30 +00004998TEST_F(FormatTest, BitshiftOperatorWidth) {
4999 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5000 " bar */",
5001 format("int a=1<<2; /* foo\n"
5002 " bar */"));
5003
5004 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5005 " bar */",
5006 format("int b =256>>1 ; /* foo\n"
5007 " bar */"));
5008}
5009
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005010TEST_F(FormatTest, UnderstandsBinaryOperators) {
5011 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005012 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005013}
5014
5015TEST_F(FormatTest, UnderstandsPointersToMembers) {
5016 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005017 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005018 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005019 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005020 verifyFormat("void f() {\n"
5021 " (a->*f)();\n"
5022 " a->*x;\n"
5023 " (a.*f)();\n"
5024 " ((*a).*f)();\n"
5025 " a.*x;\n"
5026 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005027 verifyFormat("void f() {\n"
5028 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5029 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5030 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005031 verifyFormat(
5032 "(aaaaaaaaaa->*bbbbbbb)(\n"
5033 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005034 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005035 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005036 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005037}
5038
Daniel Jasper8dd40472012-12-21 09:41:31 +00005039TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005040 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005041 verifyFormat("f(-1, -2, -3);");
5042 verifyFormat("a[-1] = 5;");
5043 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005044 verifyFormat("if (i == -1) {\n}");
5045 verifyFormat("if (i != -1) {\n}");
5046 verifyFormat("if (i > -1) {\n}");
5047 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005048 verifyFormat("++(a->f());");
5049 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005050 verifyFormat("(a->f())++;");
5051 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005052 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005053
5054 verifyFormat("a-- > b;");
5055 verifyFormat("b ? -a : c;");
5056 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005057 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005058 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005059 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005060
5061 verifyFormat("return -1;");
5062 verifyFormat("switch (a) {\n"
5063 "case -1:\n"
5064 " break;\n"
5065 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005066 verifyFormat("#define X -1");
5067 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005068
Chandler Carruthf8b72662014-03-02 12:37:31 +00005069 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5070 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005071
5072 verifyFormat("int a = /* confusing comment */ -1;");
5073 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5074 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005075}
5076
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005077TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005078 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005079 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005080 "}");
5081 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005082 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005083 verifyFormat("*aaa = aaaaaaa( // break\n"
5084 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005085}
5086
Daniel Jasper8863ada2013-08-26 08:10:17 +00005087TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005088 verifyFormat("bool operator<();");
5089 verifyFormat("bool operator>();");
5090 verifyFormat("bool operator=();");
5091 verifyFormat("bool operator==();");
5092 verifyFormat("bool operator!=();");
5093 verifyFormat("int operator+();");
5094 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00005095 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005096 verifyFormat("bool operator();");
5097 verifyFormat("bool operator()();");
5098 verifyFormat("bool operator[]();");
5099 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005100 verifyFormat("operator int();");
5101 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005102 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005103 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005104 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005105 verifyFormat("void *operator new(std::size_t size);");
5106 verifyFormat("void *operator new[](std::size_t size);");
5107 verifyFormat("void operator delete(void *ptr);");
5108 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00005109 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5110 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00005111 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00005112 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005113
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005114 verifyFormat(
5115 "ostream &operator<<(ostream &OutputStream,\n"
5116 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00005117 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5118 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5119 " return left.group < right.group;\n"
5120 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00005121 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00005122 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005123
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005124 verifyGoogleFormat("operator void*();");
5125 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00005126 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00005127
5128 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00005129 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5130 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005131}
5132
Daniel Jasper1c220482015-02-25 10:30:06 +00005133TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00005134 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5135 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5136 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5137 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5138 verifyFormat("Deleted &operator=(const Deleted &) &;");
5139 verifyFormat("Deleted &operator=(const Deleted &) &&;");
5140 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5141 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5142 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5143 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5144 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00005145 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00005146 verifyFormat("template <typename T>\n"
5147 "void F(T) && = delete;",
5148 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00005149
Daniel Jasperaf642c62015-08-25 13:40:51 +00005150 FormatStyle AlignLeft = getLLVMStyle();
5151 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005152 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005153 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5154 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5155 AlignLeft);
5156 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5157 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005158 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5159 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5160 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5161 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00005162 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005163
5164 FormatStyle Spaces = getLLVMStyle();
5165 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005166 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5167 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5168 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5169 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005170
5171 Spaces.SpacesInCStyleCastParentheses = false;
5172 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005173 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5174 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5175 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5176 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005177}
5178
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005179TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005180 verifyFormat("void f() {\n"
5181 " A *a = new A;\n"
5182 " A *a = new (placement) A;\n"
5183 " delete a;\n"
5184 " delete (A *)a;\n"
5185 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005186 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5187 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005188 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5189 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5190 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005191 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005192}
5193
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005194TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005195 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005196 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005197 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005198 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005199 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005200 verifyIndependentOfContext("int a = b * 10;");
5201 verifyIndependentOfContext("int a = 10 * b;");
5202 verifyIndependentOfContext("int a = b * c;");
5203 verifyIndependentOfContext("int a += b * c;");
5204 verifyIndependentOfContext("int a -= b * c;");
5205 verifyIndependentOfContext("int a *= b * c;");
5206 verifyIndependentOfContext("int a /= b * c;");
5207 verifyIndependentOfContext("int a = *b;");
5208 verifyIndependentOfContext("int a = *b * c;");
5209 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00005210 verifyIndependentOfContext("int a = b * (10);");
5211 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005212 verifyIndependentOfContext("return 10 * b;");
5213 verifyIndependentOfContext("return *b * *c;");
5214 verifyIndependentOfContext("return a & ~b;");
5215 verifyIndependentOfContext("f(b ? *c : *d);");
5216 verifyIndependentOfContext("int a = b ? *c : *d;");
5217 verifyIndependentOfContext("*b = a;");
5218 verifyIndependentOfContext("a * ~b;");
5219 verifyIndependentOfContext("a * !b;");
5220 verifyIndependentOfContext("a * +b;");
5221 verifyIndependentOfContext("a * -b;");
5222 verifyIndependentOfContext("a * ++b;");
5223 verifyIndependentOfContext("a * --b;");
5224 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00005225 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005226 verifyIndependentOfContext("f() * b;");
5227 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005228 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005229 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00005230 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005231 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00005232 verifyIndependentOfContext("return sizeof(int **);");
5233 verifyIndependentOfContext("return sizeof(int ******);");
5234 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00005235 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005236 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00005237 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00005238 verifyGoogleFormat("return sizeof(int**);");
5239 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5240 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005241 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00005242 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00005243 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00005244 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00005245 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00005246 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00005247 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00005248 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00005249 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00005250 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00005251 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00005252 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00005253 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00005254 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00005255 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00005256 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00005257 verifyFormat("void f(const MyOverride &override);");
5258 verifyFormat("void f(const MyFinal &final);");
5259 verifyIndependentOfContext("bool a = f() && override.f();");
5260 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00005261
Daniel Jasper5b49f472013-01-23 12:10:53 +00005262 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00005263
Daniel Jasper5b49f472013-01-23 12:10:53 +00005264 verifyIndependentOfContext("A<int *> a;");
5265 verifyIndependentOfContext("A<int **> a;");
5266 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00005267 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005268 verifyIndependentOfContext(
5269 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005270 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00005271 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00005272 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00005273 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00005274 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00005275
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00005276 verifyFormat(
5277 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5278 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5279
Daniel Jasper1f5d6372016-06-13 14:45:12 +00005280 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00005281 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00005282 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005283 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00005284 verifyGoogleFormat("A<int*> a;");
5285 verifyGoogleFormat("A<int**> a;");
5286 verifyGoogleFormat("A<int*, int*> a;");
5287 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005288 verifyGoogleFormat("f(b ? *c : *d);");
5289 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00005290 verifyGoogleFormat("Type* t = **x;");
5291 verifyGoogleFormat("Type* t = *++*x;");
5292 verifyGoogleFormat("*++*x;");
5293 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5294 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005295 verifyGoogleFormat(
5296 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00005297 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00005298 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5299 verifyGoogleFormat("template <typename T>\n"
5300 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00005301
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005302 FormatStyle Left = getLLVMStyle();
5303 Left.PointerAlignment = FormatStyle::PAS_Left;
5304 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00005305 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00005306 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005307
Daniel Jasper5b49f472013-01-23 12:10:53 +00005308 verifyIndependentOfContext("a = *(x + y);");
5309 verifyIndependentOfContext("a = &(x + y);");
5310 verifyIndependentOfContext("*(x + y).call();");
5311 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005312 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00005313
Daniel Jasper5b49f472013-01-23 12:10:53 +00005314 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00005315 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00005316 "int *MyValues = {\n"
5317 " *A, // Operator detection might be confused by the '{'\n"
5318 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00005319 "};");
Nico Weber80a82762013-01-17 17:17:19 +00005320
Daniel Jasper5b49f472013-01-23 12:10:53 +00005321 verifyIndependentOfContext("if (int *a = &b)");
5322 verifyIndependentOfContext("if (int &a = *b)");
5323 verifyIndependentOfContext("if (a & b[i])");
5324 verifyIndependentOfContext("if (a::b::c::d & b[i])");
5325 verifyIndependentOfContext("if (*b[i])");
5326 verifyIndependentOfContext("if (int *a = (&b))");
5327 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00005328 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00005329 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00005330 verifyFormat("void f() {\n"
5331 " for (const int &v : Values) {\n"
5332 " }\n"
5333 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005334 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5335 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00005336 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00005337
Daniel Jaspera98da3d2013-11-07 19:56:07 +00005338 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005339 verifyFormat("#define MACRO \\\n"
5340 " int *i = a * b; \\\n"
5341 " void f(a *b);",
5342 getLLVMStyleWithColumns(19));
5343
Daniel Jasper97b89482013-03-13 07:49:51 +00005344 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005345 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005346 verifyIndependentOfContext("T **t = new T *;");
5347 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00005348 verifyGoogleFormat("A = new SomeType*[Length]();");
5349 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005350 verifyGoogleFormat("T** t = new T*;");
5351 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005352
Daniel Jasper990ff972013-05-07 14:17:18 +00005353 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005354 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00005355 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00005356 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5357 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005358 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005359 "typename t::if<x && y>::type f() {}");
5360 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005361 verifyFormat("vector<int *> v;");
5362 verifyFormat("vector<int *const> v;");
5363 verifyFormat("vector<int *const **const *> v;");
5364 verifyFormat("vector<int *volatile> v;");
5365 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005366 verifyFormat("foo<b && false>();");
5367 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00005368 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00005369 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005370 "template <class T, class = typename std::enable_if<\n"
5371 " std::is_integral<T>::value &&\n"
5372 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
5373 "void F();",
5374 getLLVMStyleWithColumns(70));
5375 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005376 "template <class T,\n"
5377 " class = typename std::enable_if<\n"
5378 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005379 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
5380 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005381 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005382 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005383 verifyFormat(
5384 "template <class T,\n"
5385 " class = typename ::std::enable_if<\n"
5386 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
5387 "void F();",
5388 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005389
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005390 verifyIndependentOfContext("MACRO(int *i);");
5391 verifyIndependentOfContext("MACRO(auto *a);");
5392 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00005393 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00005394 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00005395 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005396 // FIXME: Is there a way to make this work?
5397 // verifyIndependentOfContext("MACRO(A *a);");
5398
Daniel Jasper32ccb032014-06-23 07:36:18 +00005399 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00005400 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00005401
Daniel Jasper866468a2014-04-14 13:15:29 +00005402 EXPECT_EQ("#define OP(x) \\\n"
5403 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5404 " return s << a.DebugString(); \\\n"
5405 " }",
5406 format("#define OP(x) \\\n"
5407 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5408 " return s << a.DebugString(); \\\n"
5409 " }",
5410 getLLVMStyleWithColumns(50)));
5411
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005412 // FIXME: We cannot handle this case yet; we might be able to figure out that
5413 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00005414 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00005415
5416 FormatStyle PointerMiddle = getLLVMStyle();
5417 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
5418 verifyFormat("delete *x;", PointerMiddle);
5419 verifyFormat("int * x;", PointerMiddle);
5420 verifyFormat("template <int * y> f() {}", PointerMiddle);
5421 verifyFormat("int * f(int * a) {}", PointerMiddle);
5422 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
5423 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
5424 verifyFormat("A<int *> a;", PointerMiddle);
5425 verifyFormat("A<int **> a;", PointerMiddle);
5426 verifyFormat("A<int *, int *> a;", PointerMiddle);
5427 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00005428 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
5429 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00005430 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005431
5432 // Member function reference qualifiers aren't binary operators.
5433 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005434 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005435 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005436 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005437 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005438 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005439}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005440
Daniel Jasperee6d6502013-07-17 20:25:02 +00005441TEST_F(FormatTest, UnderstandsAttributes) {
5442 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00005443 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
5444 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005445 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005446 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005447 verifyFormat("__attribute__((nodebug)) void\n"
5448 "foo() {}\n",
5449 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00005450}
5451
Daniel Jasper10cd5812013-05-06 06:35:44 +00005452TEST_F(FormatTest, UnderstandsEllipsis) {
5453 verifyFormat("int printf(const char *fmt, ...);");
5454 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005455 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5456
5457 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005458 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005459 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00005460}
5461
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005462TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005463 EXPECT_EQ("int *a;\n"
5464 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005465 "int *a;",
5466 format("int *a;\n"
5467 "int* a;\n"
5468 "int *a;",
5469 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005470 EXPECT_EQ("int* a;\n"
5471 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005472 "int* a;",
5473 format("int* a;\n"
5474 "int* a;\n"
5475 "int *a;",
5476 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005477 EXPECT_EQ("int *a;\n"
5478 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005479 "int *a;",
5480 format("int *a;\n"
5481 "int * a;\n"
5482 "int * a;",
5483 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005484 EXPECT_EQ("auto x = [] {\n"
5485 " int *a;\n"
5486 " int *a;\n"
5487 " int *a;\n"
5488 "};",
5489 format("auto x=[]{int *a;\n"
5490 "int * a;\n"
5491 "int * a;};",
5492 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005493}
5494
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005495TEST_F(FormatTest, UnderstandsRvalueReferences) {
5496 verifyFormat("int f(int &&a) {}");
5497 verifyFormat("int f(int a, char &&b) {}");
5498 verifyFormat("void f() { int &&a = b; }");
5499 verifyGoogleFormat("int f(int a, char&& b) {}");
5500 verifyGoogleFormat("void f() { int&& a = b; }");
5501
Daniel Jasper1eff9082013-05-27 16:36:33 +00005502 verifyIndependentOfContext("A<int &&> a;");
5503 verifyIndependentOfContext("A<int &&, int &&> a;");
5504 verifyGoogleFormat("A<int&&> a;");
5505 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00005506
5507 // Not rvalue references:
5508 verifyFormat("template <bool B, bool C> class A {\n"
5509 " static_assert(B && C, \"Something is wrong\");\n"
5510 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00005511 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
5512 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00005513 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005514}
5515
Manuel Klimekc1237a82013-01-23 14:08:21 +00005516TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
5517 verifyFormat("void f() {\n"
5518 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005519 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005520 "}",
5521 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00005522}
5523
Daniel Jasperef906a92013-01-13 08:01:36 +00005524TEST_F(FormatTest, FormatsCasts) {
5525 verifyFormat("Type *A = static_cast<Type *>(P);");
5526 verifyFormat("Type *A = (Type *)P;");
5527 verifyFormat("Type *A = (vector<Type *, int *>)P;");
5528 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00005529 verifyFormat("int a = (int)2.0f;");
5530 verifyFormat("x[(int32)y];");
5531 verifyFormat("x = (int32)y;");
5532 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
5533 verifyFormat("int a = (int)*b;");
5534 verifyFormat("int a = (int)2.0f;");
5535 verifyFormat("int a = (int)~0;");
5536 verifyFormat("int a = (int)++a;");
5537 verifyFormat("int a = (int)sizeof(int);");
5538 verifyFormat("int a = (int)+2;");
5539 verifyFormat("my_int a = (my_int)2.0f;");
5540 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00005541 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00005542 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00005543 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00005544 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00005545 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00005546
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005547 verifyFormat("void f() { my_int a = (my_int)*b; }");
5548 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
5549 verifyFormat("my_int a = (my_int)~0;");
5550 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00005551 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005552 verifyFormat("my_int a = (my_int)1;");
5553 verifyFormat("my_int a = (my_int *)1;");
5554 verifyFormat("my_int a = (const my_int)-1;");
5555 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00005556 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00005557 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00005558 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00005559 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005560
5561 // FIXME: single value wrapped with paren will be treated as cast.
5562 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00005563
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00005564 verifyFormat("{ (void)F; }");
5565
Daniel Jasper998cabc2013-07-18 14:46:07 +00005566 // Don't break after a cast's
5567 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5568 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
5569 " bbbbbbbbbbbbbbbbbbbbbb);");
5570
Daniel Jasperef906a92013-01-13 08:01:36 +00005571 // These are not casts.
5572 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00005573 verifyFormat("f(foo)->b;");
5574 verifyFormat("f(foo).b;");
5575 verifyFormat("f(foo)(b);");
5576 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005577 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00005578 verifyFormat("(*funptr)(foo)[4];");
5579 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00005580 verifyFormat("void f(int *);");
5581 verifyFormat("void f(int *) = 0;");
5582 verifyFormat("void f(SmallVector<int>) {}");
5583 verifyFormat("void f(SmallVector<int>);");
5584 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00005585 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00005586 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005587 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00005588 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
5589 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00005590 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005591
Daniel Jasperba0bda92013-02-23 08:07:18 +00005592 // These are not casts, but at some point were confused with casts.
5593 verifyFormat("virtual void foo(int *) override;");
5594 verifyFormat("virtual void foo(char &) const;");
5595 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00005596 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005597 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00005598 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00005599 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00005600
5601 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
5602 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005603 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005604 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005605 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5606 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
5607 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00005608}
5609
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005610TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005611 verifyFormat("A<bool()> a;");
5612 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00005613 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00005614 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005615 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005616 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005617 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00005618 verifyFormat("template <class CallbackClass>\n"
5619 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00005620
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005621 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
5622 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00005623 verifyGoogleFormat(
5624 "template <class CallbackClass>\n"
5625 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00005626
Daniel Jasper5dad58e2013-05-15 07:51:51 +00005627 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00005628 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00005629 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00005630 verifyFormat("some_var = function(*some_pointer_var)[0];");
5631 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00005632 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00005633 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00005634 verifyFormat("std::function<\n"
5635 " LooooooooooongTemplatedType<\n"
5636 " SomeType>*(\n"
5637 " LooooooooooooooooongType type)>\n"
5638 " function;",
5639 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005640}
5641
Daniel Jasperbeaa3222015-02-26 11:30:50 +00005642TEST_F(FormatTest, FormatsPointersToArrayTypes) {
5643 verifyFormat("A (*foo_)[6];");
5644 verifyFormat("vector<int> (*foo_)[6];");
5645}
5646
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005647TEST_F(FormatTest, BreaksLongVariableDeclarations) {
5648 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5649 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
5650 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
5651 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00005652 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5653 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005654
5655 // Different ways of ()-initializiation.
5656 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5657 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
5658 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5659 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
5660 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5661 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00005662 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5663 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00005664
5665 // Lambdas should not confuse the variable declaration heuristic.
5666 verifyFormat("LooooooooooooooooongType\n"
5667 " variable(nullptr, [](A *a) {});",
5668 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005669}
5670
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005671TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00005672 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005673 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005674 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005675 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00005676 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005677 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00005678 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
5679 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00005680 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5681 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00005682 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
5683 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00005684 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
5685 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00005686 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
5687 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005688 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5689 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
5690 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5691 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00005692 FormatStyle Indented = getLLVMStyle();
5693 Indented.IndentWrappedFunctionNames = true;
5694 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5695 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
5696 Indented);
5697 verifyFormat(
5698 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5699 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5700 Indented);
5701 verifyFormat(
5702 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
5703 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5704 Indented);
5705 verifyFormat(
5706 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
5707 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5708 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00005709
5710 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00005711 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
5712 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
5713 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00005714
Daniel Jasperd2639ef2013-01-28 15:16:31 +00005715 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005716 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00005717 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00005718 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
5719 " SourceLocation L, IdentifierIn *II,\n"
5720 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005721 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005722 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005723 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005724 " const SomeType<string, SomeOtherTemplateParameter>\n"
5725 " &ReallyReallyLongParameterName,\n"
5726 " const SomeType<string, SomeOtherTemplateParameter>\n"
5727 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00005728 verifyFormat("template <typename A>\n"
5729 "SomeLoooooooooooooooooooooongType<\n"
5730 " typename some_namespace::SomeOtherType<A>::Type>\n"
5731 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005732
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00005733 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00005734 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
5735 " aaaaaaaaaaaaaaaaaaaaaaa;");
5736 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005737 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
5738 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00005739 verifyGoogleFormat(
5740 "some_namespace::LongReturnType\n"
5741 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005742 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00005743
5744 verifyGoogleFormat("template <typename T>\n"
5745 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005746 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00005747 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5748 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00005749
5750 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005751 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5752 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00005753 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5754 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
5755 " aaaaaaaaaaaaaaaaaaaaaaaa);");
5756 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5757 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
5758 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
5759 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00005760
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00005761 verifyFormat("template <typename T> // Templates on own line.\n"
5762 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00005763 "MyFunction(int a);",
5764 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00005765}
5766
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005767TEST_F(FormatTest, FormatsArrays) {
5768 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5769 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00005770 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
5771 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00005772 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
5773 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005774 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5775 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5776 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5777 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
5778 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5779 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5780 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5781 verifyFormat(
5782 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
5783 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5784 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00005785 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
5786 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00005787
5788 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
5789 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00005790 verifyFormat(
5791 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
5792 " .aaaaaaa[0]\n"
5793 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00005794 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00005795
5796 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00005797
5798 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
5799 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005800}
5801
Daniel Jaspere9de2602012-12-06 09:56:08 +00005802TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
5803 verifyFormat("(a)->b();");
5804 verifyFormat("--a;");
5805}
5806
Daniel Jasper8b529712012-12-04 13:02:32 +00005807TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00005808 verifyFormat("#include <string>\n"
5809 "#include <a/b/c.h>\n"
5810 "#include \"a/b/string\"\n"
5811 "#include \"string.h\"\n"
5812 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00005813 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005814 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00005815 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00005816 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00005817 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005818 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
5819 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00005820 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
5821 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00005822
Daniel Jasper5ef433f2013-01-13 08:12:18 +00005823 verifyFormat("#import <string>");
5824 verifyFormat("#import <a/b/c.h>");
5825 verifyFormat("#import \"a/b/string\"");
5826 verifyFormat("#import \"string.h\"");
5827 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00005828 verifyFormat("#if __has_include(<strstream>)\n"
5829 "#include <strstream>\n"
5830 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00005831
Daniel Jasper343643b2014-08-13 08:29:18 +00005832 verifyFormat("#define MY_IMPORT <a/b>");
5833
Nico Weber21088802017-02-10 19:36:52 +00005834 verifyFormat("#if __has_include(<a/b>)");
5835 verifyFormat("#if __has_include_next(<a/b>)");
5836 verifyFormat("#define F __has_include(<a/b>)");
5837 verifyFormat("#define F __has_include_next(<a/b>)");
5838
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00005839 // Protocol buffer definition or missing "#".
5840 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
5841 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00005842
5843 FormatStyle Style = getLLVMStyle();
5844 Style.AlwaysBreakBeforeMultilineStrings = true;
5845 Style.ColumnLimit = 0;
5846 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00005847
5848 // But 'import' might also be a regular C++ namespace.
5849 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5850 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00005851}
5852
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005853//===----------------------------------------------------------------------===//
5854// Error recovery tests.
5855//===----------------------------------------------------------------------===//
5856
Daniel Jasper66e9dee2013-02-14 09:19:04 +00005857TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005858 FormatStyle NoBinPacking = getLLVMStyle();
5859 NoBinPacking.BinPackParameters = false;
5860 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
5861 " double *min_x,\n"
5862 " double *max_x,\n"
5863 " double *min_y,\n"
5864 " double *max_y,\n"
5865 " double *min_z,\n"
5866 " double *max_z, ) {}",
5867 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00005868}
5869
Daniel Jasper83a54d22013-01-10 09:26:47 +00005870TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00005871 verifyFormat("void f() { return; }\n42");
5872 verifyFormat("void f() {\n"
5873 " if (0)\n"
5874 " return;\n"
5875 "}\n"
5876 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00005877 verifyFormat("void f() { return }\n42");
5878 verifyFormat("void f() {\n"
5879 " if (0)\n"
5880 " return\n"
5881 "}\n"
5882 "42");
5883}
5884
5885TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
5886 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
5887 EXPECT_EQ("void f() {\n"
5888 " if (a)\n"
5889 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005890 "}",
5891 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00005892 EXPECT_EQ("namespace N {\n"
5893 "void f()\n"
5894 "}",
5895 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00005896 EXPECT_EQ("namespace N {\n"
5897 "void f() {}\n"
5898 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00005899 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005900 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00005901}
5902
Daniel Jasper2df93312013-01-09 10:16:05 +00005903TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
5904 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00005905 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005906 " b;",
5907 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00005908 verifyFormat("function(\n"
5909 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005910 " LoooooooooooongArgument);\n",
5911 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00005912}
5913
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005914TEST_F(FormatTest, IncorrectAccessSpecifier) {
5915 verifyFormat("public:");
5916 verifyFormat("class A {\n"
5917 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005918 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005919 "};");
5920 verifyFormat("public\n"
5921 "int qwerty;");
5922 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005923 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005924 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005925 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005926 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005927 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005928}
Daniel Jasperf7935112012-12-03 18:12:45 +00005929
Daniel Jasper291f9362013-03-20 15:58:10 +00005930TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
5931 verifyFormat("{");
5932 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00005933 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00005934}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005935
5936TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005937 verifyFormat("do {\n}");
5938 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005939 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005940 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005941 "wheeee(fun);");
5942 verifyFormat("do {\n"
5943 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00005944 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005945}
5946
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005947TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00005948 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005949 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00005950 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005951 verifyFormat("while {\n foo;\n foo();\n}");
5952 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00005953}
5954
Daniel Jasperc0880a92013-01-04 18:52:56 +00005955TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00005956 verifyIncompleteFormat("namespace {\n"
5957 "class Foo { Foo (\n"
5958 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00005959 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00005960}
5961
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005962TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005963 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005964 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
5965 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005966 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005967
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005968 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005969 " {\n"
5970 " breakme(\n"
5971 " qwe);\n"
5972 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005973 format("{\n"
5974 " {\n"
5975 " breakme(qwe);\n"
5976 "}\n",
5977 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005978}
5979
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00005980TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005981 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005982 " avariable,\n"
5983 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005984 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00005985}
5986
Manuel Klimek762dd182013-01-21 10:07:49 +00005987TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005988 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00005989}
5990
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005991TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00005992 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00005993 verifyFormat("vector<int> x{\n"
5994 " 1, 2, 3, 4,\n"
5995 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005996 verifyFormat("vector<T> x{{}, {}, {}, {}};");
5997 verifyFormat("f({1, 2});");
5998 verifyFormat("auto v = Foo{-1};");
5999 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6000 verifyFormat("Class::Class : member{1, 2, 3} {}");
6001 verifyFormat("new vector<int>{1, 2, 3};");
6002 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006003 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006004 verifyFormat("return {arg1, arg2};");
6005 verifyFormat("return {arg1, SomeType{parameter}};");
6006 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6007 verifyFormat("new T{arg1, arg2};");
6008 verifyFormat("f(MyMap[{composite, key}]);");
6009 verifyFormat("class Class {\n"
6010 " T member = {arg1, arg2};\n"
6011 "};");
6012 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006013 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6014 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006015
Daniel Jasper438059e2014-05-22 12:11:13 +00006016 verifyFormat("int foo(int i) { return fo1{}(i); }");
6017 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006018 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006019 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006020 verifyFormat("Node n{1, Node{1000}, //\n"
6021 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006022 verifyFormat("Aaaa aaaaaaa{\n"
6023 " {\n"
6024 " aaaa,\n"
6025 " },\n"
6026 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006027 verifyFormat("class C : public D {\n"
6028 " SomeClass SC{2};\n"
6029 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006030 verifyFormat("class C : public A {\n"
6031 " class D : public B {\n"
6032 " void f() { int i{2}; }\n"
6033 " };\n"
6034 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006035 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006036
Daniel Jaspere4ada022016-12-13 10:05:03 +00006037 // Cases where distinguising braced lists and blocks is hard.
6038 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
6039 verifyFormat("void f() {\n"
6040 " return; // comment\n"
6041 "}\n"
6042 "SomeType t;");
6043 verifyFormat("void f() {\n"
6044 " if (a) {\n"
6045 " f();\n"
6046 " }\n"
6047 "}\n"
6048 "SomeType t;");
6049
Daniel Jasper08434342015-05-26 07:26:26 +00006050 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006051 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006052 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006053 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6054 " bbbbb,\n"
6055 " ccccc,\n"
6056 " ddddd,\n"
6057 " eeeee,\n"
6058 " ffffff,\n"
6059 " ggggg,\n"
6060 " hhhhhh,\n"
6061 " iiiiii,\n"
6062 " jjjjjj,\n"
6063 " kkkkkk};",
6064 NoBinPacking);
6065 verifyFormat("const Aaaaaa aaaaa = {\n"
6066 " aaaaa,\n"
6067 " bbbbb,\n"
6068 " ccccc,\n"
6069 " ddddd,\n"
6070 " eeeee,\n"
6071 " ffffff,\n"
6072 " ggggg,\n"
6073 " hhhhhh,\n"
6074 " iiiiii,\n"
6075 " jjjjjj,\n"
6076 " kkkkkk,\n"
6077 "};",
6078 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006079 verifyFormat(
6080 "const Aaaaaa aaaaa = {\n"
6081 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6082 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6083 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6084 "};",
6085 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006086
Chandler Carruthf8b72662014-03-02 12:37:31 +00006087 // FIXME: The alignment of these trailing comments might be bad. Then again,
6088 // this might be utterly useless in real code.
6089 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006090 " : some_value{ //\n"
6091 " aaaaaaa, //\n"
6092 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006093
Chandler Carruthf8b72662014-03-02 12:37:31 +00006094 // In braced lists, the first comment is always assumed to belong to the
6095 // first element. Thus, it can be moved to the next or previous line as
6096 // appropriate.
6097 EXPECT_EQ("function({// First element:\n"
6098 " 1,\n"
6099 " // Second element:\n"
6100 " 2});",
6101 format("function({\n"
6102 " // First element:\n"
6103 " 1,\n"
6104 " // Second element:\n"
6105 " 2});"));
6106 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6107 " // First element:\n"
6108 " 1,\n"
6109 " // Second element:\n"
6110 " 2};",
6111 format("std::vector<int> MyNumbers{// First element:\n"
6112 " 1,\n"
6113 " // Second element:\n"
6114 " 2};",
6115 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00006116 // A trailing comma should still lead to an enforced line break.
6117 EXPECT_EQ("vector<int> SomeVector = {\n"
6118 " // aaa\n"
6119 " 1, 2,\n"
6120 "};",
6121 format("vector<int> SomeVector = { // aaa\n"
6122 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006123
Chandler Carruthf8b72662014-03-02 12:37:31 +00006124 FormatStyle ExtraSpaces = getLLVMStyle();
6125 ExtraSpaces.Cpp11BracedListStyle = false;
6126 ExtraSpaces.ColumnLimit = 75;
6127 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6128 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6129 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6130 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6131 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6132 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6133 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6134 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6135 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6136 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6137 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6138 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6139 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6140 verifyFormat("class Class {\n"
6141 " T member = { arg1, arg2 };\n"
6142 "};",
6143 ExtraSpaces);
6144 verifyFormat(
6145 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6146 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6147 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6148 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6149 ExtraSpaces);
6150 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006151 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006152 ExtraSpaces);
6153 verifyFormat(
6154 "someFunction(OtherParam,\n"
6155 " BracedList{ // comment 1 (Forcing interesting break)\n"
6156 " param1, param2,\n"
6157 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006158 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006159 ExtraSpaces);
6160 verifyFormat(
6161 "std::this_thread::sleep_for(\n"
6162 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6163 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00006164 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006165 " aaaaaaa,\n"
6166 " aaaaaaaaaa,\n"
6167 " aaaaa,\n"
6168 " aaaaaaaaaaaaaaa,\n"
6169 " aaa,\n"
6170 " aaaaaaaaaa,\n"
6171 " a,\n"
6172 " aaaaaaaaaaaaaaaaaaaaa,\n"
6173 " aaaaaaaaaaaa,\n"
6174 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6175 " aaaaaaa,\n"
6176 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006177 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006178}
6179
Daniel Jasper33b909c2013-10-25 14:29:37 +00006180TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006181 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6182 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6183 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6184 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6185 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6186 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006187 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006188 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006189 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006190 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6191 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006192 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006193 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6194 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6195 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6196 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6197 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6198 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6199 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006200 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006201 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6202 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006203 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6204 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6205 " // Separating comment.\n"
6206 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6207 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6208 " // Leading comment\n"
6209 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6210 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006211 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6212 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006213 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006214 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6215 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006216 getLLVMStyleWithColumns(38));
6217 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006218 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6219 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006220 verifyFormat(
6221 "static unsigned SomeValues[10][3] = {\n"
6222 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6223 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6224 verifyFormat("static auto fields = new vector<string>{\n"
6225 " \"aaaaaaaaaaaaa\",\n"
6226 " \"aaaaaaaaaaaaa\",\n"
6227 " \"aaaaaaaaaaaa\",\n"
6228 " \"aaaaaaaaaaaaaa\",\n"
6229 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6230 " \"aaaaaaaaaaaa\",\n"
6231 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6232 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006233 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6234 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6235 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6236 " 3, cccccccccccccccccccccc};",
6237 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006238
6239 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006240 verifyFormat("vector<int> x = {\n"
6241 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6242 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006243 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006244 verifyFormat("vector<int> x = {\n"
6245 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006246 "};",
6247 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006248 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6249 " 1, 1, 1, 1,\n"
6250 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006251 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006252
Daniel Jasper60c27072015-05-13 08:16:00 +00006253 // Trailing comment in the first line.
6254 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6255 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6256 " 111111111, 222222222, 3333333333, 444444444, //\n"
6257 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006258 // Trailing comment in the last line.
6259 verifyFormat("int aaaaa[] = {\n"
6260 " 1, 2, 3, // comment\n"
6261 " 4, 5, 6 // comment\n"
6262 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006263
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006264 // With nested lists, we should either format one item per line or all nested
6265 // lists one on line.
6266 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006267 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6268 " {aaaaaaaaaaaaaaaaaaa},\n"
6269 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6270 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006271 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006272 verifyFormat(
6273 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006274 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6275 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6276 " {aaa, aaa},\n"
6277 " {aaa, aaa},\n"
6278 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6279 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6280 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006281
6282 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006283 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
6284 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006285
6286 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006287
Daniel Jaspereb65e912015-12-21 18:31:15 +00006288 // No braced initializer here.
6289 verifyFormat("void f() {\n"
6290 " struct Dummy {};\n"
6291 " f(v);\n"
6292 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006293
6294 // Long lists should be formatted in columns even if they are nested.
6295 verifyFormat(
6296 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6297 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6298 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6299 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6300 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6301 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00006302
6303 // Allow "single-column" layout even if that violates the column limit. There
6304 // isn't going to be a better way.
6305 verifyFormat("std::vector<int> a = {\n"
6306 " aaaaaaaa,\n"
6307 " aaaaaaaa,\n"
6308 " aaaaaaaa,\n"
6309 " aaaaaaaa,\n"
6310 " aaaaaaaaaa,\n"
6311 " aaaaaaaa,\n"
6312 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
6313 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00006314 verifyFormat("vector<int> aaaa = {\n"
6315 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6316 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6317 " aaaaaa.aaaaaaa,\n"
6318 " aaaaaa.aaaaaaa,\n"
6319 " aaaaaa.aaaaaaa,\n"
6320 " aaaaaa.aaaaaaa,\n"
6321 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006322
6323 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006324 verifyFormat("someFunction(Param, {List1, List2,\n"
6325 " List3});",
6326 getLLVMStyleWithColumns(35));
6327 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006328 " {List1, List2,\n"
6329 " List3});",
6330 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00006331 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
6332 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006333}
6334
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006335TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006336 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006337 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006338
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006339 verifyFormat("void f() { return 42; }");
6340 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006341 " return 42;\n"
6342 "}",
6343 DoNotMerge);
6344 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006345 " // Comment\n"
6346 "}");
6347 verifyFormat("{\n"
6348 "#error {\n"
6349 " int a;\n"
6350 "}");
6351 verifyFormat("{\n"
6352 " int a;\n"
6353 "#error {\n"
6354 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00006355 verifyFormat("void f() {} // comment");
6356 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00006357 verifyFormat("void f() {\n"
6358 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006359 DoNotMerge);
6360 verifyFormat("void f() {\n"
6361 " int a;\n"
6362 "} // comment",
6363 DoNotMerge);
6364 verifyFormat("void f() {\n"
6365 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00006366 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006367
6368 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
6369 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
6370
6371 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
6372 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00006373 verifyFormat("class C {\n"
6374 " C()\n"
6375 " : iiiiiiii(nullptr),\n"
6376 " kkkkkkk(nullptr),\n"
6377 " mmmmmmm(nullptr),\n"
6378 " nnnnnnn(nullptr) {}\n"
6379 "};",
6380 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00006381
6382 FormatStyle NoColumnLimit = getLLVMStyle();
6383 NoColumnLimit.ColumnLimit = 0;
6384 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
6385 EXPECT_EQ("class C {\n"
6386 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00006387 "};",
6388 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00006389 EXPECT_EQ("A()\n"
6390 " : b(0) {\n"
6391 "}",
6392 format("A()\n:b(0)\n{\n}", NoColumnLimit));
6393
6394 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00006395 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
6396 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00006397 EXPECT_EQ("A()\n"
6398 " : b(0) {\n"
6399 "}",
6400 format("A():b(0){}", DoNotMergeNoColumnLimit));
6401 EXPECT_EQ("A()\n"
6402 " : b(0) {\n"
6403 "}",
6404 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00006405
6406 verifyFormat("#define A \\\n"
6407 " void f() { \\\n"
6408 " int i; \\\n"
6409 " }",
6410 getLLVMStyleWithColumns(20));
6411 verifyFormat("#define A \\\n"
6412 " void f() { int i; }",
6413 getLLVMStyleWithColumns(21));
6414 verifyFormat("#define A \\\n"
6415 " void f() { \\\n"
6416 " int i; \\\n"
6417 " } \\\n"
6418 " int j;",
6419 getLLVMStyleWithColumns(22));
6420 verifyFormat("#define A \\\n"
6421 " void f() { int i; } \\\n"
6422 " int j;",
6423 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006424}
6425
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006426TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
6427 FormatStyle MergeEmptyOnly = getLLVMStyle();
6428 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
6429 verifyFormat("class C {\n"
6430 " int f() {}\n"
6431 "};",
6432 MergeEmptyOnly);
6433 verifyFormat("class C {\n"
6434 " int f() {\n"
6435 " return 42;\n"
6436 " }\n"
6437 "};",
6438 MergeEmptyOnly);
6439 verifyFormat("int f() {}", MergeEmptyOnly);
6440 verifyFormat("int f() {\n"
6441 " return 42;\n"
6442 "}",
6443 MergeEmptyOnly);
6444
6445 // Also verify behavior when BraceWrapping.AfterFunction = true
6446 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
6447 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
6448 verifyFormat("int f() {}", MergeEmptyOnly);
6449 verifyFormat("class C {\n"
6450 " int f() {}\n"
6451 "};",
6452 MergeEmptyOnly);
6453}
6454
Daniel Jasperd74cf402014-04-08 12:46:38 +00006455TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
6456 FormatStyle MergeInlineOnly = getLLVMStyle();
6457 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6458 verifyFormat("class C {\n"
6459 " int f() { return 42; }\n"
6460 "};",
6461 MergeInlineOnly);
6462 verifyFormat("int f() {\n"
6463 " return 42;\n"
6464 "}",
6465 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006466
6467 // SFS_Inline implies SFS_Empty
6468 verifyFormat("class C {\n"
6469 " int f() {}\n"
6470 "};",
6471 MergeInlineOnly);
6472 verifyFormat("int f() {}", MergeInlineOnly);
6473
6474 // Also verify behavior when BraceWrapping.AfterFunction = true
6475 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
6476 MergeInlineOnly.BraceWrapping.AfterFunction = true;
6477 verifyFormat("class C {\n"
6478 " int f() { return 42; }\n"
6479 "};",
6480 MergeInlineOnly);
6481 verifyFormat("int f()\n"
6482 "{\n"
6483 " return 42;\n"
6484 "}",
6485 MergeInlineOnly);
6486
6487 // SFS_Inline implies SFS_Empty
6488 verifyFormat("int f() {}", MergeInlineOnly);
6489 verifyFormat("class C {\n"
6490 " int f() {}\n"
6491 "};",
6492 MergeInlineOnly);
6493}
6494
6495TEST_F(FormatTest, SplitEmptyFunctionBody) {
6496 FormatStyle Style = getLLVMStyle();
6497 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
6498 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
6499 Style.BraceWrapping.AfterFunction = true;
6500 Style.BraceWrapping.SplitEmptyFunctionBody = false;
6501 Style.ColumnLimit = 40;
6502
6503 verifyFormat("int f()\n"
6504 "{}",
6505 Style);
6506 verifyFormat("int f()\n"
6507 "{\n"
6508 " return 42;\n"
6509 "}",
6510 Style);
6511 verifyFormat("int f()\n"
6512 "{\n"
6513 " // some comment\n"
6514 "}",
6515 Style);
6516
6517 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
6518 verifyFormat("int f() {}", Style);
6519 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6520 "{}",
6521 Style);
6522 verifyFormat("int f()\n"
6523 "{\n"
6524 " return 0;\n"
6525 "}",
6526 Style);
6527
6528 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6529 verifyFormat("class Foo {\n"
6530 " int f() {}\n"
6531 "};\n",
6532 Style);
6533 verifyFormat("class Foo {\n"
6534 " int f() { return 0; }\n"
6535 "};\n",
6536 Style);
6537 verifyFormat("class Foo {\n"
6538 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6539 " {}\n"
6540 "};\n",
6541 Style);
6542 verifyFormat("class Foo {\n"
6543 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6544 " {\n"
6545 " return 0;\n"
6546 " }\n"
6547 "};\n",
6548 Style);
6549
6550 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
6551 verifyFormat("int f() {}", Style);
6552 verifyFormat("int f() { return 0; }", Style);
6553 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6554 "{}",
6555 Style);
6556 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6557 "{\n"
6558 " return 0;\n"
6559 "}",
6560 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00006561}
6562
Manuel Klimeke01bab52013-01-15 13:38:33 +00006563TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
6564 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006565 verifyFormat("struct foo a = {bar};\nint n;");
6566 verifyFormat("class foo a = {bar};\nint n;");
6567 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006568
6569 // Elaborate types inside function definitions.
6570 verifyFormat("struct foo f() {}\nint n;");
6571 verifyFormat("class foo f() {}\nint n;");
6572 verifyFormat("union foo f() {}\nint n;");
6573
6574 // Templates.
6575 verifyFormat("template <class X> void f() {}\nint n;");
6576 verifyFormat("template <struct X> void f() {}\nint n;");
6577 verifyFormat("template <union X> void f() {}\nint n;");
6578
6579 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006580 verifyFormat("struct {\n} n;");
6581 verifyFormat(
6582 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006583 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006584 verifyFormat("class MACRO Z {\n} n;");
6585 verifyFormat("class MACRO(X) Z {\n} n;");
6586 verifyFormat("class __attribute__(X) Z {\n} n;");
6587 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00006588 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00006589 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00006590 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
6591 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006592
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006593 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006594 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006595
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006596 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00006597 verifyFormat(
6598 "template <typename F>\n"
6599 "Matcher(const Matcher<F> &Other,\n"
6600 " typename enable_if_c<is_base_of<F, T>::value &&\n"
6601 " !is_same<F, T>::value>::type * = 0)\n"
6602 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
6603
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006604 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006605 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00006606 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006607
6608 // FIXME:
6609 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006610 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006611
Manuel Klimeke01bab52013-01-15 13:38:33 +00006612 // Elaborate types where incorrectly parsing the structural element would
6613 // break the indent.
6614 verifyFormat("if (true)\n"
6615 " class X x;\n"
6616 "else\n"
6617 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00006618
6619 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00006620 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00006621}
6622
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006623TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00006624 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
6625 format("#error Leave all white!!!!! space* alone!\n"));
6626 EXPECT_EQ(
6627 "#warning Leave all white!!!!! space* alone!\n",
6628 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006629 EXPECT_EQ("#error 1", format(" # error 1"));
6630 EXPECT_EQ("#warning 1", format(" # warning 1"));
6631}
6632
Daniel Jasper4431aa92013-04-23 13:54:04 +00006633TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00006634 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00006635 verifyFormat("#if (AAAA && BBBB)");
6636 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00006637 // FIXME: Come up with a better indentation for #elif.
6638 verifyFormat(
6639 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
6640 " defined(BBBBBBBB)\n"
6641 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
6642 " defined(BBBBBBBB)\n"
6643 "#endif",
6644 getLLVMStyleWithColumns(65));
6645}
6646
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006647TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
6648 FormatStyle AllowsMergedIf = getGoogleStyle();
6649 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
6650 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
6651 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00006652 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
6653 EXPECT_EQ("if (true) return 42;",
6654 format("if (true)\nreturn 42;", AllowsMergedIf));
6655 FormatStyle ShortMergedIf = AllowsMergedIf;
6656 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006657 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006658 " if (true) return 42;",
6659 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006660 verifyFormat("#define A \\\n"
6661 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006662 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006663 "#define B",
6664 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006665 verifyFormat("#define A \\\n"
6666 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006667 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006668 "g();",
6669 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00006670 verifyFormat("{\n"
6671 "#ifdef A\n"
6672 " // Comment\n"
6673 " if (true) continue;\n"
6674 "#endif\n"
6675 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00006676 " if (true) continue;\n"
6677 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006678 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00006679 ShortMergedIf.ColumnLimit = 33;
6680 verifyFormat("#define A \\\n"
6681 " if constexpr (true) return 42;",
6682 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00006683 ShortMergedIf.ColumnLimit = 29;
6684 verifyFormat("#define A \\\n"
6685 " if (aaaaaaaaaa) return 1; \\\n"
6686 " return 2;",
6687 ShortMergedIf);
6688 ShortMergedIf.ColumnLimit = 28;
6689 verifyFormat("#define A \\\n"
6690 " if (aaaaaaaaaa) \\\n"
6691 " return 1; \\\n"
6692 " return 2;",
6693 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00006694 verifyFormat("#define A \\\n"
6695 " if constexpr (aaaaaaa) \\\n"
6696 " return 1; \\\n"
6697 " return 2;",
6698 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006699}
6700
Manuel Klimekd33516e2013-01-23 10:09:28 +00006701TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00006702 verifyFormat("void f(int *a);");
6703 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00006704 verifyFormat("class A {\n void f(int *a);\n};");
6705 verifyFormat("class A {\n int *a;\n};");
6706 verifyFormat("namespace a {\n"
6707 "namespace b {\n"
6708 "class A {\n"
6709 " void f() {}\n"
6710 " int *a;\n"
6711 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006712 "} // namespace b\n"
6713 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00006714}
6715
Manuel Klimekd33516e2013-01-23 10:09:28 +00006716TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
6717 verifyFormat("while");
6718 verifyFormat("operator");
6719}
6720
Daniel Jasperfda47cd2016-10-31 13:23:00 +00006721TEST_F(FormatTest, SkipsDeeplyNestedLines) {
6722 // This code would be painfully slow to format if we didn't skip it.
6723 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
6724 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6725 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6726 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6727 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6728 "A(1, 1)\n"
6729 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
6730 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6731 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6732 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6733 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6734 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6735 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6736 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6737 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6738 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
6739 // Deeply nested part is untouched, rest is formatted.
6740 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
6741 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00006742 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00006743}
6744
Nico Weber7e6a7a12013-01-08 17:56:31 +00006745//===----------------------------------------------------------------------===//
6746// Objective-C tests.
6747//===----------------------------------------------------------------------===//
6748
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006749TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
6750 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
6751 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
6752 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00006753 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006754 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
6755 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
6756 format("-(NSInteger)Method3:(id)anObject;"));
6757 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
6758 format("-(NSInteger)Method4:(id)anObject;"));
6759 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
6760 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
6761 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
6762 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00006763 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
6764 "forAllCells:(BOOL)flag;",
6765 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
6766 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00006767
6768 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00006769 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
6770 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00006771 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
6772 " inRange:(NSRange)range\n"
6773 " outRange:(NSRange)out_range\n"
6774 " outRange1:(NSRange)out_range1\n"
6775 " outRange2:(NSRange)out_range2\n"
6776 " outRange3:(NSRange)out_range3\n"
6777 " outRange4:(NSRange)out_range4\n"
6778 " outRange5:(NSRange)out_range5\n"
6779 " outRange6:(NSRange)out_range6\n"
6780 " outRange7:(NSRange)out_range7\n"
6781 " outRange8:(NSRange)out_range8\n"
6782 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00006783
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00006784 // When the function name has to be wrapped.
6785 FormatStyle Style = getLLVMStyle();
6786 Style.IndentWrappedFunctionNames = false;
6787 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
6788 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
6789 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
6790 "}",
6791 Style);
6792 Style.IndentWrappedFunctionNames = true;
6793 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
6794 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
6795 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
6796 "}",
6797 Style);
6798
Nico Weberd6f962f2013-01-10 20:18:33 +00006799 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00006800 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00006801 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
6802 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00006803 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00006804
Daniel Jasper37194282013-05-28 08:33:00 +00006805 verifyFormat("- (int (*)())foo:(int (*)())f;");
6806 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00006807
6808 // If there's no return type (very rare in practice!), LLVM and Google style
6809 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00006810 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00006811 verifyFormat("- foo:(int)f;");
6812 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006813}
6814
Nico Weber0588b502013-02-07 00:19:29 +00006815
Alexander Kornienko64a42b82014-04-15 14:52:43 +00006816TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00006817 EXPECT_EQ("\"some text \"\n"
6818 "\"other\";",
6819 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00006820 EXPECT_EQ("\"some text \"\n"
6821 "\"other\";",
6822 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006823 EXPECT_EQ(
6824 "#define A \\\n"
6825 " \"some \" \\\n"
6826 " \"text \" \\\n"
6827 " \"other\";",
6828 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
6829 EXPECT_EQ(
6830 "#define A \\\n"
6831 " \"so \" \\\n"
6832 " \"text \" \\\n"
6833 " \"other\";",
6834 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
6835
6836 EXPECT_EQ("\"some text\"",
6837 format("\"some text\"", getLLVMStyleWithColumns(1)));
6838 EXPECT_EQ("\"some text\"",
6839 format("\"some text\"", getLLVMStyleWithColumns(11)));
6840 EXPECT_EQ("\"some \"\n"
6841 "\"text\"",
6842 format("\"some text\"", getLLVMStyleWithColumns(10)));
6843 EXPECT_EQ("\"some \"\n"
6844 "\"text\"",
6845 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00006846 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00006847 "\" tex\"\n"
6848 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00006849 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00006850 EXPECT_EQ("\"some\"\n"
6851 "\" tex\"\n"
6852 "\" and\"",
6853 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
6854 EXPECT_EQ("\"some\"\n"
6855 "\"/tex\"\n"
6856 "\"/and\"",
6857 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006858
6859 EXPECT_EQ("variable =\n"
6860 " \"long string \"\n"
6861 " \"literal\";",
6862 format("variable = \"long string literal\";",
6863 getLLVMStyleWithColumns(20)));
6864
6865 EXPECT_EQ("variable = f(\n"
6866 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006867 " \"literal\",\n"
6868 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00006869 " loooooooooooooooooooong);",
6870 format("variable = f(\"long string literal\", short, "
6871 "loooooooooooooooooooong);",
6872 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00006873
Daniel Jaspera44991332015-04-29 13:06:49 +00006874 EXPECT_EQ(
6875 "f(g(\"long string \"\n"
6876 " \"literal\"),\n"
6877 " b);",
6878 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00006879 EXPECT_EQ("f(g(\"long string \"\n"
6880 " \"literal\",\n"
6881 " a),\n"
6882 " b);",
6883 format("f(g(\"long string literal\", a), b);",
6884 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006885 EXPECT_EQ(
6886 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00006887 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00006888 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
6889 EXPECT_EQ("f(\"one two three four five six \"\n"
6890 " \"seven\".split(\n"
6891 " really_looooong_variable));",
6892 format("f(\"one two three four five six seven\"."
6893 "split(really_looooong_variable));",
6894 getLLVMStyleWithColumns(33)));
6895
6896 EXPECT_EQ("f(\"some \"\n"
6897 " \"text\",\n"
6898 " other);",
6899 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00006900
6901 // Only break as a last resort.
6902 verifyFormat(
6903 "aaaaaaaaaaaaaaaaaaaa(\n"
6904 " aaaaaaaaaaaaaaaaaaaa,\n"
6905 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00006906
Daniel Jaspera44991332015-04-29 13:06:49 +00006907 EXPECT_EQ("\"splitmea\"\n"
6908 "\"trandomp\"\n"
6909 "\"oint\"",
6910 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00006911
Daniel Jaspera44991332015-04-29 13:06:49 +00006912 EXPECT_EQ("\"split/\"\n"
6913 "\"pathat/\"\n"
6914 "\"slashes\"",
6915 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006916
Daniel Jaspera44991332015-04-29 13:06:49 +00006917 EXPECT_EQ("\"split/\"\n"
6918 "\"pathat/\"\n"
6919 "\"slashes\"",
6920 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00006921 EXPECT_EQ("\"split at \"\n"
6922 "\"spaces/at/\"\n"
6923 "\"slashes.at.any$\"\n"
6924 "\"non-alphanumeric%\"\n"
6925 "\"1111111111characte\"\n"
6926 "\"rs\"",
6927 format("\"split at "
6928 "spaces/at/"
6929 "slashes.at."
6930 "any$non-"
6931 "alphanumeric%"
6932 "1111111111characte"
6933 "rs\"",
6934 getLLVMStyleWithColumns(20)));
6935
Daniel Jasper5aad4e52013-07-12 11:37:05 +00006936 // Verify that splitting the strings understands
6937 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00006938 EXPECT_EQ(
6939 "aaaaaaaaaaaa(\n"
6940 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
6941 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
6942 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
6943 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
6944 "aaaaaaaaaaaaaaaaaaaaaa\");",
6945 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00006946 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6947 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
6948 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
6949 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
6950 "aaaaaaaaaaaaaaaaaaaaaa\";",
6951 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00006952 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6953 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
6954 format("llvm::outs() << "
6955 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
6956 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00006957 EXPECT_EQ("ffff(\n"
6958 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6959 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
6960 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
6961 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
6962 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00006963
Daniel Jaspere1a7b762016-02-01 11:21:02 +00006964 FormatStyle Style = getLLVMStyleWithColumns(12);
6965 Style.BreakStringLiterals = false;
6966 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
6967
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006968 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00006969 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00006970 EXPECT_EQ("#define A \\\n"
6971 " \"some \" \\\n"
6972 " \"text \" \\\n"
6973 " \"other\";",
6974 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006975}
6976
Manuel Klimek9e321992015-07-28 15:50:24 +00006977TEST_F(FormatTest, FullyRemoveEmptyLines) {
6978 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
6979 NoEmptyLines.MaxEmptyLinesToKeep = 0;
6980 EXPECT_EQ("int i = a(b());",
6981 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
6982}
6983
Alexander Kornienko64a42b82014-04-15 14:52:43 +00006984TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
6985 EXPECT_EQ(
6986 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
6987 "(\n"
6988 " \"x\t\");",
6989 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
6990 "aaaaaaa("
6991 "\"x\t\");"));
6992}
6993
Daniel Jasper174b0122014-01-09 14:18:12 +00006994TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00006995 EXPECT_EQ(
6996 "u8\"utf8 string \"\n"
6997 "u8\"literal\";",
6998 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
6999 EXPECT_EQ(
7000 "u\"utf16 string \"\n"
7001 "u\"literal\";",
7002 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
7003 EXPECT_EQ(
7004 "U\"utf32 string \"\n"
7005 "U\"literal\";",
7006 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
7007 EXPECT_EQ("L\"wide string \"\n"
7008 "L\"literal\";",
7009 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00007010 EXPECT_EQ("@\"NSString \"\n"
7011 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00007012 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00007013 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00007014
7015 // This input makes clang-format try to split the incomplete unicode escape
7016 // sequence, which used to lead to a crasher.
7017 verifyNoCrash(
7018 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7019 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007020}
7021
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00007022TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
7023 FormatStyle Style = getGoogleStyleWithColumns(15);
7024 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
7025 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
7026 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
7027 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
7028 EXPECT_EQ("u8R\"x(raw literal)x\";",
7029 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007030}
7031
7032TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
7033 FormatStyle Style = getLLVMStyleWithColumns(20);
7034 EXPECT_EQ(
7035 "_T(\"aaaaaaaaaaaaaa\")\n"
7036 "_T(\"aaaaaaaaaaaaaa\")\n"
7037 "_T(\"aaaaaaaaaaaa\")",
7038 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007039 EXPECT_EQ("f(x,\n"
7040 " _T(\"aaaaaaaaaaaa\")\n"
7041 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00007042 " z);",
7043 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
7044
7045 // FIXME: Handle embedded spaces in one iteration.
7046 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
7047 // "_T(\"aaaaaaaaaaaaa\")\n"
7048 // "_T(\"aaaaaaaaaaaaa\")\n"
7049 // "_T(\"a\")",
7050 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7051 // getLLVMStyleWithColumns(20)));
7052 EXPECT_EQ(
7053 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7054 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007055 EXPECT_EQ("f(\n"
7056 "#if !TEST\n"
7057 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7058 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00007059 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007060 format("f(\n"
7061 "#if !TEST\n"
7062 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7063 "#endif\n"
7064 ");"));
7065 EXPECT_EQ("f(\n"
7066 "\n"
7067 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
7068 format("f(\n"
7069 "\n"
7070 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007071}
7072
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007073TEST_F(FormatTest, BreaksStringLiteralOperands) {
7074 // In a function call with two operands, the second can be broken with no line
7075 // break before it.
7076 EXPECT_EQ("func(a, \"long long \"\n"
7077 " \"long long\");",
7078 format("func(a, \"long long long long\");",
7079 getLLVMStyleWithColumns(24)));
7080 // In a function call with three operands, the second must be broken with a
7081 // line break before it.
7082 EXPECT_EQ("func(a,\n"
7083 " \"long long long \"\n"
7084 " \"long\",\n"
7085 " c);",
7086 format("func(a, \"long long long long\", c);",
7087 getLLVMStyleWithColumns(24)));
7088 // In a function call with three operands, the third must be broken with a
7089 // line break before it.
7090 EXPECT_EQ("func(a, b,\n"
7091 " \"long long long \"\n"
7092 " \"long\");",
7093 format("func(a, b, \"long long long long\");",
7094 getLLVMStyleWithColumns(24)));
7095 // In a function call with three operands, both the second and the third must
7096 // be broken with a line break before them.
7097 EXPECT_EQ("func(a,\n"
7098 " \"long long long \"\n"
7099 " \"long\",\n"
7100 " \"long long long \"\n"
7101 " \"long\");",
7102 format("func(a, \"long long long long\", \"long long long long\");",
7103 getLLVMStyleWithColumns(24)));
7104 // In a chain of << with two operands, the second can be broken with no line
7105 // break before it.
7106 EXPECT_EQ("a << \"line line \"\n"
7107 " \"line\";",
7108 format("a << \"line line line\";",
7109 getLLVMStyleWithColumns(20)));
7110 // In a chain of << with three operands, the second can be broken with no line
7111 // break before it.
7112 EXPECT_EQ("abcde << \"line \"\n"
7113 " \"line line\"\n"
7114 " << c;",
7115 format("abcde << \"line line line\" << c;",
7116 getLLVMStyleWithColumns(20)));
7117 // In a chain of << with three operands, the third must be broken with a line
7118 // break before it.
7119 EXPECT_EQ("a << b\n"
7120 " << \"line line \"\n"
7121 " \"line\";",
7122 format("a << b << \"line line line\";",
7123 getLLVMStyleWithColumns(20)));
7124 // In a chain of << with three operands, the second can be broken with no line
7125 // break before it and the third must be broken with a line break before it.
7126 EXPECT_EQ("abcd << \"line line \"\n"
7127 " \"line\"\n"
7128 " << \"line line \"\n"
7129 " \"line\";",
7130 format("abcd << \"line line line\" << \"line line line\";",
7131 getLLVMStyleWithColumns(20)));
7132 // In a chain of binary operators with two operands, the second can be broken
7133 // with no line break before it.
7134 EXPECT_EQ("abcd + \"line line \"\n"
7135 " \"line line\";",
7136 format("abcd + \"line line line line\";",
7137 getLLVMStyleWithColumns(20)));
7138 // In a chain of binary operators with three operands, the second must be
7139 // broken with a line break before it.
7140 EXPECT_EQ("abcd +\n"
7141 " \"line line \"\n"
7142 " \"line line\" +\n"
7143 " e;",
7144 format("abcd + \"line line line line\" + e;",
7145 getLLVMStyleWithColumns(20)));
7146 // In a function call with two operands, with AlignAfterOpenBracket enabled,
7147 // the first must be broken with a line break before it.
7148 FormatStyle Style = getLLVMStyleWithColumns(25);
7149 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
7150 EXPECT_EQ("someFunction(\n"
7151 " \"long long long \"\n"
7152 " \"long\",\n"
7153 " a);",
7154 format("someFunction(\"long long long long\", a);", Style));
7155}
7156
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007157TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007158 EXPECT_EQ(
7159 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7160 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7161 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7162 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7163 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7164 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
7165}
7166
7167TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
7168 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007169 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007170 EXPECT_EQ("fffffffffff(g(R\"x(\n"
7171 "multiline raw string literal xxxxxxxxxxxxxx\n"
7172 ")x\",\n"
7173 " a),\n"
7174 " b);",
7175 format("fffffffffff(g(R\"x(\n"
7176 "multiline raw string literal xxxxxxxxxxxxxx\n"
7177 ")x\", a), b);",
7178 getGoogleStyleWithColumns(20)));
7179 EXPECT_EQ("fffffffffff(\n"
7180 " g(R\"x(qqq\n"
7181 "multiline raw string literal xxxxxxxxxxxxxx\n"
7182 ")x\",\n"
7183 " a),\n"
7184 " b);",
7185 format("fffffffffff(g(R\"x(qqq\n"
7186 "multiline raw string literal xxxxxxxxxxxxxx\n"
7187 ")x\", a), b);",
7188 getGoogleStyleWithColumns(20)));
7189
7190 EXPECT_EQ("fffffffffff(R\"x(\n"
7191 "multiline raw string literal xxxxxxxxxxxxxx\n"
7192 ")x\");",
7193 format("fffffffffff(R\"x(\n"
7194 "multiline raw string literal xxxxxxxxxxxxxx\n"
7195 ")x\");",
7196 getGoogleStyleWithColumns(20)));
7197 EXPECT_EQ("fffffffffff(R\"x(\n"
7198 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007199 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007200 format("fffffffffff(R\"x(\n"
7201 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007202 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007203 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007204 EXPECT_EQ("fffffffffff(\n"
7205 " R\"x(\n"
7206 "multiline raw string literal xxxxxxxxxxxxxx\n"
7207 ")x\" +\n"
7208 " bbbbbb);",
7209 format("fffffffffff(\n"
7210 " R\"x(\n"
7211 "multiline raw string literal xxxxxxxxxxxxxx\n"
7212 ")x\" + bbbbbb);",
7213 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007214}
7215
Alexander Kornienkobe633902013-06-14 11:46:10 +00007216TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00007217 verifyFormat("string a = \"unterminated;");
7218 EXPECT_EQ("function(\"unterminated,\n"
7219 " OtherParameter);",
7220 format("function( \"unterminated,\n"
7221 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00007222}
7223
7224TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007225 FormatStyle Style = getLLVMStyle();
7226 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00007227 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007228 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00007229}
7230
Daniel Jaspera44991332015-04-29 13:06:49 +00007231TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00007232
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007233TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
7234 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
7235 " \"ddeeefff\");",
7236 format("someFunction(\"aaabbbcccdddeeefff\");",
7237 getLLVMStyleWithColumns(25)));
7238 EXPECT_EQ("someFunction1234567890(\n"
7239 " \"aaabbbcccdddeeefff\");",
7240 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7241 getLLVMStyleWithColumns(26)));
7242 EXPECT_EQ("someFunction1234567890(\n"
7243 " \"aaabbbcccdddeeeff\"\n"
7244 " \"f\");",
7245 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7246 getLLVMStyleWithColumns(25)));
7247 EXPECT_EQ("someFunction1234567890(\n"
7248 " \"aaabbbcccdddeeeff\"\n"
7249 " \"f\");",
7250 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7251 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00007252 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
7253 " \"ddde \"\n"
7254 " \"efff\");",
7255 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007256 getLLVMStyleWithColumns(25)));
7257 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
7258 " \"ddeeefff\");",
7259 format("someFunction(\"aaabbbccc ddeeefff\");",
7260 getLLVMStyleWithColumns(25)));
7261 EXPECT_EQ("someFunction1234567890(\n"
7262 " \"aaabb \"\n"
7263 " \"cccdddeeefff\");",
7264 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
7265 getLLVMStyleWithColumns(25)));
7266 EXPECT_EQ("#define A \\\n"
7267 " string s = \\\n"
7268 " \"123456789\" \\\n"
7269 " \"0\"; \\\n"
7270 " int i;",
7271 format("#define A string s = \"1234567890\"; int i;",
7272 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00007273 // FIXME: Put additional penalties on breaking at non-whitespace locations.
7274 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
7275 " \"dddeeeff\"\n"
7276 " \"f\");",
7277 format("someFunction(\"aaabbbcc dddeeefff\");",
7278 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007279}
7280
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007281TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00007282 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
7283 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007284 EXPECT_EQ("\"test\"\n"
7285 "\"\\n\"",
7286 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
7287 EXPECT_EQ("\"tes\\\\\"\n"
7288 "\"n\"",
7289 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
7290 EXPECT_EQ("\"\\\\\\\\\"\n"
7291 "\"\\n\"",
7292 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00007293 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007294 EXPECT_EQ("\"\\uff01\"\n"
7295 "\"test\"",
7296 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
7297 EXPECT_EQ("\"\\Uff01ff02\"",
7298 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
7299 EXPECT_EQ("\"\\x000000000001\"\n"
7300 "\"next\"",
7301 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
7302 EXPECT_EQ("\"\\x000000000001next\"",
7303 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
7304 EXPECT_EQ("\"\\x000000000001\"",
7305 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
7306 EXPECT_EQ("\"test\"\n"
7307 "\"\\000000\"\n"
7308 "\"000001\"",
7309 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
7310 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007311 "\"00000000\"\n"
7312 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007313 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007314}
7315
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00007316TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
7317 verifyFormat("void f() {\n"
7318 " return g() {}\n"
7319 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007320 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00007321 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00007322 "}");
7323}
7324
Manuel Klimek421147e2014-01-24 09:25:23 +00007325TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
7326 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00007327 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00007328}
7329
Manuel Klimek13b97d82013-05-13 08:42:42 +00007330TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
7331 verifyFormat("class X {\n"
7332 " void f() {\n"
7333 " }\n"
7334 "};",
7335 getLLVMStyleWithColumns(12));
7336}
7337
7338TEST_F(FormatTest, ConfigurableIndentWidth) {
7339 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
7340 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00007341 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00007342 verifyFormat("void f() {\n"
7343 " someFunction();\n"
7344 " if (true) {\n"
7345 " f();\n"
7346 " }\n"
7347 "}",
7348 EightIndent);
7349 verifyFormat("class X {\n"
7350 " void f() {\n"
7351 " }\n"
7352 "};",
7353 EightIndent);
7354 verifyFormat("int x[] = {\n"
7355 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007356 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00007357 EightIndent);
7358}
7359
Alexander Kornienko34a87e82013-06-22 01:35:36 +00007360TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00007361 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00007362 "f();",
7363 getLLVMStyleWithColumns(8));
7364}
7365
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007366TEST_F(FormatTest, ConfigurableUseOfTab) {
7367 FormatStyle Tab = getLLVMStyleWithColumns(42);
7368 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007369 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007370 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00007371
7372 EXPECT_EQ("if (aaaaaaaa && // q\n"
7373 " bb)\t\t// w\n"
7374 "\t;",
7375 format("if (aaaaaaaa &&// q\n"
7376 "bb)// w\n"
7377 ";",
7378 Tab));
7379 EXPECT_EQ("if (aaa && bbb) // w\n"
7380 "\t;",
7381 format("if(aaa&&bbb)// w\n"
7382 ";",
7383 Tab));
7384
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007385 verifyFormat("class X {\n"
7386 "\tvoid f() {\n"
7387 "\t\tsomeFunction(parameter1,\n"
7388 "\t\t\t parameter2);\n"
7389 "\t}\n"
7390 "};",
7391 Tab);
7392 verifyFormat("#define A \\\n"
7393 "\tvoid f() { \\\n"
7394 "\t\tsomeFunction( \\\n"
7395 "\t\t parameter1, \\\n"
7396 "\t\t parameter2); \\\n"
7397 "\t}",
7398 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00007399
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00007400 Tab.TabWidth = 4;
7401 Tab.IndentWidth = 8;
7402 verifyFormat("class TabWidth4Indent8 {\n"
7403 "\t\tvoid f() {\n"
7404 "\t\t\t\tsomeFunction(parameter1,\n"
7405 "\t\t\t\t\t\t\t parameter2);\n"
7406 "\t\t}\n"
7407 "};",
7408 Tab);
7409
7410 Tab.TabWidth = 4;
7411 Tab.IndentWidth = 4;
7412 verifyFormat("class TabWidth4Indent4 {\n"
7413 "\tvoid f() {\n"
7414 "\t\tsomeFunction(parameter1,\n"
7415 "\t\t\t\t\t parameter2);\n"
7416 "\t}\n"
7417 "};",
7418 Tab);
7419
7420 Tab.TabWidth = 8;
7421 Tab.IndentWidth = 4;
7422 verifyFormat("class TabWidth8Indent4 {\n"
7423 " void f() {\n"
7424 "\tsomeFunction(parameter1,\n"
7425 "\t\t parameter2);\n"
7426 " }\n"
7427 "};",
7428 Tab);
7429
Alexander Kornienko39856b72013-09-10 09:38:25 +00007430 Tab.TabWidth = 8;
7431 Tab.IndentWidth = 8;
7432 EXPECT_EQ("/*\n"
7433 "\t a\t\tcomment\n"
7434 "\t in multiple lines\n"
7435 " */",
7436 format(" /*\t \t \n"
7437 " \t \t a\t\tcomment\t \t\n"
7438 " \t \t in multiple lines\t\n"
7439 " \t */",
7440 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00007441
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007442 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00007443 verifyFormat("{\n"
7444 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7445 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7446 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7447 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7448 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7449 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00007450 "};",
7451 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00007452 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00007453 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00007454 "\ta2,\n"
7455 "\ta3\n"
7456 "};",
7457 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007458 EXPECT_EQ("if (aaaaaaaa && // q\n"
7459 " bb) // w\n"
7460 "\t;",
7461 format("if (aaaaaaaa &&// q\n"
7462 "bb)// w\n"
7463 ";",
7464 Tab));
7465 verifyFormat("class X {\n"
7466 "\tvoid f() {\n"
7467 "\t\tsomeFunction(parameter1,\n"
7468 "\t\t parameter2);\n"
7469 "\t}\n"
7470 "};",
7471 Tab);
7472 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00007473 "\tQ(\n"
7474 "\t {\n"
7475 "\t\t int a;\n"
7476 "\t\t someFunction(aaaaaaaa,\n"
7477 "\t\t bbbbbbb);\n"
7478 "\t },\n"
7479 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007480 "}",
7481 Tab);
7482 EXPECT_EQ("{\n"
7483 "\t/* aaaa\n"
7484 "\t bbbb */\n"
7485 "}",
7486 format("{\n"
7487 "/* aaaa\n"
7488 " bbbb */\n"
7489 "}",
7490 Tab));
7491 EXPECT_EQ("{\n"
7492 "\t/*\n"
7493 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7494 "\t bbbbbbbbbbbbb\n"
7495 "\t*/\n"
7496 "}",
7497 format("{\n"
7498 "/*\n"
7499 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7500 "*/\n"
7501 "}",
7502 Tab));
7503 EXPECT_EQ("{\n"
7504 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7505 "\t// bbbbbbbbbbbbb\n"
7506 "}",
7507 format("{\n"
7508 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7509 "}",
7510 Tab));
7511 EXPECT_EQ("{\n"
7512 "\t/*\n"
7513 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7514 "\t bbbbbbbbbbbbb\n"
7515 "\t*/\n"
7516 "}",
7517 format("{\n"
7518 "\t/*\n"
7519 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7520 "\t*/\n"
7521 "}",
7522 Tab));
7523 EXPECT_EQ("{\n"
7524 "\t/*\n"
7525 "\n"
7526 "\t*/\n"
7527 "}",
7528 format("{\n"
7529 "\t/*\n"
7530 "\n"
7531 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00007532 "}",
7533 Tab));
7534 EXPECT_EQ("{\n"
7535 "\t/*\n"
7536 " asdf\n"
7537 "\t*/\n"
7538 "}",
7539 format("{\n"
7540 "\t/*\n"
7541 " asdf\n"
7542 "\t*/\n"
7543 "}",
7544 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007545
7546 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00007547 EXPECT_EQ("/*\n"
7548 " a\t\tcomment\n"
7549 " in multiple lines\n"
7550 " */",
7551 format(" /*\t \t \n"
7552 " \t \t a\t\tcomment\t \t\n"
7553 " \t \t in multiple lines\t\n"
7554 " \t */",
7555 Tab));
7556 EXPECT_EQ("/* some\n"
7557 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007558 format(" \t \t /* some\n"
7559 " \t \t comment */",
7560 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00007561 EXPECT_EQ("int a; /* some\n"
7562 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007563 format(" \t \t int a; /* some\n"
7564 " \t \t comment */",
7565 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00007566
Alexander Kornienko39856b72013-09-10 09:38:25 +00007567 EXPECT_EQ("int a; /* some\n"
7568 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007569 format(" \t \t int\ta; /* some\n"
7570 " \t \t comment */",
7571 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00007572 EXPECT_EQ("f(\"\t\t\"); /* some\n"
7573 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007574 format(" \t \t f(\"\t\t\"); /* some\n"
7575 " \t \t comment */",
7576 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00007577 EXPECT_EQ("{\n"
7578 " /*\n"
7579 " * Comment\n"
7580 " */\n"
7581 " int i;\n"
7582 "}",
7583 format("{\n"
7584 "\t/*\n"
7585 "\t * Comment\n"
7586 "\t */\n"
7587 "\t int i;\n"
7588 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00007589
7590 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
7591 Tab.TabWidth = 8;
7592 Tab.IndentWidth = 8;
7593 EXPECT_EQ("if (aaaaaaaa && // q\n"
7594 " bb) // w\n"
7595 "\t;",
7596 format("if (aaaaaaaa &&// q\n"
7597 "bb)// w\n"
7598 ";",
7599 Tab));
7600 EXPECT_EQ("if (aaa && bbb) // w\n"
7601 "\t;",
7602 format("if(aaa&&bbb)// w\n"
7603 ";",
7604 Tab));
7605 verifyFormat("class X {\n"
7606 "\tvoid f() {\n"
7607 "\t\tsomeFunction(parameter1,\n"
7608 "\t\t\t parameter2);\n"
7609 "\t}\n"
7610 "};",
7611 Tab);
7612 verifyFormat("#define A \\\n"
7613 "\tvoid f() { \\\n"
7614 "\t\tsomeFunction( \\\n"
7615 "\t\t parameter1, \\\n"
7616 "\t\t parameter2); \\\n"
7617 "\t}",
7618 Tab);
7619 Tab.TabWidth = 4;
7620 Tab.IndentWidth = 8;
7621 verifyFormat("class TabWidth4Indent8 {\n"
7622 "\t\tvoid f() {\n"
7623 "\t\t\t\tsomeFunction(parameter1,\n"
7624 "\t\t\t\t\t\t\t parameter2);\n"
7625 "\t\t}\n"
7626 "};",
7627 Tab);
7628 Tab.TabWidth = 4;
7629 Tab.IndentWidth = 4;
7630 verifyFormat("class TabWidth4Indent4 {\n"
7631 "\tvoid f() {\n"
7632 "\t\tsomeFunction(parameter1,\n"
7633 "\t\t\t\t\t parameter2);\n"
7634 "\t}\n"
7635 "};",
7636 Tab);
7637 Tab.TabWidth = 8;
7638 Tab.IndentWidth = 4;
7639 verifyFormat("class TabWidth8Indent4 {\n"
7640 " void f() {\n"
7641 "\tsomeFunction(parameter1,\n"
7642 "\t\t parameter2);\n"
7643 " }\n"
7644 "};",
7645 Tab);
7646 Tab.TabWidth = 8;
7647 Tab.IndentWidth = 8;
7648 EXPECT_EQ("/*\n"
7649 "\t a\t\tcomment\n"
7650 "\t in multiple lines\n"
7651 " */",
7652 format(" /*\t \t \n"
7653 " \t \t a\t\tcomment\t \t\n"
7654 " \t \t in multiple lines\t\n"
7655 " \t */",
7656 Tab));
7657 verifyFormat("{\n"
7658 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7659 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7660 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7661 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7662 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7663 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7664 "};",
7665 Tab);
7666 verifyFormat("enum AA {\n"
7667 "\ta1, // Force multiple lines\n"
7668 "\ta2,\n"
7669 "\ta3\n"
7670 "};",
7671 Tab);
7672 EXPECT_EQ("if (aaaaaaaa && // q\n"
7673 " bb) // w\n"
7674 "\t;",
7675 format("if (aaaaaaaa &&// q\n"
7676 "bb)// w\n"
7677 ";",
7678 Tab));
7679 verifyFormat("class X {\n"
7680 "\tvoid f() {\n"
7681 "\t\tsomeFunction(parameter1,\n"
7682 "\t\t\t parameter2);\n"
7683 "\t}\n"
7684 "};",
7685 Tab);
7686 verifyFormat("{\n"
7687 "\tQ(\n"
7688 "\t {\n"
7689 "\t\t int a;\n"
7690 "\t\t someFunction(aaaaaaaa,\n"
7691 "\t\t\t\t bbbbbbb);\n"
7692 "\t },\n"
7693 "\t p);\n"
7694 "}",
7695 Tab);
7696 EXPECT_EQ("{\n"
7697 "\t/* aaaa\n"
7698 "\t bbbb */\n"
7699 "}",
7700 format("{\n"
7701 "/* aaaa\n"
7702 " bbbb */\n"
7703 "}",
7704 Tab));
7705 EXPECT_EQ("{\n"
7706 "\t/*\n"
7707 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7708 "\t bbbbbbbbbbbbb\n"
7709 "\t*/\n"
7710 "}",
7711 format("{\n"
7712 "/*\n"
7713 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7714 "*/\n"
7715 "}",
7716 Tab));
7717 EXPECT_EQ("{\n"
7718 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7719 "\t// bbbbbbbbbbbbb\n"
7720 "}",
7721 format("{\n"
7722 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7723 "}",
7724 Tab));
7725 EXPECT_EQ("{\n"
7726 "\t/*\n"
7727 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7728 "\t bbbbbbbbbbbbb\n"
7729 "\t*/\n"
7730 "}",
7731 format("{\n"
7732 "\t/*\n"
7733 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7734 "\t*/\n"
7735 "}",
7736 Tab));
7737 EXPECT_EQ("{\n"
7738 "\t/*\n"
7739 "\n"
7740 "\t*/\n"
7741 "}",
7742 format("{\n"
7743 "\t/*\n"
7744 "\n"
7745 "\t*/\n"
7746 "}",
7747 Tab));
7748 EXPECT_EQ("{\n"
7749 "\t/*\n"
7750 " asdf\n"
7751 "\t*/\n"
7752 "}",
7753 format("{\n"
7754 "\t/*\n"
7755 " asdf\n"
7756 "\t*/\n"
7757 "}",
7758 Tab));
7759 EXPECT_EQ("/*\n"
7760 "\t a\t\tcomment\n"
7761 "\t in multiple lines\n"
7762 " */",
7763 format(" /*\t \t \n"
7764 " \t \t a\t\tcomment\t \t\n"
7765 " \t \t in multiple lines\t\n"
7766 " \t */",
7767 Tab));
7768 EXPECT_EQ("/* some\n"
7769 " comment */",
7770 format(" \t \t /* some\n"
7771 " \t \t comment */",
7772 Tab));
7773 EXPECT_EQ("int a; /* some\n"
7774 " comment */",
7775 format(" \t \t int a; /* some\n"
7776 " \t \t comment */",
7777 Tab));
7778 EXPECT_EQ("int a; /* some\n"
7779 "comment */",
7780 format(" \t \t int\ta; /* some\n"
7781 " \t \t comment */",
7782 Tab));
7783 EXPECT_EQ("f(\"\t\t\"); /* some\n"
7784 " comment */",
7785 format(" \t \t f(\"\t\t\"); /* some\n"
7786 " \t \t comment */",
7787 Tab));
7788 EXPECT_EQ("{\n"
7789 " /*\n"
7790 " * Comment\n"
7791 " */\n"
7792 " int i;\n"
7793 "}",
7794 format("{\n"
7795 "\t/*\n"
7796 "\t * Comment\n"
7797 "\t */\n"
7798 "\t int i;\n"
7799 "}"));
7800 Tab.AlignConsecutiveAssignments = true;
7801 Tab.AlignConsecutiveDeclarations = true;
7802 Tab.TabWidth = 4;
7803 Tab.IndentWidth = 4;
7804 verifyFormat("class Assign {\n"
7805 "\tvoid f() {\n"
7806 "\t\tint x = 123;\n"
7807 "\t\tint random = 4;\n"
7808 "\t\tstd::string alphabet =\n"
7809 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
7810 "\t}\n"
7811 "};",
7812 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007813}
7814
Alexander Kornienko917f9e02013-09-10 12:29:48 +00007815TEST_F(FormatTest, CalculatesOriginalColumn) {
7816 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7817 "q\"; /* some\n"
7818 " comment */",
7819 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7820 "q\"; /* some\n"
7821 " comment */",
7822 getLLVMStyle()));
7823 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
7824 "/* some\n"
7825 " comment */",
7826 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
7827 " /* some\n"
7828 " comment */",
7829 getLLVMStyle()));
7830 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7831 "qqq\n"
7832 "/* some\n"
7833 " comment */",
7834 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7835 "qqq\n"
7836 " /* some\n"
7837 " comment */",
7838 getLLVMStyle()));
7839 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7840 "wwww; /* some\n"
7841 " comment */",
7842 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7843 "wwww; /* some\n"
7844 " comment */",
7845 getLLVMStyle()));
7846}
7847
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007848TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00007849 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007850 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00007851
7852 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007853 " continue;",
7854 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007855 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007856 " continue;",
7857 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007858 verifyFormat("if(true)\n"
7859 " f();\n"
7860 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007861 " f();",
7862 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007863 verifyFormat("do {\n"
7864 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007865 "} while(something());",
7866 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007867 verifyFormat("switch(x) {\n"
7868 "default:\n"
7869 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007870 "}",
7871 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00007872 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00007873 verifyFormat("size_t x = sizeof(x);", NoSpace);
7874 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
7875 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
7876 verifyFormat("alignas(128) char a[128];", NoSpace);
7877 verifyFormat("size_t x = alignof(MyType);", NoSpace);
7878 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
7879 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00007880 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00007881 verifyFormat("T A::operator()();", NoSpace);
7882 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007883
7884 FormatStyle Space = getLLVMStyle();
7885 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
7886
7887 verifyFormat("int f ();", Space);
7888 verifyFormat("void f (int a, T b) {\n"
7889 " while (true)\n"
7890 " continue;\n"
7891 "}",
7892 Space);
7893 verifyFormat("if (true)\n"
7894 " f ();\n"
7895 "else if (true)\n"
7896 " f ();",
7897 Space);
7898 verifyFormat("do {\n"
7899 " do_something ();\n"
7900 "} while (something ());",
7901 Space);
7902 verifyFormat("switch (x) {\n"
7903 "default:\n"
7904 " break;\n"
7905 "}",
7906 Space);
7907 verifyFormat("A::A () : a (1) {}", Space);
7908 verifyFormat("void f () __attribute__ ((asdf));", Space);
7909 verifyFormat("*(&a + 1);\n"
7910 "&((&a)[1]);\n"
7911 "a[(b + c) * d];\n"
7912 "(((a + 1) * 2) + 3) * 4;",
7913 Space);
7914 verifyFormat("#define A(x) x", Space);
7915 verifyFormat("#define A (x) x", Space);
7916 verifyFormat("#if defined(x)\n"
7917 "#endif",
7918 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00007919 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00007920 verifyFormat("size_t x = sizeof (x);", Space);
7921 verifyFormat("auto f (int x) -> decltype (x);", Space);
7922 verifyFormat("int f (T x) noexcept (x.create ());", Space);
7923 verifyFormat("alignas (128) char a[128];", Space);
7924 verifyFormat("size_t x = alignof (MyType);", Space);
7925 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
7926 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00007927 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00007928 verifyFormat("T A::operator() ();", Space);
7929 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007930}
7931
7932TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
7933 FormatStyle Spaces = getLLVMStyle();
7934
7935 Spaces.SpacesInParentheses = true;
7936 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007937 verifyFormat("call();", Spaces);
7938 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00007939 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
7940 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007941 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007942 " continue;",
7943 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007944 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007945 " continue;",
7946 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007947 verifyFormat("if ( true )\n"
7948 " f();\n"
7949 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007950 " f();",
7951 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007952 verifyFormat("do {\n"
7953 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007954 "} while ( something() );",
7955 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007956 verifyFormat("switch ( x ) {\n"
7957 "default:\n"
7958 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007959 "}",
7960 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007961
7962 Spaces.SpacesInParentheses = false;
7963 Spaces.SpacesInCStyleCastParentheses = true;
7964 verifyFormat("Type *A = ( Type * )P;", Spaces);
7965 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
7966 verifyFormat("x = ( int32 )y;", Spaces);
7967 verifyFormat("int a = ( int )(2.0f);", Spaces);
7968 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
7969 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
7970 verifyFormat("#define x (( int )-1)", Spaces);
7971
Daniel Jasper92e09822015-03-18 12:59:19 +00007972 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00007973 Spaces.SpacesInParentheses = false;
7974 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00007975 Spaces.SpacesInCStyleCastParentheses = true;
7976 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007977 verifyFormat("call( );", Spaces);
7978 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007979 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007980 " continue;",
7981 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007982 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007983 " continue;",
7984 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007985 verifyFormat("if (true)\n"
7986 " f( );\n"
7987 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007988 " f( );",
7989 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007990 verifyFormat("do {\n"
7991 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007992 "} while (something( ));",
7993 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007994 verifyFormat("switch (x) {\n"
7995 "default:\n"
7996 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007997 "}",
7998 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007999
Daniel Jasper92e09822015-03-18 12:59:19 +00008000 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008001 Spaces.SpaceAfterCStyleCast = true;
8002 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008003 verifyFormat("call( );", Spaces);
8004 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008005 verifyFormat("while (( bool ) 1)\n"
8006 " continue;",
8007 Spaces);
8008 verifyFormat("for (;;)\n"
8009 " continue;",
8010 Spaces);
8011 verifyFormat("if (true)\n"
8012 " f( );\n"
8013 "else if (true)\n"
8014 " f( );",
8015 Spaces);
8016 verifyFormat("do {\n"
8017 " do_something(( int ) i);\n"
8018 "} while (something( ));",
8019 Spaces);
8020 verifyFormat("switch (x) {\n"
8021 "default:\n"
8022 " break;\n"
8023 "}",
8024 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008025
8026 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008027 Spaces.SpacesInCStyleCastParentheses = false;
8028 Spaces.SpaceAfterCStyleCast = true;
8029 verifyFormat("while ((bool) 1)\n"
8030 " continue;",
8031 Spaces);
8032 verifyFormat("do {\n"
8033 " do_something((int) i);\n"
8034 "} while (something( ));",
8035 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008036}
8037
Daniel Jasperad981f82014-08-26 11:41:14 +00008038TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
8039 verifyFormat("int a[5];");
8040 verifyFormat("a[3] += 42;");
8041
8042 FormatStyle Spaces = getLLVMStyle();
8043 Spaces.SpacesInSquareBrackets = true;
8044 // Lambdas unchanged.
8045 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
8046 verifyFormat("return [i, args...] {};", Spaces);
8047
8048 // Not lambdas.
8049 verifyFormat("int a[ 5 ];", Spaces);
8050 verifyFormat("a[ 3 ] += 42;", Spaces);
8051 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
8052 verifyFormat("double &operator[](int i) { return 0; }\n"
8053 "int i;",
8054 Spaces);
8055 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
8056 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
8057 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
8058}
8059
Daniel Jasperd94bff32013-09-25 15:15:02 +00008060TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
8061 verifyFormat("int a = 5;");
8062 verifyFormat("a += 42;");
8063 verifyFormat("a or_eq 8;");
8064
8065 FormatStyle Spaces = getLLVMStyle();
8066 Spaces.SpaceBeforeAssignmentOperators = false;
8067 verifyFormat("int a= 5;", Spaces);
8068 verifyFormat("a+= 42;", Spaces);
8069 verifyFormat("a or_eq 8;", Spaces);
8070}
8071
Daniel Jaspera44991332015-04-29 13:06:49 +00008072TEST_F(FormatTest, AlignConsecutiveAssignments) {
8073 FormatStyle Alignment = getLLVMStyle();
8074 Alignment.AlignConsecutiveAssignments = false;
8075 verifyFormat("int a = 5;\n"
8076 "int oneTwoThree = 123;",
8077 Alignment);
8078 verifyFormat("int a = 5;\n"
8079 "int oneTwoThree = 123;",
8080 Alignment);
8081
8082 Alignment.AlignConsecutiveAssignments = true;
8083 verifyFormat("int a = 5;\n"
8084 "int oneTwoThree = 123;",
8085 Alignment);
8086 verifyFormat("int a = method();\n"
8087 "int oneTwoThree = 133;",
8088 Alignment);
8089 verifyFormat("a &= 5;\n"
8090 "bcd *= 5;\n"
8091 "ghtyf += 5;\n"
8092 "dvfvdb -= 5;\n"
8093 "a /= 5;\n"
8094 "vdsvsv %= 5;\n"
8095 "sfdbddfbdfbb ^= 5;\n"
8096 "dvsdsv |= 5;\n"
8097 "int dsvvdvsdvvv = 123;",
8098 Alignment);
8099 verifyFormat("int i = 1, j = 10;\n"
8100 "something = 2000;",
8101 Alignment);
8102 verifyFormat("something = 2000;\n"
8103 "int i = 1, j = 10;\n",
8104 Alignment);
8105 verifyFormat("something = 2000;\n"
8106 "another = 911;\n"
8107 "int i = 1, j = 10;\n"
8108 "oneMore = 1;\n"
8109 "i = 2;",
8110 Alignment);
8111 verifyFormat("int a = 5;\n"
8112 "int one = 1;\n"
8113 "method();\n"
8114 "int oneTwoThree = 123;\n"
8115 "int oneTwo = 12;",
8116 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00008117 verifyFormat("int oneTwoThree = 123;\n"
8118 "int oneTwo = 12;\n"
8119 "method();\n",
8120 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008121 verifyFormat("int oneTwoThree = 123; // comment\n"
8122 "int oneTwo = 12; // comment",
8123 Alignment);
8124 EXPECT_EQ("int a = 5;\n"
8125 "\n"
8126 "int oneTwoThree = 123;",
8127 format("int a = 5;\n"
8128 "\n"
8129 "int oneTwoThree= 123;",
8130 Alignment));
8131 EXPECT_EQ("int a = 5;\n"
8132 "int one = 1;\n"
8133 "\n"
8134 "int oneTwoThree = 123;",
8135 format("int a = 5;\n"
8136 "int one = 1;\n"
8137 "\n"
8138 "int oneTwoThree = 123;",
8139 Alignment));
8140 EXPECT_EQ("int a = 5;\n"
8141 "int one = 1;\n"
8142 "\n"
8143 "int oneTwoThree = 123;\n"
8144 "int oneTwo = 12;",
8145 format("int a = 5;\n"
8146 "int one = 1;\n"
8147 "\n"
8148 "int oneTwoThree = 123;\n"
8149 "int oneTwo = 12;",
8150 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008151 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
8152 verifyFormat("#define A \\\n"
8153 " int aaaa = 12; \\\n"
8154 " int b = 23; \\\n"
8155 " int ccc = 234; \\\n"
8156 " int dddddddddd = 2345;",
8157 Alignment);
8158 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00008159 verifyFormat("#define A \\\n"
8160 " int aaaa = 12; \\\n"
8161 " int b = 23; \\\n"
8162 " int ccc = 234; \\\n"
8163 " int dddddddddd = 2345;",
8164 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008165 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00008166 verifyFormat("#define A "
8167 " \\\n"
8168 " int aaaa = 12; "
8169 " \\\n"
8170 " int b = 23; "
8171 " \\\n"
8172 " int ccc = 234; "
8173 " \\\n"
8174 " int dddddddddd = 2345;",
8175 Alignment);
8176 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
8177 "k = 4, int l = 5,\n"
8178 " int m = 6) {\n"
8179 " int j = 10;\n"
8180 " otherThing = 1;\n"
8181 "}",
8182 Alignment);
8183 verifyFormat("void SomeFunction(int parameter = 0) {\n"
8184 " int i = 1;\n"
8185 " int j = 2;\n"
8186 " int big = 10000;\n"
8187 "}",
8188 Alignment);
8189 verifyFormat("class C {\n"
8190 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00008191 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008192 " virtual void f() = 0;\n"
8193 "};",
8194 Alignment);
8195 verifyFormat("int i = 1;\n"
8196 "if (SomeType t = getSomething()) {\n"
8197 "}\n"
8198 "int j = 2;\n"
8199 "int big = 10000;",
8200 Alignment);
8201 verifyFormat("int j = 7;\n"
8202 "for (int k = 0; k < N; ++k) {\n"
8203 "}\n"
8204 "int j = 2;\n"
8205 "int big = 10000;\n"
8206 "}",
8207 Alignment);
8208 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8209 verifyFormat("int i = 1;\n"
8210 "LooooooooooongType loooooooooooooooooooooongVariable\n"
8211 " = someLooooooooooooooooongFunction();\n"
8212 "int j = 2;",
8213 Alignment);
8214 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
8215 verifyFormat("int i = 1;\n"
8216 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
8217 " someLooooooooooooooooongFunction();\n"
8218 "int j = 2;",
8219 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00008220
8221 verifyFormat("auto lambda = []() {\n"
8222 " auto i = 0;\n"
8223 " return 0;\n"
8224 "};\n"
8225 "int i = 0;\n"
8226 "auto v = type{\n"
8227 " i = 1, //\n"
8228 " (i = 2), //\n"
8229 " i = 3 //\n"
8230 "};",
8231 Alignment);
8232
Daniel Jaspera44991332015-04-29 13:06:49 +00008233 verifyFormat(
8234 "int i = 1;\n"
8235 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
8236 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008237 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00008238 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00008239
8240 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
8241 " typename B = very_long_type_name_1,\n"
8242 " typename T_2 = very_long_type_name_2>\n"
8243 "auto foo() {}\n",
8244 Alignment);
8245 verifyFormat("int a, b = 1;\n"
8246 "int c = 2;\n"
8247 "int dd = 3;\n",
8248 Alignment);
8249 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8250 "float b[1][] = {{3.f}};\n",
8251 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008252 verifyFormat("for (int i = 0; i < 1; i++)\n"
8253 " int x = 1;\n",
8254 Alignment);
8255 verifyFormat("for (i = 0; i < 1; i++)\n"
8256 " x = 1;\n"
8257 "y = 1;\n",
8258 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008259}
8260
Daniel Jaspere12597c2015-10-01 10:06:54 +00008261TEST_F(FormatTest, AlignConsecutiveDeclarations) {
8262 FormatStyle Alignment = getLLVMStyle();
8263 Alignment.AlignConsecutiveDeclarations = false;
8264 verifyFormat("float const a = 5;\n"
8265 "int oneTwoThree = 123;",
8266 Alignment);
8267 verifyFormat("int a = 5;\n"
8268 "float const oneTwoThree = 123;",
8269 Alignment);
8270
8271 Alignment.AlignConsecutiveDeclarations = true;
8272 verifyFormat("float const a = 5;\n"
8273 "int oneTwoThree = 123;",
8274 Alignment);
8275 verifyFormat("int a = method();\n"
8276 "float const oneTwoThree = 133;",
8277 Alignment);
8278 verifyFormat("int i = 1, j = 10;\n"
8279 "something = 2000;",
8280 Alignment);
8281 verifyFormat("something = 2000;\n"
8282 "int i = 1, j = 10;\n",
8283 Alignment);
8284 verifyFormat("float something = 2000;\n"
8285 "double another = 911;\n"
8286 "int i = 1, j = 10;\n"
8287 "const int *oneMore = 1;\n"
8288 "unsigned i = 2;",
8289 Alignment);
8290 verifyFormat("float a = 5;\n"
8291 "int one = 1;\n"
8292 "method();\n"
8293 "const double oneTwoThree = 123;\n"
8294 "const unsigned int oneTwo = 12;",
8295 Alignment);
8296 verifyFormat("int oneTwoThree{0}; // comment\n"
8297 "unsigned oneTwo; // comment",
8298 Alignment);
8299 EXPECT_EQ("float const a = 5;\n"
8300 "\n"
8301 "int oneTwoThree = 123;",
8302 format("float const a = 5;\n"
8303 "\n"
8304 "int oneTwoThree= 123;",
8305 Alignment));
8306 EXPECT_EQ("float a = 5;\n"
8307 "int one = 1;\n"
8308 "\n"
8309 "unsigned oneTwoThree = 123;",
8310 format("float a = 5;\n"
8311 "int one = 1;\n"
8312 "\n"
8313 "unsigned oneTwoThree = 123;",
8314 Alignment));
8315 EXPECT_EQ("float a = 5;\n"
8316 "int one = 1;\n"
8317 "\n"
8318 "unsigned oneTwoThree = 123;\n"
8319 "int oneTwo = 12;",
8320 format("float a = 5;\n"
8321 "int one = 1;\n"
8322 "\n"
8323 "unsigned oneTwoThree = 123;\n"
8324 "int oneTwo = 12;",
8325 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008326 // Function prototype alignment
8327 verifyFormat("int a();\n"
8328 "double b();",
8329 Alignment);
8330 verifyFormat("int a(int x);\n"
8331 "double b();",
8332 Alignment);
8333 unsigned OldColumnLimit = Alignment.ColumnLimit;
8334 // We need to set ColumnLimit to zero, in order to stress nested alignments,
8335 // otherwise the function parameters will be re-flowed onto a single line.
8336 Alignment.ColumnLimit = 0;
8337 EXPECT_EQ("int a(int x,\n"
8338 " float y);\n"
8339 "double b(int x,\n"
8340 " double y);",
8341 format("int a(int x,\n"
8342 " float y);\n"
8343 "double b(int x,\n"
8344 " double y);",
8345 Alignment));
8346 // This ensures that function parameters of function declarations are
8347 // correctly indented when their owning functions are indented.
8348 // The failure case here is for 'double y' to not be indented enough.
8349 EXPECT_EQ("double a(int x);\n"
8350 "int b(int y,\n"
8351 " double z);",
8352 format("double a(int x);\n"
8353 "int b(int y,\n"
8354 " double z);",
8355 Alignment));
8356 // Set ColumnLimit low so that we induce wrapping immediately after
8357 // the function name and opening paren.
8358 Alignment.ColumnLimit = 13;
8359 verifyFormat("int function(\n"
8360 " int x,\n"
8361 " bool y);",
8362 Alignment);
8363 Alignment.ColumnLimit = OldColumnLimit;
8364 // Ensure function pointers don't screw up recursive alignment
8365 verifyFormat("int a(int x, void (*fp)(int y));\n"
8366 "double b();",
8367 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008368 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008369 // Ensure recursive alignment is broken by function braces, so that the
8370 // "a = 1" does not align with subsequent assignments inside the function
8371 // body.
8372 verifyFormat("int func(int a = 1) {\n"
8373 " int b = 2;\n"
8374 " int cc = 3;\n"
8375 "}",
8376 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008377 verifyFormat("float something = 2000;\n"
8378 "double another = 911;\n"
8379 "int i = 1, j = 10;\n"
8380 "const int *oneMore = 1;\n"
8381 "unsigned i = 2;",
8382 Alignment);
8383 verifyFormat("int oneTwoThree = {0}; // comment\n"
8384 "unsigned oneTwo = 0; // comment",
8385 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008386 // Make sure that scope is correctly tracked, in the absence of braces
8387 verifyFormat("for (int i = 0; i < n; i++)\n"
8388 " j = i;\n"
8389 "double x = 1;\n",
8390 Alignment);
8391 verifyFormat("if (int i = 0)\n"
8392 " j = i;\n"
8393 "double x = 1;\n",
8394 Alignment);
8395 // Ensure operator[] and operator() are comprehended
8396 verifyFormat("struct test {\n"
8397 " long long int foo();\n"
8398 " int operator[](int a);\n"
8399 " double bar();\n"
8400 "};\n",
8401 Alignment);
8402 verifyFormat("struct test {\n"
8403 " long long int foo();\n"
8404 " int operator()(int a);\n"
8405 " double bar();\n"
8406 "};\n",
8407 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008408 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
8409 " int const i = 1;\n"
8410 " int * j = 2;\n"
8411 " int big = 10000;\n"
8412 "\n"
8413 " unsigned oneTwoThree = 123;\n"
8414 " int oneTwo = 12;\n"
8415 " method();\n"
8416 " float k = 2;\n"
8417 " int ll = 10000;\n"
8418 "}",
8419 format("void SomeFunction(int parameter= 0) {\n"
8420 " int const i= 1;\n"
8421 " int *j=2;\n"
8422 " int big = 10000;\n"
8423 "\n"
8424 "unsigned oneTwoThree =123;\n"
8425 "int oneTwo = 12;\n"
8426 " method();\n"
8427 "float k= 2;\n"
8428 "int ll=10000;\n"
8429 "}",
8430 Alignment));
8431 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008432 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
8433 verifyFormat("#define A \\\n"
8434 " int aaaa = 12; \\\n"
8435 " float b = 23; \\\n"
8436 " const int ccc = 234; \\\n"
8437 " unsigned dddddddddd = 2345;",
8438 Alignment);
8439 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00008440 verifyFormat("#define A \\\n"
8441 " int aaaa = 12; \\\n"
8442 " float b = 23; \\\n"
8443 " const int ccc = 234; \\\n"
8444 " unsigned dddddddddd = 2345;",
8445 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008446 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00008447 Alignment.ColumnLimit = 30;
8448 verifyFormat("#define A \\\n"
8449 " int aaaa = 12; \\\n"
8450 " float b = 23; \\\n"
8451 " const int ccc = 234; \\\n"
8452 " int dddddddddd = 2345;",
8453 Alignment);
8454 Alignment.ColumnLimit = 80;
8455 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
8456 "k = 4, int l = 5,\n"
8457 " int m = 6) {\n"
8458 " const int j = 10;\n"
8459 " otherThing = 1;\n"
8460 "}",
8461 Alignment);
8462 verifyFormat("void SomeFunction(int parameter = 0) {\n"
8463 " int const i = 1;\n"
8464 " int * j = 2;\n"
8465 " int big = 10000;\n"
8466 "}",
8467 Alignment);
8468 verifyFormat("class C {\n"
8469 "public:\n"
8470 " int i = 1;\n"
8471 " virtual void f() = 0;\n"
8472 "};",
8473 Alignment);
8474 verifyFormat("float i = 1;\n"
8475 "if (SomeType t = getSomething()) {\n"
8476 "}\n"
8477 "const unsigned j = 2;\n"
8478 "int big = 10000;",
8479 Alignment);
8480 verifyFormat("float j = 7;\n"
8481 "for (int k = 0; k < N; ++k) {\n"
8482 "}\n"
8483 "unsigned j = 2;\n"
8484 "int big = 10000;\n"
8485 "}",
8486 Alignment);
8487 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8488 verifyFormat("float i = 1;\n"
8489 "LooooooooooongType loooooooooooooooooooooongVariable\n"
8490 " = someLooooooooooooooooongFunction();\n"
8491 "int j = 2;",
8492 Alignment);
8493 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
8494 verifyFormat("int i = 1;\n"
8495 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
8496 " someLooooooooooooooooongFunction();\n"
8497 "int j = 2;",
8498 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00008499
8500 Alignment.AlignConsecutiveAssignments = true;
8501 verifyFormat("auto lambda = []() {\n"
8502 " auto ii = 0;\n"
8503 " float j = 0;\n"
8504 " return 0;\n"
8505 "};\n"
8506 "int i = 0;\n"
8507 "float i2 = 0;\n"
8508 "auto v = type{\n"
8509 " i = 1, //\n"
8510 " (i = 2), //\n"
8511 " i = 3 //\n"
8512 "};",
8513 Alignment);
8514 Alignment.AlignConsecutiveAssignments = false;
8515
Daniel Jaspere12597c2015-10-01 10:06:54 +00008516 verifyFormat(
8517 "int i = 1;\n"
8518 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
8519 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008520 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00008521 Alignment);
8522
8523 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
8524 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008525 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00008526 // happens.
8527 Alignment.AlignConsecutiveAssignments = true;
8528 Alignment.ColumnLimit = 30;
8529 verifyFormat("float ii = 1;\n"
8530 "unsigned j = 2;\n"
8531 "int someVerylongVariable = 1;\n"
8532 "AnotherLongType ll = 123456;\n"
8533 "VeryVeryLongType k = 2;\n"
8534 "int myvar = 1;",
8535 Alignment);
8536 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00008537 Alignment.AlignConsecutiveAssignments = false;
8538
8539 verifyFormat(
8540 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
8541 " typename LongType, typename B>\n"
8542 "auto foo() {}\n",
8543 Alignment);
8544 verifyFormat("float a, b = 1;\n"
8545 "int c = 2;\n"
8546 "int dd = 3;\n",
8547 Alignment);
8548 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8549 "float b[1][] = {{3.f}};\n",
8550 Alignment);
8551 Alignment.AlignConsecutiveAssignments = true;
8552 verifyFormat("float a, b = 1;\n"
8553 "int c = 2;\n"
8554 "int dd = 3;\n",
8555 Alignment);
8556 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8557 "float b[1][] = {{3.f}};\n",
8558 Alignment);
8559 Alignment.AlignConsecutiveAssignments = false;
8560
8561 Alignment.ColumnLimit = 30;
8562 Alignment.BinPackParameters = false;
8563 verifyFormat("void foo(float a,\n"
8564 " float b,\n"
8565 " int c,\n"
8566 " uint32_t *d) {\n"
8567 " int * e = 0;\n"
8568 " float f = 0;\n"
8569 " double g = 0;\n"
8570 "}\n"
8571 "void bar(ino_t a,\n"
8572 " int b,\n"
8573 " uint32_t *c,\n"
8574 " bool d) {}\n",
8575 Alignment);
8576 Alignment.BinPackParameters = true;
8577 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00008578}
8579
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008580TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008581 FormatStyle LinuxBraceStyle = getLLVMStyle();
8582 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008583 verifyFormat("namespace a\n"
8584 "{\n"
8585 "class A\n"
8586 "{\n"
8587 " void f()\n"
8588 " {\n"
8589 " if (true) {\n"
8590 " a();\n"
8591 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00008592 " } else {\n"
8593 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008594 " }\n"
8595 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008596 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008597 "};\n"
8598 "struct B {\n"
8599 " int x;\n"
8600 "};\n"
8601 "}\n",
8602 LinuxBraceStyle);
8603 verifyFormat("enum X {\n"
8604 " Y = 0,\n"
8605 "}\n",
8606 LinuxBraceStyle);
8607 verifyFormat("struct S {\n"
8608 " int Type;\n"
8609 " union {\n"
8610 " int x;\n"
8611 " double y;\n"
8612 " } Value;\n"
8613 " class C\n"
8614 " {\n"
8615 " MyFavoriteType Value;\n"
8616 " } Class;\n"
8617 "}\n",
8618 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008619}
8620
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00008621TEST_F(FormatTest, MozillaBraceBreaking) {
8622 FormatStyle MozillaBraceStyle = getLLVMStyle();
8623 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00008624 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00008625 verifyFormat("namespace a {\n"
8626 "class A\n"
8627 "{\n"
8628 " void f()\n"
8629 " {\n"
8630 " if (true) {\n"
8631 " a();\n"
8632 " b();\n"
8633 " }\n"
8634 " }\n"
8635 " void g() { return; }\n"
8636 "};\n"
8637 "enum E\n"
8638 "{\n"
8639 " A,\n"
8640 " // foo\n"
8641 " B,\n"
8642 " C\n"
8643 "};\n"
8644 "struct B\n"
8645 "{\n"
8646 " int x;\n"
8647 "};\n"
8648 "}\n",
8649 MozillaBraceStyle);
8650 verifyFormat("struct S\n"
8651 "{\n"
8652 " int Type;\n"
8653 " union\n"
8654 " {\n"
8655 " int x;\n"
8656 " double y;\n"
8657 " } Value;\n"
8658 " class C\n"
8659 " {\n"
8660 " MyFavoriteType Value;\n"
8661 " } Class;\n"
8662 "}\n",
8663 MozillaBraceStyle);
8664}
8665
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008666TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008667 FormatStyle StroustrupBraceStyle = getLLVMStyle();
8668 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008669 verifyFormat("namespace a {\n"
8670 "class A {\n"
8671 " void f()\n"
8672 " {\n"
8673 " if (true) {\n"
8674 " a();\n"
8675 " b();\n"
8676 " }\n"
8677 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008678 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008679 "};\n"
8680 "struct B {\n"
8681 " int x;\n"
8682 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00008683 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008684 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008685
Daniel Jasperd9670872014-08-05 12:06:20 +00008686 verifyFormat("void foo()\n"
8687 "{\n"
8688 " if (a) {\n"
8689 " a();\n"
8690 " }\n"
8691 " else {\n"
8692 " b();\n"
8693 " }\n"
8694 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008695 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00008696
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008697 verifyFormat("#ifdef _DEBUG\n"
8698 "int foo(int i = 0)\n"
8699 "#else\n"
8700 "int foo(int i = 5)\n"
8701 "#endif\n"
8702 "{\n"
8703 " return i;\n"
8704 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008705 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008706
8707 verifyFormat("void foo() {}\n"
8708 "void bar()\n"
8709 "#ifdef _DEBUG\n"
8710 "{\n"
8711 " foo();\n"
8712 "}\n"
8713 "#else\n"
8714 "{\n"
8715 "}\n"
8716 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008717 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008718
8719 verifyFormat("void foobar() { int i = 5; }\n"
8720 "#ifdef _DEBUG\n"
8721 "void bar() {}\n"
8722 "#else\n"
8723 "void bar() { foobar(); }\n"
8724 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008725 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008726}
8727
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008728TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008729 FormatStyle AllmanBraceStyle = getLLVMStyle();
8730 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008731 verifyFormat("namespace a\n"
8732 "{\n"
8733 "class A\n"
8734 "{\n"
8735 " void f()\n"
8736 " {\n"
8737 " if (true)\n"
8738 " {\n"
8739 " a();\n"
8740 " b();\n"
8741 " }\n"
8742 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008743 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008744 "};\n"
8745 "struct B\n"
8746 "{\n"
8747 " int x;\n"
8748 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008749 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008750 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008751
8752 verifyFormat("void f()\n"
8753 "{\n"
8754 " if (true)\n"
8755 " {\n"
8756 " a();\n"
8757 " }\n"
8758 " else if (false)\n"
8759 " {\n"
8760 " b();\n"
8761 " }\n"
8762 " else\n"
8763 " {\n"
8764 " c();\n"
8765 " }\n"
8766 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008767 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008768
8769 verifyFormat("void f()\n"
8770 "{\n"
8771 " for (int i = 0; i < 10; ++i)\n"
8772 " {\n"
8773 " a();\n"
8774 " }\n"
8775 " while (false)\n"
8776 " {\n"
8777 " b();\n"
8778 " }\n"
8779 " do\n"
8780 " {\n"
8781 " c();\n"
8782 " } while (false)\n"
8783 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008784 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008785
8786 verifyFormat("void f(int a)\n"
8787 "{\n"
8788 " switch (a)\n"
8789 " {\n"
8790 " case 0:\n"
8791 " break;\n"
8792 " case 1:\n"
8793 " {\n"
8794 " break;\n"
8795 " }\n"
8796 " case 2:\n"
8797 " {\n"
8798 " }\n"
8799 " break;\n"
8800 " default:\n"
8801 " break;\n"
8802 " }\n"
8803 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008804 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00008805
8806 verifyFormat("enum X\n"
8807 "{\n"
8808 " Y = 0,\n"
8809 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008810 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00008811 verifyFormat("enum X\n"
8812 "{\n"
8813 " Y = 0\n"
8814 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008815 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00008816
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008817 verifyFormat("@interface BSApplicationController ()\n"
8818 "{\n"
8819 "@private\n"
8820 " id _extraIvar;\n"
8821 "}\n"
8822 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008823 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008824
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008825 verifyFormat("#ifdef _DEBUG\n"
8826 "int foo(int i = 0)\n"
8827 "#else\n"
8828 "int foo(int i = 5)\n"
8829 "#endif\n"
8830 "{\n"
8831 " return i;\n"
8832 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008833 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008834
8835 verifyFormat("void foo() {}\n"
8836 "void bar()\n"
8837 "#ifdef _DEBUG\n"
8838 "{\n"
8839 " foo();\n"
8840 "}\n"
8841 "#else\n"
8842 "{\n"
8843 "}\n"
8844 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008845 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008846
8847 verifyFormat("void foobar() { int i = 5; }\n"
8848 "#ifdef _DEBUG\n"
8849 "void bar() {}\n"
8850 "#else\n"
8851 "void bar() { foobar(); }\n"
8852 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008853 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008854
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008855 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008856 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00008857 " // ...\n"
8858 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008859 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008860 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008861 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00008862 " // ...\n"
8863 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008864 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008865 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008866 // .. or dict literals.
8867 verifyFormat("void f()\n"
8868 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00008869 " // ...\n"
8870 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
8871 "}",
8872 AllmanBraceStyle);
8873 verifyFormat("void f()\n"
8874 "{\n"
8875 " // ...\n"
8876 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008877 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008878 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00008879 verifyFormat("int f()\n"
8880 "{ // comment\n"
8881 " return 42;\n"
8882 "}",
8883 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008884
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008885 AllmanBraceStyle.ColumnLimit = 19;
8886 verifyFormat("void f() { int i; }", AllmanBraceStyle);
8887 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00008888 verifyFormat("void f()\n"
8889 "{\n"
8890 " int i;\n"
8891 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008892 AllmanBraceStyle);
8893 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00008894
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008895 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00008896 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
8897 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
8898 verifyFormat("void f(bool b)\n"
8899 "{\n"
8900 " if (b)\n"
8901 " {\n"
8902 " return;\n"
8903 " }\n"
8904 "}\n",
8905 BreakBeforeBraceShortIfs);
8906 verifyFormat("void f(bool b)\n"
8907 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00008908 " if constexpr (b)\n"
8909 " {\n"
8910 " return;\n"
8911 " }\n"
8912 "}\n",
8913 BreakBeforeBraceShortIfs);
8914 verifyFormat("void f(bool b)\n"
8915 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00008916 " if (b) return;\n"
8917 "}\n",
8918 BreakBeforeBraceShortIfs);
8919 verifyFormat("void f(bool b)\n"
8920 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00008921 " if constexpr (b) return;\n"
8922 "}\n",
8923 BreakBeforeBraceShortIfs);
8924 verifyFormat("void f(bool b)\n"
8925 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00008926 " while (b)\n"
8927 " {\n"
8928 " return;\n"
8929 " }\n"
8930 "}\n",
8931 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008932}
8933
Alexander Kornienko3a33f022013-12-12 09:49:52 +00008934TEST_F(FormatTest, GNUBraceBreaking) {
8935 FormatStyle GNUBraceStyle = getLLVMStyle();
8936 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
8937 verifyFormat("namespace a\n"
8938 "{\n"
8939 "class A\n"
8940 "{\n"
8941 " void f()\n"
8942 " {\n"
8943 " int a;\n"
8944 " {\n"
8945 " int b;\n"
8946 " }\n"
8947 " if (true)\n"
8948 " {\n"
8949 " a();\n"
8950 " b();\n"
8951 " }\n"
8952 " }\n"
8953 " void g() { return; }\n"
8954 "}\n"
8955 "}",
8956 GNUBraceStyle);
8957
8958 verifyFormat("void f()\n"
8959 "{\n"
8960 " if (true)\n"
8961 " {\n"
8962 " a();\n"
8963 " }\n"
8964 " else if (false)\n"
8965 " {\n"
8966 " b();\n"
8967 " }\n"
8968 " else\n"
8969 " {\n"
8970 " c();\n"
8971 " }\n"
8972 "}\n",
8973 GNUBraceStyle);
8974
8975 verifyFormat("void f()\n"
8976 "{\n"
8977 " for (int i = 0; i < 10; ++i)\n"
8978 " {\n"
8979 " a();\n"
8980 " }\n"
8981 " while (false)\n"
8982 " {\n"
8983 " b();\n"
8984 " }\n"
8985 " do\n"
8986 " {\n"
8987 " c();\n"
8988 " }\n"
8989 " while (false);\n"
8990 "}\n",
8991 GNUBraceStyle);
8992
8993 verifyFormat("void f(int a)\n"
8994 "{\n"
8995 " switch (a)\n"
8996 " {\n"
8997 " case 0:\n"
8998 " break;\n"
8999 " case 1:\n"
9000 " {\n"
9001 " break;\n"
9002 " }\n"
9003 " case 2:\n"
9004 " {\n"
9005 " }\n"
9006 " break;\n"
9007 " default:\n"
9008 " break;\n"
9009 " }\n"
9010 "}\n",
9011 GNUBraceStyle);
9012
9013 verifyFormat("enum X\n"
9014 "{\n"
9015 " Y = 0,\n"
9016 "}\n",
9017 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009018
9019 verifyFormat("@interface BSApplicationController ()\n"
9020 "{\n"
9021 "@private\n"
9022 " id _extraIvar;\n"
9023 "}\n"
9024 "@end\n",
9025 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009026
9027 verifyFormat("#ifdef _DEBUG\n"
9028 "int foo(int i = 0)\n"
9029 "#else\n"
9030 "int foo(int i = 5)\n"
9031 "#endif\n"
9032 "{\n"
9033 " return i;\n"
9034 "}",
9035 GNUBraceStyle);
9036
9037 verifyFormat("void foo() {}\n"
9038 "void bar()\n"
9039 "#ifdef _DEBUG\n"
9040 "{\n"
9041 " foo();\n"
9042 "}\n"
9043 "#else\n"
9044 "{\n"
9045 "}\n"
9046 "#endif",
9047 GNUBraceStyle);
9048
9049 verifyFormat("void foobar() { int i = 5; }\n"
9050 "#ifdef _DEBUG\n"
9051 "void bar() {}\n"
9052 "#else\n"
9053 "void bar() { foobar(); }\n"
9054 "#endif",
9055 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009056}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009057
9058TEST_F(FormatTest, WebKitBraceBreaking) {
9059 FormatStyle WebKitBraceStyle = getLLVMStyle();
9060 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009061 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009062 verifyFormat("namespace a {\n"
9063 "class A {\n"
9064 " void f()\n"
9065 " {\n"
9066 " if (true) {\n"
9067 " a();\n"
9068 " b();\n"
9069 " }\n"
9070 " }\n"
9071 " void g() { return; }\n"
9072 "};\n"
9073 "enum E {\n"
9074 " A,\n"
9075 " // foo\n"
9076 " B,\n"
9077 " C\n"
9078 "};\n"
9079 "struct B {\n"
9080 " int x;\n"
9081 "};\n"
9082 "}\n",
9083 WebKitBraceStyle);
9084 verifyFormat("struct S {\n"
9085 " int Type;\n"
9086 " union {\n"
9087 " int x;\n"
9088 " double y;\n"
9089 " } Value;\n"
9090 " class C {\n"
9091 " MyFavoriteType Value;\n"
9092 " } Class;\n"
9093 "};\n",
9094 WebKitBraceStyle);
9095}
9096
Manuel Klimekd5735502013-08-12 03:51:17 +00009097TEST_F(FormatTest, CatchExceptionReferenceBinding) {
9098 verifyFormat("void f() {\n"
9099 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00009100 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00009101 " }\n"
9102 "}\n",
9103 getLLVMStyle());
9104}
9105
Daniel Jasper9613c812013-08-07 16:29:23 +00009106TEST_F(FormatTest, UnderstandsPragmas) {
9107 verifyFormat("#pragma omp reduction(| : var)");
9108 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +00009109
9110 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
9111 "(including parentheses).",
9112 format("#pragma mark Any non-hyphenated or hyphenated string "
9113 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +00009114}
9115
Daniel Jasperee4a8a12015-04-22 09:45:42 +00009116TEST_F(FormatTest, UnderstandPragmaOption) {
9117 verifyFormat("#pragma option -C -A");
9118
9119 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
9120}
9121
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009122#define EXPECT_ALL_STYLES_EQUAL(Styles) \
9123 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +00009124 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
9125 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +00009126
9127TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009128 SmallVector<FormatStyle, 3> Styles;
9129 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009130
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009131 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009132 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
9133 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
9134 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009135
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009136 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009137 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
9138 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
9139 EXPECT_ALL_STYLES_EQUAL(Styles);
9140
Nico Weber514ecc82014-02-02 20:50:45 +00009141 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009142 EXPECT_TRUE(
9143 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
9144 EXPECT_TRUE(
9145 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
9146 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009147
Nico Weber514ecc82014-02-02 20:50:45 +00009148 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009149 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
9150 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
9151 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009152
9153 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009154 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
9155 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
9156 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009157
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009158 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009159 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
9160 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
9161 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009162
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +00009163 Styles[0] = getGNUStyle();
9164 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
9165 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
9166 EXPECT_ALL_STYLES_EQUAL(Styles);
9167
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009168 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
9169}
9170
9171TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
9172 SmallVector<FormatStyle, 8> Styles;
9173 Styles.resize(2);
9174
9175 Styles[0] = getGoogleStyle();
9176 Styles[1] = getLLVMStyle();
9177 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9178 EXPECT_ALL_STYLES_EQUAL(Styles);
9179
9180 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +00009181 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009182 Styles[1] = getLLVMStyle();
9183 Styles[1].Language = FormatStyle::LK_JavaScript;
9184 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9185
9186 Styles[2] = getLLVMStyle();
9187 Styles[2].Language = FormatStyle::LK_JavaScript;
9188 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
9189 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009190 &Styles[2])
9191 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009192
9193 Styles[3] = getLLVMStyle();
9194 Styles[3].Language = FormatStyle::LK_JavaScript;
9195 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
9196 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009197 &Styles[3])
9198 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009199
9200 Styles[4] = getLLVMStyle();
9201 Styles[4].Language = FormatStyle::LK_JavaScript;
9202 EXPECT_EQ(0, parseConfiguration("---\n"
9203 "BasedOnStyle: LLVM\n"
9204 "IndentWidth: 123\n"
9205 "---\n"
9206 "BasedOnStyle: Google\n"
9207 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009208 &Styles[4])
9209 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009210 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009211}
9212
Daniel Jasper91881d92014-09-29 08:07:46 +00009213#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +00009214 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +00009215 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009216 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +00009217 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +00009218 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009219
Daniel Jasper91881d92014-09-29 08:07:46 +00009220#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
9221
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009222#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
9223 Style.STRUCT.FIELD = false; \
9224 EXPECT_EQ(0, \
9225 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
9226 .value()); \
9227 EXPECT_TRUE(Style.STRUCT.FIELD); \
9228 EXPECT_EQ(0, \
9229 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
9230 .value()); \
9231 EXPECT_FALSE(Style.STRUCT.FIELD);
9232
9233#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
9234 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
9235
Daniel Jasper00853002014-09-16 16:22:30 +00009236#define CHECK_PARSE(TEXT, FIELD, VALUE) \
9237 EXPECT_NE(VALUE, Style.FIELD); \
9238 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
9239 EXPECT_EQ(VALUE, Style.FIELD)
9240
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009241TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009242 FormatStyle Style = {};
9243 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +00009244 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +00009245 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +00009246 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009247 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009248 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +00009249 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +00009250 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009251 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +00009252 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00009253 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +00009254 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00009255 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00009256 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +00009257 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00009258 CHECK_PARSE_BOOL(BreakStringLiterals);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00009259 CHECK_PARSE_BOOL(BreakBeforeInheritanceComma)
Francois Ferrande56a8292017-06-14 12:29:47 +00009260 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009261 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +00009262 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +00009263 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +00009264 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009265 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00009266 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +00009267 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +00009268 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009269 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +00009270 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +00009271 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +00009272 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009273 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +00009274 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009275 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009276 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +00009277 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009278 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009279 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +00009280 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +00009281 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009282
9283 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
9284 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
9285 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
9286 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
9287 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
9288 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
9289 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
9290 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
9291 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
9292 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
9293 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00009294 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunctionBody);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009295}
Alexander Kornienkod6538332013-05-07 15:32:14 +00009296
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009297#undef CHECK_PARSE_BOOL
9298
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009299TEST_F(FormatTest, ParsesConfiguration) {
9300 FormatStyle Style = {};
9301 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00009302 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009303 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
9304 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +00009305 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009306 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
9307 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +00009308 CHECK_PARSE("PenaltyBreakAssignment: 1234",
9309 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +00009310 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
9311 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009312 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
9313 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
9314 PenaltyReturnTypeOnItsOwnLine, 1234u);
9315 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
9316 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +00009317 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +00009318 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00009319 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +00009320
Daniel Jasper553d4872014-06-17 12:40:34 +00009321 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +00009322 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
9323 FormatStyle::PAS_Left);
9324 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
9325 FormatStyle::PAS_Right);
9326 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
9327 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +00009328 // For backward compatibility:
9329 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
9330 FormatStyle::PAS_Left);
9331 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
9332 FormatStyle::PAS_Right);
9333 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
9334 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +00009335
Alexander Kornienkod6538332013-05-07 15:32:14 +00009336 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +00009337 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
9338 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009339 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
9340 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
9341 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
9342
Daniel Jasperac043c92014-09-15 11:11:00 +00009343 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +00009344 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
9345 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +00009346 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
9347 FormatStyle::BOS_None);
9348 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
9349 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00009350 // For backward compatibility:
9351 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
9352 FormatStyle::BOS_None);
9353 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
9354 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +00009355
Francois Ferranda6b6d512017-05-24 11:36:58 +00009356 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
9357 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
9358 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
9359 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
9360 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
9361 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
9362 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
9363 // For backward compatibility:
9364 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
9365 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
9366
Daniel Jasper6501f7e2015-10-27 12:38:37 +00009367 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9368 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
9369 FormatStyle::BAS_Align);
9370 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
9371 FormatStyle::BAS_DontAlign);
9372 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
9373 FormatStyle::BAS_AlwaysBreak);
9374 // For backward compatibility:
9375 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
9376 FormatStyle::BAS_DontAlign);
9377 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
9378 FormatStyle::BAS_Align);
9379
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009380 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
9381 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
9382 FormatStyle::ENAS_DontAlign);
9383 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
9384 FormatStyle::ENAS_Left);
9385 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
9386 FormatStyle::ENAS_Right);
9387 // For backward compatibility:
9388 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
9389 FormatStyle::ENAS_Left);
9390 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
9391 FormatStyle::ENAS_Right);
9392
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009393 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009394 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
9395 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
9396 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00009397 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
9398 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +00009399 // For backward compatibility:
9400 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
9401 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009402
Daniel Jasperd74cf402014-04-08 12:46:38 +00009403 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +00009404 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
9405 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
9406 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
9407 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +00009408 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
9409 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +00009410 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
9411 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00009412 // For backward compatibility:
9413 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
9414 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
9415 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
9416 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +00009417
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009418 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
9419 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
9420 FormatStyle::SBPO_Never);
9421 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
9422 FormatStyle::SBPO_Always);
9423 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
9424 FormatStyle::SBPO_ControlStatements);
9425 // For backward compatibility:
9426 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
9427 FormatStyle::SBPO_Never);
9428 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
9429 FormatStyle::SBPO_ControlStatements);
9430
Alexander Kornienkod6538332013-05-07 15:32:14 +00009431 Style.ColumnLimit = 123;
9432 FormatStyle BaseStyle = getLLVMStyle();
9433 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
9434 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
9435
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009436 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
9437 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
9438 FormatStyle::BS_Attach);
9439 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
9440 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009441 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
9442 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009443 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
9444 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009445 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
9446 FormatStyle::BS_Allman);
9447 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009448 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
9449 FormatStyle::BS_WebKit);
9450 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
9451 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009452
Zachary Turner448592e2015-12-18 22:20:15 +00009453 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
9454 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
9455 FormatStyle::RTBS_None);
9456 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
9457 FormatStyle::RTBS_All);
9458 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +00009459 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +00009460 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
9461 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
9462 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
9463 AlwaysBreakAfterReturnType,
9464 FormatStyle::RTBS_TopLevelDefinitions);
9465
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00009466 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
9467 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
9468 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
9469 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
9470 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
9471 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
9472 AlwaysBreakAfterDefinitionReturnType,
9473 FormatStyle::DRTBS_TopLevel);
9474
Daniel Jasper65ee3472013-07-31 23:16:02 +00009475 Style.NamespaceIndentation = FormatStyle::NI_All;
9476 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
9477 FormatStyle::NI_None);
9478 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
9479 FormatStyle::NI_Inner);
9480 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
9481 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +00009482
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00009483 // FIXME: This is required because parsing a configuration simply overwrites
9484 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +00009485 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +00009486 std::vector<std::string> BoostForeach;
9487 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00009488 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +00009489 std::vector<std::string> BoostAndQForeach;
9490 BoostAndQForeach.push_back("BOOST_FOREACH");
9491 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00009492 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
9493 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00009494
9495 Style.IncludeCategories.clear();
9496 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
9497 {".*", 1}};
9498 CHECK_PARSE("IncludeCategories:\n"
9499 " - Regex: abc/.*\n"
9500 " Priority: 2\n"
9501 " - Regex: .*\n"
9502 " Priority: 1",
9503 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00009504 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009505}
9506
9507TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
9508 FormatStyle Style = {};
9509 Style.Language = FormatStyle::LK_Cpp;
9510 CHECK_PARSE("Language: Cpp\n"
9511 "IndentWidth: 12",
9512 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +00009513 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
9514 "IndentWidth: 34",
9515 &Style),
9516 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009517 EXPECT_EQ(12u, Style.IndentWidth);
9518 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
9519 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
9520
9521 Style.Language = FormatStyle::LK_JavaScript;
9522 CHECK_PARSE("Language: JavaScript\n"
9523 "IndentWidth: 12",
9524 IndentWidth, 12u);
9525 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +00009526 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
9527 "IndentWidth: 34",
9528 &Style),
9529 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009530 EXPECT_EQ(23u, Style.IndentWidth);
9531 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
9532 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
9533
9534 CHECK_PARSE("BasedOnStyle: LLVM\n"
9535 "IndentWidth: 67",
9536 IndentWidth, 67u);
9537
9538 CHECK_PARSE("---\n"
9539 "Language: JavaScript\n"
9540 "IndentWidth: 12\n"
9541 "---\n"
9542 "Language: Cpp\n"
9543 "IndentWidth: 34\n"
9544 "...\n",
9545 IndentWidth, 12u);
9546
9547 Style.Language = FormatStyle::LK_Cpp;
9548 CHECK_PARSE("---\n"
9549 "Language: JavaScript\n"
9550 "IndentWidth: 12\n"
9551 "---\n"
9552 "Language: Cpp\n"
9553 "IndentWidth: 34\n"
9554 "...\n",
9555 IndentWidth, 34u);
9556 CHECK_PARSE("---\n"
9557 "IndentWidth: 78\n"
9558 "---\n"
9559 "Language: JavaScript\n"
9560 "IndentWidth: 56\n"
9561 "...\n",
9562 IndentWidth, 78u);
9563
9564 Style.ColumnLimit = 123;
9565 Style.IndentWidth = 234;
9566 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
9567 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +00009568 EXPECT_FALSE(parseConfiguration("---\n"
9569 "IndentWidth: 456\n"
9570 "BreakBeforeBraces: Allman\n"
9571 "---\n"
9572 "Language: JavaScript\n"
9573 "IndentWidth: 111\n"
9574 "TabWidth: 111\n"
9575 "---\n"
9576 "Language: Cpp\n"
9577 "BreakBeforeBraces: Stroustrup\n"
9578 "TabWidth: 789\n"
9579 "...\n",
9580 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009581 EXPECT_EQ(123u, Style.ColumnLimit);
9582 EXPECT_EQ(456u, Style.IndentWidth);
9583 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
9584 EXPECT_EQ(789u, Style.TabWidth);
9585
Rafael Espindola1f243172014-06-12 11:35:17 +00009586 EXPECT_EQ(parseConfiguration("---\n"
9587 "Language: JavaScript\n"
9588 "IndentWidth: 56\n"
9589 "---\n"
9590 "IndentWidth: 78\n"
9591 "...\n",
9592 &Style),
9593 ParseError::Error);
9594 EXPECT_EQ(parseConfiguration("---\n"
9595 "Language: JavaScript\n"
9596 "IndentWidth: 56\n"
9597 "---\n"
9598 "Language: JavaScript\n"
9599 "IndentWidth: 78\n"
9600 "...\n",
9601 &Style),
9602 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009603
9604 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
9605}
Daniel Jasper65ee3472013-07-31 23:16:02 +00009606
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009607#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009608
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009609TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
9610 FormatStyle Style = {};
9611 Style.Language = FormatStyle::LK_JavaScript;
9612 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009613 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00009614 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009615
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009616 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009617 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009618 "BasedOnStyle: Google\n"
9619 "---\n"
9620 "Language: JavaScript\n"
9621 "IndentWidth: 76\n"
9622 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009623 &Style)
9624 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00009625 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009626 EXPECT_EQ(76u, Style.IndentWidth);
9627 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
9628}
9629
Alexander Kornienkod6538332013-05-07 15:32:14 +00009630TEST_F(FormatTest, ConfigurationRoundTripTest) {
9631 FormatStyle Style = getLLVMStyle();
9632 std::string YAML = configurationAsText(Style);
9633 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009634 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00009635 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
9636 EXPECT_EQ(Style, ParsedStyle);
9637}
9638
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009639TEST_F(FormatTest, WorksFor8bitEncodings) {
9640 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
9641 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
9642 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
9643 "\"\xef\xee\xf0\xf3...\"",
9644 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
9645 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
9646 "\xef\xee\xf0\xf3...\"",
9647 getLLVMStyleWithColumns(12)));
9648}
9649
Alexander Kornienko393e3082013-11-13 14:04:17 +00009650TEST_F(FormatTest, HandlesUTF8BOM) {
9651 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
9652 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
9653 format("\xef\xbb\xbf#include <iostream>"));
9654 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
9655 format("\xef\xbb\xbf\n#include <iostream>"));
9656}
9657
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +00009658// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
9659#if !defined(_MSC_VER)
9660
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009661TEST_F(FormatTest, CountsUTF8CharactersProperly) {
9662 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
9663 getLLVMStyleWithColumns(35));
9664 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009665 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009666 verifyFormat("// Однажды в студёную зимнюю пору...",
9667 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +00009668 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009669 verifyFormat("/* Однажды в студёную зимнюю пору... */",
9670 getLLVMStyleWithColumns(39));
9671 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009672 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009673}
9674
9675TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +00009676 // Non-printable characters' width is currently considered to be the length in
9677 // bytes in UTF8. The characters can be displayed in very different manner
9678 // (zero-width, single width with a substitution glyph, expanded to their code
9679 // (e.g. "<8d>"), so there's no single correct way to handle them.
9680 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00009681 "\"\xc2\x8d\";",
9682 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +00009683 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00009684 "\"\xc2\x8d\";",
9685 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +00009686 EXPECT_EQ("\"Однажды, в \"\n"
9687 "\"студёную \"\n"
9688 "\"зимнюю \"\n"
9689 "\"пору,\"",
9690 format("\"Однажды, в студёную зимнюю пору,\"",
9691 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009692 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +00009693 "\"一 二 三 \"\n"
9694 "\"四 五六 \"\n"
9695 "\"七 八 九 \"\n"
9696 "\"十\"",
9697 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009698 EXPECT_EQ("\"一\t二 \"\n"
9699 "\"\t三 \"\n"
9700 "\"四 五\t六 \"\n"
9701 "\"\t七 \"\n"
9702 "\"八九十\tqq\"",
9703 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
9704 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +00009705
9706 // UTF8 character in an escape sequence.
9707 EXPECT_EQ("\"aaaaaa\"\n"
9708 "\"\\\xC2\x8D\"",
9709 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009710}
9711
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009712TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
9713 EXPECT_EQ("const char *sssss =\n"
9714 " \"一二三四五六七八\\\n"
9715 " 九 十\";",
9716 format("const char *sssss = \"一二三四五六七八\\\n"
9717 " 九 十\";",
9718 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009719}
9720
9721TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00009722 EXPECT_EQ("// aaaaÄ\xc2\x8d",
9723 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009724 EXPECT_EQ("// Я из лесу\n"
9725 "// вышел; был\n"
9726 "// сильный\n"
9727 "// мороз.",
9728 format("// Я из лесу вышел; был сильный мороз.",
9729 getLLVMStyleWithColumns(13)));
9730 EXPECT_EQ("// 一二三\n"
9731 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009732 "// 八 九\n"
9733 "// 十",
9734 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009735}
9736
9737TEST_F(FormatTest, SplitsUTF8BlockComments) {
9738 EXPECT_EQ("/* Гляжу,\n"
9739 " * поднимается\n"
9740 " * медленно в\n"
9741 " * гору\n"
9742 " * Лошадка,\n"
9743 " * везущая\n"
9744 " * хворосту\n"
9745 " * воз. */",
9746 format("/* Гляжу, поднимается медленно в гору\n"
9747 " * Лошадка, везущая хворосту воз. */",
9748 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009749 EXPECT_EQ(
9750 "/* 一二三\n"
9751 " * 四五六七\n"
9752 " * 八 九\n"
9753 " * 十 */",
9754 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +00009755 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
9756 " * 𝕓𝕪𝕥𝕖\n"
9757 " * 𝖀𝕿𝕱-𝟠 */",
9758 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009759}
9760
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009761#endif // _MSC_VER
9762
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009763TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
9764 FormatStyle Style = getLLVMStyle();
9765
9766 Style.ConstructorInitializerIndentWidth = 4;
9767 verifyFormat(
9768 "SomeClass::Constructor()\n"
9769 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
9770 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
9771 Style);
9772
9773 Style.ConstructorInitializerIndentWidth = 2;
9774 verifyFormat(
9775 "SomeClass::Constructor()\n"
9776 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
9777 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
9778 Style);
9779
9780 Style.ConstructorInitializerIndentWidth = 0;
9781 verifyFormat(
9782 "SomeClass::Constructor()\n"
9783 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
9784 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
9785 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +00009786 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9787 verifyFormat(
9788 "SomeLongTemplateVariableName<\n"
9789 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
9790 Style);
9791 verifyFormat(
9792 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
9793 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
9794 Style);
Daniel Jasper00853002014-09-16 16:22:30 +00009795}
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009796
Daniel Jasper00853002014-09-16 16:22:30 +00009797TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
9798 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +00009799 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009800 Style.ConstructorInitializerIndentWidth = 4;
9801 verifyFormat("SomeClass::Constructor()\n"
9802 " : a(a)\n"
9803 " , b(b)\n"
9804 " , c(c) {}",
9805 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009806 verifyFormat("SomeClass::Constructor()\n"
9807 " : a(a) {}",
9808 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009809
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009810 Style.ColumnLimit = 0;
9811 verifyFormat("SomeClass::Constructor()\n"
9812 " : a(a) {}",
9813 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +00009814 verifyFormat("SomeClass::Constructor() noexcept\n"
9815 " : a(a) {}",
9816 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009817 verifyFormat("SomeClass::Constructor()\n"
9818 " : a(a)\n"
9819 " , b(b)\n"
9820 " , c(c) {}",
9821 Style);
9822 verifyFormat("SomeClass::Constructor()\n"
9823 " : a(a) {\n"
9824 " foo();\n"
9825 " bar();\n"
9826 "}",
9827 Style);
9828
Daniel Jasperd74cf402014-04-08 12:46:38 +00009829 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009830 verifyFormat("SomeClass::Constructor()\n"
9831 " : a(a)\n"
9832 " , b(b)\n"
9833 " , c(c) {\n}",
9834 Style);
9835 verifyFormat("SomeClass::Constructor()\n"
9836 " : a(a) {\n}",
9837 Style);
9838
9839 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +00009840 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009841 Style.ConstructorInitializerIndentWidth = 2;
9842 verifyFormat("SomeClass::Constructor()\n"
9843 " : a(a)\n"
9844 " , b(b)\n"
9845 " , c(c) {}",
9846 Style);
9847
9848 Style.ConstructorInitializerIndentWidth = 0;
9849 verifyFormat("SomeClass::Constructor()\n"
9850 ": a(a)\n"
9851 ", b(b)\n"
9852 ", c(c) {}",
9853 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +00009854
9855 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
9856 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009857 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
9858 verifyFormat(
9859 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
9860 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +00009861 verifyFormat(
9862 "SomeClass::Constructor()\n"
9863 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
9864 Style);
9865 Style.ConstructorInitializerIndentWidth = 4;
9866 Style.ColumnLimit = 60;
9867 verifyFormat("SomeClass::Constructor()\n"
9868 " : aaaaaaaa(aaaaaaaa)\n"
9869 " , aaaaaaaa(aaaaaaaa)\n"
9870 " , aaaaaaaa(aaaaaaaa) {}",
9871 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009872}
9873
Daniel Jasper38efc132014-10-21 07:51:54 +00009874TEST_F(FormatTest, Destructors) {
9875 verifyFormat("void F(int &i) { i.~int(); }");
9876 verifyFormat("void F(int &i) { i->~int(); }");
9877}
9878
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009879TEST_F(FormatTest, FormatsWithWebKitStyle) {
9880 FormatStyle Style = getWebKitStyle();
9881
9882 // Don't indent in outer namespaces.
9883 verifyFormat("namespace outer {\n"
9884 "int i;\n"
9885 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00009886 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009887 "} // namespace inner\n"
9888 "} // namespace outer\n"
9889 "namespace other_outer {\n"
9890 "int i;\n"
9891 "}",
9892 Style);
9893
9894 // Don't indent case labels.
9895 verifyFormat("switch (variable) {\n"
9896 "case 1:\n"
9897 "case 2:\n"
9898 " doSomething();\n"
9899 " break;\n"
9900 "default:\n"
9901 " ++variable;\n"
9902 "}",
9903 Style);
9904
9905 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +00009906 EXPECT_EQ("void f()\n"
9907 "{\n"
9908 " if (aaaaaaaaaaaaaaaa\n"
9909 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
9910 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
9911 " return;\n"
9912 "}",
9913 format("void f() {\n"
9914 "if (aaaaaaaaaaaaaaaa\n"
9915 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
9916 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
9917 "return;\n"
9918 "}",
9919 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009920
Daniel Jasper35995672014-04-29 14:05:20 +00009921 // Allow functions on a single line.
9922 verifyFormat("void f() { return; }", Style);
9923
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009924 // Constructor initializers are formatted one per line with the "," on the
9925 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009926 verifyFormat("Constructor()\n"
9927 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
9928 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00009929 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +00009930 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
9931 "{\n"
9932 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009933 Style);
9934 verifyFormat("SomeClass::Constructor()\n"
9935 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +00009936 "{\n"
9937 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009938 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +00009939 EXPECT_EQ("SomeClass::Constructor()\n"
9940 " : a(a)\n"
9941 "{\n"
9942 "}",
9943 format("SomeClass::Constructor():a(a){}", Style));
9944 verifyFormat("SomeClass::Constructor()\n"
9945 " : a(a)\n"
9946 " , b(b)\n"
9947 " , c(c)\n"
9948 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009949 "}",
9950 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009951 verifyFormat("SomeClass::Constructor()\n"
9952 " : a(a)\n"
9953 "{\n"
9954 " foo();\n"
9955 " bar();\n"
9956 "}",
9957 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009958
Daniel Jasper65ee3472013-07-31 23:16:02 +00009959 // Access specifiers should be aligned left.
9960 verifyFormat("class C {\n"
9961 "public:\n"
9962 " int i;\n"
9963 "};",
9964 Style);
9965
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009966 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +00009967 verifyFormat("int a; // Do not\n"
9968 "double b; // align comments.",
9969 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009970
Daniel Jasper3219e432014-12-02 13:24:51 +00009971 // Do not align operands.
9972 EXPECT_EQ("ASSERT(aaaa\n"
9973 " || bbbb);",
9974 format("ASSERT ( aaaa\n||bbbb);", Style));
9975
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009976 // Accept input's line breaks.
9977 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
9978 " || bbbbbbbbbbbbbbb) {\n"
9979 " i++;\n"
9980 "}",
9981 format("if (aaaaaaaaaaaaaaa\n"
9982 "|| bbbbbbbbbbbbbbb) { i++; }",
9983 Style));
9984 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
9985 " i++;\n"
9986 "}",
9987 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +00009988
9989 // Don't automatically break all macro definitions (llvm.org/PR17842).
9990 verifyFormat("#define aNumber 10", Style);
9991 // However, generally keep the line breaks that the user authored.
9992 EXPECT_EQ("#define aNumber \\\n"
9993 " 10",
9994 format("#define aNumber \\\n"
9995 " 10",
9996 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +00009997
9998 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +00009999 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10000 " copyItems:YES];",
10001 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10002 "copyItems:YES];",
10003 Style));
10004 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10005 " copyItems:YES];",
10006 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10007 " copyItems:YES];",
10008 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010009 // FIXME: This does not seem right, there should be more indentation before
10010 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010011 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010012 " @\"a\",\n"
10013 " @\"a\"\n"
10014 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010015 " copyItems:YES];",
10016 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10017 " @\"a\",\n"
10018 " @\"a\"\n"
10019 " ]\n"
10020 " copyItems:YES];",
10021 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010022 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010023 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10024 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010025 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10026 " copyItems:YES];",
10027 Style));
10028
10029 verifyFormat("[self.a b:c c:d];", Style);
10030 EXPECT_EQ("[self.a b:c\n"
10031 " c:d];",
10032 format("[self.a b:c\n"
10033 "c:d];",
10034 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010035}
10036
Manuel Klimekffdeb592013-09-03 15:10:01 +000010037TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010038 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10039 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10040 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10041 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10042 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000010043 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000010044 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010045 verifyFormat("void f() {\n"
10046 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10047 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010048 verifyFormat("void f() {\n"
10049 " other(x.begin(), //\n"
10050 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000010051 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010052 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000010053 verifyFormat("SomeFunction([]() { // A cool function...\n"
10054 " return 43;\n"
10055 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000010056 EXPECT_EQ("SomeFunction([]() {\n"
10057 "#define A a\n"
10058 " return 43;\n"
10059 "});",
10060 format("SomeFunction([](){\n"
10061 "#define A a\n"
10062 "return 43;\n"
10063 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000010064 verifyFormat("void f() {\n"
10065 " SomeFunction([](decltype(x), A *a) {});\n"
10066 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010067 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10068 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000010069 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
10070 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
10071 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000010072 verifyFormat("Constructor()\n"
10073 " : Field([] { // comment\n"
10074 " int i;\n"
10075 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000010076 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
10077 " return some_parameter.size();\n"
10078 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000010079 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
10080 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000010081 verifyFormat("int i = aaaaaa ? 1 //\n"
10082 " : [] {\n"
10083 " return 2; //\n"
10084 " }();");
10085 verifyFormat("llvm::errs() << \"number of twos is \"\n"
10086 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
10087 " return x == 2; // force break\n"
10088 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000010089 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10090 " [=](int iiiiiiiiiiii) {\n"
10091 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
10092 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
10093 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000010094 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000010095 verifyFormat("SomeFunction({[&] {\n"
10096 " // comment\n"
10097 " },\n"
10098 " [&] {\n"
10099 " // comment\n"
10100 " }});");
10101 verifyFormat("SomeFunction({[&] {\n"
10102 " // comment\n"
10103 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000010104 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
10105 " [&]() { return true; },\n"
10106 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010107
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010108 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000010109 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000010110 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000010111 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
10112 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010113 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000010114 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010115 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
10116 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000010117 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010118 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
10119 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010120 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010121 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000010122 verifyFormat(
10123 "aaaaaaaaaaaaaaaaaaaaaa(\n"
10124 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
10125 " return aaaaaaaaaaaaaaaaa;\n"
10126 " });",
10127 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000010128 verifyFormat("[]() //\n"
10129 " -> int {\n"
10130 " return 1; //\n"
10131 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010132
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010133 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000010134 verifyFormat("SomeFunction(\n"
10135 " []() {\n"
10136 " int i = 42;\n"
10137 " return i;\n"
10138 " },\n"
10139 " []() {\n"
10140 " int j = 43;\n"
10141 " return j;\n"
10142 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010143
Daniel Jasperda18fd82014-06-10 06:39:03 +000010144 // More complex introducers.
10145 verifyFormat("return [i, args...] {};");
10146
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010147 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000010148 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000010149 verifyFormat("double &operator[](int i) { return 0; }\n"
10150 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000010151 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000010152 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000010153 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000010154
10155 // Other corner cases.
10156 verifyFormat("void f() {\n"
10157 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000010158 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000010159 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000010160
10161 // Lambdas created through weird macros.
10162 verifyFormat("void f() {\n"
10163 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000010164 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000010165 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000010166
10167 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
10168 " doo_dah();\n"
10169 " doo_dah();\n"
10170 " })) {\n"
10171 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000010172 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
10173 " doo_dah();\n"
10174 " doo_dah();\n"
10175 " })) {\n"
10176 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000010177 verifyFormat("auto lambda = []() {\n"
10178 " int a = 2\n"
10179 "#if A\n"
10180 " + 2\n"
10181 "#endif\n"
10182 " ;\n"
10183 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000010184
10185 // Lambdas with complex multiline introducers.
10186 verifyFormat(
10187 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10188 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
10189 " -> ::std::unordered_set<\n"
10190 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
10191 " //\n"
10192 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000010193}
10194
Manuel Klimek516e0542013-09-04 13:25:30 +000010195TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000010196 FormatStyle ShortBlocks = getLLVMStyle();
10197 ShortBlocks.AllowShortBlocksOnASingleLine = true;
10198 verifyFormat("int (^Block)(int, int);", ShortBlocks);
10199 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
10200 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
10201 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
10202 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
10203 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000010204
Daniel Jasper76284682014-10-22 09:12:44 +000010205 verifyFormat("foo(^{ bar(); });", ShortBlocks);
10206 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
10207 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000010208
Daniel Jasper76284682014-10-22 09:12:44 +000010209 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010210 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010211 "}];");
10212 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010213 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010214 "}]};");
10215 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010216 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010217 "}];");
10218 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010219 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010220 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000010221 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010222 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010223 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010224 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010225 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010226
10227 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010228 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010229 "}];",
10230 getLLVMStyleWithColumns(60));
10231 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010232 " NSString *path = [self sessionFilePath];\n"
10233 " if (path) {\n"
10234 " // ...\n"
10235 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010236 "});");
10237 verifyFormat("[[SessionService sharedService]\n"
10238 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010239 " if (window) {\n"
10240 " [self windowDidLoad:window];\n"
10241 " } else {\n"
10242 " [self errorLoadingWindow];\n"
10243 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010244 " }];");
10245 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010246 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010247 "};\n",
10248 getLLVMStyleWithColumns(40));
10249 verifyFormat("[[SessionService sharedService]\n"
10250 " loadWindowWithCompletionBlock: //\n"
10251 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010252 " if (window) {\n"
10253 " [self windowDidLoad:window];\n"
10254 " } else {\n"
10255 " [self errorLoadingWindow];\n"
10256 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010257 " }];",
10258 getLLVMStyleWithColumns(60));
10259 verifyFormat("[myObject doSomethingWith:arg1\n"
10260 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010261 " // ...\n"
10262 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010263 " }\n"
10264 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010265 " // ...\n"
10266 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000010267 " }\n"
10268 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010269 " // ...\n"
10270 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010271 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000010272 verifyFormat("[myObject doSomethingWith:arg1\n"
10273 " firstBlock:-1\n"
10274 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010275 " // ...\n"
10276 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000010277 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010278
10279 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010280 " @autoreleasepool {\n"
10281 " if (a) {\n"
10282 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010283 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010284 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010285 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000010286 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000010287 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
10288 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000010289
10290 FormatStyle FourIndent = getLLVMStyle();
10291 FourIndent.ObjCBlockIndentWidth = 4;
10292 verifyFormat("[operation setCompletionBlock:^{\n"
10293 " [self onOperationDone];\n"
10294 "}];",
10295 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000010296}
10297
Daniel Jasper289afc02015-04-23 09:23:17 +000010298TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
10299 FormatStyle ZeroColumn = getLLVMStyle();
10300 ZeroColumn.ColumnLimit = 0;
10301
10302 verifyFormat("[[SessionService sharedService] "
10303 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10304 " if (window) {\n"
10305 " [self windowDidLoad:window];\n"
10306 " } else {\n"
10307 " [self errorLoadingWindow];\n"
10308 " }\n"
10309 "}];",
10310 ZeroColumn);
10311 EXPECT_EQ("[[SessionService sharedService]\n"
10312 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10313 " if (window) {\n"
10314 " [self windowDidLoad:window];\n"
10315 " } else {\n"
10316 " [self errorLoadingWindow];\n"
10317 " }\n"
10318 " }];",
10319 format("[[SessionService sharedService]\n"
10320 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10321 " if (window) {\n"
10322 " [self windowDidLoad:window];\n"
10323 " } else {\n"
10324 " [self errorLoadingWindow];\n"
10325 " }\n"
10326 "}];",
10327 ZeroColumn));
10328 verifyFormat("[myObject doSomethingWith:arg1\n"
10329 " firstBlock:^(Foo *a) {\n"
10330 " // ...\n"
10331 " int i;\n"
10332 " }\n"
10333 " secondBlock:^(Bar *b) {\n"
10334 " // ...\n"
10335 " int i;\n"
10336 " }\n"
10337 " thirdBlock:^Foo(Bar *b) {\n"
10338 " // ...\n"
10339 " int i;\n"
10340 " }];",
10341 ZeroColumn);
10342 verifyFormat("f(^{\n"
10343 " @autoreleasepool {\n"
10344 " if (a) {\n"
10345 " g();\n"
10346 " }\n"
10347 " }\n"
10348 "});",
10349 ZeroColumn);
10350 verifyFormat("void (^largeBlock)(void) = ^{\n"
10351 " // ...\n"
10352 "};",
10353 ZeroColumn);
10354
10355 ZeroColumn.AllowShortBlocksOnASingleLine = true;
10356 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010357 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000010358 ZeroColumn.AllowShortBlocksOnASingleLine = false;
10359 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
10360 " int i;\n"
10361 "};",
10362 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
10363}
10364
Alexander Kornienko9e649af2013-09-11 12:25:57 +000010365TEST_F(FormatTest, SupportsCRLF) {
10366 EXPECT_EQ("int a;\r\n"
10367 "int b;\r\n"
10368 "int c;\r\n",
10369 format("int a;\r\n"
10370 " int b;\r\n"
10371 " int c;\r\n",
10372 getLLVMStyle()));
10373 EXPECT_EQ("int a;\r\n"
10374 "int b;\r\n"
10375 "int c;\r\n",
10376 format("int a;\r\n"
10377 " int b;\n"
10378 " int c;\r\n",
10379 getLLVMStyle()));
10380 EXPECT_EQ("int a;\n"
10381 "int b;\n"
10382 "int c;\n",
10383 format("int a;\r\n"
10384 " int b;\n"
10385 " int c;\n",
10386 getLLVMStyle()));
10387 EXPECT_EQ("\"aaaaaaa \"\r\n"
10388 "\"bbbbbbb\";\r\n",
10389 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
10390 EXPECT_EQ("#define A \\\r\n"
10391 " b; \\\r\n"
10392 " c; \\\r\n"
10393 " d;\r\n",
10394 format("#define A \\\r\n"
10395 " b; \\\r\n"
10396 " c; d; \r\n",
10397 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000010398
10399 EXPECT_EQ("/*\r\n"
10400 "multi line block comments\r\n"
10401 "should not introduce\r\n"
10402 "an extra carriage return\r\n"
10403 "*/\r\n",
10404 format("/*\r\n"
10405 "multi line block comments\r\n"
10406 "should not introduce\r\n"
10407 "an extra carriage return\r\n"
10408 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000010409}
10410
Manuel Klimekb212f3b2013-10-12 22:46:56 +000010411TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
10412 verifyFormat("MY_CLASS(C) {\n"
10413 " int i;\n"
10414 " int j;\n"
10415 "};");
10416}
10417
Daniel Jasper6633ab82013-10-18 10:38:14 +000010418TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
10419 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
10420 TwoIndent.ContinuationIndentWidth = 2;
10421
10422 EXPECT_EQ("int i =\n"
10423 " longFunction(\n"
10424 " arg);",
10425 format("int i = longFunction(arg);", TwoIndent));
10426
10427 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
10428 SixIndent.ContinuationIndentWidth = 6;
10429
10430 EXPECT_EQ("int i =\n"
10431 " longFunction(\n"
10432 " arg);",
10433 format("int i = longFunction(arg);", SixIndent));
10434}
10435
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010436TEST_F(FormatTest, SpacesInAngles) {
10437 FormatStyle Spaces = getLLVMStyle();
10438 Spaces.SpacesInAngles = true;
10439
10440 verifyFormat("static_cast< int >(arg);", Spaces);
10441 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
10442 verifyFormat("f< int, float >();", Spaces);
10443 verifyFormat("template <> g() {}", Spaces);
10444 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000010445 verifyFormat("std::function< void(int, int) > fct;", Spaces);
10446 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
10447 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010448
10449 Spaces.Standard = FormatStyle::LS_Cpp03;
10450 Spaces.SpacesInAngles = true;
10451 verifyFormat("A< A< int > >();", Spaces);
10452
10453 Spaces.SpacesInAngles = false;
10454 verifyFormat("A<A<int> >();", Spaces);
10455
10456 Spaces.Standard = FormatStyle::LS_Cpp11;
10457 Spaces.SpacesInAngles = true;
10458 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000010459
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010460 Spaces.SpacesInAngles = false;
10461 verifyFormat("A<A<int>>();", Spaces);
10462}
10463
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010464TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
10465 FormatStyle Style = getLLVMStyle();
10466 Style.SpaceAfterTemplateKeyword = false;
10467 verifyFormat("template<int> void foo();", Style);
10468}
10469
Jacques Pienaarfc275112015-02-18 23:48:37 +000010470TEST_F(FormatTest, TripleAngleBrackets) {
10471 verifyFormat("f<<<1, 1>>>();");
10472 verifyFormat("f<<<1, 1, 1, s>>>();");
10473 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000010474 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010475 verifyFormat("f<param><<<1, 1>>>();");
10476 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000010477 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010478 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10479 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000010480 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
10481 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000010482}
10483
10484TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000010485 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000010486 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010487 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10488 "aaallvm::outs() <<");
10489 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10490 "aaaallvm::outs()\n <<");
10491}
10492
Manuel Klimek819788d2014-03-18 11:22:45 +000010493TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
10494 std::string code = "#if A\n"
10495 "#if B\n"
10496 "a.\n"
10497 "#endif\n"
10498 " a = 1;\n"
10499 "#else\n"
10500 "#endif\n"
10501 "#if C\n"
10502 "#else\n"
10503 "#endif\n";
10504 EXPECT_EQ(code, format(code));
10505}
10506
Manuel Klimek68b03042014-04-14 09:14:11 +000010507TEST_F(FormatTest, HandleConflictMarkers) {
10508 // Git/SVN conflict markers.
10509 EXPECT_EQ("int a;\n"
10510 "void f() {\n"
10511 " callme(some(parameter1,\n"
10512 "<<<<<<< text by the vcs\n"
10513 " parameter2),\n"
10514 "||||||| text by the vcs\n"
10515 " parameter2),\n"
10516 " parameter3,\n"
10517 "======= text by the vcs\n"
10518 " parameter2, parameter3),\n"
10519 ">>>>>>> text by the vcs\n"
10520 " otherparameter);\n",
10521 format("int a;\n"
10522 "void f() {\n"
10523 " callme(some(parameter1,\n"
10524 "<<<<<<< text by the vcs\n"
10525 " parameter2),\n"
10526 "||||||| text by the vcs\n"
10527 " parameter2),\n"
10528 " parameter3,\n"
10529 "======= text by the vcs\n"
10530 " parameter2,\n"
10531 " parameter3),\n"
10532 ">>>>>>> text by the vcs\n"
10533 " otherparameter);\n"));
10534
10535 // Perforce markers.
10536 EXPECT_EQ("void f() {\n"
10537 " function(\n"
10538 ">>>> text by the vcs\n"
10539 " parameter,\n"
10540 "==== text by the vcs\n"
10541 " parameter,\n"
10542 "==== text by the vcs\n"
10543 " parameter,\n"
10544 "<<<< text by the vcs\n"
10545 " parameter);\n",
10546 format("void f() {\n"
10547 " function(\n"
10548 ">>>> text by the vcs\n"
10549 " parameter,\n"
10550 "==== text by the vcs\n"
10551 " parameter,\n"
10552 "==== text by the vcs\n"
10553 " parameter,\n"
10554 "<<<< text by the vcs\n"
10555 " parameter);\n"));
10556
10557 EXPECT_EQ("<<<<<<<\n"
10558 "|||||||\n"
10559 "=======\n"
10560 ">>>>>>>",
10561 format("<<<<<<<\n"
10562 "|||||||\n"
10563 "=======\n"
10564 ">>>>>>>"));
10565
10566 EXPECT_EQ("<<<<<<<\n"
10567 "|||||||\n"
10568 "int i;\n"
10569 "=======\n"
10570 ">>>>>>>",
10571 format("<<<<<<<\n"
10572 "|||||||\n"
10573 "int i;\n"
10574 "=======\n"
10575 ">>>>>>>"));
10576
10577 // FIXME: Handle parsing of macros around conflict markers correctly:
10578 EXPECT_EQ("#define Macro \\\n"
10579 "<<<<<<<\n"
10580 "Something \\\n"
10581 "|||||||\n"
10582 "Else \\\n"
10583 "=======\n"
10584 "Other \\\n"
10585 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000010586 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000010587 format("#define Macro \\\n"
10588 "<<<<<<<\n"
10589 " Something \\\n"
10590 "|||||||\n"
10591 " Else \\\n"
10592 "=======\n"
10593 " Other \\\n"
10594 ">>>>>>>\n"
10595 " End\n"
10596 "int i;\n"));
10597}
10598
Daniel Jasper471894432014-08-06 13:40:26 +000010599TEST_F(FormatTest, DisableRegions) {
10600 EXPECT_EQ("int i;\n"
10601 "// clang-format off\n"
10602 " int j;\n"
10603 "// clang-format on\n"
10604 "int k;",
10605 format(" int i;\n"
10606 " // clang-format off\n"
10607 " int j;\n"
10608 " // clang-format on\n"
10609 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000010610 EXPECT_EQ("int i;\n"
10611 "/* clang-format off */\n"
10612 " int j;\n"
10613 "/* clang-format on */\n"
10614 "int k;",
10615 format(" int i;\n"
10616 " /* clang-format off */\n"
10617 " int j;\n"
10618 " /* clang-format on */\n"
10619 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000010620
10621 // Don't reflow comments within disabled regions.
10622 EXPECT_EQ(
10623 "// clang-format off\n"
10624 "// long long long long long long line\n"
10625 "/* clang-format on */\n"
10626 "/* long long long\n"
10627 " * long long long\n"
10628 " * line */\n"
10629 "int i;\n"
10630 "/* clang-format off */\n"
10631 "/* long long long long long long line */\n",
10632 format("// clang-format off\n"
10633 "// long long long long long long line\n"
10634 "/* clang-format on */\n"
10635 "/* long long long long long long line */\n"
10636 "int i;\n"
10637 "/* clang-format off */\n"
10638 "/* long long long long long long line */\n",
10639 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000010640}
10641
Manuel Klimekf0c95b32015-06-11 10:14:13 +000010642TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
10643 format("? ) =");
10644 verifyNoCrash("#define a\\\n /**/}");
10645}
Manuel Klimek5f594f82014-08-13 14:00:41 +000010646
Daniel Jasper498f5582015-12-25 08:53:31 +000010647TEST_F(FormatTest, FormatsTableGenCode) {
10648 FormatStyle Style = getLLVMStyle();
10649 Style.Language = FormatStyle::LK_TableGen;
10650 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
10651}
10652
Nico Weberb2673a12016-11-10 21:49:25 +000010653TEST_F(FormatTest, ArrayOfTemplates) {
10654 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
10655 format("auto a = new unique_ptr<int > [ 10];"));
10656
10657 FormatStyle Spaces = getLLVMStyle();
10658 Spaces.SpacesInSquareBrackets = true;
10659 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
10660 format("auto a = new unique_ptr<int > [10];", Spaces));
10661}
10662
10663TEST_F(FormatTest, ArrayAsTemplateType) {
10664 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
10665 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
10666
10667 FormatStyle Spaces = getLLVMStyle();
10668 Spaces.SpacesInSquareBrackets = true;
10669 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
10670 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
10671}
10672
Martin Probstc9c51c42017-03-16 10:21:35 +000010673TEST_F(FormatTest, NoSpaceAfterSuper) {
10674 verifyFormat("__super::FooBar();");
10675}
10676
Eric Liu547d8792016-03-24 13:22:42 +000010677TEST(FormatStyle, GetStyleOfFile) {
10678 vfs::InMemoryFileSystem FS;
10679 // Test 1: format file in the same directory.
10680 ASSERT_TRUE(
10681 FS.addFile("/a/.clang-format", 0,
10682 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
10683 ASSERT_TRUE(
10684 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010685 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000010686 ASSERT_TRUE((bool)Style1);
10687 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000010688
Antonio Maiorano7eb75072017-01-20 01:22:42 +000010689 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000010690 ASSERT_TRUE(
10691 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010692 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000010693 ASSERT_TRUE((bool)Style2);
10694 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000010695
Antonio Maiorano7eb75072017-01-20 01:22:42 +000010696 // Test 2.2: no format on 'none' fallback style.
10697 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
10698 ASSERT_TRUE((bool)Style2);
10699 ASSERT_EQ(*Style2, getNoStyle());
10700
10701 // Test 2.3: format if config is found with no based style while fallback is
10702 // 'none'.
10703 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
10704 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
10705 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
10706 ASSERT_TRUE((bool)Style2);
10707 ASSERT_EQ(*Style2, getLLVMStyle());
10708
10709 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
10710 Style2 = getStyle("{}", "a.h", "none", "", &FS);
10711 ASSERT_TRUE((bool)Style2);
10712 ASSERT_EQ(*Style2, getLLVMStyle());
10713
Eric Liu547d8792016-03-24 13:22:42 +000010714 // Test 3: format file in parent directory.
10715 ASSERT_TRUE(
10716 FS.addFile("/c/.clang-format", 0,
10717 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
10718 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
10719 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010720 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000010721 ASSERT_TRUE((bool)Style3);
10722 ASSERT_EQ(*Style3, getGoogleStyle());
10723
10724 // Test 4: error on invalid fallback style
10725 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
10726 ASSERT_FALSE((bool)Style4);
10727 llvm::consumeError(Style4.takeError());
10728
10729 // Test 5: error on invalid yaml on command line
10730 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
10731 ASSERT_FALSE((bool)Style5);
10732 llvm::consumeError(Style5.takeError());
10733
10734 // Test 6: error on invalid style
10735 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
10736 ASSERT_FALSE((bool)Style6);
10737 llvm::consumeError(Style6.takeError());
10738
10739 // Test 7: found config file, error on parsing it
10740 ASSERT_TRUE(
10741 FS.addFile("/d/.clang-format", 0,
10742 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
10743 "InvalidKey: InvalidValue")));
10744 ASSERT_TRUE(
10745 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
10746 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
10747 ASSERT_FALSE((bool)Style7);
10748 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000010749}
10750
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010751TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
10752 // Column limit is 20.
10753 std::string Code = "Type *a =\n"
10754 " new Type();\n"
10755 "g(iiiii, 0, jjjjj,\n"
10756 " 0, kkkkk, 0, mm);\n"
10757 "int bad = format ;";
10758 std::string Expected = "auto a = new Type();\n"
10759 "g(iiiii, nullptr,\n"
10760 " jjjjj, nullptr,\n"
10761 " kkkkk, nullptr,\n"
10762 " mm);\n"
10763 "int bad = format ;";
10764 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000010765 tooling::Replacements Replaces = toReplacements(
10766 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
10767 "auto "),
10768 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
10769 "nullptr"),
10770 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
10771 "nullptr"),
10772 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
10773 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010774
10775 format::FormatStyle Style = format::getLLVMStyle();
10776 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000010777 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
10778 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
10779 << llvm::toString(FormattedReplaces.takeError()) << "\n";
10780 auto Result = applyAllReplacements(Code, *FormattedReplaces);
10781 EXPECT_TRUE(static_cast<bool>(Result));
10782 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010783}
10784
Eric Liubaf58c22016-05-18 13:43:48 +000010785TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
10786 std::string Code = "#include \"a.h\"\n"
10787 "#include \"c.h\"\n"
10788 "\n"
10789 "int main() {\n"
10790 " return 0;\n"
10791 "}";
10792 std::string Expected = "#include \"a.h\"\n"
10793 "#include \"b.h\"\n"
10794 "#include \"c.h\"\n"
10795 "\n"
10796 "int main() {\n"
10797 " return 0;\n"
10798 "}";
10799 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000010800 tooling::Replacements Replaces = toReplacements(
10801 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
10802 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000010803
10804 format::FormatStyle Style = format::getLLVMStyle();
10805 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000010806 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
10807 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
10808 << llvm::toString(FormattedReplaces.takeError()) << "\n";
10809 auto Result = applyAllReplacements(Code, *FormattedReplaces);
10810 EXPECT_TRUE(static_cast<bool>(Result));
10811 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000010812}
10813
Nico Weberdc065182017-04-05 18:10:42 +000010814TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
10815 format::FormatStyle Style = format::getLLVMStyle();
10816 Style.Standard = FormatStyle::LS_Cpp03;
10817 // cpp03 recognize this string as identifier u8 and literal character 'a'
10818 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
10819}
10820
10821TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
10822 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
10823 // all modes, including C++11, C++14 and C++17
10824 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
10825}
10826
Daniel Jasperd246a5a2015-06-15 15:25:11 +000010827} // end namespace
10828} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000010829} // end namespace clang