blob: e070396ac05d4a8c84991fd70550312439a29025 [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};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00001707
1708 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
1709 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
1710 " [2] = bbbbbbbbbb,\n"
1711 " [3] = cccccccccc,\n"
1712 " [4] = dddddddddd,\n"
1713 " [5] = eeeeeeeeee};");
1714 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
1715 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1716 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
1717 " [3] = cccccccccccccccccccccccccccccccccccccc,\n"
1718 " [4] = dddddddddddddddddddddddddddddddddddddd,\n"
1719 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001720}
1721
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001722TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001723 verifyFormat("static A x = {{{}}};\n");
1724 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
1725 " {init1, init2, init3, init4}}};",
1726 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00001727
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001728 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001729 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1730 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1731 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
1732 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00001733 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001734 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1735 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1736 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00001737 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
1738 " {rect.fRight - rect.fLeft, rect.fBottom - "
1739 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001740
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001741 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001742 "SomeArrayOfSomeType a = {\n"
1743 " {{1, 2, 3},\n"
1744 " {1, 2, 3},\n"
1745 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
1746 " 333333333333333333333333333333},\n"
1747 " {1, 2, 3},\n"
1748 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00001749 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00001750 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00001751 " {{1, 2, 3}},\n"
1752 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001753 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
1754 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00001755 " {{1, 2, 3}},\n"
1756 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001757
Daniel Jaspera44991332015-04-29 13:06:49 +00001758 verifyFormat("struct {\n"
1759 " unsigned bit;\n"
1760 " const char *const name;\n"
1761 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
1762 " {kOsWin, \"Windows\"},\n"
1763 " {kOsLinux, \"Linux\"},\n"
1764 " {kOsCrOS, \"Chrome OS\"}};");
1765 verifyFormat("struct {\n"
1766 " unsigned bit;\n"
1767 " const char *const name;\n"
1768 "} kBitsToOs[] = {\n"
1769 " {kOsMac, \"Mac\"},\n"
1770 " {kOsWin, \"Windows\"},\n"
1771 " {kOsLinux, \"Linux\"},\n"
1772 " {kOsCrOS, \"Chrome OS\"},\n"
1773 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001774}
1775
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001776TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
1777 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
1778 " \\\n"
1779 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
1780}
1781
Daniel Jasperda16db32013-01-07 10:48:50 +00001782TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00001783 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
1784 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00001785
1786 // Do break defaulted and deleted functions.
1787 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1788 " default;",
1789 getLLVMStyleWithColumns(40));
1790 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1791 " delete;",
1792 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00001793}
1794
1795TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
1796 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
1797 getLLVMStyleWithColumns(40));
1798 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1799 getLLVMStyleWithColumns(40));
1800 EXPECT_EQ("#define Q \\\n"
1801 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
1802 " \"aaaaaaaa.cpp\"",
1803 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1804 getLLVMStyleWithColumns(40)));
1805}
1806
1807TEST_F(FormatTest, UnderstandsLinePPDirective) {
1808 EXPECT_EQ("# 123 \"A string literal\"",
1809 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00001810}
1811
Manuel Klimek591b5802013-01-31 15:58:48 +00001812TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00001813 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00001814 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001815}
1816
1817TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
1818 EXPECT_EQ("#line 42 \"test\"\n",
1819 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001820 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
1821 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001822}
1823
1824TEST_F(FormatTest, EndOfFileEndsPPDirective) {
1825 EXPECT_EQ("#line 42 \"test\"",
1826 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001827 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001828}
1829
Daniel Jasper877615c2013-10-11 19:45:02 +00001830TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
1831 verifyFormat("#define A \\x20");
1832 verifyFormat("#define A \\ x20");
1833 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
1834 verifyFormat("#define A ''");
1835 verifyFormat("#define A ''qqq");
1836 verifyFormat("#define A `qqq");
1837 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00001838 EXPECT_EQ("const char *c = STRINGIFY(\n"
1839 "\\na : b);",
1840 format("const char * c = STRINGIFY(\n"
1841 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00001842
1843 verifyFormat("a\r\\");
1844 verifyFormat("a\v\\");
1845 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00001846}
1847
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001848TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001849 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
1850 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001851 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001852 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00001853 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00001854
1855 verifyFormat("#define A A\n#define A A");
1856 verifyFormat("#define A(X) A\n#define A A");
1857
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001858 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
1859 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001860}
1861
1862TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001863 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001864 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001865 "#define A( \\\n"
1866 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001867 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001868 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001869 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001870 " #include \"a.h\"\n"
1871 "#define A(A,\\\n"
1872 " B)\n"
1873 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001874 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001875 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001876}
1877
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001878TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00001879
1880TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
1881 EXPECT_EQ("#define A \\\n"
1882 " c; \\\n"
1883 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001884 "f;",
1885 format("#define A c; e;\n"
1886 "f;",
1887 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00001888}
1889
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001890TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00001891
Manuel Klimek1abf7892013-01-04 23:34:14 +00001892TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00001893 EXPECT_EQ("int x,\n"
1894 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001895 " y;",
1896 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00001897}
1898
Manuel Klimek09e07972013-01-05 21:34:55 +00001899TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00001900 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00001901 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00001902 verifyFormat("#define A \\\n"
1903 " { \\\n"
1904 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001905 " }",
1906 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00001907
1908 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001909 " void function##X()",
1910 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00001911
1912 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001913 " void a##b##c()",
1914 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00001915
Daniel Jasper39825ea2013-01-14 15:40:57 +00001916 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00001917}
1918
Manuel Klimekd053c5b2013-01-23 14:37:36 +00001919TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00001920 EXPECT_EQ("#define A (x)", format("#define A (x)"));
1921 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00001922}
1923
Manuel Klimek0c137952013-02-11 12:33:24 +00001924TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
1925 EXPECT_EQ("#define A b;", format("#define A \\\n"
1926 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001927 " b;",
1928 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001929 EXPECT_EQ("#define A \\\n"
1930 " \\\n"
1931 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001932 " b;",
1933 format("#define A \\\n"
1934 " \\\n"
1935 " a; \\\n"
1936 " b;",
1937 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001938 EXPECT_EQ("#define A \\\n"
1939 " a; \\\n"
1940 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001941 " b;",
1942 format("#define A \\\n"
1943 " a; \\\n"
1944 " \\\n"
1945 " b;",
1946 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001947}
1948
Daniel Jasper00475962013-02-19 17:14:38 +00001949TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001950 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00001951 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00001952 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00001953 " case 2\n",
1954 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00001955 verifyFormat("#define MACRO(a) \\\n"
1956 " if (a) \\\n"
1957 " f(); \\\n"
1958 " else \\\n"
1959 " g()",
1960 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00001961 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001962 verifyIncompleteFormat("#define STR(x) #x\n"
1963 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00001964 verifyFormat("#pragma omp threadprivate( \\\n"
1965 " y)), // expected-warning",
1966 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00001967 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00001968 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001969 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00001970 "#define b \\\n"
1971 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001972 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00001973 "a",
1974 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00001975 verifyFormat("#define A \\\n"
1976 " { \\\n"
1977 " {\n"
1978 "#define B \\\n"
1979 " } \\\n"
1980 " }",
1981 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00001982 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00001983 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00001984 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00001985 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00001986}
1987
Daniel Jasper40e19212013-05-29 13:16:10 +00001988TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
1989 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
1990 EXPECT_EQ("class A : public QObject {\n"
1991 " Q_OBJECT\n"
1992 "\n"
1993 " A() {}\n"
1994 "};",
1995 format("class A : public QObject {\n"
1996 " Q_OBJECT\n"
1997 "\n"
1998 " A() {\n}\n"
1999 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00002000 EXPECT_EQ("MACRO\n"
2001 "/*static*/ int i;",
2002 format("MACRO\n"
2003 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00002004 EXPECT_EQ("SOME_MACRO\n"
2005 "namespace {\n"
2006 "void f();\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002007 "} // namespace",
Daniel Jasper41a0f782013-05-29 14:09:17 +00002008 format("SOME_MACRO\n"
2009 " namespace {\n"
2010 "void f( );\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002011 "} // namespace"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002012 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00002013 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2014 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002015 // Only if everything is upper case.
2016 EXPECT_EQ("class A : public QObject {\n"
2017 " Q_Object A() {}\n"
2018 "};",
2019 format("class A : public QObject {\n"
2020 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00002021 " A() {\n}\n"
2022 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00002023
2024 // Only if the next line can actually start an unwrapped line.
2025 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2026 format("SOME_WEIRD_LOG_MACRO\n"
2027 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00002028
2029 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00002030 "(n, buffers))\n",
2031 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00002032}
2033
Alexander Kornienkode644272013-04-08 22:16:06 +00002034TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2035 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2036 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2037 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002038 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00002039 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2040 "int *createScopDetectionPass() { return 0; }",
2041 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2042 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2043 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2044 " class X {};\n"
2045 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2046 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002047 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2048 // braces, so that inner block is indented one level more.
2049 EXPECT_EQ("int q() {\n"
2050 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2051 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2052 " IPC_END_MESSAGE_MAP()\n"
2053 "}",
2054 format("int q() {\n"
2055 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2056 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2057 " IPC_END_MESSAGE_MAP()\n"
2058 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00002059
Daniel Jasper352dae12014-01-03 11:50:46 +00002060 // Same inside macros.
2061 EXPECT_EQ("#define LIST(L) \\\n"
2062 " L(A) \\\n"
2063 " L(B) \\\n"
2064 " L(C)",
2065 format("#define LIST(L) \\\n"
2066 " L(A) \\\n"
2067 " L(B) \\\n"
2068 " L(C)",
2069 getGoogleStyle()));
2070
Daniel Jasper545c6522013-09-17 09:26:07 +00002071 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002072 EXPECT_EQ("int q() {\n"
2073 " f(x);\n"
2074 " f(x) {}\n"
2075 " f(x)->g();\n"
2076 " f(x)->*g();\n"
2077 " f(x).g();\n"
2078 " f(x) = x;\n"
2079 " f(x) += x;\n"
2080 " f(x) -= x;\n"
2081 " f(x) *= x;\n"
2082 " f(x) /= x;\n"
2083 " f(x) %= x;\n"
2084 " f(x) &= x;\n"
2085 " f(x) |= x;\n"
2086 " f(x) ^= x;\n"
2087 " f(x) >>= x;\n"
2088 " f(x) <<= x;\n"
2089 " f(x)[y].z();\n"
2090 " LOG(INFO) << x;\n"
2091 " ifstream(x) >> x;\n"
2092 "}\n",
2093 format("int q() {\n"
2094 " f(x)\n;\n"
2095 " f(x)\n {}\n"
2096 " f(x)\n->g();\n"
2097 " f(x)\n->*g();\n"
2098 " f(x)\n.g();\n"
2099 " f(x)\n = x;\n"
2100 " f(x)\n += x;\n"
2101 " f(x)\n -= x;\n"
2102 " f(x)\n *= x;\n"
2103 " f(x)\n /= x;\n"
2104 " f(x)\n %= x;\n"
2105 " f(x)\n &= x;\n"
2106 " f(x)\n |= x;\n"
2107 " f(x)\n ^= x;\n"
2108 " f(x)\n >>= x;\n"
2109 " f(x)\n <<= x;\n"
2110 " f(x)\n[y].z();\n"
2111 " LOG(INFO)\n << x;\n"
2112 " ifstream(x)\n >> x;\n"
2113 "}\n"));
2114 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002115 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002116 " if (1) {\n"
2117 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002118 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002119 " while (1) {\n"
2120 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002121 " F(x)\n"
2122 " G(x);\n"
2123 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002124 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002125 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002126 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002127 " }\n"
2128 "}\n",
2129 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002130 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002131 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002132 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002133 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002134 "F(x)\n"
2135 "G(x);\n"
2136 "F(x)\n"
2137 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002138 "}\n"));
2139 EXPECT_EQ("class A {\n"
2140 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002141 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002142 " A(X x)\n" // FIXME: function-level try blocks are broken.
2143 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002144 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002145 " }\n"
2146 "};",
2147 format("class A {\n"
2148 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002149 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002150 " A(X x)\n"
2151 " try : t(0) {} catch (...) {}\n"
2152 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00002153 EXPECT_EQ("class SomeClass {\n"
2154 "public:\n"
2155 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2156 "};",
2157 format("class SomeClass {\n"
2158 "public:\n"
2159 " SomeClass()\n"
2160 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2161 "};"));
2162 EXPECT_EQ("class SomeClass {\n"
2163 "public:\n"
2164 " SomeClass()\n"
2165 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2166 "};",
2167 format("class SomeClass {\n"
2168 "public:\n"
2169 " SomeClass()\n"
2170 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2171 "};",
2172 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00002173
2174 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00002175}
2176
Manuel Klimek4fe43002013-05-22 12:51:29 +00002177TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2178 verifyFormat("#define A \\\n"
2179 " f({ \\\n"
2180 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00002181 " });",
2182 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00002183}
2184
Manuel Klimekef2cfb12013-01-05 22:14:16 +00002185TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
2186 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
2187}
2188
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002189TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002190 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002191}
2192
Manuel Klimek1058d982013-01-06 20:07:31 +00002193TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
2194 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
2195 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2196 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
2197 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2198}
Manuel Klimek1abf7892013-01-04 23:34:14 +00002199
Daniel Jaspere2408e32015-05-06 11:16:43 +00002200TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00002201 EXPECT_EQ(
2202 "#define A \\\n int i; \\\n int j;",
2203 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002204 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00002205 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00002206 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002207 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00002208}
2209
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002210TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2211 verifyFormat("#define A \\\n"
2212 " int v( \\\n"
2213 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002214 " int i;",
2215 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002216}
2217
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002218TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00002219 EXPECT_EQ(
2220 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2221 " \\\n"
2222 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2223 "\n"
2224 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2225 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2226 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
2227 "\\\n"
2228 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2229 " \n"
2230 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2231 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002232}
2233
Manuel Klimek52b15152013-01-09 15:25:02 +00002234TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2235 EXPECT_EQ("int\n"
2236 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002237 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002238 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002239 verifyFormat("functionCallTo(\n"
2240 " someOtherFunction(\n"
2241 " withSomeParameters, whichInSequence,\n"
2242 " areLongerThanALine(andAnotherCall,\n"
2243 "#define A B\n"
2244 " withMoreParamters,\n"
2245 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00002246 " andMoreParameters),\n"
2247 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002248 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00002249 verifyFormat("Foo::Foo()\n"
2250 "#ifdef BAR\n"
2251 " : baz(0)\n"
2252 "#endif\n"
2253 "{\n"
2254 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00002255 verifyFormat("void f() {\n"
2256 " if (true)\n"
2257 "#ifdef A\n"
2258 " f(42);\n"
2259 " x();\n"
2260 "#else\n"
2261 " g();\n"
2262 " x();\n"
2263 "#endif\n"
2264 "}");
2265 verifyFormat("void f(param1, param2,\n"
2266 " param3,\n"
2267 "#ifdef A\n"
2268 " param4(param5,\n"
2269 "#ifdef A1\n"
2270 " param6,\n"
2271 "#ifdef A2\n"
2272 " param7),\n"
2273 "#else\n"
2274 " param8),\n"
2275 " param9,\n"
2276 "#endif\n"
2277 " param10,\n"
2278 "#endif\n"
2279 " param11)\n"
2280 "#else\n"
2281 " param12)\n"
2282 "#endif\n"
2283 "{\n"
2284 " x();\n"
2285 "}",
2286 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00002287 verifyFormat("#if 1\n"
2288 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00002289 verifyFormat("#if 1\n"
2290 "#endif\n"
2291 "#if 1\n"
2292 "#else\n"
2293 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00002294 verifyFormat("DEBUG({\n"
2295 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2296 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2297 "});\n"
2298 "#if a\n"
2299 "#else\n"
2300 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00002301
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002302 verifyIncompleteFormat("void f(\n"
2303 "#if A\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00002304 ");\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002305 "#else\n"
2306 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00002307}
2308
Manuel Klimek14bd9172014-01-29 08:49:02 +00002309TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2310 verifyFormat("#endif\n"
2311 "#if B");
2312}
2313
Manuel Klimek88033d72013-10-21 08:11:15 +00002314TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2315 FormatStyle SingleLine = getLLVMStyle();
2316 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00002317 verifyFormat("#if 0\n"
2318 "#elif 1\n"
2319 "#endif\n"
2320 "void foo() {\n"
2321 " if (test) foo2();\n"
2322 "}",
2323 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00002324}
2325
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002326TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00002327 verifyFormat("functionCall({ int i; });");
2328 verifyFormat("functionCall({\n"
2329 " int i;\n"
2330 " int j;\n"
2331 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00002332 verifyFormat("functionCall(\n"
2333 " {\n"
2334 " int i;\n"
2335 " int j;\n"
2336 " },\n"
2337 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00002338 verifyFormat("functionA(functionB({\n"
2339 " int i;\n"
2340 " int j;\n"
2341 " }),\n"
2342 " aaaa, bbbb, cccc);");
2343 verifyFormat("functionCall(\n"
2344 " {\n"
2345 " int i;\n"
2346 " int j;\n"
2347 " },\n"
2348 " aaaa, bbbb, // comment\n"
2349 " cccc);");
2350 verifyFormat("functionA(functionB({\n"
2351 " int i;\n"
2352 " int j;\n"
2353 " }),\n"
2354 " aaaa, bbbb, // comment\n"
2355 " cccc);");
2356 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2357 verifyFormat("functionCall(aaaa, bbbb, {\n"
2358 " int i;\n"
2359 " int j;\n"
2360 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00002361 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00002362 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00002363 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002364 " int i; // break\n"
2365 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00002366 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2367 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002368 verifyFormat("DEBUG({\n"
2369 " if (a)\n"
2370 " f();\n"
2371 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002372}
2373
2374TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002375 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002376 "int i;",
2377 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002378}
2379
2380TEST_F(FormatTest, LayoutNestedBlocks) {
2381 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2382 " struct s {\n"
2383 " int i;\n"
2384 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002385 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002386 " for (int i = 0; i < 10; ++i)\n"
2387 " return;\n"
2388 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002389 verifyFormat("call(parameter, {\n"
2390 " something();\n"
2391 " // Comment using all columns.\n"
2392 " somethingelse();\n"
2393 "});",
2394 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00002395 verifyFormat("DEBUG( //\n"
2396 " { f(); }, a);");
2397 verifyFormat("DEBUG( //\n"
2398 " {\n"
2399 " f(); //\n"
2400 " },\n"
2401 " a);");
2402
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002403 EXPECT_EQ("call(parameter, {\n"
2404 " something();\n"
2405 " // Comment too\n"
2406 " // looooooooooong.\n"
2407 " somethingElse();\n"
2408 "});",
2409 format("call(parameter, {\n"
2410 " something();\n"
2411 " // Comment too looooooooooong.\n"
2412 " somethingElse();\n"
2413 "});",
2414 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002415 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00002416 EXPECT_EQ("DEBUG({ // comment\n"
2417 " int i;\n"
2418 "});",
2419 format("DEBUG({ // comment\n"
2420 "int i;\n"
2421 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002422 EXPECT_EQ("DEBUG({\n"
2423 " int i;\n"
2424 "\n"
2425 " // comment\n"
2426 " int j;\n"
2427 "});",
2428 format("DEBUG({\n"
2429 " int i;\n"
2430 "\n"
2431 " // comment\n"
2432 " int j;\n"
2433 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00002434
2435 verifyFormat("DEBUG({\n"
2436 " if (a)\n"
2437 " return;\n"
2438 "});");
2439 verifyGoogleFormat("DEBUG({\n"
2440 " if (a) return;\n"
2441 "});");
2442 FormatStyle Style = getGoogleStyle();
2443 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00002444 verifyFormat("Debug(aaaaa,\n"
2445 " {\n"
2446 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
2447 " },\n"
2448 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00002449 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002450
Daniel Jaspera87af7a2015-06-30 11:32:22 +00002451 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
2452
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002453 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00002454}
2455
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002456TEST_F(FormatTest, FormatNestedBlocksInMacros) {
2457 EXPECT_EQ("#define MACRO() \\\n"
2458 " Debug(aaa, /* force line break */ \\\n"
2459 " { \\\n"
2460 " int i; \\\n"
2461 " int j; \\\n"
2462 " })",
2463 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
2464 " { int i; int j; })",
2465 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00002466
2467 EXPECT_EQ("#define A \\\n"
2468 " [] { \\\n"
2469 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2470 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
2471 " }",
2472 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2473 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
2474 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002475}
2476
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002477TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
2478 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002479 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002480 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002481}
2482
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00002483TEST_F(FormatTest, FormatBeginBlockEndMacros) {
2484 FormatStyle Style = getLLVMStyle();
2485 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
2486 Style.MacroBlockEnd = "^[A-Z_]+_END$";
2487 verifyFormat("FOO_BEGIN\n"
2488 " FOO_ENTRY\n"
2489 "FOO_END", Style);
2490 verifyFormat("FOO_BEGIN\n"
2491 " NESTED_FOO_BEGIN\n"
2492 " NESTED_FOO_ENTRY\n"
2493 " NESTED_FOO_END\n"
2494 "FOO_END", Style);
2495 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
2496 " int x;\n"
2497 " x = 1;\n"
2498 "FOO_END(Baz)", Style);
2499}
2500
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002501//===----------------------------------------------------------------------===//
2502// Line break tests.
2503//===----------------------------------------------------------------------===//
2504
Daniel Jasperf79b0b12013-08-30 08:29:25 +00002505TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002506 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00002507 "void f() {\n"
2508 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
2509 " parameter, parameter, parameter)),\n"
2510 " SecondLongCall(parameter));\n"
2511 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002512 verifyFormat(
2513 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2514 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2515 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2516 " aaaaaaaaaaaaaaaaaaaaaaaa);");
2517 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00002518 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2519 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
2520 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
2521 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002522 verifyFormat(
2523 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
2524 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
2525 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
2526 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00002527 verifyFormat("int a = bbbb && ccc &&\n"
2528 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00002529 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00002530 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002531}
2532
Daniel Jasperd69fc772013-05-08 14:12:04 +00002533TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
2534 verifyFormat(
2535 "bool aaaaaaa =\n"
2536 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
2537 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002538 verifyFormat(
2539 "bool aaaaaaa =\n"
2540 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
2541 " bbbbbbbb();");
2542
Daniel Jasperd69fc772013-05-08 14:12:04 +00002543 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2544 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
2545 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002546 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2547 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
2548 " ccccccccc == ddddddddddd;");
2549 verifyFormat(
2550 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
2551 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
2552 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00002553
2554 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2555 " aaaaaa) &&\n"
2556 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00002557 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2558 " aaaaaa) >>\n"
2559 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00002560 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00002561 " SourceMgr.getSpellingColumnNumber(\n"
2562 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
2563 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00002564
Daniel Jasper68d888c2013-06-03 08:42:05 +00002565 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2566 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
2567 " cccccc) {\n}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00002568 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2569 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
2570 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00002571 verifyFormat("b = a &&\n"
2572 " // Comment\n"
2573 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00002574
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002575 // If the LHS of a comparison is not a binary expression itself, the
2576 // additional linebreak confuses many people.
2577 verifyFormat(
2578 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2579 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
2580 "}");
2581 verifyFormat(
2582 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2583 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2584 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00002585 verifyFormat(
2586 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
2587 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2588 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002589 // Even explicit parentheses stress the precedence enough to make the
2590 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00002591 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2592 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2593 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002594 // This cases is borderline, but with the indentation it is still readable.
2595 verifyFormat(
2596 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2597 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2598 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
2599 "}",
2600 getLLVMStyleWithColumns(75));
2601
2602 // If the LHS is a binary expression, we should still use the additional break
2603 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00002604 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2605 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2606 " 5) {\n"
2607 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002608
Daniel Jasper571f1af2013-05-14 20:39:56 +00002609 FormatStyle OnePerLine = getLLVMStyle();
2610 OnePerLine.BinPackParameters = false;
2611 verifyFormat(
2612 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2613 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2614 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
2615 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00002616
2617 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
2618 " .aaa(aaaaaaaaaaaaa) *\n"
2619 " aaaaaaa +\n"
2620 " aaaaaaa;",
2621 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00002622}
2623
Daniel Jasper6bee6822013-04-08 20:33:42 +00002624TEST_F(FormatTest, ExpressionIndentation) {
2625 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2626 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2627 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2628 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2629 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
2630 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
2631 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2632 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
2633 " ccccccccccccccccccccccccccccccccccccccccc;");
2634 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2635 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2636 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2637 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2638 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2639 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2640 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2641 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2642 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2643 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2644 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2645 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002646 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002647 "} else if (aaaaa && bbbbb > // break\n"
2648 " ccccc) {\n"
2649 "}");
2650 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00002651 "} else if (aaaaa &&\n"
2652 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002653 " ccccc &&\n"
2654 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002655 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00002656
2657 // Presence of a trailing comment used to change indentation of b.
2658 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
2659 " b;\n"
2660 "return aaaaaaaaaaaaaaaaaaa +\n"
2661 " b; //",
2662 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00002663}
2664
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002665TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
2666 // Not sure what the best system is here. Like this, the LHS can be found
2667 // immediately above an operator (everything with the same or a higher
2668 // indent). The RHS is aligned right of the operator and so compasses
2669 // everything until something with the same indent as the operator is found.
2670 // FIXME: Is this a good system?
2671 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00002672 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002673 verifyFormat(
2674 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002675 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2676 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2677 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2678 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2679 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002680 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002681 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2682 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002683 Style);
2684 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002685 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2686 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002687 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2688 Style);
2689 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002690 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2691 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002692 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2693 Style);
2694 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2695 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002696 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2697 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002698 Style);
2699 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00002700 "} else if (aaaaa\n"
2701 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002702 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002703 "}",
2704 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00002705 verifyFormat("return (a)\n"
2706 " // comment\n"
2707 " + b;",
2708 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00002709 verifyFormat(
2710 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2711 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2712 " + cc;",
2713 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00002714
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00002715 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2716 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
2717 Style);
2718
Daniel Jasper9e5ede02013-11-08 19:56:28 +00002719 // Forced by comments.
2720 verifyFormat(
2721 "unsigned ContentSize =\n"
2722 " sizeof(int16_t) // DWARF ARange version number\n"
2723 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
2724 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
2725 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00002726
2727 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
2728 " == boost::fusion::at_c<1>(iiii).second;",
2729 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00002730
2731 Style.ColumnLimit = 60;
2732 verifyFormat("zzzzzzzzzz\n"
2733 " = bbbbbbbbbbbbbbbbb\n"
2734 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
2735 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002736}
2737
Daniel Jasperb1270392017-02-01 23:27:37 +00002738TEST_F(FormatTest, EnforcedOperatorWraps) {
2739 // Here we'd like to wrap after the || operators, but a comment is forcing an
2740 // earlier wrap.
2741 verifyFormat("bool x = aaaaa //\n"
2742 " || bbbbb\n"
2743 " //\n"
2744 " || cccc;");
2745}
2746
Daniel Jasper3219e432014-12-02 13:24:51 +00002747TEST_F(FormatTest, NoOperandAlignment) {
2748 FormatStyle Style = getLLVMStyle();
2749 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00002750 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
2751 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2752 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
2753 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002754 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00002755 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2756 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2757 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2758 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2759 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2760 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2761 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2762 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2763 " > ccccccccccccccccccccccccccccccccccccccccc;",
2764 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002765
2766 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2767 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2768 " + cc;",
2769 Style);
2770 verifyFormat("int a = aa\n"
2771 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002772 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00002773 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00002774
Daniel Jasper6501f7e2015-10-27 12:38:37 +00002775 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00002776 verifyFormat("return (a > b\n"
2777 " // comment1\n"
2778 " // comment2\n"
2779 " || c);",
2780 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002781}
2782
Daniel Jasperac043c92014-09-15 11:11:00 +00002783TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
2784 FormatStyle Style = getLLVMStyle();
2785 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
2786 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
2787 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00002788 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
2789 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00002790}
2791
Daniel Jasper988e7e42017-05-08 15:07:52 +00002792TEST_F(FormatTest, AllowBinPackingInsideArguments) {
2793 FormatStyle Style = getLLVMStyle();
2794 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
2795 Style.BinPackArguments = false;
2796 Style.ColumnLimit = 40;
2797 verifyFormat("void test() {\n"
2798 " someFunction(\n"
2799 " this + argument + is + quite\n"
2800 " + long + so + it + gets + wrapped\n"
2801 " + but + remains + bin - packed);\n"
2802 "}",
2803 Style);
2804 verifyFormat("void test() {\n"
2805 " someFunction(arg1,\n"
2806 " this + argument + is\n"
2807 " + quite + long + so\n"
2808 " + it + gets + wrapped\n"
2809 " + but + remains + bin\n"
2810 " - packed,\n"
2811 " arg3);\n"
2812 "}",
2813 Style);
2814 verifyFormat("void test() {\n"
2815 " someFunction(\n"
2816 " arg1,\n"
2817 " this + argument + has\n"
2818 " + anotherFunc(nested,\n"
2819 " calls + whose\n"
2820 " + arguments\n"
2821 " + are + also\n"
2822 " + wrapped,\n"
2823 " in + addition)\n"
2824 " + to + being + bin - packed,\n"
2825 " arg3);\n"
2826 "}",
2827 Style);
2828
2829 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
2830 verifyFormat("void test() {\n"
2831 " someFunction(\n"
2832 " arg1,\n"
2833 " this + argument + has +\n"
2834 " anotherFunc(nested,\n"
2835 " calls + whose +\n"
2836 " arguments +\n"
2837 " are + also +\n"
2838 " wrapped,\n"
2839 " in + addition) +\n"
2840 " to + being + bin - packed,\n"
2841 " arg3);\n"
2842 "}",
2843 Style);
2844}
2845
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002846TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002847 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002848 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
2849 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002850 verifyFormat("Constructor()\n"
2851 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002852 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002853 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002854 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002855 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002856
Daniel Jasper7b259cd2015-08-27 11:59:31 +00002857 verifyFormat("template <typename T>\n"
2858 "Constructor() : Initializer(FitsOnTheLine) {}",
2859 getLLVMStyleWithColumns(45));
2860
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002861 verifyFormat(
2862 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002863 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002864
2865 verifyFormat(
2866 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002867 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002868 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002869 verifyFormat(
2870 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002871 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002872 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00002873 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2874 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2875 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002876
2877 verifyFormat("Constructor()\n"
2878 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2879 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2880 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002881 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002882
Daniel Jasper65585ed2013-01-28 13:31:35 +00002883 verifyFormat("Constructor()\n"
2884 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002885 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00002886
Daniel Jasper62e68172013-02-25 15:59:54 +00002887 verifyFormat("Constructor(int Parameter = 0)\n"
2888 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
2889 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00002890 verifyFormat("Constructor()\n"
2891 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
2892 "}",
2893 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00002894 verifyFormat("Constructor()\n"
2895 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2896 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00002897
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002898 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00002899 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00002900 verifyFormat("Constructor()\n"
2901 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
2902 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
2903 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002904
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002905 FormatStyle OnePerLine = getLLVMStyle();
2906 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00002907 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002908 verifyFormat("SomeClass::Constructor()\n"
2909 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
2910 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002911 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002912 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002913 verifyFormat("SomeClass::Constructor()\n"
2914 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
2915 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002916 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002917 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002918 verifyFormat("MyClass::MyClass(int var)\n"
2919 " : some_var_(var), // 4 space indent\n"
2920 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002921 "}",
2922 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00002923 verifyFormat("Constructor()\n"
2924 " : aaaaa(aaaaaa),\n"
2925 " aaaaa(aaaaaa),\n"
2926 " aaaaa(aaaaaa),\n"
2927 " aaaaa(aaaaaa),\n"
2928 " aaaaa(aaaaaa) {}",
2929 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00002930 verifyFormat("Constructor()\n"
2931 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
2932 " aaaaaaaaaaaaaaaaaaaaaa) {}",
2933 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00002934 OnePerLine.BinPackParameters = false;
2935 verifyFormat(
2936 "Constructor()\n"
2937 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2938 " aaaaaaaaaaa().aaa(),\n"
2939 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
2940 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00002941 OnePerLine.ColumnLimit = 60;
2942 verifyFormat("Constructor()\n"
2943 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
2944 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
2945 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00002946
2947 EXPECT_EQ("Constructor()\n"
2948 " : // Comment forcing unwanted break.\n"
2949 " aaaa(aaaa) {}",
2950 format("Constructor() :\n"
2951 " // Comment forcing unwanted break.\n"
2952 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00002953}
2954
Francois Ferranda6b6d512017-05-24 11:36:58 +00002955TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
2956 FormatStyle Style = getLLVMStyle();
2957 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
2958
2959 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
2960 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
2961 getStyleWithColumns(Style, 45));
2962 verifyFormat("Constructor() :\n"
2963 " Initializer(FitsOnTheLine) {}",
2964 getStyleWithColumns(Style, 44));
2965 verifyFormat("Constructor() :\n"
2966 " Initializer(FitsOnTheLine) {}",
2967 getStyleWithColumns(Style, 43));
2968
2969 verifyFormat("template <typename T>\n"
2970 "Constructor() : Initializer(FitsOnTheLine) {}",
2971 getStyleWithColumns(Style, 50));
2972
2973 verifyFormat(
2974 "SomeClass::Constructor() :\n"
2975 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
2976 Style);
2977
2978 verifyFormat(
2979 "SomeClass::Constructor() :\n"
2980 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
2981 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
2982 Style);
2983 verifyFormat(
2984 "SomeClass::Constructor() :\n"
2985 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2986 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
2987 Style);
2988 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2989 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
2990 " aaaaaaaaaa(aaaaaa) {}",
2991 Style);
2992
2993 verifyFormat("Constructor() :\n"
2994 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2995 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2996 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2997 " aaaaaaaaaaaaaaaaaaaaaaa() {}",
2998 Style);
2999
3000 verifyFormat("Constructor() :\n"
3001 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3002 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3003 Style);
3004
3005 verifyFormat("Constructor(int Parameter = 0) :\n"
3006 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3007 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
3008 Style);
3009 verifyFormat("Constructor() :\n"
3010 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3011 "}",
3012 getStyleWithColumns(Style, 60));
3013 verifyFormat("Constructor() :\n"
3014 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3015 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
3016 Style);
3017
3018 // Here a line could be saved by splitting the second initializer onto two
3019 // lines, but that is not desirable.
3020 verifyFormat("Constructor() :\n"
3021 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3022 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3023 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3024 Style);
3025
3026 FormatStyle OnePerLine = Style;
3027 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3028 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3029 verifyFormat("SomeClass::Constructor() :\n"
3030 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3031 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3032 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3033 OnePerLine);
3034 verifyFormat("SomeClass::Constructor() :\n"
3035 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3036 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3037 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3038 OnePerLine);
3039 verifyFormat("MyClass::MyClass(int var) :\n"
3040 " some_var_(var), // 4 space indent\n"
3041 " some_other_var_(var + 1) { // lined up\n"
3042 "}",
3043 OnePerLine);
3044 verifyFormat("Constructor() :\n"
3045 " aaaaa(aaaaaa),\n"
3046 " aaaaa(aaaaaa),\n"
3047 " aaaaa(aaaaaa),\n"
3048 " aaaaa(aaaaaa),\n"
3049 " aaaaa(aaaaaa) {}",
3050 OnePerLine);
3051 verifyFormat("Constructor() :\n"
3052 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3053 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3054 OnePerLine);
3055 OnePerLine.BinPackParameters = false;
3056 verifyFormat(
3057 "Constructor() :\n"
3058 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3059 " aaaaaaaaaaa().aaa(),\n"
3060 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3061 OnePerLine);
3062 OnePerLine.ColumnLimit = 60;
3063 verifyFormat("Constructor() :\n"
3064 " aaaaaaaaaaaaaaaaaaaa(a),\n"
3065 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3066 OnePerLine);
3067
3068 EXPECT_EQ("Constructor() :\n"
3069 " // Comment forcing unwanted break.\n"
3070 " aaaa(aaaa) {}",
3071 format("Constructor() :\n"
3072 " // Comment forcing unwanted break.\n"
3073 " aaaa(aaaa) {}",
3074 Style));
3075
3076 Style.ColumnLimit = 0;
3077 verifyFormat("SomeClass::Constructor() :\n"
3078 " a(a) {}",
3079 Style);
3080 verifyFormat("SomeClass::Constructor() noexcept :\n"
3081 " a(a) {}",
3082 Style);
3083 verifyFormat("SomeClass::Constructor() :\n"
3084 " a(a), b(b), c(c) {}",
3085 Style);
3086 verifyFormat("SomeClass::Constructor() :\n"
3087 " a(a) {\n"
3088 " foo();\n"
3089 " bar();\n"
3090 "}",
3091 Style);
3092
3093 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
3094 verifyFormat("SomeClass::Constructor() :\n"
3095 " a(a), b(b), c(c) {\n"
3096 "}",
3097 Style);
3098 verifyFormat("SomeClass::Constructor() :\n"
3099 " a(a) {\n"
3100 "}",
3101 Style);
3102
3103 Style.ColumnLimit = 80;
3104 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
3105 Style.ConstructorInitializerIndentWidth = 2;
3106 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
3107 Style);
3108 verifyFormat("SomeClass::Constructor() :\n"
3109 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3110 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
3111 Style);
3112}
3113
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003114TEST_F(FormatTest, MemoizationTests) {
3115 // This breaks if the memoization lookup does not take \c Indent and
3116 // \c LastSpace into account.
3117 verifyFormat(
3118 "extern CFRunLoopTimerRef\n"
3119 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3120 " CFTimeInterval interval, CFOptionFlags flags,\n"
3121 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003122 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003123
3124 // Deep nesting somewhat works around our memoization.
3125 verifyFormat(
3126 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3127 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3128 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3129 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3130 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3131 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003132 verifyFormat(
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,\n"
3145 " aaaaa(\n"
3146 " aaaaa,\n"
3147 " aaaaa(\n"
3148 " aaaaa,\n"
3149 " aaaaa(\n"
3150 " aaaaa,\n"
3151 " aaaaa(\n"
3152 " aaaaa,\n"
3153 " aaaaa(\n"
3154 " aaaaa,\n"
3155 " aaaaa(\n"
3156 " aaaaa,\n"
3157 " aaaaa))))))))))));",
3158 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003159 verifyFormat(
3160 "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"
3161 " a),\n"
3162 " a),\n"
3163 " a),\n"
3164 " a),\n"
3165 " a),\n"
3166 " a),\n"
3167 " a),\n"
3168 " a),\n"
3169 " a),\n"
3170 " a),\n"
3171 " a),\n"
3172 " a),\n"
3173 " a),\n"
3174 " a),\n"
3175 " a),\n"
3176 " a),\n"
3177 " a)",
3178 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00003179
3180 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003181 FormatStyle OnePerLine = getLLVMStyle();
3182 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003183 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00003184 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00003185 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00003186 for (unsigned i = 0, e = 80; i != e; ++i) {
3187 input += " a,\n";
3188 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003189 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003190 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003191}
3192
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003193TEST_F(FormatTest, BreaksAsHighAsPossible) {
3194 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003195 "void f() {\n"
3196 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3197 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3198 " f();\n"
3199 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00003200 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003201 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003202}
3203
Daniel Jasper6728fc12013-04-11 14:29:13 +00003204TEST_F(FormatTest, BreaksFunctionDeclarations) {
3205 // Principially, we break function declarations in a certain order:
3206 // 1) break amongst arguments.
3207 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3208 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003209 verifyFormat("template <class TemplateIt>\n"
3210 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3211 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00003212
3213 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00003214 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003215 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003216 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003217 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003218
3219 // 3) break after (.
3220 verifyFormat(
3221 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00003222 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3223 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003224
3225 // 4) break before after nested name specifiers.
3226 verifyFormat(
3227 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003228 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3229 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003230 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003231
3232 // However, there are exceptions, if a sufficient amount of lines can be
3233 // saved.
3234 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3235 // more adjusting.
3236 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3237 " Cccccccccccccc cccccccccc,\n"
3238 " Cccccccccccccc cccccccccc,\n"
3239 " Cccccccccccccc cccccccccc,\n"
3240 " Cccccccccccccc cccccccccc);");
3241 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003242 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003243 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3244 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3245 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003246 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003247 verifyFormat(
3248 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3249 " Cccccccccccccc cccccccccc,\n"
3250 " Cccccccccccccc cccccccccc,\n"
3251 " Cccccccccccccc cccccccccc,\n"
3252 " Cccccccccccccc cccccccccc,\n"
3253 " Cccccccccccccc cccccccccc,\n"
3254 " Cccccccccccccc cccccccccc);");
3255 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3256 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3257 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3258 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3259 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00003260
3261 // Break after multi-line parameters.
3262 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3263 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3264 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3265 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00003266 verifyFormat("void SomeLoooooooooooongFunction(\n"
3267 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3268 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3269 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003270
3271 // Treat overloaded operators like other functions.
3272 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3273 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00003274 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3275 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00003276 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3277 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3278 verifyGoogleFormat(
3279 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3280 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003281 verifyGoogleFormat(
3282 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3283 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00003284 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3285 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3286 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3287 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00003288 verifyGoogleFormat(
3289 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
3290 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3291 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00003292 verifyGoogleFormat(
3293 "template <typename T>\n"
3294 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3295 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
3296 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00003297
3298 FormatStyle Style = getLLVMStyle();
3299 Style.PointerAlignment = FormatStyle::PAS_Left;
3300 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3301 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
3302 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003303 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3304 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3305 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00003306}
3307
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003308TEST_F(FormatTest, TrailingReturnType) {
3309 verifyFormat("auto foo() -> int;\n");
3310 verifyFormat("struct S {\n"
3311 " auto bar() const -> int;\n"
3312 "};");
3313 verifyFormat("template <size_t Order, typename T>\n"
3314 "auto load_img(const std::string &filename)\n"
3315 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00003316 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
3317 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00003318 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00003319 verifyFormat("template <typename T>\n"
3320 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
3321 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00003322
3323 // Not trailing return types.
3324 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003325}
3326
Daniel Jasper5be31f72013-05-21 09:16:31 +00003327TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003328 // Avoid breaking before trailing 'const' or other trailing annotations, if
3329 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00003330 FormatStyle Style = getGoogleStyle();
3331 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00003332 verifyFormat("void someLongFunction(\n"
3333 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00003334 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00003335 verifyFormat("LoooooongReturnType\n"
3336 "someLoooooooongFunction() const {}",
3337 getLLVMStyleWithColumns(47));
3338 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
3339 " const {}",
3340 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003341 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3342 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
3343 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3344 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
3345 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3346 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00003347 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
3348 " aaaaaaaaaaa aaaaa) const override;");
3349 verifyGoogleFormat(
3350 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3351 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003352
Daniel Jasper5550de62014-02-17 07:57:46 +00003353 // Even if the first parameter has to be wrapped.
3354 verifyFormat("void someLongFunction(\n"
3355 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003356 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00003357 verifyFormat("void someLongFunction(\n"
3358 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003359 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00003360 verifyFormat("void someLongFunction(\n"
3361 " int someLongParameter) override {}",
3362 Style);
3363 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003364 " int someLongParameter) OVERRIDE {}",
3365 Style);
3366 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003367 " int someLongParameter) final {}",
3368 Style);
3369 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003370 " int someLongParameter) FINAL {}",
3371 Style);
3372 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003373 " int parameter) const override {}",
3374 Style);
3375
Daniel Jaspere3f907f2014-06-02 09:52:08 +00003376 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3377 verifyFormat("void someLongFunction(\n"
3378 " int someLongParameter) const\n"
3379 "{\n"
3380 "}",
3381 Style);
3382
Daniel Jasper5550de62014-02-17 07:57:46 +00003383 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003384 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
3385 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3386 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00003387
3388 // Breaking before function-like trailing annotations is fine to keep them
3389 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00003390 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3391 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3392 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3393 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3394 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3395 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00003396 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
3397 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00003398 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003399
3400 verifyFormat(
3401 "void aaaaaaaaaaaaaaaaaa()\n"
3402 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
3403 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
3404 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3405 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003406 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003407 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003408 " GUARDED_BY(aaaaaaaaaaaa);");
3409 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00003410 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003411 " GUARDED_BY(aaaaaaaaaaaa);");
3412 verifyGoogleFormat(
3413 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3414 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00003415 verifyGoogleFormat(
3416 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3417 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003418}
3419
Daniel Jasperf090f032015-05-18 09:47:22 +00003420TEST_F(FormatTest, FunctionAnnotations) {
3421 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00003422 "int OldFunction(const string &parameter) {}");
3423 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00003424 "string OldFunction(const string &parameter) {}");
3425 verifyFormat("template <typename T>\n"
3426 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
3427 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00003428
3429 // Not function annotations.
3430 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3431 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00003432 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
3433 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00003434 verifyFormat("MACRO(abc).function() // wrap\n"
3435 " << abc;");
3436 verifyFormat("MACRO(abc)->function() // wrap\n"
3437 " << abc;");
3438 verifyFormat("MACRO(abc)::function() // wrap\n"
3439 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00003440}
3441
Daniel Jasperf7935112012-12-03 18:12:45 +00003442TEST_F(FormatTest, BreaksDesireably) {
3443 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
3444 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003445 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00003446 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3447 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
3448 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003449
3450 verifyFormat(
3451 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003452 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003453
3454 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3455 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3456 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00003457
3458 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003459 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3460 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3461 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00003462 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3463 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003464
3465 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3466 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3467
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003468 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003469 "void f() {\n"
3470 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
3471 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3472 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00003473 verifyFormat(
3474 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3475 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3476 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003477 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3478 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3479 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003480 "aaaaaa(aaa,\n"
3481 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003482 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3483 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003484 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3485 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3486 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003487
Daniel Jasper739b85f2015-06-29 10:42:59 +00003488 // Indent consistently independent of call expression and unary operator.
3489 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3490 " dddddddddddddddddddddddddddddd));");
3491 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3492 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003493 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003494 " dddddddddddddddddddddddddddddd));");
3495
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003496 // This test case breaks on an incorrect memoization, i.e. an optimization not
3497 // taking into account the StopAt value.
3498 verifyFormat(
3499 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003500 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3501 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3502 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00003503
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003504 verifyFormat("{\n {\n {\n"
3505 " Annotation.SpaceRequiredBefore =\n"
3506 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
3507 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
3508 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00003509
3510 // Break on an outer level if there was a break on an inner level.
3511 EXPECT_EQ("f(g(h(a, // comment\n"
3512 " b, c),\n"
3513 " d, e),\n"
3514 " x, y);",
3515 format("f(g(h(a, // comment\n"
3516 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00003517
3518 // Prefer breaking similar line breaks.
3519 verifyFormat(
3520 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
3521 " NSTrackingMouseEnteredAndExited |\n"
3522 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00003523}
3524
Daniel Jasper18210d72014-10-09 09:52:05 +00003525TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
3526 FormatStyle NoBinPacking = getGoogleStyle();
3527 NoBinPacking.BinPackParameters = false;
3528 NoBinPacking.BinPackArguments = true;
3529 verifyFormat("void f() {\n"
3530 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
3531 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3532 "}",
3533 NoBinPacking);
3534 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
3535 " int aaaaaaaaaaaaaaaaaaaa,\n"
3536 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3537 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003538
Daniel Jasper00693b082016-01-09 15:56:47 +00003539 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
3540 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3541 " vector<int> bbbbbbbbbbbbbbb);",
3542 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003543 // FIXME: This behavior difference is probably not wanted. However, currently
3544 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
3545 // template arguments from BreakBeforeParameter being set because of the
3546 // one-per-line formatting.
3547 verifyFormat(
3548 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3549 " aaaaaaaaaa> aaaaaaaaaa);",
3550 NoBinPacking);
3551 verifyFormat(
3552 "void fffffffffff(\n"
3553 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
3554 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00003555}
3556
Daniel Jasper9278eb92013-01-16 14:59:02 +00003557TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00003558 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003559 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00003560 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003561 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
3562 " aaaaaaaaaaaaaaaaaaaa,\n"
3563 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
3564 NoBinPacking);
3565 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
3566 " aaaaaaaaaaaaa,\n"
3567 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
3568 NoBinPacking);
3569 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003570 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3571 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3572 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
3573 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003574 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
3575 NoBinPacking);
3576 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3577 " .aaaaaaaaaaaaaaaaaa();",
3578 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003579 verifyFormat("void f() {\n"
3580 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3581 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
3582 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003583 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003584
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003585 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00003586 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3587 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003588 " aaaaaaaaaaaa);",
3589 NoBinPacking);
3590 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003591 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
3592 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003593 " test);",
3594 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003595
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003596 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3597 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00003598 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
3599 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003600 NoBinPacking);
3601 verifyFormat("a(\"a\"\n"
3602 " \"a\",\n"
3603 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00003604
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003605 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00003606 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00003607 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00003608 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003609 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00003610 verifyFormat(
3611 "void f() {\n"
3612 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3613 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003614 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003615 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00003616 verifyFormat(
3617 "template <class SomeType, class SomeOtherType>\n"
3618 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
3619 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003620}
3621
Daniel Jasperb10cbc42013-07-10 14:02:49 +00003622TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
3623 FormatStyle Style = getLLVMStyleWithColumns(15);
3624 Style.ExperimentalAutoDetectBinPacking = true;
3625 EXPECT_EQ("aaa(aaaa,\n"
3626 " aaaa,\n"
3627 " aaaa);\n"
3628 "aaa(aaaa,\n"
3629 " aaaa,\n"
3630 " aaaa);",
3631 format("aaa(aaaa,\n" // one-per-line
3632 " aaaa,\n"
3633 " aaaa );\n"
3634 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3635 Style));
3636 EXPECT_EQ("aaa(aaaa, aaaa,\n"
3637 " aaaa);\n"
3638 "aaa(aaaa, aaaa,\n"
3639 " aaaa);",
3640 format("aaa(aaaa, aaaa,\n" // bin-packed
3641 " aaaa );\n"
3642 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3643 Style));
3644}
3645
Daniel Jasper04468962013-01-18 10:56:38 +00003646TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00003647 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
3648 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
3649 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
3650 " .StartsWith(\".init\", ORDER_INIT)\n"
3651 " .StartsWith(\".fini\", ORDER_FINI)\n"
3652 " .StartsWith(\".hash\", ORDER_HASH)\n"
3653 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00003654
Daniel Jaspereb50c672013-02-15 20:33:06 +00003655 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003656 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00003657 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00003658 "aaaaaaa->aaaaaaa\n"
3659 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3660 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00003661 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00003662 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00003663 "aaaaaaa->aaaaaaa\n"
3664 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3665 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
3666 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00003667 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00003668 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00003669 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003670 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
3671 " aaaaaa->aaaaaaaaaaaa()\n"
3672 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00003673 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003674 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00003675 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003676 "void f() {\n"
3677 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003678 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003679 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003680 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003681 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003682 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003683 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003684 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003685 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003686 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003687 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003688 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00003689
3690 verifyFormat(
3691 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
3692 verifyFormat("aaaaaaaaaaaaaaa()\n"
3693 " .aaaaaaaaaaaaaaa()\n"
3694 " .aaaaaaaaaaaaaaa()\n"
3695 " .aaaaaaaaaaaaaaa()\n"
3696 " .aaaaaaaaaaaaaaa();");
3697 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3698 " .aaaaaaaaaaaaaaa()\n"
3699 " .aaaaaaaaaaaaaaa()\n"
3700 " .aaaaaaaaaaaaaaa();");
3701 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3702 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3703 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00003704 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
3705 " ->aaaaaaaaaaaaaae(0)\n"
3706 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00003707
Daniel Jasper775954b2015-04-24 10:08:09 +00003708 // Don't linewrap after very short segments.
3709 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3710 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3711 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3712 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3713 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3714 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3715 verifyFormat("aaa()\n"
3716 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3717 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3718 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3719
Daniel Jaspercc3114d2013-10-18 15:23:06 +00003720 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3721 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3722 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
3723 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3724 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003725 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00003726
Daniel Jaspera41aa532014-09-19 08:01:25 +00003727 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00003728 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
3729 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00003730
3731 // Prefer not to create "hanging" indents.
3732 verifyFormat(
3733 "return !soooooooooooooome_map\n"
3734 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3735 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00003736 verifyFormat(
3737 "return aaaaaaaaaaaaaaaa\n"
3738 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
3739 " .aaaa(aaaaaaaaaaaaaa);");
3740 // No hanging indent here.
3741 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
3742 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3743 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
3744 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00003745 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3746 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3747 getLLVMStyleWithColumns(60));
3748 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
3749 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3750 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3751 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00003752 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3753 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3754 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00003755}
3756
Daniel Jasperde5c2072012-12-24 00:13:23 +00003757TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
3758 verifyFormat(
3759 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003760 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003761 verifyFormat(
3762 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
3763 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
3764
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003765 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003766 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003767 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
3768 " ccccccccccccccccccccccccc) {\n}");
3769
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003770 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003771 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003772 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
3773 " ccccccccccccccccccccccccc) {\n}");
3774
Daniel Jasperde5c2072012-12-24 00:13:23 +00003775 verifyFormat(
3776 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003777 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003778 verifyFormat(
3779 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
3780 " ccccccccccccccccccccccccc) {\n}");
3781
Daniel Jasper400adc62013-02-08 15:28:42 +00003782 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
3783 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
3784 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
3785 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003786 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
3787 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
3788 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
3789 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
3790
Daniel Jasper400adc62013-02-08 15:28:42 +00003791 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
3792 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
3793 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003794 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
3795 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
3796 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00003797}
3798
Daniel Jasper43b65482013-01-23 12:27:43 +00003799TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00003800 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00003801 "unsigned Cost =\n"
3802 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
3803 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00003804 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00003805 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
3806 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00003807
3808 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003809 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
3810 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00003811 verifyFormat("unsigned OriginalStartColumn =\n"
3812 " SourceMgr.getSpellingColumnNumber(\n"
3813 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
3814 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00003815}
3816
Francois Ferrand9976efa2017-05-22 08:28:17 +00003817TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
3818 FormatStyle Style = getLLVMStyle();
3819 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3820 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
3821 Style);
3822
3823 Style.PenaltyBreakAssignment = 20;
3824 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3825 " cccccccccccccccccccccccccc;",
3826 Style);
3827}
3828
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003829TEST_F(FormatTest, AlignsAfterAssignments) {
3830 verifyFormat(
3831 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003832 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003833 verifyFormat(
3834 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003835 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003836 verifyFormat(
3837 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003838 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003839 verifyFormat(
3840 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003841 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00003842 verifyFormat(
3843 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3844 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3845 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003846}
3847
3848TEST_F(FormatTest, AlignsAfterReturn) {
3849 verifyFormat(
3850 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3851 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
3852 verifyFormat(
3853 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3854 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00003855 verifyFormat(
3856 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003857 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00003858 verifyFormat(
3859 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003860 " aaaaaaaaaaaaaaaaaaaaaa());");
3861 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3862 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3863 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3864 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
3865 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00003866 verifyFormat("return\n"
3867 " // true if code is one of a or b.\n"
3868 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003869}
3870
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003871TEST_F(FormatTest, AlignsAfterOpenBracket) {
3872 verifyFormat(
3873 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
3874 " aaaaaaaaa aaaaaaa) {}");
3875 verifyFormat(
3876 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
3877 " aaaaaaaaaaa aaaaaaaaa);");
3878 verifyFormat(
3879 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
3880 " aaaaaaaaaaaaaaaaaaaaa));");
3881 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003882 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00003883 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3884 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
3885 Style);
3886 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
3887 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
3888 Style);
3889 verifyFormat("SomeLongVariableName->someFunction(\n"
3890 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
3891 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003892 verifyFormat(
3893 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
3894 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3895 Style);
3896 verifyFormat(
3897 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
3898 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3899 Style);
3900 verifyFormat(
3901 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
3902 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
3903 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003904
Daniel Jasper2a9f7202016-02-08 09:52:54 +00003905 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
3906 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
3907 " b));",
3908 Style);
3909
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003910 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
3911 Style.BinPackArguments = false;
3912 Style.BinPackParameters = false;
3913 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3914 " aaaaaaaaaaa aaaaaaaa,\n"
3915 " aaaaaaaaa aaaaaaa,\n"
3916 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3917 Style);
3918 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
3919 " aaaaaaaaaaa aaaaaaaaa,\n"
3920 " aaaaaaaaaaa aaaaaaaaa,\n"
3921 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3922 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00003923 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
3924 " aaaaaaaaaaaaaaa,\n"
3925 " aaaaaaaaaaaaaaaaaaaaa,\n"
3926 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003927 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00003928 verifyFormat(
3929 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
3930 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
3931 Style);
3932 verifyFormat(
3933 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
3934 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
3935 Style);
3936 verifyFormat(
3937 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3938 " aaaaaaaaaaaaaaaaaaaaa(\n"
3939 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
3940 " aaaaaaaaaaaaaaaa);",
3941 Style);
3942 verifyFormat(
3943 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3944 " aaaaaaaaaaaaaaaaaaaaa(\n"
3945 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
3946 " aaaaaaaaaaaaaaaa);",
3947 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003948}
3949
Daniel Jasper3219e432014-12-02 13:24:51 +00003950TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
3951 FormatStyle Style = getLLVMStyleWithColumns(40);
3952 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3953 " bbbbbbbbbbbbbbbbbbbbbb);",
3954 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003955 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00003956 Style.AlignOperands = false;
3957 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3958 " bbbbbbbbbbbbbbbbbbbbbb);",
3959 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003960 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00003961 Style.AlignOperands = true;
3962 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3963 " bbbbbbbbbbbbbbbbbbbbbb);",
3964 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003965 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00003966 Style.AlignOperands = false;
3967 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3968 " bbbbbbbbbbbbbbbbbbbbbb);",
3969 Style);
3970}
3971
Daniel Jasper399d24b2013-01-09 07:06:56 +00003972TEST_F(FormatTest, BreaksConditionalExpressions) {
3973 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003974 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3975 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3976 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3977 verifyFormat(
3978 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003979 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3980 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00003981 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003982 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3983 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3984 verifyFormat(
3985 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003986 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3987 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00003988 verifyFormat(
3989 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
3990 " : aaaaaaaaaaaaa);");
3991 verifyFormat(
3992 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00003993 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00003994 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3995 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00003996 verifyFormat(
3997 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3998 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3999 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004000 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4001 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4002 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4003 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4004 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4005 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4006 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4007 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4008 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4009 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4010 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4011 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004012 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4013 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4014 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4015 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4016 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004017 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4018 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4019 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004020 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4021 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4022 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4023 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004024 verifyFormat(
4025 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4026 " ? aaaaaaaaaaaaaaa\n"
4027 " : aaaaaaaaaaaaaaa;");
4028 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004029 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004030 " ? b\n"
4031 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004032 verifyFormat("return aaaa == bbbb\n"
4033 " // comment\n"
4034 " ? aaaa\n"
4035 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004036 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004037 " format(TheLine.First,\n"
4038 " IndentForLevel[TheLine.Level] >= 0\n"
4039 " ? IndentForLevel[TheLine.Level]\n"
4040 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004041 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004042 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004043 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4044 " ? aaaaaaaaaaaaaaa\n"
4045 " : bbbbbbbbbbbbbbb //\n"
4046 " ? ccccccccccccccc\n"
4047 " : ddddddddddddddd;");
4048 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4049 " ? aaaaaaaaaaaaaaa\n"
4050 " : (bbbbbbbbbbbbbbb //\n"
4051 " ? ccccccccccccccc\n"
4052 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004053 verifyFormat(
4054 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4055 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4056 " aaaaaaaaaaaaaaaaaaaaa +\n"
4057 " aaaaaaaaaaaaaaaaaaaaa\n"
4058 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004059 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004060 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4061 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4062 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004063
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004064 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004065 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004066 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004067 "void f() {\n"
4068 " g(aaa,\n"
4069 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4070 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4071 " ? aaaaaaaaaaaaaaa\n"
4072 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004073 "}",
4074 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004075 verifyFormat(
4076 "void f() {\n"
4077 " g(aaa,\n"
4078 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4079 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4080 " ?: aaaaaaaaaaaaaaa);\n"
4081 "}",
4082 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004083
4084 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4085 " // comment.\n"
4086 " ccccccccccccccccccccccccccccccccccccccc\n"
4087 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4088 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004089
4090 // Assignments in conditional expressions. Apparently not uncommon :-(.
4091 verifyFormat("return a != b\n"
4092 " // comment\n"
4093 " ? a = b\n"
4094 " : a = b;");
4095 verifyFormat("return a != b\n"
4096 " // comment\n"
4097 " ? a = a != b\n"
4098 " // comment\n"
4099 " ? a = b\n"
4100 " : a\n"
4101 " : a;\n");
4102 verifyFormat("return a != b\n"
4103 " // comment\n"
4104 " ? a\n"
4105 " : a = a != b\n"
4106 " // comment\n"
4107 " ? a = b\n"
4108 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004109}
4110
Daniel Jasper165b29e2013-11-08 00:57:11 +00004111TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4112 FormatStyle Style = getLLVMStyle();
4113 Style.BreakBeforeTernaryOperators = false;
4114 Style.ColumnLimit = 70;
4115 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004116 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4117 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4118 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4119 Style);
4120 verifyFormat(
4121 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004122 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4123 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004124 Style);
4125 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004126 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4127 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4128 Style);
4129 verifyFormat(
4130 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004131 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4132 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004133 Style);
4134 verifyFormat(
4135 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4136 " aaaaaaaaaaaaa);",
4137 Style);
4138 verifyFormat(
4139 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4140 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4141 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4142 " aaaaaaaaaaaaa);",
4143 Style);
4144 verifyFormat(
4145 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4146 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4147 " aaaaaaaaaaaaa);",
4148 Style);
4149 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4150 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4151 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4152 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4153 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4154 Style);
4155 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4156 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4157 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4158 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4159 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4160 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4161 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4162 Style);
4163 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4164 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4165 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4166 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4167 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4168 Style);
4169 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4170 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4171 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4172 Style);
4173 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00004174 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00004175 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4176 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4177 Style);
4178 verifyFormat(
4179 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4180 " aaaaaaaaaaaaaaa :\n"
4181 " aaaaaaaaaaaaaaa;",
4182 Style);
4183 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4184 " aaaaaaaaa ?\n"
4185 " b :\n"
4186 " c);",
4187 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00004188 verifyFormat("unsigned Indent =\n"
4189 " format(TheLine.First,\n"
4190 " IndentForLevel[TheLine.Level] >= 0 ?\n"
4191 " IndentForLevel[TheLine.Level] :\n"
4192 " TheLine * 2,\n"
4193 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4194 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004195 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4196 " aaaaaaaaaaaaaaa :\n"
4197 " bbbbbbbbbbbbbbb ? //\n"
4198 " ccccccccccccccc :\n"
4199 " ddddddddddddddd;",
4200 Style);
4201 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4202 " aaaaaaaaaaaaaaa :\n"
4203 " (bbbbbbbbbbbbbbb ? //\n"
4204 " ccccccccccccccc :\n"
4205 " ddddddddddddddd);",
4206 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00004207 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4208 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4209 " ccccccccccccccccccccccccccc;",
4210 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00004211 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4212 " aaaaa :\n"
4213 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
4214 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004215}
4216
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004217TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4218 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4219 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4220 verifyFormat("bool a = true, b = false;");
4221
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004222 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004223 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004224 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00004225 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004226 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00004227 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004228 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00004229 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00004230 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4231 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4232 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4233 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4234 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4235 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004236
Daniel Jasperbea1ab42015-03-01 18:55:26 +00004237 FormatStyle Style = getGoogleStyle();
4238 Style.PointerAlignment = FormatStyle::PAS_Left;
4239 Style.DerivePointerAlignment = false;
4240 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4241 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4242 " *b = bbbbbbbbbbbbbbbbbbb;",
4243 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004244 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4245 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4246 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00004247 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00004248 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004249}
4250
Nico Weber4a5030c2013-01-12 01:28:06 +00004251TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4252 verifyFormat("arr[foo ? bar : baz];");
4253 verifyFormat("f()[foo ? bar : baz];");
4254 verifyFormat("(a + b)[foo ? bar : baz];");
4255 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4256}
4257
Daniel Jasperf7935112012-12-03 18:12:45 +00004258TEST_F(FormatTest, AlignsStringLiterals) {
4259 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4260 " \"short literal\");");
4261 verifyFormat(
4262 "looooooooooooooooooooooooongFunction(\n"
4263 " \"short literal\"\n"
4264 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004265 verifyFormat("someFunction(\"Always break between multi-line\"\n"
4266 " \" string literals\",\n"
4267 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004268 EXPECT_EQ("fun + \"1243\" /* comment */\n"
4269 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004270 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00004271 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004272 getLLVMStyleWithColumns(28)));
4273 EXPECT_EQ(
4274 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4275 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4276 " \"aaaaaaaaaaaaaaaa\";",
4277 format("aaaaaa ="
4278 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4279 "aaaaaaaaaaaaaaaaaaaaa\" "
4280 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004281 verifyFormat("a = a + \"a\"\n"
4282 " \"a\"\n"
4283 " \"a\";");
4284 verifyFormat("f(\"a\", \"b\"\n"
4285 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00004286
4287 verifyFormat(
4288 "#define LL_FORMAT \"ll\"\n"
4289 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
4290 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00004291
4292 verifyFormat("#define A(X) \\\n"
4293 " \"aaaaa\" #X \"bbbbbb\" \\\n"
4294 " \"ccccc\"",
4295 getLLVMStyleWithColumns(23));
4296 verifyFormat("#define A \"def\"\n"
4297 "f(\"abc\" A \"ghi\"\n"
4298 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004299
4300 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004301 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004302 verifyFormat("#define A(X) \\\n"
4303 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
4304 " L\"ccccc\"",
4305 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00004306
4307 verifyFormat("f(@\"a\"\n"
4308 " @\"b\");");
4309 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00004310 " @\"b\"\n"
4311 " @\"c\";");
4312 verifyFormat("NSString s = @\"a\"\n"
4313 " \"b\"\n"
4314 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00004315}
4316
Zachary Turner448592e2015-12-18 22:20:15 +00004317TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004318 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00004319 // No declarations or definitions should be moved to own line.
4320 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
4321 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004322 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004323 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004324 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004325 "int f() { return 1; }\n"
4326 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004327 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00004328
4329 // All declarations and definitions should have the return type moved to its
4330 // own
4331 // line.
4332 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
4333 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004334 " int\n"
4335 " f() {\n"
4336 " return 1;\n"
4337 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004338 " int\n"
4339 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004340 "};\n"
4341 "int\n"
4342 "f() {\n"
4343 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004344 "}\n"
4345 "int\n"
4346 "g();\n",
4347 Style);
4348
4349 // Top-level definitions, and no kinds of declarations should have the
4350 // return type moved to its own line.
4351 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
4352 verifyFormat("class B {\n"
4353 " int f() { return 1; }\n"
4354 " int g();\n"
4355 "};\n"
4356 "int\n"
4357 "f() {\n"
4358 " return 1;\n"
4359 "}\n"
4360 "int g();\n",
4361 Style);
4362
4363 // Top-level definitions and declarations should have the return type moved
4364 // to its own line.
4365 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
4366 verifyFormat("class C {\n"
4367 " int f() { return 1; }\n"
4368 " int g();\n"
4369 "};\n"
4370 "int\n"
4371 "f() {\n"
4372 " return 1;\n"
4373 "}\n"
4374 "int\n"
4375 "g();\n",
4376 Style);
4377
4378 // All definitions should have the return type moved to its own line, but no
4379 // kinds of declarations.
4380 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4381 verifyFormat("class D {\n"
4382 " int\n"
4383 " f() {\n"
4384 " return 1;\n"
4385 " }\n"
4386 " int g();\n"
4387 "};\n"
4388 "int\n"
4389 "f() {\n"
4390 " return 1;\n"
4391 "}\n"
4392 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004393 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004394 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004395 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004396 " return \"\";\n"
4397 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004398 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004399 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004400 verifyFormat("template <class T>\n"
4401 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004402 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004403 " return NULL;\n"
4404 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004405 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004406 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00004407 verifyFormat("class C {\n"
4408 " int\n"
4409 " operator+() {\n"
4410 " return 1;\n"
4411 " }\n"
4412 " int\n"
4413 " operator()() {\n"
4414 " return 1;\n"
4415 " }\n"
4416 "};\n",
4417 Style);
4418 verifyFormat("void\n"
4419 "A::operator()() {}\n"
4420 "void\n"
4421 "A::operator>>() {}\n"
4422 "void\n"
4423 "A::operator+() {}\n",
4424 Style);
4425 verifyFormat("void *operator new(std::size_t s);", // No break here.
4426 Style);
4427 verifyFormat("void *\n"
4428 "operator new(std::size_t s) {}",
4429 Style);
4430 verifyFormat("void *\n"
4431 "operator delete[](void *ptr) {}",
4432 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004433 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00004434 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004435 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004436 "{\n"
4437 " return \"\";\n"
4438 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004439 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004440 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004441 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004442 "T *\n" // Problem here: no line break
4443 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004444 "{\n"
4445 " return NULL;\n"
4446 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004447 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004448 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004449}
4450
Alexander Kornienko58611712013-07-04 12:02:44 +00004451TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
4452 FormatStyle NoBreak = getLLVMStyle();
4453 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
4454 FormatStyle Break = getLLVMStyle();
4455 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00004456 verifyFormat("aaaa = \"bbbb\"\n"
4457 " \"cccc\";",
4458 NoBreak);
4459 verifyFormat("aaaa =\n"
4460 " \"bbbb\"\n"
4461 " \"cccc\";",
4462 Break);
4463 verifyFormat("aaaa(\"bbbb\"\n"
4464 " \"cccc\");",
4465 NoBreak);
4466 verifyFormat("aaaa(\n"
4467 " \"bbbb\"\n"
4468 " \"cccc\");",
4469 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004470 verifyFormat("aaaa(qqq, \"bbbb\"\n"
4471 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004472 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004473 verifyFormat("aaaa(qqq,\n"
4474 " \"bbbb\"\n"
4475 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004476 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004477 verifyFormat("aaaa(qqq,\n"
4478 " L\"bbbb\"\n"
4479 " L\"cccc\");",
4480 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004481 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
4482 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00004483 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00004484 verifyFormat("string s = someFunction(\n"
4485 " \"abc\"\n"
4486 " \"abc\");",
4487 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00004488
Daniel Jasper3251fff2014-06-10 06:27:23 +00004489 // As we break before unary operators, breaking right after them is bad.
4490 verifyFormat("string foo = abc ? \"x\"\n"
4491 " \"blah blah blah blah blah blah\"\n"
4492 " : \"y\";",
4493 Break);
4494
Daniel Jasperc834c702013-07-17 15:38:19 +00004495 // Don't break if there is no column gain.
4496 verifyFormat("f(\"aaaa\"\n"
4497 " \"bbbb\");",
4498 Break);
4499
4500 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004501 EXPECT_EQ("x = \"a\\\n"
4502 "b\\\n"
4503 "c\";",
4504 format("x = \"a\\\n"
4505 "b\\\n"
4506 "c\";",
4507 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004508 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004509 " \"a\\\n"
4510 "b\\\n"
4511 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004512 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004513 "b\\\n"
4514 "c\";",
4515 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00004516
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00004517 EXPECT_EQ("NSString *const kString =\n"
4518 " @\"aaaa\"\n"
4519 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004520 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004521 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004522 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00004523
4524 Break.ColumnLimit = 0;
4525 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00004526}
4527
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004528TEST_F(FormatTest, AlignsPipes) {
4529 verifyFormat(
4530 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4531 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4532 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4533 verifyFormat(
4534 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
4535 " << aaaaaaaaaaaaaaaaaaaa;");
4536 verifyFormat(
4537 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4538 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4539 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00004540 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4541 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4542 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004543 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
4544 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
4545 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
4546 verifyFormat(
4547 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4548 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4549 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004550 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4551 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4552 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4553 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00004554 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
4555 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00004556 verifyFormat(
4557 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4558 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00004559 verifyFormat(
4560 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
4561 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00004562
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004563 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
4564 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00004565 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4566 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4567 " aaaaaaaaaaaaaaaaaaaaa)\n"
4568 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00004569 verifyFormat("LOG_IF(aaa == //\n"
4570 " bbb)\n"
4571 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004572
Daniel Jasper467ddb12013-08-12 12:58:05 +00004573 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00004574 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4575 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004576 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
4577 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4578 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00004579 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
4580 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00004581 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4582 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4583 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4584 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4585 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4586 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4587 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004588
Daniel Jasperc238c872013-04-02 14:33:13 +00004589 verifyFormat(
4590 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4591 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00004592
4593 // Incomplete string literal.
4594 EXPECT_EQ("llvm::errs() << \"\n"
4595 " << a;",
4596 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00004597
4598 verifyFormat("void f() {\n"
4599 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
4600 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
4601 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00004602
4603 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00004604 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
4605 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
4606 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00004607
4608 // Handle '\n'.
4609 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
4610 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
4611 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
4612 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
4613 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
4614 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
4615 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004616}
4617
Daniel Jasper7209bb92016-12-13 11:16:42 +00004618TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
4619 verifyFormat("return out << \"somepacket = {\\n\"\n"
4620 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
4621 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
4622 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
4623 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
4624 " << \"}\";");
4625
4626 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4627 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4628 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
4629 verifyFormat(
4630 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
4631 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
4632 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
4633 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
4634 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
4635 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
4636 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
4637 verifyFormat(
4638 "void f() {\n"
4639 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
4640 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4641 "}");
4642
4643 // Breaking before the first "<<" is generally not desirable.
4644 verifyFormat(
4645 "llvm::errs()\n"
4646 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4647 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4648 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4649 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4650 getLLVMStyleWithColumns(70));
4651 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4652 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4653 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4654 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4655 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4656 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4657 getLLVMStyleWithColumns(70));
4658
4659 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4660 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4661 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
4662 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4663 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4664 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00004665 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
4666 " (aaaa + aaaa);",
4667 getLLVMStyleWithColumns(40));
4668 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
4669 " (aaaaaaa + aaaaa));",
4670 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00004671 verifyFormat(
4672 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
4673 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
4674 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00004675}
4676
Daniel Jasperf7935112012-12-03 18:12:45 +00004677TEST_F(FormatTest, UnderstandsEquals) {
4678 verifyFormat(
4679 "aaaaaaaaaaaaaaaaa =\n"
4680 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4681 verifyFormat(
4682 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004683 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004684 verifyFormat(
4685 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004686 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00004687 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004688 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
4689 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004690
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004691 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4692 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004693}
4694
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004695TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004696 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4697 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004698
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004699 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4700 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004701
4702 verifyFormat(
4703 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
4704 " Parameter2);");
4705
4706 verifyFormat(
4707 "ShortObject->shortFunction(\n"
4708 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
4709 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
4710
4711 verifyFormat("loooooooooooooongFunction(\n"
4712 " LoooooooooooooongObject->looooooooooooooooongFunction());");
4713
4714 verifyFormat(
4715 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
4716 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
4717
Daniel Jasper687af3b2013-02-14 14:26:07 +00004718 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4719 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00004720 verifyFormat("void f() {\n"
4721 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4722 " .Times(2)\n"
4723 " .WillRepeatedly(Return(SomeValue));\n"
4724 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00004725 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
4726 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00004727 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00004728 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4729 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00004730 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004731 verifyFormat("void f() {\n"
4732 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4733 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
4734 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00004735 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4736 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4737 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4738 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4739 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00004740 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4741 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4742 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4743 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
4744 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00004745
Daniel Jasperc7345cc2013-01-07 07:13:20 +00004746 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004747 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004748 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00004749 verifyFormat(
4750 "aaaaaaaaaaa->aaaaaaaaa(\n"
4751 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4752 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00004753
4754 verifyFormat(
4755 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4756 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00004757 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
4758 " aaaaaaaaa()->aaaaaa()->aaaaa());");
4759 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
4760 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004761
Daniel Jasper9b334242013-03-15 14:57:30 +00004762 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00004763 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4764 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00004765
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004766 FormatStyle NoBinPacking = getLLVMStyle();
4767 NoBinPacking.BinPackParameters = false;
4768 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4769 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4770 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
4771 " aaaaaaaaaaaaaaaaaaa,\n"
4772 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4773 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00004774
4775 // If there is a subsequent call, change to hanging indentation.
4776 verifyFormat(
4777 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4778 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
4779 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4780 verifyFormat(
4781 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4782 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00004783 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4784 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4785 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4786 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4787 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4788 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004789}
4790
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004791TEST_F(FormatTest, WrapsTemplateDeclarations) {
4792 verifyFormat("template <typename T>\n"
4793 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00004794 verifyFormat("template <typename T>\n"
4795 "// T should be one of {A, B}.\n"
4796 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004797 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00004798 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00004799 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004800 verifyFormat("template <typename T>\n"
4801 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
4802 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004803 verifyFormat(
4804 "template <typename T>\n"
4805 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
4806 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00004807 verifyFormat(
4808 "template <typename T>\n"
4809 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
4810 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
4811 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00004812 verifyFormat("template <typename T>\n"
4813 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004814 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00004815 verifyFormat(
4816 "template <typename T1, typename T2 = char, typename T3 = char,\n"
4817 " typename T4 = char>\n"
4818 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00004819 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
4820 " template <typename> class cccccccccccccccccccccc,\n"
4821 " typename ddddddddddddd>\n"
4822 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004823 verifyFormat(
4824 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
4825 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00004826
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004827 verifyFormat("void f() {\n"
4828 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
4829 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
4830 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00004831
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00004832 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00004833 verifyFormat("template <typename T> void f();");
4834 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00004835 verifyFormat(
4836 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4837 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4838 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
4839 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4840 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4841 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
4842 " bbbbbbbbbbbbbbbbbbbbbbbb);",
4843 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00004844 EXPECT_EQ("static_cast<A< //\n"
4845 " B> *>(\n"
4846 "\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00004847 ");",
Daniel Jasperfcfac102014-07-15 09:00:34 +00004848 format("static_cast<A<//\n"
4849 " B>*>(\n"
4850 "\n"
4851 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00004852 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4853 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00004854
4855 FormatStyle AlwaysBreak = getLLVMStyle();
4856 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
4857 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
4858 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
4859 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
4860 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4861 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
4862 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
4863 verifyFormat("template <template <typename> class Fooooooo,\n"
4864 " template <typename> class Baaaaaaar>\n"
4865 "struct C {};",
4866 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00004867 verifyFormat("template <typename T> // T can be A, B or C.\n"
4868 "struct C {};",
4869 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00004870 verifyFormat("template <enum E> class A {\n"
4871 "public:\n"
4872 " E *f();\n"
4873 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004874}
4875
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00004876TEST_F(FormatTest, WrapsTemplateParameters) {
4877 FormatStyle Style = getLLVMStyle();
4878 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4879 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4880 verifyFormat(
4881 "template <typename... a> struct q {};\n"
4882 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
4883 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
4884 " y;",
4885 Style);
4886 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4887 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4888 verifyFormat(
4889 "template <typename... a> struct r {};\n"
4890 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
4891 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
4892 " y;",
4893 Style);
4894 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4895 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4896 verifyFormat(
4897 "template <typename... a> struct s {};\n"
4898 "extern s<\n"
4899 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4900 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
4901 " y;",
4902 Style);
4903 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4904 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4905 verifyFormat(
4906 "template <typename... a> struct t {};\n"
4907 "extern t<\n"
4908 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4909 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
4910 " y;",
4911 Style);
4912}
4913
Daniel Jasper45797022013-01-25 10:57:27 +00004914TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
4915 verifyFormat(
4916 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4917 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4918 verifyFormat(
4919 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4920 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4921 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
4922
Daniel Jasper0f0234e2013-05-08 10:00:18 +00004923 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00004924 verifyFormat(
4925 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4926 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00004927 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00004928
Daniel Jasper45797022013-01-25 10:57:27 +00004929 verifyFormat(
4930 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00004931 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00004932
4933 // Breaking at nested name specifiers is generally not desirable.
4934 verifyFormat(
4935 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4936 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004937
4938 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004939 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
4940 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4941 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004942 " aaaaaaaaaaaaaaaaaaaaa);",
4943 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00004944
4945 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4946 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4947 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00004948}
4949
Daniel Jasperf7935112012-12-03 18:12:45 +00004950TEST_F(FormatTest, UnderstandsTemplateParameters) {
4951 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00004952 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004953 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
4954 verifyFormat("bool x = a < 1 || 2 > a;");
4955 verifyFormat("bool x = 5 < f<int>();");
4956 verifyFormat("bool x = f<int>() > 5;");
4957 verifyFormat("bool x = 5 < a<int>::x;");
4958 verifyFormat("bool x = a < 4 ? a > 2 : false;");
4959 verifyFormat("bool x = f() ? a < 2 : a > 2;");
4960
4961 verifyGoogleFormat("A<A<int>> a;");
4962 verifyGoogleFormat("A<A<A<int>>> a;");
4963 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00004964 verifyGoogleFormat("A<A<int> > a;");
4965 verifyGoogleFormat("A<A<A<int> > > a;");
4966 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00004967 verifyGoogleFormat("A<::A<int>> a;");
4968 verifyGoogleFormat("A<::A> a;");
4969 verifyGoogleFormat("A< ::A> a;");
4970 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00004971 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
4972 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00004973 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
4974 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00004975 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
4976 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00004977
Nico Weber7533b4d2014-09-24 17:17:32 +00004978 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
4979
Daniel Jasperf7935112012-12-03 18:12:45 +00004980 verifyFormat("test >> a >> b;");
4981 verifyFormat("test << a >> b;");
4982
4983 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004984 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00004985 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00004986 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
4987 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00004988 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00004989 verifyFormat("f(a.operator()<A>());");
4990 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4991 " .template operator()<A>());",
4992 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00004993
4994 // Not template parameters.
4995 verifyFormat("return a < b && c > d;");
4996 verifyFormat("void f() {\n"
4997 " while (a < b && c > d) {\n"
4998 " }\n"
4999 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005000 verifyFormat("template <typename... Types>\n"
5001 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005002
5003 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5004 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5005 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005006 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005007 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005008 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005009}
5010
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005011TEST_F(FormatTest, BitshiftOperatorWidth) {
5012 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5013 " bar */",
5014 format("int a=1<<2; /* foo\n"
5015 " bar */"));
5016
5017 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5018 " bar */",
5019 format("int b =256>>1 ; /* foo\n"
5020 " bar */"));
5021}
5022
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005023TEST_F(FormatTest, UnderstandsBinaryOperators) {
5024 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005025 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005026}
5027
5028TEST_F(FormatTest, UnderstandsPointersToMembers) {
5029 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005030 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005031 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005032 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005033 verifyFormat("void f() {\n"
5034 " (a->*f)();\n"
5035 " a->*x;\n"
5036 " (a.*f)();\n"
5037 " ((*a).*f)();\n"
5038 " a.*x;\n"
5039 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005040 verifyFormat("void f() {\n"
5041 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5042 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5043 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005044 verifyFormat(
5045 "(aaaaaaaaaa->*bbbbbbb)(\n"
5046 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005047 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005048 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005049 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005050}
5051
Daniel Jasper8dd40472012-12-21 09:41:31 +00005052TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005053 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005054 verifyFormat("f(-1, -2, -3);");
5055 verifyFormat("a[-1] = 5;");
5056 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005057 verifyFormat("if (i == -1) {\n}");
5058 verifyFormat("if (i != -1) {\n}");
5059 verifyFormat("if (i > -1) {\n}");
5060 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005061 verifyFormat("++(a->f());");
5062 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005063 verifyFormat("(a->f())++;");
5064 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005065 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005066
5067 verifyFormat("a-- > b;");
5068 verifyFormat("b ? -a : c;");
5069 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005070 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005071 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005072 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005073
5074 verifyFormat("return -1;");
5075 verifyFormat("switch (a) {\n"
5076 "case -1:\n"
5077 " break;\n"
5078 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005079 verifyFormat("#define X -1");
5080 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005081
Chandler Carruthf8b72662014-03-02 12:37:31 +00005082 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5083 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005084
5085 verifyFormat("int a = /* confusing comment */ -1;");
5086 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5087 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005088}
5089
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005090TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005091 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005092 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005093 "}");
5094 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005095 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005096 verifyFormat("*aaa = aaaaaaa( // break\n"
5097 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005098}
5099
Daniel Jasper8863ada2013-08-26 08:10:17 +00005100TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005101 verifyFormat("bool operator<();");
5102 verifyFormat("bool operator>();");
5103 verifyFormat("bool operator=();");
5104 verifyFormat("bool operator==();");
5105 verifyFormat("bool operator!=();");
5106 verifyFormat("int operator+();");
5107 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00005108 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005109 verifyFormat("bool operator();");
5110 verifyFormat("bool operator()();");
5111 verifyFormat("bool operator[]();");
5112 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005113 verifyFormat("operator int();");
5114 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005115 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005116 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005117 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005118 verifyFormat("void *operator new(std::size_t size);");
5119 verifyFormat("void *operator new[](std::size_t size);");
5120 verifyFormat("void operator delete(void *ptr);");
5121 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00005122 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5123 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00005124 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00005125 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005126
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005127 verifyFormat(
5128 "ostream &operator<<(ostream &OutputStream,\n"
5129 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00005130 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5131 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5132 " return left.group < right.group;\n"
5133 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00005134 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00005135 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005136
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005137 verifyGoogleFormat("operator void*();");
5138 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00005139 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00005140
5141 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00005142 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5143 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005144}
5145
Daniel Jasper1c220482015-02-25 10:30:06 +00005146TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00005147 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5148 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5149 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5150 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5151 verifyFormat("Deleted &operator=(const Deleted &) &;");
5152 verifyFormat("Deleted &operator=(const Deleted &) &&;");
5153 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5154 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5155 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5156 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5157 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00005158 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00005159 verifyFormat("template <typename T>\n"
5160 "void F(T) && = delete;",
5161 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00005162
Daniel Jasperaf642c62015-08-25 13:40:51 +00005163 FormatStyle AlignLeft = getLLVMStyle();
5164 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005165 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005166 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5167 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5168 AlignLeft);
5169 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5170 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005171 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5172 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5173 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5174 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00005175 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005176
5177 FormatStyle Spaces = getLLVMStyle();
5178 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005179 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5180 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5181 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5182 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005183
5184 Spaces.SpacesInCStyleCastParentheses = false;
5185 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005186 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5187 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5188 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5189 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005190}
5191
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005192TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005193 verifyFormat("void f() {\n"
5194 " A *a = new A;\n"
5195 " A *a = new (placement) A;\n"
5196 " delete a;\n"
5197 " delete (A *)a;\n"
5198 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005199 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5200 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005201 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5202 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5203 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005204 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005205}
5206
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005207TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005208 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005209 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005210 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005211 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005212 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005213 verifyIndependentOfContext("int a = b * 10;");
5214 verifyIndependentOfContext("int a = 10 * b;");
5215 verifyIndependentOfContext("int a = b * c;");
5216 verifyIndependentOfContext("int a += b * c;");
5217 verifyIndependentOfContext("int a -= b * c;");
5218 verifyIndependentOfContext("int a *= b * c;");
5219 verifyIndependentOfContext("int a /= b * c;");
5220 verifyIndependentOfContext("int a = *b;");
5221 verifyIndependentOfContext("int a = *b * c;");
5222 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00005223 verifyIndependentOfContext("int a = b * (10);");
5224 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005225 verifyIndependentOfContext("return 10 * b;");
5226 verifyIndependentOfContext("return *b * *c;");
5227 verifyIndependentOfContext("return a & ~b;");
5228 verifyIndependentOfContext("f(b ? *c : *d);");
5229 verifyIndependentOfContext("int a = b ? *c : *d;");
5230 verifyIndependentOfContext("*b = a;");
5231 verifyIndependentOfContext("a * ~b;");
5232 verifyIndependentOfContext("a * !b;");
5233 verifyIndependentOfContext("a * +b;");
5234 verifyIndependentOfContext("a * -b;");
5235 verifyIndependentOfContext("a * ++b;");
5236 verifyIndependentOfContext("a * --b;");
5237 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00005238 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005239 verifyIndependentOfContext("f() * b;");
5240 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005241 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005242 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00005243 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005244 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00005245 verifyIndependentOfContext("return sizeof(int **);");
5246 verifyIndependentOfContext("return sizeof(int ******);");
5247 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00005248 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005249 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00005250 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00005251 verifyGoogleFormat("return sizeof(int**);");
5252 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5253 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005254 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00005255 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00005256 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00005257 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00005258 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00005259 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00005260 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00005261 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00005262 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00005263 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00005264 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00005265 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00005266 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00005267 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00005268 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00005269 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00005270 verifyFormat("void f(const MyOverride &override);");
5271 verifyFormat("void f(const MyFinal &final);");
5272 verifyIndependentOfContext("bool a = f() && override.f();");
5273 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00005274
Daniel Jasper5b49f472013-01-23 12:10:53 +00005275 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00005276
Daniel Jasper5b49f472013-01-23 12:10:53 +00005277 verifyIndependentOfContext("A<int *> a;");
5278 verifyIndependentOfContext("A<int **> a;");
5279 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00005280 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005281 verifyIndependentOfContext(
5282 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005283 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00005284 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00005285 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00005286 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00005287 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00005288
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00005289 verifyFormat(
5290 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5291 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5292
Daniel Jasper1f5d6372016-06-13 14:45:12 +00005293 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00005294 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00005295 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005296 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00005297 verifyGoogleFormat("A<int*> a;");
5298 verifyGoogleFormat("A<int**> a;");
5299 verifyGoogleFormat("A<int*, int*> a;");
5300 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005301 verifyGoogleFormat("f(b ? *c : *d);");
5302 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00005303 verifyGoogleFormat("Type* t = **x;");
5304 verifyGoogleFormat("Type* t = *++*x;");
5305 verifyGoogleFormat("*++*x;");
5306 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5307 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005308 verifyGoogleFormat(
5309 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00005310 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00005311 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5312 verifyGoogleFormat("template <typename T>\n"
5313 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00005314
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005315 FormatStyle Left = getLLVMStyle();
5316 Left.PointerAlignment = FormatStyle::PAS_Left;
5317 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00005318 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00005319 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005320
Daniel Jasper5b49f472013-01-23 12:10:53 +00005321 verifyIndependentOfContext("a = *(x + y);");
5322 verifyIndependentOfContext("a = &(x + y);");
5323 verifyIndependentOfContext("*(x + y).call();");
5324 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005325 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00005326
Daniel Jasper5b49f472013-01-23 12:10:53 +00005327 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00005328 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00005329 "int *MyValues = {\n"
5330 " *A, // Operator detection might be confused by the '{'\n"
5331 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00005332 "};");
Nico Weber80a82762013-01-17 17:17:19 +00005333
Daniel Jasper5b49f472013-01-23 12:10:53 +00005334 verifyIndependentOfContext("if (int *a = &b)");
5335 verifyIndependentOfContext("if (int &a = *b)");
5336 verifyIndependentOfContext("if (a & b[i])");
5337 verifyIndependentOfContext("if (a::b::c::d & b[i])");
5338 verifyIndependentOfContext("if (*b[i])");
5339 verifyIndependentOfContext("if (int *a = (&b))");
5340 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00005341 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00005342 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00005343 verifyFormat("void f() {\n"
5344 " for (const int &v : Values) {\n"
5345 " }\n"
5346 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005347 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5348 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00005349 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00005350
Daniel Jaspera98da3d2013-11-07 19:56:07 +00005351 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005352 verifyFormat("#define MACRO \\\n"
5353 " int *i = a * b; \\\n"
5354 " void f(a *b);",
5355 getLLVMStyleWithColumns(19));
5356
Daniel Jasper97b89482013-03-13 07:49:51 +00005357 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005358 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005359 verifyIndependentOfContext("T **t = new T *;");
5360 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00005361 verifyGoogleFormat("A = new SomeType*[Length]();");
5362 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005363 verifyGoogleFormat("T** t = new T*;");
5364 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005365
Daniel Jasper990ff972013-05-07 14:17:18 +00005366 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005367 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00005368 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00005369 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5370 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005371 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005372 "typename t::if<x && y>::type f() {}");
5373 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005374 verifyFormat("vector<int *> v;");
5375 verifyFormat("vector<int *const> v;");
5376 verifyFormat("vector<int *const **const *> v;");
5377 verifyFormat("vector<int *volatile> v;");
5378 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005379 verifyFormat("foo<b && false>();");
5380 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00005381 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00005382 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005383 "template <class T, class = typename std::enable_if<\n"
5384 " std::is_integral<T>::value &&\n"
5385 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
5386 "void F();",
5387 getLLVMStyleWithColumns(70));
5388 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005389 "template <class T,\n"
5390 " class = typename std::enable_if<\n"
5391 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005392 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
5393 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005394 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005395 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005396 verifyFormat(
5397 "template <class T,\n"
5398 " class = typename ::std::enable_if<\n"
5399 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
5400 "void F();",
5401 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005402
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005403 verifyIndependentOfContext("MACRO(int *i);");
5404 verifyIndependentOfContext("MACRO(auto *a);");
5405 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00005406 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00005407 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00005408 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005409 // FIXME: Is there a way to make this work?
5410 // verifyIndependentOfContext("MACRO(A *a);");
5411
Daniel Jasper32ccb032014-06-23 07:36:18 +00005412 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00005413 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00005414
Daniel Jasper866468a2014-04-14 13:15:29 +00005415 EXPECT_EQ("#define OP(x) \\\n"
5416 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5417 " return s << a.DebugString(); \\\n"
5418 " }",
5419 format("#define OP(x) \\\n"
5420 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5421 " return s << a.DebugString(); \\\n"
5422 " }",
5423 getLLVMStyleWithColumns(50)));
5424
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005425 // FIXME: We cannot handle this case yet; we might be able to figure out that
5426 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00005427 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00005428
5429 FormatStyle PointerMiddle = getLLVMStyle();
5430 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
5431 verifyFormat("delete *x;", PointerMiddle);
5432 verifyFormat("int * x;", PointerMiddle);
5433 verifyFormat("template <int * y> f() {}", PointerMiddle);
5434 verifyFormat("int * f(int * a) {}", PointerMiddle);
5435 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
5436 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
5437 verifyFormat("A<int *> a;", PointerMiddle);
5438 verifyFormat("A<int **> a;", PointerMiddle);
5439 verifyFormat("A<int *, int *> a;", PointerMiddle);
5440 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00005441 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
5442 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00005443 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005444
5445 // Member function reference qualifiers aren't binary operators.
5446 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005447 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005448 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005449 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005450 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005451 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005452}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005453
Daniel Jasperee6d6502013-07-17 20:25:02 +00005454TEST_F(FormatTest, UnderstandsAttributes) {
5455 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00005456 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
5457 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005458 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005459 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005460 verifyFormat("__attribute__((nodebug)) void\n"
5461 "foo() {}\n",
5462 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00005463}
5464
Daniel Jasper10cd5812013-05-06 06:35:44 +00005465TEST_F(FormatTest, UnderstandsEllipsis) {
5466 verifyFormat("int printf(const char *fmt, ...);");
5467 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005468 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5469
5470 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005471 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005472 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00005473}
5474
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005475TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005476 EXPECT_EQ("int *a;\n"
5477 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005478 "int *a;",
5479 format("int *a;\n"
5480 "int* a;\n"
5481 "int *a;",
5482 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005483 EXPECT_EQ("int* a;\n"
5484 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005485 "int* a;",
5486 format("int* a;\n"
5487 "int* a;\n"
5488 "int *a;",
5489 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005490 EXPECT_EQ("int *a;\n"
5491 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005492 "int *a;",
5493 format("int *a;\n"
5494 "int * a;\n"
5495 "int * a;",
5496 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005497 EXPECT_EQ("auto x = [] {\n"
5498 " int *a;\n"
5499 " int *a;\n"
5500 " int *a;\n"
5501 "};",
5502 format("auto x=[]{int *a;\n"
5503 "int * a;\n"
5504 "int * a;};",
5505 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005506}
5507
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005508TEST_F(FormatTest, UnderstandsRvalueReferences) {
5509 verifyFormat("int f(int &&a) {}");
5510 verifyFormat("int f(int a, char &&b) {}");
5511 verifyFormat("void f() { int &&a = b; }");
5512 verifyGoogleFormat("int f(int a, char&& b) {}");
5513 verifyGoogleFormat("void f() { int&& a = b; }");
5514
Daniel Jasper1eff9082013-05-27 16:36:33 +00005515 verifyIndependentOfContext("A<int &&> a;");
5516 verifyIndependentOfContext("A<int &&, int &&> a;");
5517 verifyGoogleFormat("A<int&&> a;");
5518 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00005519
5520 // Not rvalue references:
5521 verifyFormat("template <bool B, bool C> class A {\n"
5522 " static_assert(B && C, \"Something is wrong\");\n"
5523 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00005524 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
5525 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00005526 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005527}
5528
Manuel Klimekc1237a82013-01-23 14:08:21 +00005529TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
5530 verifyFormat("void f() {\n"
5531 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005532 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005533 "}",
5534 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00005535}
5536
Daniel Jasperef906a92013-01-13 08:01:36 +00005537TEST_F(FormatTest, FormatsCasts) {
5538 verifyFormat("Type *A = static_cast<Type *>(P);");
5539 verifyFormat("Type *A = (Type *)P;");
5540 verifyFormat("Type *A = (vector<Type *, int *>)P;");
5541 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00005542 verifyFormat("int a = (int)2.0f;");
5543 verifyFormat("x[(int32)y];");
5544 verifyFormat("x = (int32)y;");
5545 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
5546 verifyFormat("int a = (int)*b;");
5547 verifyFormat("int a = (int)2.0f;");
5548 verifyFormat("int a = (int)~0;");
5549 verifyFormat("int a = (int)++a;");
5550 verifyFormat("int a = (int)sizeof(int);");
5551 verifyFormat("int a = (int)+2;");
5552 verifyFormat("my_int a = (my_int)2.0f;");
5553 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00005554 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00005555 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00005556 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00005557 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00005558 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00005559
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005560 verifyFormat("void f() { my_int a = (my_int)*b; }");
5561 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
5562 verifyFormat("my_int a = (my_int)~0;");
5563 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00005564 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005565 verifyFormat("my_int a = (my_int)1;");
5566 verifyFormat("my_int a = (my_int *)1;");
5567 verifyFormat("my_int a = (const my_int)-1;");
5568 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00005569 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00005570 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00005571 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00005572 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005573
5574 // FIXME: single value wrapped with paren will be treated as cast.
5575 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00005576
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00005577 verifyFormat("{ (void)F; }");
5578
Daniel Jasper998cabc2013-07-18 14:46:07 +00005579 // Don't break after a cast's
5580 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5581 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
5582 " bbbbbbbbbbbbbbbbbbbbbb);");
5583
Daniel Jasperef906a92013-01-13 08:01:36 +00005584 // These are not casts.
5585 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00005586 verifyFormat("f(foo)->b;");
5587 verifyFormat("f(foo).b;");
5588 verifyFormat("f(foo)(b);");
5589 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005590 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00005591 verifyFormat("(*funptr)(foo)[4];");
5592 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00005593 verifyFormat("void f(int *);");
5594 verifyFormat("void f(int *) = 0;");
5595 verifyFormat("void f(SmallVector<int>) {}");
5596 verifyFormat("void f(SmallVector<int>);");
5597 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00005598 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00005599 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005600 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00005601 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
5602 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00005603 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005604
Daniel Jasperba0bda92013-02-23 08:07:18 +00005605 // These are not casts, but at some point were confused with casts.
5606 verifyFormat("virtual void foo(int *) override;");
5607 verifyFormat("virtual void foo(char &) const;");
5608 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00005609 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005610 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00005611 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00005612 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00005613
5614 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
5615 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005616 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005617 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005618 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5619 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
5620 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00005621}
5622
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005623TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005624 verifyFormat("A<bool()> a;");
5625 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00005626 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00005627 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005628 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005629 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005630 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00005631 verifyFormat("template <class CallbackClass>\n"
5632 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00005633
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005634 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
5635 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00005636 verifyGoogleFormat(
5637 "template <class CallbackClass>\n"
5638 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00005639
Daniel Jasper5dad58e2013-05-15 07:51:51 +00005640 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00005641 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00005642 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00005643 verifyFormat("some_var = function(*some_pointer_var)[0];");
5644 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00005645 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00005646 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00005647 verifyFormat("std::function<\n"
5648 " LooooooooooongTemplatedType<\n"
5649 " SomeType>*(\n"
5650 " LooooooooooooooooongType type)>\n"
5651 " function;",
5652 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005653}
5654
Daniel Jasperbeaa3222015-02-26 11:30:50 +00005655TEST_F(FormatTest, FormatsPointersToArrayTypes) {
5656 verifyFormat("A (*foo_)[6];");
5657 verifyFormat("vector<int> (*foo_)[6];");
5658}
5659
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005660TEST_F(FormatTest, BreaksLongVariableDeclarations) {
5661 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5662 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
5663 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
5664 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00005665 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5666 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005667
5668 // Different ways of ()-initializiation.
5669 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5670 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
5671 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5672 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
5673 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5674 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00005675 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5676 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00005677
5678 // Lambdas should not confuse the variable declaration heuristic.
5679 verifyFormat("LooooooooooooooooongType\n"
5680 " variable(nullptr, [](A *a) {});",
5681 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005682}
5683
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005684TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00005685 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005686 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005687 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005688 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00005689 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005690 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00005691 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
5692 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00005693 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5694 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00005695 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
5696 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00005697 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
5698 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00005699 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
5700 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005701 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5702 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
5703 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5704 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00005705 FormatStyle Indented = getLLVMStyle();
5706 Indented.IndentWrappedFunctionNames = true;
5707 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5708 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
5709 Indented);
5710 verifyFormat(
5711 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5712 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5713 Indented);
5714 verifyFormat(
5715 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
5716 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5717 Indented);
5718 verifyFormat(
5719 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
5720 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5721 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00005722
5723 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00005724 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
5725 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
5726 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00005727
Daniel Jasperd2639ef2013-01-28 15:16:31 +00005728 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005729 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00005730 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00005731 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
5732 " SourceLocation L, IdentifierIn *II,\n"
5733 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005734 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005735 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005736 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005737 " const SomeType<string, SomeOtherTemplateParameter>\n"
5738 " &ReallyReallyLongParameterName,\n"
5739 " const SomeType<string, SomeOtherTemplateParameter>\n"
5740 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00005741 verifyFormat("template <typename A>\n"
5742 "SomeLoooooooooooooooooooooongType<\n"
5743 " typename some_namespace::SomeOtherType<A>::Type>\n"
5744 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005745
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00005746 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00005747 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
5748 " aaaaaaaaaaaaaaaaaaaaaaa;");
5749 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005750 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
5751 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00005752 verifyGoogleFormat(
5753 "some_namespace::LongReturnType\n"
5754 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005755 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00005756
5757 verifyGoogleFormat("template <typename T>\n"
5758 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005759 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00005760 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5761 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00005762
5763 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005764 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5765 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00005766 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5767 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
5768 " aaaaaaaaaaaaaaaaaaaaaaaa);");
5769 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5770 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
5771 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
5772 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00005773
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00005774 verifyFormat("template <typename T> // Templates on own line.\n"
5775 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00005776 "MyFunction(int a);",
5777 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00005778}
5779
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005780TEST_F(FormatTest, FormatsArrays) {
5781 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5782 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00005783 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
5784 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00005785 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
5786 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005787 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5788 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5789 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5790 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
5791 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5792 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5793 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5794 verifyFormat(
5795 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
5796 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5797 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00005798 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
5799 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00005800
5801 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
5802 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00005803 verifyFormat(
5804 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
5805 " .aaaaaaa[0]\n"
5806 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00005807 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00005808
5809 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00005810
5811 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
5812 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005813}
5814
Daniel Jaspere9de2602012-12-06 09:56:08 +00005815TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
5816 verifyFormat("(a)->b();");
5817 verifyFormat("--a;");
5818}
5819
Daniel Jasper8b529712012-12-04 13:02:32 +00005820TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00005821 verifyFormat("#include <string>\n"
5822 "#include <a/b/c.h>\n"
5823 "#include \"a/b/string\"\n"
5824 "#include \"string.h\"\n"
5825 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00005826 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005827 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00005828 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00005829 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00005830 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005831 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
5832 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00005833 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
5834 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00005835
Daniel Jasper5ef433f2013-01-13 08:12:18 +00005836 verifyFormat("#import <string>");
5837 verifyFormat("#import <a/b/c.h>");
5838 verifyFormat("#import \"a/b/string\"");
5839 verifyFormat("#import \"string.h\"");
5840 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00005841 verifyFormat("#if __has_include(<strstream>)\n"
5842 "#include <strstream>\n"
5843 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00005844
Daniel Jasper343643b2014-08-13 08:29:18 +00005845 verifyFormat("#define MY_IMPORT <a/b>");
5846
Nico Weber21088802017-02-10 19:36:52 +00005847 verifyFormat("#if __has_include(<a/b>)");
5848 verifyFormat("#if __has_include_next(<a/b>)");
5849 verifyFormat("#define F __has_include(<a/b>)");
5850 verifyFormat("#define F __has_include_next(<a/b>)");
5851
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00005852 // Protocol buffer definition or missing "#".
5853 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
5854 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00005855
5856 FormatStyle Style = getLLVMStyle();
5857 Style.AlwaysBreakBeforeMultilineStrings = true;
5858 Style.ColumnLimit = 0;
5859 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00005860
5861 // But 'import' might also be a regular C++ namespace.
5862 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5863 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00005864}
5865
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005866//===----------------------------------------------------------------------===//
5867// Error recovery tests.
5868//===----------------------------------------------------------------------===//
5869
Daniel Jasper66e9dee2013-02-14 09:19:04 +00005870TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005871 FormatStyle NoBinPacking = getLLVMStyle();
5872 NoBinPacking.BinPackParameters = false;
5873 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
5874 " double *min_x,\n"
5875 " double *max_x,\n"
5876 " double *min_y,\n"
5877 " double *max_y,\n"
5878 " double *min_z,\n"
5879 " double *max_z, ) {}",
5880 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00005881}
5882
Daniel Jasper83a54d22013-01-10 09:26:47 +00005883TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00005884 verifyFormat("void f() { return; }\n42");
5885 verifyFormat("void f() {\n"
5886 " if (0)\n"
5887 " return;\n"
5888 "}\n"
5889 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00005890 verifyFormat("void f() { return }\n42");
5891 verifyFormat("void f() {\n"
5892 " if (0)\n"
5893 " return\n"
5894 "}\n"
5895 "42");
5896}
5897
5898TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
5899 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
5900 EXPECT_EQ("void f() {\n"
5901 " if (a)\n"
5902 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005903 "}",
5904 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00005905 EXPECT_EQ("namespace N {\n"
5906 "void f()\n"
5907 "}",
5908 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00005909 EXPECT_EQ("namespace N {\n"
5910 "void f() {}\n"
5911 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00005912 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005913 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00005914}
5915
Daniel Jasper2df93312013-01-09 10:16:05 +00005916TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
5917 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00005918 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005919 " b;",
5920 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00005921 verifyFormat("function(\n"
5922 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005923 " LoooooooooooongArgument);\n",
5924 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00005925}
5926
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005927TEST_F(FormatTest, IncorrectAccessSpecifier) {
5928 verifyFormat("public:");
5929 verifyFormat("class A {\n"
5930 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005931 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005932 "};");
5933 verifyFormat("public\n"
5934 "int qwerty;");
5935 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005936 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005937 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005938 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005939 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005940 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005941}
Daniel Jasperf7935112012-12-03 18:12:45 +00005942
Daniel Jasper291f9362013-03-20 15:58:10 +00005943TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
5944 verifyFormat("{");
5945 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00005946 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00005947}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005948
5949TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005950 verifyFormat("do {\n}");
5951 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005952 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005953 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005954 "wheeee(fun);");
5955 verifyFormat("do {\n"
5956 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00005957 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005958}
5959
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005960TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00005961 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005962 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00005963 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005964 verifyFormat("while {\n foo;\n foo();\n}");
5965 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00005966}
5967
Daniel Jasperc0880a92013-01-04 18:52:56 +00005968TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00005969 verifyIncompleteFormat("namespace {\n"
5970 "class Foo { Foo (\n"
5971 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00005972 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00005973}
5974
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005975TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005976 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005977 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
5978 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005979 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005980
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005981 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005982 " {\n"
5983 " breakme(\n"
5984 " qwe);\n"
5985 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005986 format("{\n"
5987 " {\n"
5988 " breakme(qwe);\n"
5989 "}\n",
5990 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005991}
5992
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00005993TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005994 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005995 " avariable,\n"
5996 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005997 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00005998}
5999
Manuel Klimek762dd182013-01-21 10:07:49 +00006000TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006001 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006002}
6003
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006004TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006005 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006006 verifyFormat("vector<int> x{\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006007 " 1,\n"
6008 " 2,\n"
6009 " 3,\n"
6010 " 4,\n"
Daniel Jaspera125d532014-03-21 12:38:57 +00006011 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006012 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6013 verifyFormat("f({1, 2});");
6014 verifyFormat("auto v = Foo{-1};");
6015 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6016 verifyFormat("Class::Class : member{1, 2, 3} {}");
6017 verifyFormat("new vector<int>{1, 2, 3};");
6018 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006019 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006020 verifyFormat("return {arg1, arg2};");
6021 verifyFormat("return {arg1, SomeType{parameter}};");
6022 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6023 verifyFormat("new T{arg1, arg2};");
6024 verifyFormat("f(MyMap[{composite, key}]);");
6025 verifyFormat("class Class {\n"
6026 " T member = {arg1, arg2};\n"
6027 "};");
6028 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00006029 verifyFormat("const struct A a = {.a = 1, .b = 2};");
6030 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006031 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6032 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006033
Daniel Jasper438059e2014-05-22 12:11:13 +00006034 verifyFormat("int foo(int i) { return fo1{}(i); }");
6035 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006036 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006037 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006038 verifyFormat("Node n{1, Node{1000}, //\n"
6039 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006040 verifyFormat("Aaaa aaaaaaa{\n"
6041 " {\n"
6042 " aaaa,\n"
6043 " },\n"
6044 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006045 verifyFormat("class C : public D {\n"
6046 " SomeClass SC{2};\n"
6047 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006048 verifyFormat("class C : public A {\n"
6049 " class D : public B {\n"
6050 " void f() { int i{2}; }\n"
6051 " };\n"
6052 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006053 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006054
Francois Ferrandd2130f52017-06-30 20:00:02 +00006055 // Binpacking only if there is no trailing comma
6056 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
6057 " cccccccccc, dddddddddd};",
6058 getLLVMStyleWithColumns(50));
6059 verifyFormat("const Aaaaaa aaaaa = {\n"
6060 " aaaaaaaaaaa,\n"
6061 " bbbbbbbbbbb,\n"
6062 " ccccccccccc,\n"
6063 " ddddddddddd,\n"
6064 "};", getLLVMStyleWithColumns(50));
6065
Daniel Jaspere4ada022016-12-13 10:05:03 +00006066 // Cases where distinguising braced lists and blocks is hard.
6067 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
6068 verifyFormat("void f() {\n"
6069 " return; // comment\n"
6070 "}\n"
6071 "SomeType t;");
6072 verifyFormat("void f() {\n"
6073 " if (a) {\n"
6074 " f();\n"
6075 " }\n"
6076 "}\n"
6077 "SomeType t;");
6078
Daniel Jasper08434342015-05-26 07:26:26 +00006079 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006080 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006081 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006082 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6083 " bbbbb,\n"
6084 " ccccc,\n"
6085 " ddddd,\n"
6086 " eeeee,\n"
6087 " ffffff,\n"
6088 " ggggg,\n"
6089 " hhhhhh,\n"
6090 " iiiiii,\n"
6091 " jjjjjj,\n"
6092 " kkkkkk};",
6093 NoBinPacking);
6094 verifyFormat("const Aaaaaa aaaaa = {\n"
6095 " aaaaa,\n"
6096 " bbbbb,\n"
6097 " ccccc,\n"
6098 " ddddd,\n"
6099 " eeeee,\n"
6100 " ffffff,\n"
6101 " ggggg,\n"
6102 " hhhhhh,\n"
6103 " iiiiii,\n"
6104 " jjjjjj,\n"
6105 " kkkkkk,\n"
6106 "};",
6107 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006108 verifyFormat(
6109 "const Aaaaaa aaaaa = {\n"
6110 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6111 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6112 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6113 "};",
6114 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006115
Chandler Carruthf8b72662014-03-02 12:37:31 +00006116 // FIXME: The alignment of these trailing comments might be bad. Then again,
6117 // this might be utterly useless in real code.
6118 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006119 " : some_value{ //\n"
6120 " aaaaaaa, //\n"
6121 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006122
Chandler Carruthf8b72662014-03-02 12:37:31 +00006123 // In braced lists, the first comment is always assumed to belong to the
6124 // first element. Thus, it can be moved to the next or previous line as
6125 // appropriate.
6126 EXPECT_EQ("function({// First element:\n"
6127 " 1,\n"
6128 " // Second element:\n"
6129 " 2});",
6130 format("function({\n"
6131 " // First element:\n"
6132 " 1,\n"
6133 " // Second element:\n"
6134 " 2});"));
6135 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6136 " // First element:\n"
6137 " 1,\n"
6138 " // Second element:\n"
6139 " 2};",
6140 format("std::vector<int> MyNumbers{// First element:\n"
6141 " 1,\n"
6142 " // Second element:\n"
6143 " 2};",
6144 getLLVMStyleWithColumns(30)));
Francois Ferrandd2130f52017-06-30 20:00:02 +00006145 // A trailing comma should still lead to an enforced line break and no
6146 // binpacking.
Daniel Jasper64a328e2014-11-11 19:34:57 +00006147 EXPECT_EQ("vector<int> SomeVector = {\n"
6148 " // aaa\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006149 " 1,\n"
6150 " 2,\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006151 "};",
6152 format("vector<int> SomeVector = { // aaa\n"
6153 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006154
Chandler Carruthf8b72662014-03-02 12:37:31 +00006155 FormatStyle ExtraSpaces = getLLVMStyle();
6156 ExtraSpaces.Cpp11BracedListStyle = false;
6157 ExtraSpaces.ColumnLimit = 75;
6158 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6159 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6160 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6161 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6162 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6163 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6164 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6165 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6166 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6167 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6168 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6169 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6170 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6171 verifyFormat("class Class {\n"
6172 " T member = { arg1, arg2 };\n"
6173 "};",
6174 ExtraSpaces);
6175 verifyFormat(
6176 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6177 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6178 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6179 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6180 ExtraSpaces);
6181 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006182 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006183 ExtraSpaces);
6184 verifyFormat(
6185 "someFunction(OtherParam,\n"
6186 " BracedList{ // comment 1 (Forcing interesting break)\n"
6187 " param1, param2,\n"
6188 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006189 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006190 ExtraSpaces);
6191 verifyFormat(
6192 "std::this_thread::sleep_for(\n"
6193 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6194 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00006195 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006196 " aaaaaaa,\n"
6197 " aaaaaaaaaa,\n"
6198 " aaaaa,\n"
6199 " aaaaaaaaaaaaaaa,\n"
6200 " aaa,\n"
6201 " aaaaaaaaaa,\n"
6202 " a,\n"
6203 " aaaaaaaaaaaaaaaaaaaaa,\n"
6204 " aaaaaaaaaaaa,\n"
6205 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6206 " aaaaaaa,\n"
6207 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006208 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Francois Ferrand5f07f442017-06-19 14:41:21 +00006209 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
6210 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006211}
6212
Daniel Jasper33b909c2013-10-25 14:29:37 +00006213TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006214 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6215 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6216 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6217 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6218 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6219 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006220 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006221 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006222 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006223 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6224 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006225 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006226 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6227 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6228 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6229 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6230 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6231 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6232 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006233 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006234 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6235 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006236 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6237 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6238 " // Separating comment.\n"
6239 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6240 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6241 " // Leading comment\n"
6242 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6243 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006244 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6245 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006246 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006247 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6248 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006249 getLLVMStyleWithColumns(38));
6250 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006251 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6252 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006253 verifyFormat(
6254 "static unsigned SomeValues[10][3] = {\n"
6255 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6256 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6257 verifyFormat("static auto fields = new vector<string>{\n"
6258 " \"aaaaaaaaaaaaa\",\n"
6259 " \"aaaaaaaaaaaaa\",\n"
6260 " \"aaaaaaaaaaaa\",\n"
6261 " \"aaaaaaaaaaaaaa\",\n"
6262 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6263 " \"aaaaaaaaaaaa\",\n"
6264 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6265 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006266 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6267 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6268 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6269 " 3, cccccccccccccccccccccc};",
6270 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006271
6272 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006273 verifyFormat("vector<int> x = {\n"
6274 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6275 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006276 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006277 verifyFormat("vector<int> x = {\n"
6278 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006279 "};",
6280 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006281 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6282 " 1, 1, 1, 1,\n"
6283 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006284 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006285
Daniel Jasper60c27072015-05-13 08:16:00 +00006286 // Trailing comment in the first line.
6287 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6288 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6289 " 111111111, 222222222, 3333333333, 444444444, //\n"
6290 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006291 // Trailing comment in the last line.
6292 verifyFormat("int aaaaa[] = {\n"
6293 " 1, 2, 3, // comment\n"
6294 " 4, 5, 6 // comment\n"
6295 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006296
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006297 // With nested lists, we should either format one item per line or all nested
6298 // lists one on line.
6299 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006300 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6301 " {aaaaaaaaaaaaaaaaaaa},\n"
6302 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6303 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006304 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006305 verifyFormat(
6306 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006307 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6308 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6309 " {aaa, aaa},\n"
6310 " {aaa, aaa},\n"
6311 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6312 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6313 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006314
6315 // No column layout should be used here.
Francois Ferrandd2130f52017-06-30 20:00:02 +00006316 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006317 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006318
6319 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006320
Daniel Jaspereb65e912015-12-21 18:31:15 +00006321 // No braced initializer here.
6322 verifyFormat("void f() {\n"
6323 " struct Dummy {};\n"
6324 " f(v);\n"
6325 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006326
6327 // Long lists should be formatted in columns even if they are nested.
6328 verifyFormat(
6329 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6330 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6331 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6332 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6333 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6334 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00006335
6336 // Allow "single-column" layout even if that violates the column limit. There
6337 // isn't going to be a better way.
6338 verifyFormat("std::vector<int> a = {\n"
6339 " aaaaaaaa,\n"
6340 " aaaaaaaa,\n"
6341 " aaaaaaaa,\n"
6342 " aaaaaaaa,\n"
6343 " aaaaaaaaaa,\n"
6344 " aaaaaaaa,\n"
6345 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
6346 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00006347 verifyFormat("vector<int> aaaa = {\n"
6348 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6349 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6350 " aaaaaa.aaaaaaa,\n"
6351 " aaaaaa.aaaaaaa,\n"
6352 " aaaaaa.aaaaaaa,\n"
6353 " aaaaaa.aaaaaaa,\n"
6354 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006355
6356 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006357 verifyFormat("someFunction(Param, {List1, List2,\n"
6358 " List3});",
6359 getLLVMStyleWithColumns(35));
6360 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006361 " {List1, List2,\n"
6362 " List3});",
6363 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00006364 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
6365 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006366}
6367
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006368TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006369 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006370 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006371
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006372 verifyFormat("void f() { return 42; }");
6373 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006374 " return 42;\n"
6375 "}",
6376 DoNotMerge);
6377 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006378 " // Comment\n"
6379 "}");
6380 verifyFormat("{\n"
6381 "#error {\n"
6382 " int a;\n"
6383 "}");
6384 verifyFormat("{\n"
6385 " int a;\n"
6386 "#error {\n"
6387 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00006388 verifyFormat("void f() {} // comment");
6389 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00006390 verifyFormat("void f() {\n"
6391 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006392 DoNotMerge);
6393 verifyFormat("void f() {\n"
6394 " int a;\n"
6395 "} // comment",
6396 DoNotMerge);
6397 verifyFormat("void f() {\n"
6398 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00006399 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006400
6401 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
6402 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
6403
6404 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
6405 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00006406 verifyFormat("class C {\n"
6407 " C()\n"
6408 " : iiiiiiii(nullptr),\n"
6409 " kkkkkkk(nullptr),\n"
6410 " mmmmmmm(nullptr),\n"
6411 " nnnnnnn(nullptr) {}\n"
6412 "};",
6413 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00006414
6415 FormatStyle NoColumnLimit = getLLVMStyle();
6416 NoColumnLimit.ColumnLimit = 0;
6417 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
6418 EXPECT_EQ("class C {\n"
6419 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00006420 "};",
6421 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00006422 EXPECT_EQ("A()\n"
6423 " : b(0) {\n"
6424 "}",
6425 format("A()\n:b(0)\n{\n}", NoColumnLimit));
6426
6427 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00006428 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
6429 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00006430 EXPECT_EQ("A()\n"
6431 " : b(0) {\n"
6432 "}",
6433 format("A():b(0){}", DoNotMergeNoColumnLimit));
6434 EXPECT_EQ("A()\n"
6435 " : b(0) {\n"
6436 "}",
6437 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00006438
6439 verifyFormat("#define A \\\n"
6440 " void f() { \\\n"
6441 " int i; \\\n"
6442 " }",
6443 getLLVMStyleWithColumns(20));
6444 verifyFormat("#define A \\\n"
6445 " void f() { int i; }",
6446 getLLVMStyleWithColumns(21));
6447 verifyFormat("#define A \\\n"
6448 " void f() { \\\n"
6449 " int i; \\\n"
6450 " } \\\n"
6451 " int j;",
6452 getLLVMStyleWithColumns(22));
6453 verifyFormat("#define A \\\n"
6454 " void f() { int i; } \\\n"
6455 " int j;",
6456 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006457}
6458
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006459TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
6460 FormatStyle MergeEmptyOnly = getLLVMStyle();
6461 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
6462 verifyFormat("class C {\n"
6463 " int f() {}\n"
6464 "};",
6465 MergeEmptyOnly);
6466 verifyFormat("class C {\n"
6467 " int f() {\n"
6468 " return 42;\n"
6469 " }\n"
6470 "};",
6471 MergeEmptyOnly);
6472 verifyFormat("int f() {}", MergeEmptyOnly);
6473 verifyFormat("int f() {\n"
6474 " return 42;\n"
6475 "}",
6476 MergeEmptyOnly);
6477
6478 // Also verify behavior when BraceWrapping.AfterFunction = true
6479 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
6480 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
6481 verifyFormat("int f() {}", MergeEmptyOnly);
6482 verifyFormat("class C {\n"
6483 " int f() {}\n"
6484 "};",
6485 MergeEmptyOnly);
6486}
6487
Daniel Jasperd74cf402014-04-08 12:46:38 +00006488TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
6489 FormatStyle MergeInlineOnly = getLLVMStyle();
6490 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6491 verifyFormat("class C {\n"
6492 " int f() { return 42; }\n"
6493 "};",
6494 MergeInlineOnly);
6495 verifyFormat("int f() {\n"
6496 " return 42;\n"
6497 "}",
6498 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006499
6500 // SFS_Inline implies SFS_Empty
6501 verifyFormat("class C {\n"
6502 " int f() {}\n"
6503 "};",
6504 MergeInlineOnly);
6505 verifyFormat("int f() {}", MergeInlineOnly);
6506
6507 // Also verify behavior when BraceWrapping.AfterFunction = true
6508 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
6509 MergeInlineOnly.BraceWrapping.AfterFunction = true;
6510 verifyFormat("class C {\n"
6511 " int f() { return 42; }\n"
6512 "};",
6513 MergeInlineOnly);
6514 verifyFormat("int f()\n"
6515 "{\n"
6516 " return 42;\n"
6517 "}",
6518 MergeInlineOnly);
6519
6520 // SFS_Inline implies SFS_Empty
6521 verifyFormat("int f() {}", MergeInlineOnly);
6522 verifyFormat("class C {\n"
6523 " int f() {}\n"
6524 "};",
6525 MergeInlineOnly);
6526}
6527
Francois Ferrandd3f0e3d2017-06-21 13:56:02 +00006528TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
6529 FormatStyle MergeInlineOnly = getLLVMStyle();
6530 MergeInlineOnly.AllowShortFunctionsOnASingleLine =
6531 FormatStyle::SFS_InlineOnly;
6532 verifyFormat("class C {\n"
6533 " int f() { return 42; }\n"
6534 "};",
6535 MergeInlineOnly);
6536 verifyFormat("int f() {\n"
6537 " return 42;\n"
6538 "}",
6539 MergeInlineOnly);
6540
6541 // SFS_InlineOnly does not imply SFS_Empty
6542 verifyFormat("class C {\n"
6543 " int f() {}\n"
6544 "};",
6545 MergeInlineOnly);
6546 verifyFormat("int f() {\n"
6547 "}",
6548 MergeInlineOnly);
6549
6550 // Also verify behavior when BraceWrapping.AfterFunction = true
6551 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
6552 MergeInlineOnly.BraceWrapping.AfterFunction = true;
6553 verifyFormat("class C {\n"
6554 " int f() { return 42; }\n"
6555 "};",
6556 MergeInlineOnly);
6557 verifyFormat("int f()\n"
6558 "{\n"
6559 " return 42;\n"
6560 "}",
6561 MergeInlineOnly);
6562
6563 // SFS_InlineOnly does not imply SFS_Empty
6564 verifyFormat("int f()\n"
6565 "{\n"
6566 "}",
6567 MergeInlineOnly);
6568 verifyFormat("class C {\n"
6569 " int f() {}\n"
6570 "};",
6571 MergeInlineOnly);
6572}
6573
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006574TEST_F(FormatTest, SplitEmptyFunctionBody) {
6575 FormatStyle Style = getLLVMStyle();
6576 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
6577 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
6578 Style.BraceWrapping.AfterFunction = true;
6579 Style.BraceWrapping.SplitEmptyFunctionBody = false;
6580 Style.ColumnLimit = 40;
6581
6582 verifyFormat("int f()\n"
6583 "{}",
6584 Style);
6585 verifyFormat("int f()\n"
6586 "{\n"
6587 " return 42;\n"
6588 "}",
6589 Style);
6590 verifyFormat("int f()\n"
6591 "{\n"
6592 " // some comment\n"
6593 "}",
6594 Style);
6595
6596 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
6597 verifyFormat("int f() {}", Style);
6598 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6599 "{}",
6600 Style);
6601 verifyFormat("int f()\n"
6602 "{\n"
6603 " return 0;\n"
6604 "}",
6605 Style);
6606
6607 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6608 verifyFormat("class Foo {\n"
6609 " int f() {}\n"
6610 "};\n",
6611 Style);
6612 verifyFormat("class Foo {\n"
6613 " int f() { return 0; }\n"
6614 "};\n",
6615 Style);
6616 verifyFormat("class Foo {\n"
6617 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6618 " {}\n"
6619 "};\n",
6620 Style);
6621 verifyFormat("class Foo {\n"
6622 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6623 " {\n"
6624 " return 0;\n"
6625 " }\n"
6626 "};\n",
6627 Style);
6628
6629 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
6630 verifyFormat("int f() {}", Style);
6631 verifyFormat("int f() { return 0; }", Style);
6632 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6633 "{}",
6634 Style);
6635 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6636 "{\n"
6637 " return 0;\n"
6638 "}",
6639 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00006640}
6641
Manuel Klimeke01bab52013-01-15 13:38:33 +00006642TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
6643 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006644 verifyFormat("struct foo a = {bar};\nint n;");
6645 verifyFormat("class foo a = {bar};\nint n;");
6646 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006647
6648 // Elaborate types inside function definitions.
6649 verifyFormat("struct foo f() {}\nint n;");
6650 verifyFormat("class foo f() {}\nint n;");
6651 verifyFormat("union foo f() {}\nint n;");
6652
6653 // Templates.
6654 verifyFormat("template <class X> void f() {}\nint n;");
6655 verifyFormat("template <struct X> void f() {}\nint n;");
6656 verifyFormat("template <union X> void f() {}\nint n;");
6657
6658 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006659 verifyFormat("struct {\n} n;");
6660 verifyFormat(
6661 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006662 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006663 verifyFormat("class MACRO Z {\n} n;");
6664 verifyFormat("class MACRO(X) Z {\n} n;");
6665 verifyFormat("class __attribute__(X) Z {\n} n;");
6666 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00006667 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00006668 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00006669 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
6670 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006671
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006672 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006673 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006674
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006675 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00006676 verifyFormat(
6677 "template <typename F>\n"
6678 "Matcher(const Matcher<F> &Other,\n"
6679 " typename enable_if_c<is_base_of<F, T>::value &&\n"
6680 " !is_same<F, T>::value>::type * = 0)\n"
6681 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
6682
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006683 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006684 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00006685 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006686
6687 // FIXME:
6688 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006689 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006690
Manuel Klimeke01bab52013-01-15 13:38:33 +00006691 // Elaborate types where incorrectly parsing the structural element would
6692 // break the indent.
6693 verifyFormat("if (true)\n"
6694 " class X x;\n"
6695 "else\n"
6696 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00006697
6698 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00006699 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00006700}
6701
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006702TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00006703 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
6704 format("#error Leave all white!!!!! space* alone!\n"));
6705 EXPECT_EQ(
6706 "#warning Leave all white!!!!! space* alone!\n",
6707 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006708 EXPECT_EQ("#error 1", format(" # error 1"));
6709 EXPECT_EQ("#warning 1", format(" # warning 1"));
6710}
6711
Daniel Jasper4431aa92013-04-23 13:54:04 +00006712TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00006713 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00006714 verifyFormat("#if (AAAA && BBBB)");
6715 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00006716 // FIXME: Come up with a better indentation for #elif.
6717 verifyFormat(
6718 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
6719 " defined(BBBBBBBB)\n"
6720 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
6721 " defined(BBBBBBBB)\n"
6722 "#endif",
6723 getLLVMStyleWithColumns(65));
6724}
6725
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006726TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
6727 FormatStyle AllowsMergedIf = getGoogleStyle();
6728 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
6729 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
6730 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00006731 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
6732 EXPECT_EQ("if (true) return 42;",
6733 format("if (true)\nreturn 42;", AllowsMergedIf));
6734 FormatStyle ShortMergedIf = AllowsMergedIf;
6735 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006736 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006737 " if (true) return 42;",
6738 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006739 verifyFormat("#define A \\\n"
6740 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006741 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006742 "#define B",
6743 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006744 verifyFormat("#define A \\\n"
6745 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006746 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006747 "g();",
6748 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00006749 verifyFormat("{\n"
6750 "#ifdef A\n"
6751 " // Comment\n"
6752 " if (true) continue;\n"
6753 "#endif\n"
6754 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00006755 " if (true) continue;\n"
6756 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006757 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00006758 ShortMergedIf.ColumnLimit = 33;
6759 verifyFormat("#define A \\\n"
6760 " if constexpr (true) return 42;",
6761 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00006762 ShortMergedIf.ColumnLimit = 29;
6763 verifyFormat("#define A \\\n"
6764 " if (aaaaaaaaaa) return 1; \\\n"
6765 " return 2;",
6766 ShortMergedIf);
6767 ShortMergedIf.ColumnLimit = 28;
6768 verifyFormat("#define A \\\n"
6769 " if (aaaaaaaaaa) \\\n"
6770 " return 1; \\\n"
6771 " return 2;",
6772 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00006773 verifyFormat("#define A \\\n"
6774 " if constexpr (aaaaaaa) \\\n"
6775 " return 1; \\\n"
6776 " return 2;",
6777 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006778}
6779
Manuel Klimekd33516e2013-01-23 10:09:28 +00006780TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00006781 verifyFormat("void f(int *a);");
6782 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00006783 verifyFormat("class A {\n void f(int *a);\n};");
6784 verifyFormat("class A {\n int *a;\n};");
6785 verifyFormat("namespace a {\n"
6786 "namespace b {\n"
6787 "class A {\n"
6788 " void f() {}\n"
6789 " int *a;\n"
6790 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006791 "} // namespace b\n"
6792 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00006793}
6794
Manuel Klimekd33516e2013-01-23 10:09:28 +00006795TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
6796 verifyFormat("while");
6797 verifyFormat("operator");
6798}
6799
Daniel Jasperfda47cd2016-10-31 13:23:00 +00006800TEST_F(FormatTest, SkipsDeeplyNestedLines) {
6801 // This code would be painfully slow to format if we didn't skip it.
6802 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
6803 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6804 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6805 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6806 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6807 "A(1, 1)\n"
6808 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
6809 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6810 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6811 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6812 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6813 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6814 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6815 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6816 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6817 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
6818 // Deeply nested part is untouched, rest is formatted.
6819 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
6820 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00006821 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00006822}
6823
Nico Weber7e6a7a12013-01-08 17:56:31 +00006824//===----------------------------------------------------------------------===//
6825// Objective-C tests.
6826//===----------------------------------------------------------------------===//
6827
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006828TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
6829 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
6830 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
6831 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00006832 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006833 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
6834 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
6835 format("-(NSInteger)Method3:(id)anObject;"));
6836 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
6837 format("-(NSInteger)Method4:(id)anObject;"));
6838 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
6839 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
6840 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
6841 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00006842 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
6843 "forAllCells:(BOOL)flag;",
6844 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
6845 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00006846
6847 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00006848 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
6849 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00006850 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
6851 " inRange:(NSRange)range\n"
6852 " outRange:(NSRange)out_range\n"
6853 " outRange1:(NSRange)out_range1\n"
6854 " outRange2:(NSRange)out_range2\n"
6855 " outRange3:(NSRange)out_range3\n"
6856 " outRange4:(NSRange)out_range4\n"
6857 " outRange5:(NSRange)out_range5\n"
6858 " outRange6:(NSRange)out_range6\n"
6859 " outRange7:(NSRange)out_range7\n"
6860 " outRange8:(NSRange)out_range8\n"
6861 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00006862
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00006863 // When the function name has to be wrapped.
6864 FormatStyle Style = getLLVMStyle();
6865 Style.IndentWrappedFunctionNames = false;
6866 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
6867 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
6868 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
6869 "}",
6870 Style);
6871 Style.IndentWrappedFunctionNames = true;
6872 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
6873 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
6874 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
6875 "}",
6876 Style);
6877
Nico Weberd6f962f2013-01-10 20:18:33 +00006878 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00006879 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00006880 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
6881 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00006882 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00006883
Daniel Jasper37194282013-05-28 08:33:00 +00006884 verifyFormat("- (int (*)())foo:(int (*)())f;");
6885 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00006886
6887 // If there's no return type (very rare in practice!), LLVM and Google style
6888 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00006889 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00006890 verifyFormat("- foo:(int)f;");
6891 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006892}
6893
Nico Weber0588b502013-02-07 00:19:29 +00006894
Alexander Kornienko64a42b82014-04-15 14:52:43 +00006895TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00006896 EXPECT_EQ("\"some text \"\n"
6897 "\"other\";",
6898 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00006899 EXPECT_EQ("\"some text \"\n"
6900 "\"other\";",
6901 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006902 EXPECT_EQ(
6903 "#define A \\\n"
6904 " \"some \" \\\n"
6905 " \"text \" \\\n"
6906 " \"other\";",
6907 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
6908 EXPECT_EQ(
6909 "#define A \\\n"
6910 " \"so \" \\\n"
6911 " \"text \" \\\n"
6912 " \"other\";",
6913 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
6914
6915 EXPECT_EQ("\"some text\"",
6916 format("\"some text\"", getLLVMStyleWithColumns(1)));
6917 EXPECT_EQ("\"some text\"",
6918 format("\"some text\"", getLLVMStyleWithColumns(11)));
6919 EXPECT_EQ("\"some \"\n"
6920 "\"text\"",
6921 format("\"some text\"", getLLVMStyleWithColumns(10)));
6922 EXPECT_EQ("\"some \"\n"
6923 "\"text\"",
6924 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00006925 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00006926 "\" tex\"\n"
6927 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00006928 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00006929 EXPECT_EQ("\"some\"\n"
6930 "\" tex\"\n"
6931 "\" and\"",
6932 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
6933 EXPECT_EQ("\"some\"\n"
6934 "\"/tex\"\n"
6935 "\"/and\"",
6936 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006937
6938 EXPECT_EQ("variable =\n"
6939 " \"long string \"\n"
6940 " \"literal\";",
6941 format("variable = \"long string literal\";",
6942 getLLVMStyleWithColumns(20)));
6943
6944 EXPECT_EQ("variable = f(\n"
6945 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006946 " \"literal\",\n"
6947 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00006948 " loooooooooooooooooooong);",
6949 format("variable = f(\"long string literal\", short, "
6950 "loooooooooooooooooooong);",
6951 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00006952
Daniel Jaspera44991332015-04-29 13:06:49 +00006953 EXPECT_EQ(
6954 "f(g(\"long string \"\n"
6955 " \"literal\"),\n"
6956 " b);",
6957 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00006958 EXPECT_EQ("f(g(\"long string \"\n"
6959 " \"literal\",\n"
6960 " a),\n"
6961 " b);",
6962 format("f(g(\"long string literal\", a), b);",
6963 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006964 EXPECT_EQ(
6965 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00006966 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00006967 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
6968 EXPECT_EQ("f(\"one two three four five six \"\n"
6969 " \"seven\".split(\n"
6970 " really_looooong_variable));",
6971 format("f(\"one two three four five six seven\"."
6972 "split(really_looooong_variable));",
6973 getLLVMStyleWithColumns(33)));
6974
6975 EXPECT_EQ("f(\"some \"\n"
6976 " \"text\",\n"
6977 " other);",
6978 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00006979
6980 // Only break as a last resort.
6981 verifyFormat(
6982 "aaaaaaaaaaaaaaaaaaaa(\n"
6983 " aaaaaaaaaaaaaaaaaaaa,\n"
6984 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00006985
Daniel Jaspera44991332015-04-29 13:06:49 +00006986 EXPECT_EQ("\"splitmea\"\n"
6987 "\"trandomp\"\n"
6988 "\"oint\"",
6989 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00006990
Daniel Jaspera44991332015-04-29 13:06:49 +00006991 EXPECT_EQ("\"split/\"\n"
6992 "\"pathat/\"\n"
6993 "\"slashes\"",
6994 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006995
Daniel Jaspera44991332015-04-29 13:06:49 +00006996 EXPECT_EQ("\"split/\"\n"
6997 "\"pathat/\"\n"
6998 "\"slashes\"",
6999 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00007000 EXPECT_EQ("\"split at \"\n"
7001 "\"spaces/at/\"\n"
7002 "\"slashes.at.any$\"\n"
7003 "\"non-alphanumeric%\"\n"
7004 "\"1111111111characte\"\n"
7005 "\"rs\"",
7006 format("\"split at "
7007 "spaces/at/"
7008 "slashes.at."
7009 "any$non-"
7010 "alphanumeric%"
7011 "1111111111characte"
7012 "rs\"",
7013 getLLVMStyleWithColumns(20)));
7014
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007015 // Verify that splitting the strings understands
7016 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00007017 EXPECT_EQ(
7018 "aaaaaaaaaaaa(\n"
7019 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
7020 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
7021 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
7022 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7023 "aaaaaaaaaaaaaaaaaaaaaa\");",
7024 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00007025 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7026 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
7027 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
7028 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7029 "aaaaaaaaaaaaaaaaaaaaaa\";",
7030 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00007031 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7032 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7033 format("llvm::outs() << "
7034 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
7035 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00007036 EXPECT_EQ("ffff(\n"
7037 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7038 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7039 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
7040 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7041 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007042
Daniel Jaspere1a7b762016-02-01 11:21:02 +00007043 FormatStyle Style = getLLVMStyleWithColumns(12);
7044 Style.BreakStringLiterals = false;
7045 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
7046
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007047 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007048 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00007049 EXPECT_EQ("#define A \\\n"
7050 " \"some \" \\\n"
7051 " \"text \" \\\n"
7052 " \"other\";",
7053 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007054}
7055
Manuel Klimek9e321992015-07-28 15:50:24 +00007056TEST_F(FormatTest, FullyRemoveEmptyLines) {
7057 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
7058 NoEmptyLines.MaxEmptyLinesToKeep = 0;
7059 EXPECT_EQ("int i = a(b());",
7060 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
7061}
7062
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007063TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
7064 EXPECT_EQ(
7065 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7066 "(\n"
7067 " \"x\t\");",
7068 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7069 "aaaaaaa("
7070 "\"x\t\");"));
7071}
7072
Daniel Jasper174b0122014-01-09 14:18:12 +00007073TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00007074 EXPECT_EQ(
7075 "u8\"utf8 string \"\n"
7076 "u8\"literal\";",
7077 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
7078 EXPECT_EQ(
7079 "u\"utf16 string \"\n"
7080 "u\"literal\";",
7081 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
7082 EXPECT_EQ(
7083 "U\"utf32 string \"\n"
7084 "U\"literal\";",
7085 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
7086 EXPECT_EQ("L\"wide string \"\n"
7087 "L\"literal\";",
7088 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00007089 EXPECT_EQ("@\"NSString \"\n"
7090 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00007091 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00007092 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00007093
7094 // This input makes clang-format try to split the incomplete unicode escape
7095 // sequence, which used to lead to a crasher.
7096 verifyNoCrash(
7097 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7098 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007099}
7100
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00007101TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
7102 FormatStyle Style = getGoogleStyleWithColumns(15);
7103 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
7104 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
7105 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
7106 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
7107 EXPECT_EQ("u8R\"x(raw literal)x\";",
7108 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007109}
7110
7111TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
7112 FormatStyle Style = getLLVMStyleWithColumns(20);
7113 EXPECT_EQ(
7114 "_T(\"aaaaaaaaaaaaaa\")\n"
7115 "_T(\"aaaaaaaaaaaaaa\")\n"
7116 "_T(\"aaaaaaaaaaaa\")",
7117 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007118 EXPECT_EQ("f(x,\n"
7119 " _T(\"aaaaaaaaaaaa\")\n"
7120 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00007121 " z);",
7122 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
7123
7124 // FIXME: Handle embedded spaces in one iteration.
7125 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
7126 // "_T(\"aaaaaaaaaaaaa\")\n"
7127 // "_T(\"aaaaaaaaaaaaa\")\n"
7128 // "_T(\"a\")",
7129 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7130 // getLLVMStyleWithColumns(20)));
7131 EXPECT_EQ(
7132 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7133 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007134 EXPECT_EQ("f(\n"
7135 "#if !TEST\n"
7136 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7137 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00007138 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007139 format("f(\n"
7140 "#if !TEST\n"
7141 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7142 "#endif\n"
7143 ");"));
7144 EXPECT_EQ("f(\n"
7145 "\n"
7146 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
7147 format("f(\n"
7148 "\n"
7149 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007150}
7151
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007152TEST_F(FormatTest, BreaksStringLiteralOperands) {
7153 // In a function call with two operands, the second can be broken with no line
7154 // break before it.
7155 EXPECT_EQ("func(a, \"long long \"\n"
7156 " \"long long\");",
7157 format("func(a, \"long long long long\");",
7158 getLLVMStyleWithColumns(24)));
7159 // In a function call with three operands, the second must be broken with a
7160 // line break before it.
7161 EXPECT_EQ("func(a,\n"
7162 " \"long long long \"\n"
7163 " \"long\",\n"
7164 " c);",
7165 format("func(a, \"long long long long\", c);",
7166 getLLVMStyleWithColumns(24)));
7167 // In a function call with three operands, the third must be broken with a
7168 // line break before it.
7169 EXPECT_EQ("func(a, b,\n"
7170 " \"long long long \"\n"
7171 " \"long\");",
7172 format("func(a, b, \"long long long long\");",
7173 getLLVMStyleWithColumns(24)));
7174 // In a function call with three operands, both the second and the third must
7175 // be broken with a line break before them.
7176 EXPECT_EQ("func(a,\n"
7177 " \"long long long \"\n"
7178 " \"long\",\n"
7179 " \"long long long \"\n"
7180 " \"long\");",
7181 format("func(a, \"long long long long\", \"long long long long\");",
7182 getLLVMStyleWithColumns(24)));
7183 // In a chain of << with two operands, the second can be broken with no line
7184 // break before it.
7185 EXPECT_EQ("a << \"line line \"\n"
7186 " \"line\";",
7187 format("a << \"line line line\";",
7188 getLLVMStyleWithColumns(20)));
7189 // In a chain of << with three operands, the second can be broken with no line
7190 // break before it.
7191 EXPECT_EQ("abcde << \"line \"\n"
7192 " \"line line\"\n"
7193 " << c;",
7194 format("abcde << \"line line line\" << c;",
7195 getLLVMStyleWithColumns(20)));
7196 // In a chain of << with three operands, the third must be broken with a line
7197 // break before it.
7198 EXPECT_EQ("a << b\n"
7199 " << \"line line \"\n"
7200 " \"line\";",
7201 format("a << b << \"line line line\";",
7202 getLLVMStyleWithColumns(20)));
7203 // In a chain of << with three operands, the second can be broken with no line
7204 // break before it and the third must be broken with a line break before it.
7205 EXPECT_EQ("abcd << \"line line \"\n"
7206 " \"line\"\n"
7207 " << \"line line \"\n"
7208 " \"line\";",
7209 format("abcd << \"line line line\" << \"line line line\";",
7210 getLLVMStyleWithColumns(20)));
7211 // In a chain of binary operators with two operands, the second can be broken
7212 // with no line break before it.
7213 EXPECT_EQ("abcd + \"line line \"\n"
7214 " \"line line\";",
7215 format("abcd + \"line line line line\";",
7216 getLLVMStyleWithColumns(20)));
7217 // In a chain of binary operators with three operands, the second must be
7218 // broken with a line break before it.
7219 EXPECT_EQ("abcd +\n"
7220 " \"line line \"\n"
7221 " \"line line\" +\n"
7222 " e;",
7223 format("abcd + \"line line line line\" + e;",
7224 getLLVMStyleWithColumns(20)));
7225 // In a function call with two operands, with AlignAfterOpenBracket enabled,
7226 // the first must be broken with a line break before it.
7227 FormatStyle Style = getLLVMStyleWithColumns(25);
7228 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
7229 EXPECT_EQ("someFunction(\n"
7230 " \"long long long \"\n"
7231 " \"long\",\n"
7232 " a);",
7233 format("someFunction(\"long long long long\", a);", Style));
7234}
7235
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007236TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007237 EXPECT_EQ(
7238 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7239 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7240 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7241 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7242 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7243 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
7244}
7245
7246TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
7247 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007248 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007249 EXPECT_EQ("fffffffffff(g(R\"x(\n"
7250 "multiline raw string literal xxxxxxxxxxxxxx\n"
7251 ")x\",\n"
7252 " a),\n"
7253 " b);",
7254 format("fffffffffff(g(R\"x(\n"
7255 "multiline raw string literal xxxxxxxxxxxxxx\n"
7256 ")x\", a), b);",
7257 getGoogleStyleWithColumns(20)));
7258 EXPECT_EQ("fffffffffff(\n"
7259 " g(R\"x(qqq\n"
7260 "multiline raw string literal xxxxxxxxxxxxxx\n"
7261 ")x\",\n"
7262 " a),\n"
7263 " b);",
7264 format("fffffffffff(g(R\"x(qqq\n"
7265 "multiline raw string literal xxxxxxxxxxxxxx\n"
7266 ")x\", a), b);",
7267 getGoogleStyleWithColumns(20)));
7268
7269 EXPECT_EQ("fffffffffff(R\"x(\n"
7270 "multiline raw string literal xxxxxxxxxxxxxx\n"
7271 ")x\");",
7272 format("fffffffffff(R\"x(\n"
7273 "multiline raw string literal xxxxxxxxxxxxxx\n"
7274 ")x\");",
7275 getGoogleStyleWithColumns(20)));
7276 EXPECT_EQ("fffffffffff(R\"x(\n"
7277 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007278 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007279 format("fffffffffff(R\"x(\n"
7280 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007281 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007282 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007283 EXPECT_EQ("fffffffffff(\n"
7284 " R\"x(\n"
7285 "multiline raw string literal xxxxxxxxxxxxxx\n"
7286 ")x\" +\n"
7287 " bbbbbb);",
7288 format("fffffffffff(\n"
7289 " R\"x(\n"
7290 "multiline raw string literal xxxxxxxxxxxxxx\n"
7291 ")x\" + bbbbbb);",
7292 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007293}
7294
Alexander Kornienkobe633902013-06-14 11:46:10 +00007295TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00007296 verifyFormat("string a = \"unterminated;");
7297 EXPECT_EQ("function(\"unterminated,\n"
7298 " OtherParameter);",
7299 format("function( \"unterminated,\n"
7300 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00007301}
7302
7303TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007304 FormatStyle Style = getLLVMStyle();
7305 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00007306 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007307 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00007308}
7309
Daniel Jaspera44991332015-04-29 13:06:49 +00007310TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00007311
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007312TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
7313 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
7314 " \"ddeeefff\");",
7315 format("someFunction(\"aaabbbcccdddeeefff\");",
7316 getLLVMStyleWithColumns(25)));
7317 EXPECT_EQ("someFunction1234567890(\n"
7318 " \"aaabbbcccdddeeefff\");",
7319 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7320 getLLVMStyleWithColumns(26)));
7321 EXPECT_EQ("someFunction1234567890(\n"
7322 " \"aaabbbcccdddeeeff\"\n"
7323 " \"f\");",
7324 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7325 getLLVMStyleWithColumns(25)));
7326 EXPECT_EQ("someFunction1234567890(\n"
7327 " \"aaabbbcccdddeeeff\"\n"
7328 " \"f\");",
7329 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7330 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00007331 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
7332 " \"ddde \"\n"
7333 " \"efff\");",
7334 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007335 getLLVMStyleWithColumns(25)));
7336 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
7337 " \"ddeeefff\");",
7338 format("someFunction(\"aaabbbccc ddeeefff\");",
7339 getLLVMStyleWithColumns(25)));
7340 EXPECT_EQ("someFunction1234567890(\n"
7341 " \"aaabb \"\n"
7342 " \"cccdddeeefff\");",
7343 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
7344 getLLVMStyleWithColumns(25)));
7345 EXPECT_EQ("#define A \\\n"
7346 " string s = \\\n"
7347 " \"123456789\" \\\n"
7348 " \"0\"; \\\n"
7349 " int i;",
7350 format("#define A string s = \"1234567890\"; int i;",
7351 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00007352 // FIXME: Put additional penalties on breaking at non-whitespace locations.
7353 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
7354 " \"dddeeeff\"\n"
7355 " \"f\");",
7356 format("someFunction(\"aaabbbcc dddeeefff\");",
7357 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007358}
7359
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007360TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00007361 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
7362 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007363 EXPECT_EQ("\"test\"\n"
7364 "\"\\n\"",
7365 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
7366 EXPECT_EQ("\"tes\\\\\"\n"
7367 "\"n\"",
7368 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
7369 EXPECT_EQ("\"\\\\\\\\\"\n"
7370 "\"\\n\"",
7371 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00007372 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007373 EXPECT_EQ("\"\\uff01\"\n"
7374 "\"test\"",
7375 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
7376 EXPECT_EQ("\"\\Uff01ff02\"",
7377 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
7378 EXPECT_EQ("\"\\x000000000001\"\n"
7379 "\"next\"",
7380 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
7381 EXPECT_EQ("\"\\x000000000001next\"",
7382 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
7383 EXPECT_EQ("\"\\x000000000001\"",
7384 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
7385 EXPECT_EQ("\"test\"\n"
7386 "\"\\000000\"\n"
7387 "\"000001\"",
7388 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
7389 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007390 "\"00000000\"\n"
7391 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007392 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007393}
7394
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00007395TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
7396 verifyFormat("void f() {\n"
7397 " return g() {}\n"
7398 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007399 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00007400 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00007401 "}");
7402}
7403
Manuel Klimek421147e2014-01-24 09:25:23 +00007404TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
7405 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00007406 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00007407}
7408
Manuel Klimek13b97d82013-05-13 08:42:42 +00007409TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
7410 verifyFormat("class X {\n"
7411 " void f() {\n"
7412 " }\n"
7413 "};",
7414 getLLVMStyleWithColumns(12));
7415}
7416
7417TEST_F(FormatTest, ConfigurableIndentWidth) {
7418 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
7419 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00007420 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00007421 verifyFormat("void f() {\n"
7422 " someFunction();\n"
7423 " if (true) {\n"
7424 " f();\n"
7425 " }\n"
7426 "}",
7427 EightIndent);
7428 verifyFormat("class X {\n"
7429 " void f() {\n"
7430 " }\n"
7431 "};",
7432 EightIndent);
7433 verifyFormat("int x[] = {\n"
7434 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007435 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00007436 EightIndent);
7437}
7438
Alexander Kornienko34a87e82013-06-22 01:35:36 +00007439TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00007440 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00007441 "f();",
7442 getLLVMStyleWithColumns(8));
7443}
7444
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007445TEST_F(FormatTest, ConfigurableUseOfTab) {
7446 FormatStyle Tab = getLLVMStyleWithColumns(42);
7447 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007448 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007449 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00007450
7451 EXPECT_EQ("if (aaaaaaaa && // q\n"
7452 " bb)\t\t// w\n"
7453 "\t;",
7454 format("if (aaaaaaaa &&// q\n"
7455 "bb)// w\n"
7456 ";",
7457 Tab));
7458 EXPECT_EQ("if (aaa && bbb) // w\n"
7459 "\t;",
7460 format("if(aaa&&bbb)// w\n"
7461 ";",
7462 Tab));
7463
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007464 verifyFormat("class X {\n"
7465 "\tvoid f() {\n"
7466 "\t\tsomeFunction(parameter1,\n"
7467 "\t\t\t parameter2);\n"
7468 "\t}\n"
7469 "};",
7470 Tab);
7471 verifyFormat("#define A \\\n"
7472 "\tvoid f() { \\\n"
7473 "\t\tsomeFunction( \\\n"
7474 "\t\t parameter1, \\\n"
7475 "\t\t parameter2); \\\n"
7476 "\t}",
7477 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00007478
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00007479 Tab.TabWidth = 4;
7480 Tab.IndentWidth = 8;
7481 verifyFormat("class TabWidth4Indent8 {\n"
7482 "\t\tvoid f() {\n"
7483 "\t\t\t\tsomeFunction(parameter1,\n"
7484 "\t\t\t\t\t\t\t parameter2);\n"
7485 "\t\t}\n"
7486 "};",
7487 Tab);
7488
7489 Tab.TabWidth = 4;
7490 Tab.IndentWidth = 4;
7491 verifyFormat("class TabWidth4Indent4 {\n"
7492 "\tvoid f() {\n"
7493 "\t\tsomeFunction(parameter1,\n"
7494 "\t\t\t\t\t parameter2);\n"
7495 "\t}\n"
7496 "};",
7497 Tab);
7498
7499 Tab.TabWidth = 8;
7500 Tab.IndentWidth = 4;
7501 verifyFormat("class TabWidth8Indent4 {\n"
7502 " void f() {\n"
7503 "\tsomeFunction(parameter1,\n"
7504 "\t\t parameter2);\n"
7505 " }\n"
7506 "};",
7507 Tab);
7508
Alexander Kornienko39856b72013-09-10 09:38:25 +00007509 Tab.TabWidth = 8;
7510 Tab.IndentWidth = 8;
7511 EXPECT_EQ("/*\n"
7512 "\t a\t\tcomment\n"
7513 "\t in multiple lines\n"
7514 " */",
7515 format(" /*\t \t \n"
7516 " \t \t a\t\tcomment\t \t\n"
7517 " \t \t in multiple lines\t\n"
7518 " \t */",
7519 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00007520
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007521 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00007522 verifyFormat("{\n"
7523 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7524 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7525 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7526 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7527 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7528 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00007529 "};",
7530 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00007531 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00007532 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00007533 "\ta2,\n"
7534 "\ta3\n"
7535 "};",
7536 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007537 EXPECT_EQ("if (aaaaaaaa && // q\n"
7538 " bb) // w\n"
7539 "\t;",
7540 format("if (aaaaaaaa &&// q\n"
7541 "bb)// w\n"
7542 ";",
7543 Tab));
7544 verifyFormat("class X {\n"
7545 "\tvoid f() {\n"
7546 "\t\tsomeFunction(parameter1,\n"
7547 "\t\t parameter2);\n"
7548 "\t}\n"
7549 "};",
7550 Tab);
7551 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00007552 "\tQ(\n"
7553 "\t {\n"
7554 "\t\t int a;\n"
7555 "\t\t someFunction(aaaaaaaa,\n"
7556 "\t\t bbbbbbb);\n"
7557 "\t },\n"
7558 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007559 "}",
7560 Tab);
7561 EXPECT_EQ("{\n"
7562 "\t/* aaaa\n"
7563 "\t bbbb */\n"
7564 "}",
7565 format("{\n"
7566 "/* aaaa\n"
7567 " bbbb */\n"
7568 "}",
7569 Tab));
7570 EXPECT_EQ("{\n"
7571 "\t/*\n"
7572 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7573 "\t bbbbbbbbbbbbb\n"
7574 "\t*/\n"
7575 "}",
7576 format("{\n"
7577 "/*\n"
7578 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7579 "*/\n"
7580 "}",
7581 Tab));
7582 EXPECT_EQ("{\n"
7583 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7584 "\t// bbbbbbbbbbbbb\n"
7585 "}",
7586 format("{\n"
7587 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7588 "}",
7589 Tab));
7590 EXPECT_EQ("{\n"
7591 "\t/*\n"
7592 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7593 "\t bbbbbbbbbbbbb\n"
7594 "\t*/\n"
7595 "}",
7596 format("{\n"
7597 "\t/*\n"
7598 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7599 "\t*/\n"
7600 "}",
7601 Tab));
7602 EXPECT_EQ("{\n"
7603 "\t/*\n"
7604 "\n"
7605 "\t*/\n"
7606 "}",
7607 format("{\n"
7608 "\t/*\n"
7609 "\n"
7610 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00007611 "}",
7612 Tab));
7613 EXPECT_EQ("{\n"
7614 "\t/*\n"
7615 " asdf\n"
7616 "\t*/\n"
7617 "}",
7618 format("{\n"
7619 "\t/*\n"
7620 " asdf\n"
7621 "\t*/\n"
7622 "}",
7623 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007624
7625 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00007626 EXPECT_EQ("/*\n"
7627 " a\t\tcomment\n"
7628 " in multiple lines\n"
7629 " */",
7630 format(" /*\t \t \n"
7631 " \t \t a\t\tcomment\t \t\n"
7632 " \t \t in multiple lines\t\n"
7633 " \t */",
7634 Tab));
7635 EXPECT_EQ("/* some\n"
7636 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007637 format(" \t \t /* some\n"
7638 " \t \t comment */",
7639 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00007640 EXPECT_EQ("int a; /* some\n"
7641 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007642 format(" \t \t int a; /* some\n"
7643 " \t \t comment */",
7644 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00007645
Alexander Kornienko39856b72013-09-10 09:38:25 +00007646 EXPECT_EQ("int a; /* some\n"
7647 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007648 format(" \t \t int\ta; /* some\n"
7649 " \t \t comment */",
7650 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00007651 EXPECT_EQ("f(\"\t\t\"); /* some\n"
7652 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007653 format(" \t \t f(\"\t\t\"); /* some\n"
7654 " \t \t comment */",
7655 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00007656 EXPECT_EQ("{\n"
7657 " /*\n"
7658 " * Comment\n"
7659 " */\n"
7660 " int i;\n"
7661 "}",
7662 format("{\n"
7663 "\t/*\n"
7664 "\t * Comment\n"
7665 "\t */\n"
7666 "\t int i;\n"
7667 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00007668
7669 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
7670 Tab.TabWidth = 8;
7671 Tab.IndentWidth = 8;
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 EXPECT_EQ("if (aaa && bbb) // w\n"
7680 "\t;",
7681 format("if(aaa&&bbb)// w\n"
7682 ";",
7683 Tab));
7684 verifyFormat("class X {\n"
7685 "\tvoid f() {\n"
7686 "\t\tsomeFunction(parameter1,\n"
7687 "\t\t\t parameter2);\n"
7688 "\t}\n"
7689 "};",
7690 Tab);
7691 verifyFormat("#define A \\\n"
7692 "\tvoid f() { \\\n"
7693 "\t\tsomeFunction( \\\n"
7694 "\t\t parameter1, \\\n"
7695 "\t\t parameter2); \\\n"
7696 "\t}",
7697 Tab);
7698 Tab.TabWidth = 4;
7699 Tab.IndentWidth = 8;
7700 verifyFormat("class TabWidth4Indent8 {\n"
7701 "\t\tvoid f() {\n"
7702 "\t\t\t\tsomeFunction(parameter1,\n"
7703 "\t\t\t\t\t\t\t parameter2);\n"
7704 "\t\t}\n"
7705 "};",
7706 Tab);
7707 Tab.TabWidth = 4;
7708 Tab.IndentWidth = 4;
7709 verifyFormat("class TabWidth4Indent4 {\n"
7710 "\tvoid f() {\n"
7711 "\t\tsomeFunction(parameter1,\n"
7712 "\t\t\t\t\t parameter2);\n"
7713 "\t}\n"
7714 "};",
7715 Tab);
7716 Tab.TabWidth = 8;
7717 Tab.IndentWidth = 4;
7718 verifyFormat("class TabWidth8Indent4 {\n"
7719 " void f() {\n"
7720 "\tsomeFunction(parameter1,\n"
7721 "\t\t parameter2);\n"
7722 " }\n"
7723 "};",
7724 Tab);
7725 Tab.TabWidth = 8;
7726 Tab.IndentWidth = 8;
7727 EXPECT_EQ("/*\n"
7728 "\t a\t\tcomment\n"
7729 "\t in multiple lines\n"
7730 " */",
7731 format(" /*\t \t \n"
7732 " \t \t a\t\tcomment\t \t\n"
7733 " \t \t in multiple lines\t\n"
7734 " \t */",
7735 Tab));
7736 verifyFormat("{\n"
7737 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7738 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7739 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7740 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7741 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7742 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7743 "};",
7744 Tab);
7745 verifyFormat("enum AA {\n"
7746 "\ta1, // Force multiple lines\n"
7747 "\ta2,\n"
7748 "\ta3\n"
7749 "};",
7750 Tab);
7751 EXPECT_EQ("if (aaaaaaaa && // q\n"
7752 " bb) // w\n"
7753 "\t;",
7754 format("if (aaaaaaaa &&// q\n"
7755 "bb)// w\n"
7756 ";",
7757 Tab));
7758 verifyFormat("class X {\n"
7759 "\tvoid f() {\n"
7760 "\t\tsomeFunction(parameter1,\n"
7761 "\t\t\t parameter2);\n"
7762 "\t}\n"
7763 "};",
7764 Tab);
7765 verifyFormat("{\n"
7766 "\tQ(\n"
7767 "\t {\n"
7768 "\t\t int a;\n"
7769 "\t\t someFunction(aaaaaaaa,\n"
7770 "\t\t\t\t bbbbbbb);\n"
7771 "\t },\n"
7772 "\t p);\n"
7773 "}",
7774 Tab);
7775 EXPECT_EQ("{\n"
7776 "\t/* aaaa\n"
7777 "\t bbbb */\n"
7778 "}",
7779 format("{\n"
7780 "/* aaaa\n"
7781 " bbbb */\n"
7782 "}",
7783 Tab));
7784 EXPECT_EQ("{\n"
7785 "\t/*\n"
7786 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7787 "\t bbbbbbbbbbbbb\n"
7788 "\t*/\n"
7789 "}",
7790 format("{\n"
7791 "/*\n"
7792 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7793 "*/\n"
7794 "}",
7795 Tab));
7796 EXPECT_EQ("{\n"
7797 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7798 "\t// bbbbbbbbbbbbb\n"
7799 "}",
7800 format("{\n"
7801 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7802 "}",
7803 Tab));
7804 EXPECT_EQ("{\n"
7805 "\t/*\n"
7806 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7807 "\t bbbbbbbbbbbbb\n"
7808 "\t*/\n"
7809 "}",
7810 format("{\n"
7811 "\t/*\n"
7812 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7813 "\t*/\n"
7814 "}",
7815 Tab));
7816 EXPECT_EQ("{\n"
7817 "\t/*\n"
7818 "\n"
7819 "\t*/\n"
7820 "}",
7821 format("{\n"
7822 "\t/*\n"
7823 "\n"
7824 "\t*/\n"
7825 "}",
7826 Tab));
7827 EXPECT_EQ("{\n"
7828 "\t/*\n"
7829 " asdf\n"
7830 "\t*/\n"
7831 "}",
7832 format("{\n"
7833 "\t/*\n"
7834 " asdf\n"
7835 "\t*/\n"
7836 "}",
7837 Tab));
7838 EXPECT_EQ("/*\n"
7839 "\t a\t\tcomment\n"
7840 "\t in multiple lines\n"
7841 " */",
7842 format(" /*\t \t \n"
7843 " \t \t a\t\tcomment\t \t\n"
7844 " \t \t in multiple lines\t\n"
7845 " \t */",
7846 Tab));
7847 EXPECT_EQ("/* some\n"
7848 " comment */",
7849 format(" \t \t /* some\n"
7850 " \t \t comment */",
7851 Tab));
7852 EXPECT_EQ("int a; /* some\n"
7853 " comment */",
7854 format(" \t \t int a; /* some\n"
7855 " \t \t comment */",
7856 Tab));
7857 EXPECT_EQ("int a; /* some\n"
7858 "comment */",
7859 format(" \t \t int\ta; /* some\n"
7860 " \t \t comment */",
7861 Tab));
7862 EXPECT_EQ("f(\"\t\t\"); /* some\n"
7863 " comment */",
7864 format(" \t \t f(\"\t\t\"); /* some\n"
7865 " \t \t comment */",
7866 Tab));
7867 EXPECT_EQ("{\n"
7868 " /*\n"
7869 " * Comment\n"
7870 " */\n"
7871 " int i;\n"
7872 "}",
7873 format("{\n"
7874 "\t/*\n"
7875 "\t * Comment\n"
7876 "\t */\n"
7877 "\t int i;\n"
7878 "}"));
7879 Tab.AlignConsecutiveAssignments = true;
7880 Tab.AlignConsecutiveDeclarations = true;
7881 Tab.TabWidth = 4;
7882 Tab.IndentWidth = 4;
7883 verifyFormat("class Assign {\n"
7884 "\tvoid f() {\n"
7885 "\t\tint x = 123;\n"
7886 "\t\tint random = 4;\n"
7887 "\t\tstd::string alphabet =\n"
7888 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
7889 "\t}\n"
7890 "};",
7891 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007892}
7893
Alexander Kornienko917f9e02013-09-10 12:29:48 +00007894TEST_F(FormatTest, CalculatesOriginalColumn) {
7895 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7896 "q\"; /* some\n"
7897 " comment */",
7898 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7899 "q\"; /* some\n"
7900 " comment */",
7901 getLLVMStyle()));
7902 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
7903 "/* some\n"
7904 " comment */",
7905 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
7906 " /* some\n"
7907 " comment */",
7908 getLLVMStyle()));
7909 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7910 "qqq\n"
7911 "/* some\n"
7912 " comment */",
7913 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7914 "qqq\n"
7915 " /* some\n"
7916 " comment */",
7917 getLLVMStyle()));
7918 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7919 "wwww; /* some\n"
7920 " comment */",
7921 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7922 "wwww; /* some\n"
7923 " comment */",
7924 getLLVMStyle()));
7925}
7926
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007927TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00007928 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007929 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00007930
7931 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007932 " continue;",
7933 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007934 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007935 " continue;",
7936 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007937 verifyFormat("if(true)\n"
7938 " f();\n"
7939 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007940 " f();",
7941 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007942 verifyFormat("do {\n"
7943 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007944 "} while(something());",
7945 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007946 verifyFormat("switch(x) {\n"
7947 "default:\n"
7948 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007949 "}",
7950 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00007951 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00007952 verifyFormat("size_t x = sizeof(x);", NoSpace);
7953 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
7954 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
7955 verifyFormat("alignas(128) char a[128];", NoSpace);
7956 verifyFormat("size_t x = alignof(MyType);", NoSpace);
7957 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
7958 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00007959 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00007960 verifyFormat("T A::operator()();", NoSpace);
7961 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007962
7963 FormatStyle Space = getLLVMStyle();
7964 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
7965
7966 verifyFormat("int f ();", Space);
7967 verifyFormat("void f (int a, T b) {\n"
7968 " while (true)\n"
7969 " continue;\n"
7970 "}",
7971 Space);
7972 verifyFormat("if (true)\n"
7973 " f ();\n"
7974 "else if (true)\n"
7975 " f ();",
7976 Space);
7977 verifyFormat("do {\n"
7978 " do_something ();\n"
7979 "} while (something ());",
7980 Space);
7981 verifyFormat("switch (x) {\n"
7982 "default:\n"
7983 " break;\n"
7984 "}",
7985 Space);
7986 verifyFormat("A::A () : a (1) {}", Space);
7987 verifyFormat("void f () __attribute__ ((asdf));", Space);
7988 verifyFormat("*(&a + 1);\n"
7989 "&((&a)[1]);\n"
7990 "a[(b + c) * d];\n"
7991 "(((a + 1) * 2) + 3) * 4;",
7992 Space);
7993 verifyFormat("#define A(x) x", Space);
7994 verifyFormat("#define A (x) x", Space);
7995 verifyFormat("#if defined(x)\n"
7996 "#endif",
7997 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00007998 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00007999 verifyFormat("size_t x = sizeof (x);", Space);
8000 verifyFormat("auto f (int x) -> decltype (x);", Space);
8001 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8002 verifyFormat("alignas (128) char a[128];", Space);
8003 verifyFormat("size_t x = alignof (MyType);", Space);
8004 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8005 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008006 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008007 verifyFormat("T A::operator() ();", Space);
8008 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008009}
8010
8011TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8012 FormatStyle Spaces = getLLVMStyle();
8013
8014 Spaces.SpacesInParentheses = true;
8015 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008016 verifyFormat("call();", Spaces);
8017 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008018 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8019 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008020 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008021 " continue;",
8022 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008023 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008024 " continue;",
8025 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008026 verifyFormat("if ( true )\n"
8027 " f();\n"
8028 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008029 " f();",
8030 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008031 verifyFormat("do {\n"
8032 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008033 "} while ( something() );",
8034 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008035 verifyFormat("switch ( x ) {\n"
8036 "default:\n"
8037 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008038 "}",
8039 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008040
8041 Spaces.SpacesInParentheses = false;
8042 Spaces.SpacesInCStyleCastParentheses = true;
8043 verifyFormat("Type *A = ( Type * )P;", Spaces);
8044 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8045 verifyFormat("x = ( int32 )y;", Spaces);
8046 verifyFormat("int a = ( int )(2.0f);", Spaces);
8047 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8048 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8049 verifyFormat("#define x (( int )-1)", Spaces);
8050
Daniel Jasper92e09822015-03-18 12:59:19 +00008051 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008052 Spaces.SpacesInParentheses = false;
8053 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008054 Spaces.SpacesInCStyleCastParentheses = true;
8055 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008056 verifyFormat("call( );", Spaces);
8057 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008058 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008059 " continue;",
8060 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008061 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008062 " continue;",
8063 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008064 verifyFormat("if (true)\n"
8065 " f( );\n"
8066 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008067 " f( );",
8068 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008069 verifyFormat("do {\n"
8070 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008071 "} while (something( ));",
8072 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008073 verifyFormat("switch (x) {\n"
8074 "default:\n"
8075 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008076 "}",
8077 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008078
Daniel Jasper92e09822015-03-18 12:59:19 +00008079 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008080 Spaces.SpaceAfterCStyleCast = true;
8081 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008082 verifyFormat("call( );", Spaces);
8083 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008084 verifyFormat("while (( bool ) 1)\n"
8085 " continue;",
8086 Spaces);
8087 verifyFormat("for (;;)\n"
8088 " continue;",
8089 Spaces);
8090 verifyFormat("if (true)\n"
8091 " f( );\n"
8092 "else if (true)\n"
8093 " f( );",
8094 Spaces);
8095 verifyFormat("do {\n"
8096 " do_something(( int ) i);\n"
8097 "} while (something( ));",
8098 Spaces);
8099 verifyFormat("switch (x) {\n"
8100 "default:\n"
8101 " break;\n"
8102 "}",
8103 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008104
8105 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008106 Spaces.SpacesInCStyleCastParentheses = false;
8107 Spaces.SpaceAfterCStyleCast = true;
8108 verifyFormat("while ((bool) 1)\n"
8109 " continue;",
8110 Spaces);
8111 verifyFormat("do {\n"
8112 " do_something((int) i);\n"
8113 "} while (something( ));",
8114 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008115}
8116
Daniel Jasperad981f82014-08-26 11:41:14 +00008117TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
8118 verifyFormat("int a[5];");
8119 verifyFormat("a[3] += 42;");
8120
8121 FormatStyle Spaces = getLLVMStyle();
8122 Spaces.SpacesInSquareBrackets = true;
8123 // Lambdas unchanged.
8124 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
8125 verifyFormat("return [i, args...] {};", Spaces);
8126
8127 // Not lambdas.
8128 verifyFormat("int a[ 5 ];", Spaces);
8129 verifyFormat("a[ 3 ] += 42;", Spaces);
8130 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
8131 verifyFormat("double &operator[](int i) { return 0; }\n"
8132 "int i;",
8133 Spaces);
8134 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
8135 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
8136 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
8137}
8138
Daniel Jasperd94bff32013-09-25 15:15:02 +00008139TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
8140 verifyFormat("int a = 5;");
8141 verifyFormat("a += 42;");
8142 verifyFormat("a or_eq 8;");
8143
8144 FormatStyle Spaces = getLLVMStyle();
8145 Spaces.SpaceBeforeAssignmentOperators = false;
8146 verifyFormat("int a= 5;", Spaces);
8147 verifyFormat("a+= 42;", Spaces);
8148 verifyFormat("a or_eq 8;", Spaces);
8149}
8150
Daniel Jaspera44991332015-04-29 13:06:49 +00008151TEST_F(FormatTest, AlignConsecutiveAssignments) {
8152 FormatStyle Alignment = getLLVMStyle();
8153 Alignment.AlignConsecutiveAssignments = false;
8154 verifyFormat("int a = 5;\n"
8155 "int oneTwoThree = 123;",
8156 Alignment);
8157 verifyFormat("int a = 5;\n"
8158 "int oneTwoThree = 123;",
8159 Alignment);
8160
8161 Alignment.AlignConsecutiveAssignments = true;
8162 verifyFormat("int a = 5;\n"
8163 "int oneTwoThree = 123;",
8164 Alignment);
8165 verifyFormat("int a = method();\n"
8166 "int oneTwoThree = 133;",
8167 Alignment);
8168 verifyFormat("a &= 5;\n"
8169 "bcd *= 5;\n"
8170 "ghtyf += 5;\n"
8171 "dvfvdb -= 5;\n"
8172 "a /= 5;\n"
8173 "vdsvsv %= 5;\n"
8174 "sfdbddfbdfbb ^= 5;\n"
8175 "dvsdsv |= 5;\n"
8176 "int dsvvdvsdvvv = 123;",
8177 Alignment);
8178 verifyFormat("int i = 1, j = 10;\n"
8179 "something = 2000;",
8180 Alignment);
8181 verifyFormat("something = 2000;\n"
8182 "int i = 1, j = 10;\n",
8183 Alignment);
8184 verifyFormat("something = 2000;\n"
8185 "another = 911;\n"
8186 "int i = 1, j = 10;\n"
8187 "oneMore = 1;\n"
8188 "i = 2;",
8189 Alignment);
8190 verifyFormat("int a = 5;\n"
8191 "int one = 1;\n"
8192 "method();\n"
8193 "int oneTwoThree = 123;\n"
8194 "int oneTwo = 12;",
8195 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00008196 verifyFormat("int oneTwoThree = 123;\n"
8197 "int oneTwo = 12;\n"
8198 "method();\n",
8199 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008200 verifyFormat("int oneTwoThree = 123; // comment\n"
8201 "int oneTwo = 12; // comment",
8202 Alignment);
8203 EXPECT_EQ("int a = 5;\n"
8204 "\n"
8205 "int oneTwoThree = 123;",
8206 format("int a = 5;\n"
8207 "\n"
8208 "int oneTwoThree= 123;",
8209 Alignment));
8210 EXPECT_EQ("int a = 5;\n"
8211 "int one = 1;\n"
8212 "\n"
8213 "int oneTwoThree = 123;",
8214 format("int a = 5;\n"
8215 "int one = 1;\n"
8216 "\n"
8217 "int oneTwoThree = 123;",
8218 Alignment));
8219 EXPECT_EQ("int a = 5;\n"
8220 "int one = 1;\n"
8221 "\n"
8222 "int oneTwoThree = 123;\n"
8223 "int oneTwo = 12;",
8224 format("int a = 5;\n"
8225 "int one = 1;\n"
8226 "\n"
8227 "int oneTwoThree = 123;\n"
8228 "int oneTwo = 12;",
8229 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008230 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
8231 verifyFormat("#define A \\\n"
8232 " int aaaa = 12; \\\n"
8233 " int b = 23; \\\n"
8234 " int ccc = 234; \\\n"
8235 " int dddddddddd = 2345;",
8236 Alignment);
8237 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00008238 verifyFormat("#define A \\\n"
8239 " int aaaa = 12; \\\n"
8240 " int b = 23; \\\n"
8241 " int ccc = 234; \\\n"
8242 " int dddddddddd = 2345;",
8243 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008244 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00008245 verifyFormat("#define A "
8246 " \\\n"
8247 " int aaaa = 12; "
8248 " \\\n"
8249 " int b = 23; "
8250 " \\\n"
8251 " int ccc = 234; "
8252 " \\\n"
8253 " int dddddddddd = 2345;",
8254 Alignment);
8255 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
8256 "k = 4, int l = 5,\n"
8257 " int m = 6) {\n"
8258 " int j = 10;\n"
8259 " otherThing = 1;\n"
8260 "}",
8261 Alignment);
8262 verifyFormat("void SomeFunction(int parameter = 0) {\n"
8263 " int i = 1;\n"
8264 " int j = 2;\n"
8265 " int big = 10000;\n"
8266 "}",
8267 Alignment);
8268 verifyFormat("class C {\n"
8269 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00008270 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008271 " virtual void f() = 0;\n"
8272 "};",
8273 Alignment);
8274 verifyFormat("int i = 1;\n"
8275 "if (SomeType t = getSomething()) {\n"
8276 "}\n"
8277 "int j = 2;\n"
8278 "int big = 10000;",
8279 Alignment);
8280 verifyFormat("int j = 7;\n"
8281 "for (int k = 0; k < N; ++k) {\n"
8282 "}\n"
8283 "int j = 2;\n"
8284 "int big = 10000;\n"
8285 "}",
8286 Alignment);
8287 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8288 verifyFormat("int i = 1;\n"
8289 "LooooooooooongType loooooooooooooooooooooongVariable\n"
8290 " = someLooooooooooooooooongFunction();\n"
8291 "int j = 2;",
8292 Alignment);
8293 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
8294 verifyFormat("int i = 1;\n"
8295 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
8296 " someLooooooooooooooooongFunction();\n"
8297 "int j = 2;",
8298 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00008299
8300 verifyFormat("auto lambda = []() {\n"
8301 " auto i = 0;\n"
8302 " return 0;\n"
8303 "};\n"
8304 "int i = 0;\n"
8305 "auto v = type{\n"
8306 " i = 1, //\n"
8307 " (i = 2), //\n"
8308 " i = 3 //\n"
8309 "};",
8310 Alignment);
8311
Daniel Jaspera44991332015-04-29 13:06:49 +00008312 verifyFormat(
8313 "int i = 1;\n"
8314 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
8315 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008316 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00008317 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00008318
8319 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
8320 " typename B = very_long_type_name_1,\n"
8321 " typename T_2 = very_long_type_name_2>\n"
8322 "auto foo() {}\n",
8323 Alignment);
8324 verifyFormat("int a, b = 1;\n"
8325 "int c = 2;\n"
8326 "int dd = 3;\n",
8327 Alignment);
8328 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8329 "float b[1][] = {{3.f}};\n",
8330 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008331 verifyFormat("for (int i = 0; i < 1; i++)\n"
8332 " int x = 1;\n",
8333 Alignment);
8334 verifyFormat("for (i = 0; i < 1; i++)\n"
8335 " x = 1;\n"
8336 "y = 1;\n",
8337 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008338}
8339
Daniel Jaspere12597c2015-10-01 10:06:54 +00008340TEST_F(FormatTest, AlignConsecutiveDeclarations) {
8341 FormatStyle Alignment = getLLVMStyle();
8342 Alignment.AlignConsecutiveDeclarations = false;
8343 verifyFormat("float const a = 5;\n"
8344 "int oneTwoThree = 123;",
8345 Alignment);
8346 verifyFormat("int a = 5;\n"
8347 "float const oneTwoThree = 123;",
8348 Alignment);
8349
8350 Alignment.AlignConsecutiveDeclarations = true;
8351 verifyFormat("float const a = 5;\n"
8352 "int oneTwoThree = 123;",
8353 Alignment);
8354 verifyFormat("int a = method();\n"
8355 "float const oneTwoThree = 133;",
8356 Alignment);
8357 verifyFormat("int i = 1, j = 10;\n"
8358 "something = 2000;",
8359 Alignment);
8360 verifyFormat("something = 2000;\n"
8361 "int i = 1, j = 10;\n",
8362 Alignment);
8363 verifyFormat("float something = 2000;\n"
8364 "double another = 911;\n"
8365 "int i = 1, j = 10;\n"
8366 "const int *oneMore = 1;\n"
8367 "unsigned i = 2;",
8368 Alignment);
8369 verifyFormat("float a = 5;\n"
8370 "int one = 1;\n"
8371 "method();\n"
8372 "const double oneTwoThree = 123;\n"
8373 "const unsigned int oneTwo = 12;",
8374 Alignment);
8375 verifyFormat("int oneTwoThree{0}; // comment\n"
8376 "unsigned oneTwo; // comment",
8377 Alignment);
8378 EXPECT_EQ("float const a = 5;\n"
8379 "\n"
8380 "int oneTwoThree = 123;",
8381 format("float const a = 5;\n"
8382 "\n"
8383 "int oneTwoThree= 123;",
8384 Alignment));
8385 EXPECT_EQ("float a = 5;\n"
8386 "int one = 1;\n"
8387 "\n"
8388 "unsigned oneTwoThree = 123;",
8389 format("float a = 5;\n"
8390 "int one = 1;\n"
8391 "\n"
8392 "unsigned oneTwoThree = 123;",
8393 Alignment));
8394 EXPECT_EQ("float a = 5;\n"
8395 "int one = 1;\n"
8396 "\n"
8397 "unsigned oneTwoThree = 123;\n"
8398 "int oneTwo = 12;",
8399 format("float a = 5;\n"
8400 "int one = 1;\n"
8401 "\n"
8402 "unsigned oneTwoThree = 123;\n"
8403 "int oneTwo = 12;",
8404 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008405 // Function prototype alignment
8406 verifyFormat("int a();\n"
8407 "double b();",
8408 Alignment);
8409 verifyFormat("int a(int x);\n"
8410 "double b();",
8411 Alignment);
8412 unsigned OldColumnLimit = Alignment.ColumnLimit;
8413 // We need to set ColumnLimit to zero, in order to stress nested alignments,
8414 // otherwise the function parameters will be re-flowed onto a single line.
8415 Alignment.ColumnLimit = 0;
8416 EXPECT_EQ("int a(int x,\n"
8417 " float y);\n"
8418 "double b(int x,\n"
8419 " double y);",
8420 format("int a(int x,\n"
8421 " float y);\n"
8422 "double b(int x,\n"
8423 " double y);",
8424 Alignment));
8425 // This ensures that function parameters of function declarations are
8426 // correctly indented when their owning functions are indented.
8427 // The failure case here is for 'double y' to not be indented enough.
8428 EXPECT_EQ("double a(int x);\n"
8429 "int b(int y,\n"
8430 " double z);",
8431 format("double a(int x);\n"
8432 "int b(int y,\n"
8433 " double z);",
8434 Alignment));
8435 // Set ColumnLimit low so that we induce wrapping immediately after
8436 // the function name and opening paren.
8437 Alignment.ColumnLimit = 13;
8438 verifyFormat("int function(\n"
8439 " int x,\n"
8440 " bool y);",
8441 Alignment);
8442 Alignment.ColumnLimit = OldColumnLimit;
8443 // Ensure function pointers don't screw up recursive alignment
8444 verifyFormat("int a(int x, void (*fp)(int y));\n"
8445 "double b();",
8446 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008447 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008448 // Ensure recursive alignment is broken by function braces, so that the
8449 // "a = 1" does not align with subsequent assignments inside the function
8450 // body.
8451 verifyFormat("int func(int a = 1) {\n"
8452 " int b = 2;\n"
8453 " int cc = 3;\n"
8454 "}",
8455 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008456 verifyFormat("float something = 2000;\n"
8457 "double another = 911;\n"
8458 "int i = 1, j = 10;\n"
8459 "const int *oneMore = 1;\n"
8460 "unsigned i = 2;",
8461 Alignment);
8462 verifyFormat("int oneTwoThree = {0}; // comment\n"
8463 "unsigned oneTwo = 0; // comment",
8464 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008465 // Make sure that scope is correctly tracked, in the absence of braces
8466 verifyFormat("for (int i = 0; i < n; i++)\n"
8467 " j = i;\n"
8468 "double x = 1;\n",
8469 Alignment);
8470 verifyFormat("if (int i = 0)\n"
8471 " j = i;\n"
8472 "double x = 1;\n",
8473 Alignment);
8474 // Ensure operator[] and operator() are comprehended
8475 verifyFormat("struct test {\n"
8476 " long long int foo();\n"
8477 " int operator[](int a);\n"
8478 " double bar();\n"
8479 "};\n",
8480 Alignment);
8481 verifyFormat("struct test {\n"
8482 " long long int foo();\n"
8483 " int operator()(int a);\n"
8484 " double bar();\n"
8485 "};\n",
8486 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008487 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
8488 " int const i = 1;\n"
8489 " int * j = 2;\n"
8490 " int big = 10000;\n"
8491 "\n"
8492 " unsigned oneTwoThree = 123;\n"
8493 " int oneTwo = 12;\n"
8494 " method();\n"
8495 " float k = 2;\n"
8496 " int ll = 10000;\n"
8497 "}",
8498 format("void SomeFunction(int parameter= 0) {\n"
8499 " int const i= 1;\n"
8500 " int *j=2;\n"
8501 " int big = 10000;\n"
8502 "\n"
8503 "unsigned oneTwoThree =123;\n"
8504 "int oneTwo = 12;\n"
8505 " method();\n"
8506 "float k= 2;\n"
8507 "int ll=10000;\n"
8508 "}",
8509 Alignment));
8510 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008511 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
8512 verifyFormat("#define A \\\n"
8513 " int aaaa = 12; \\\n"
8514 " float b = 23; \\\n"
8515 " const int ccc = 234; \\\n"
8516 " unsigned dddddddddd = 2345;",
8517 Alignment);
8518 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00008519 verifyFormat("#define A \\\n"
8520 " int aaaa = 12; \\\n"
8521 " float b = 23; \\\n"
8522 " const int ccc = 234; \\\n"
8523 " unsigned dddddddddd = 2345;",
8524 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008525 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00008526 Alignment.ColumnLimit = 30;
8527 verifyFormat("#define A \\\n"
8528 " int aaaa = 12; \\\n"
8529 " float b = 23; \\\n"
8530 " const int ccc = 234; \\\n"
8531 " int dddddddddd = 2345;",
8532 Alignment);
8533 Alignment.ColumnLimit = 80;
8534 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
8535 "k = 4, int l = 5,\n"
8536 " int m = 6) {\n"
8537 " const int j = 10;\n"
8538 " otherThing = 1;\n"
8539 "}",
8540 Alignment);
8541 verifyFormat("void SomeFunction(int parameter = 0) {\n"
8542 " int const i = 1;\n"
8543 " int * j = 2;\n"
8544 " int big = 10000;\n"
8545 "}",
8546 Alignment);
8547 verifyFormat("class C {\n"
8548 "public:\n"
8549 " int i = 1;\n"
8550 " virtual void f() = 0;\n"
8551 "};",
8552 Alignment);
8553 verifyFormat("float i = 1;\n"
8554 "if (SomeType t = getSomething()) {\n"
8555 "}\n"
8556 "const unsigned j = 2;\n"
8557 "int big = 10000;",
8558 Alignment);
8559 verifyFormat("float j = 7;\n"
8560 "for (int k = 0; k < N; ++k) {\n"
8561 "}\n"
8562 "unsigned j = 2;\n"
8563 "int big = 10000;\n"
8564 "}",
8565 Alignment);
8566 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8567 verifyFormat("float i = 1;\n"
8568 "LooooooooooongType loooooooooooooooooooooongVariable\n"
8569 " = someLooooooooooooooooongFunction();\n"
8570 "int j = 2;",
8571 Alignment);
8572 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
8573 verifyFormat("int i = 1;\n"
8574 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
8575 " someLooooooooooooooooongFunction();\n"
8576 "int j = 2;",
8577 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00008578
8579 Alignment.AlignConsecutiveAssignments = true;
8580 verifyFormat("auto lambda = []() {\n"
8581 " auto ii = 0;\n"
8582 " float j = 0;\n"
8583 " return 0;\n"
8584 "};\n"
8585 "int i = 0;\n"
8586 "float i2 = 0;\n"
8587 "auto v = type{\n"
8588 " i = 1, //\n"
8589 " (i = 2), //\n"
8590 " i = 3 //\n"
8591 "};",
8592 Alignment);
8593 Alignment.AlignConsecutiveAssignments = false;
8594
Daniel Jaspere12597c2015-10-01 10:06:54 +00008595 verifyFormat(
8596 "int i = 1;\n"
8597 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
8598 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008599 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00008600 Alignment);
8601
8602 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
8603 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008604 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00008605 // happens.
8606 Alignment.AlignConsecutiveAssignments = true;
8607 Alignment.ColumnLimit = 30;
8608 verifyFormat("float ii = 1;\n"
8609 "unsigned j = 2;\n"
8610 "int someVerylongVariable = 1;\n"
8611 "AnotherLongType ll = 123456;\n"
8612 "VeryVeryLongType k = 2;\n"
8613 "int myvar = 1;",
8614 Alignment);
8615 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00008616 Alignment.AlignConsecutiveAssignments = false;
8617
8618 verifyFormat(
8619 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
8620 " typename LongType, typename B>\n"
8621 "auto foo() {}\n",
8622 Alignment);
8623 verifyFormat("float a, b = 1;\n"
8624 "int c = 2;\n"
8625 "int dd = 3;\n",
8626 Alignment);
8627 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8628 "float b[1][] = {{3.f}};\n",
8629 Alignment);
8630 Alignment.AlignConsecutiveAssignments = true;
8631 verifyFormat("float a, b = 1;\n"
8632 "int c = 2;\n"
8633 "int dd = 3;\n",
8634 Alignment);
8635 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8636 "float b[1][] = {{3.f}};\n",
8637 Alignment);
8638 Alignment.AlignConsecutiveAssignments = false;
8639
8640 Alignment.ColumnLimit = 30;
8641 Alignment.BinPackParameters = false;
8642 verifyFormat("void foo(float a,\n"
8643 " float b,\n"
8644 " int c,\n"
8645 " uint32_t *d) {\n"
8646 " int * e = 0;\n"
8647 " float f = 0;\n"
8648 " double g = 0;\n"
8649 "}\n"
8650 "void bar(ino_t a,\n"
8651 " int b,\n"
8652 " uint32_t *c,\n"
8653 " bool d) {}\n",
8654 Alignment);
8655 Alignment.BinPackParameters = true;
8656 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00008657}
8658
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008659TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008660 FormatStyle LinuxBraceStyle = getLLVMStyle();
8661 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008662 verifyFormat("namespace a\n"
8663 "{\n"
8664 "class A\n"
8665 "{\n"
8666 " void f()\n"
8667 " {\n"
8668 " if (true) {\n"
8669 " a();\n"
8670 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00008671 " } else {\n"
8672 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008673 " }\n"
8674 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008675 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008676 "};\n"
8677 "struct B {\n"
8678 " int x;\n"
8679 "};\n"
8680 "}\n",
8681 LinuxBraceStyle);
8682 verifyFormat("enum X {\n"
8683 " Y = 0,\n"
8684 "}\n",
8685 LinuxBraceStyle);
8686 verifyFormat("struct S {\n"
8687 " int Type;\n"
8688 " union {\n"
8689 " int x;\n"
8690 " double y;\n"
8691 " } Value;\n"
8692 " class C\n"
8693 " {\n"
8694 " MyFavoriteType Value;\n"
8695 " } Class;\n"
8696 "}\n",
8697 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008698}
8699
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00008700TEST_F(FormatTest, MozillaBraceBreaking) {
8701 FormatStyle MozillaBraceStyle = getLLVMStyle();
8702 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00008703 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00008704 verifyFormat("namespace a {\n"
8705 "class A\n"
8706 "{\n"
8707 " void f()\n"
8708 " {\n"
8709 " if (true) {\n"
8710 " a();\n"
8711 " b();\n"
8712 " }\n"
8713 " }\n"
8714 " void g() { return; }\n"
8715 "};\n"
8716 "enum E\n"
8717 "{\n"
8718 " A,\n"
8719 " // foo\n"
8720 " B,\n"
8721 " C\n"
8722 "};\n"
8723 "struct B\n"
8724 "{\n"
8725 " int x;\n"
8726 "};\n"
8727 "}\n",
8728 MozillaBraceStyle);
8729 verifyFormat("struct S\n"
8730 "{\n"
8731 " int Type;\n"
8732 " union\n"
8733 " {\n"
8734 " int x;\n"
8735 " double y;\n"
8736 " } Value;\n"
8737 " class C\n"
8738 " {\n"
8739 " MyFavoriteType Value;\n"
8740 " } Class;\n"
8741 "}\n",
8742 MozillaBraceStyle);
8743}
8744
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008745TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008746 FormatStyle StroustrupBraceStyle = getLLVMStyle();
8747 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008748 verifyFormat("namespace a {\n"
8749 "class A {\n"
8750 " void f()\n"
8751 " {\n"
8752 " if (true) {\n"
8753 " a();\n"
8754 " b();\n"
8755 " }\n"
8756 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008757 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008758 "};\n"
8759 "struct B {\n"
8760 " int x;\n"
8761 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00008762 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008763 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008764
Daniel Jasperd9670872014-08-05 12:06:20 +00008765 verifyFormat("void foo()\n"
8766 "{\n"
8767 " if (a) {\n"
8768 " a();\n"
8769 " }\n"
8770 " else {\n"
8771 " b();\n"
8772 " }\n"
8773 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008774 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00008775
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008776 verifyFormat("#ifdef _DEBUG\n"
8777 "int foo(int i = 0)\n"
8778 "#else\n"
8779 "int foo(int i = 5)\n"
8780 "#endif\n"
8781 "{\n"
8782 " return i;\n"
8783 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008784 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008785
8786 verifyFormat("void foo() {}\n"
8787 "void bar()\n"
8788 "#ifdef _DEBUG\n"
8789 "{\n"
8790 " foo();\n"
8791 "}\n"
8792 "#else\n"
8793 "{\n"
8794 "}\n"
8795 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008796 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008797
8798 verifyFormat("void foobar() { int i = 5; }\n"
8799 "#ifdef _DEBUG\n"
8800 "void bar() {}\n"
8801 "#else\n"
8802 "void bar() { foobar(); }\n"
8803 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008804 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008805}
8806
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008807TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008808 FormatStyle AllmanBraceStyle = getLLVMStyle();
8809 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008810 verifyFormat("namespace a\n"
8811 "{\n"
8812 "class A\n"
8813 "{\n"
8814 " void f()\n"
8815 " {\n"
8816 " if (true)\n"
8817 " {\n"
8818 " a();\n"
8819 " b();\n"
8820 " }\n"
8821 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008822 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008823 "};\n"
8824 "struct B\n"
8825 "{\n"
8826 " int x;\n"
8827 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008828 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008829 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008830
8831 verifyFormat("void f()\n"
8832 "{\n"
8833 " if (true)\n"
8834 " {\n"
8835 " a();\n"
8836 " }\n"
8837 " else if (false)\n"
8838 " {\n"
8839 " b();\n"
8840 " }\n"
8841 " else\n"
8842 " {\n"
8843 " c();\n"
8844 " }\n"
8845 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008846 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008847
8848 verifyFormat("void f()\n"
8849 "{\n"
8850 " for (int i = 0; i < 10; ++i)\n"
8851 " {\n"
8852 " a();\n"
8853 " }\n"
8854 " while (false)\n"
8855 " {\n"
8856 " b();\n"
8857 " }\n"
8858 " do\n"
8859 " {\n"
8860 " c();\n"
8861 " } while (false)\n"
8862 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008863 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008864
8865 verifyFormat("void f(int a)\n"
8866 "{\n"
8867 " switch (a)\n"
8868 " {\n"
8869 " case 0:\n"
8870 " break;\n"
8871 " case 1:\n"
8872 " {\n"
8873 " break;\n"
8874 " }\n"
8875 " case 2:\n"
8876 " {\n"
8877 " }\n"
8878 " break;\n"
8879 " default:\n"
8880 " break;\n"
8881 " }\n"
8882 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008883 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00008884
8885 verifyFormat("enum X\n"
8886 "{\n"
8887 " Y = 0,\n"
8888 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008889 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00008890 verifyFormat("enum X\n"
8891 "{\n"
8892 " Y = 0\n"
8893 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008894 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00008895
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008896 verifyFormat("@interface BSApplicationController ()\n"
8897 "{\n"
8898 "@private\n"
8899 " id _extraIvar;\n"
8900 "}\n"
8901 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008902 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008903
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008904 verifyFormat("#ifdef _DEBUG\n"
8905 "int foo(int i = 0)\n"
8906 "#else\n"
8907 "int foo(int i = 5)\n"
8908 "#endif\n"
8909 "{\n"
8910 " return i;\n"
8911 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008912 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008913
8914 verifyFormat("void foo() {}\n"
8915 "void bar()\n"
8916 "#ifdef _DEBUG\n"
8917 "{\n"
8918 " foo();\n"
8919 "}\n"
8920 "#else\n"
8921 "{\n"
8922 "}\n"
8923 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008924 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008925
8926 verifyFormat("void foobar() { int i = 5; }\n"
8927 "#ifdef _DEBUG\n"
8928 "void bar() {}\n"
8929 "#else\n"
8930 "void bar() { foobar(); }\n"
8931 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008932 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008933
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008934 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008935 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00008936 " // ...\n"
8937 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008938 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008939 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008940 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00008941 " // ...\n"
8942 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008943 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008944 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008945 // .. or dict literals.
8946 verifyFormat("void f()\n"
8947 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00008948 " // ...\n"
8949 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
8950 "}",
8951 AllmanBraceStyle);
8952 verifyFormat("void f()\n"
8953 "{\n"
8954 " // ...\n"
8955 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008956 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008957 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00008958 verifyFormat("int f()\n"
8959 "{ // comment\n"
8960 " return 42;\n"
8961 "}",
8962 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008963
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008964 AllmanBraceStyle.ColumnLimit = 19;
8965 verifyFormat("void f() { int i; }", AllmanBraceStyle);
8966 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00008967 verifyFormat("void f()\n"
8968 "{\n"
8969 " int i;\n"
8970 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008971 AllmanBraceStyle);
8972 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00008973
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008974 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00008975 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
8976 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
8977 verifyFormat("void f(bool b)\n"
8978 "{\n"
8979 " if (b)\n"
8980 " {\n"
8981 " return;\n"
8982 " }\n"
8983 "}\n",
8984 BreakBeforeBraceShortIfs);
8985 verifyFormat("void f(bool b)\n"
8986 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00008987 " if constexpr (b)\n"
8988 " {\n"
8989 " return;\n"
8990 " }\n"
8991 "}\n",
8992 BreakBeforeBraceShortIfs);
8993 verifyFormat("void f(bool b)\n"
8994 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00008995 " if (b) return;\n"
8996 "}\n",
8997 BreakBeforeBraceShortIfs);
8998 verifyFormat("void f(bool b)\n"
8999 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009000 " if constexpr (b) return;\n"
9001 "}\n",
9002 BreakBeforeBraceShortIfs);
9003 verifyFormat("void f(bool b)\n"
9004 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009005 " while (b)\n"
9006 " {\n"
9007 " return;\n"
9008 " }\n"
9009 "}\n",
9010 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009011}
9012
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009013TEST_F(FormatTest, GNUBraceBreaking) {
9014 FormatStyle GNUBraceStyle = getLLVMStyle();
9015 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9016 verifyFormat("namespace a\n"
9017 "{\n"
9018 "class A\n"
9019 "{\n"
9020 " void f()\n"
9021 " {\n"
9022 " int a;\n"
9023 " {\n"
9024 " int b;\n"
9025 " }\n"
9026 " if (true)\n"
9027 " {\n"
9028 " a();\n"
9029 " b();\n"
9030 " }\n"
9031 " }\n"
9032 " void g() { return; }\n"
9033 "}\n"
9034 "}",
9035 GNUBraceStyle);
9036
9037 verifyFormat("void f()\n"
9038 "{\n"
9039 " if (true)\n"
9040 " {\n"
9041 " a();\n"
9042 " }\n"
9043 " else if (false)\n"
9044 " {\n"
9045 " b();\n"
9046 " }\n"
9047 " else\n"
9048 " {\n"
9049 " c();\n"
9050 " }\n"
9051 "}\n",
9052 GNUBraceStyle);
9053
9054 verifyFormat("void f()\n"
9055 "{\n"
9056 " for (int i = 0; i < 10; ++i)\n"
9057 " {\n"
9058 " a();\n"
9059 " }\n"
9060 " while (false)\n"
9061 " {\n"
9062 " b();\n"
9063 " }\n"
9064 " do\n"
9065 " {\n"
9066 " c();\n"
9067 " }\n"
9068 " while (false);\n"
9069 "}\n",
9070 GNUBraceStyle);
9071
9072 verifyFormat("void f(int a)\n"
9073 "{\n"
9074 " switch (a)\n"
9075 " {\n"
9076 " case 0:\n"
9077 " break;\n"
9078 " case 1:\n"
9079 " {\n"
9080 " break;\n"
9081 " }\n"
9082 " case 2:\n"
9083 " {\n"
9084 " }\n"
9085 " break;\n"
9086 " default:\n"
9087 " break;\n"
9088 " }\n"
9089 "}\n",
9090 GNUBraceStyle);
9091
9092 verifyFormat("enum X\n"
9093 "{\n"
9094 " Y = 0,\n"
9095 "}\n",
9096 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009097
9098 verifyFormat("@interface BSApplicationController ()\n"
9099 "{\n"
9100 "@private\n"
9101 " id _extraIvar;\n"
9102 "}\n"
9103 "@end\n",
9104 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009105
9106 verifyFormat("#ifdef _DEBUG\n"
9107 "int foo(int i = 0)\n"
9108 "#else\n"
9109 "int foo(int i = 5)\n"
9110 "#endif\n"
9111 "{\n"
9112 " return i;\n"
9113 "}",
9114 GNUBraceStyle);
9115
9116 verifyFormat("void foo() {}\n"
9117 "void bar()\n"
9118 "#ifdef _DEBUG\n"
9119 "{\n"
9120 " foo();\n"
9121 "}\n"
9122 "#else\n"
9123 "{\n"
9124 "}\n"
9125 "#endif",
9126 GNUBraceStyle);
9127
9128 verifyFormat("void foobar() { int i = 5; }\n"
9129 "#ifdef _DEBUG\n"
9130 "void bar() {}\n"
9131 "#else\n"
9132 "void bar() { foobar(); }\n"
9133 "#endif",
9134 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009135}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009136
9137TEST_F(FormatTest, WebKitBraceBreaking) {
9138 FormatStyle WebKitBraceStyle = getLLVMStyle();
9139 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009140 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009141 verifyFormat("namespace a {\n"
9142 "class A {\n"
9143 " void f()\n"
9144 " {\n"
9145 " if (true) {\n"
9146 " a();\n"
9147 " b();\n"
9148 " }\n"
9149 " }\n"
9150 " void g() { return; }\n"
9151 "};\n"
9152 "enum E {\n"
9153 " A,\n"
9154 " // foo\n"
9155 " B,\n"
9156 " C\n"
9157 "};\n"
9158 "struct B {\n"
9159 " int x;\n"
9160 "};\n"
9161 "}\n",
9162 WebKitBraceStyle);
9163 verifyFormat("struct S {\n"
9164 " int Type;\n"
9165 " union {\n"
9166 " int x;\n"
9167 " double y;\n"
9168 " } Value;\n"
9169 " class C {\n"
9170 " MyFavoriteType Value;\n"
9171 " } Class;\n"
9172 "};\n",
9173 WebKitBraceStyle);
9174}
9175
Manuel Klimekd5735502013-08-12 03:51:17 +00009176TEST_F(FormatTest, CatchExceptionReferenceBinding) {
9177 verifyFormat("void f() {\n"
9178 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00009179 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00009180 " }\n"
9181 "}\n",
9182 getLLVMStyle());
9183}
9184
Daniel Jasper9613c812013-08-07 16:29:23 +00009185TEST_F(FormatTest, UnderstandsPragmas) {
9186 verifyFormat("#pragma omp reduction(| : var)");
9187 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +00009188
9189 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
9190 "(including parentheses).",
9191 format("#pragma mark Any non-hyphenated or hyphenated string "
9192 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +00009193}
9194
Daniel Jasperee4a8a12015-04-22 09:45:42 +00009195TEST_F(FormatTest, UnderstandPragmaOption) {
9196 verifyFormat("#pragma option -C -A");
9197
9198 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
9199}
9200
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009201#define EXPECT_ALL_STYLES_EQUAL(Styles) \
9202 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +00009203 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
9204 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +00009205
9206TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009207 SmallVector<FormatStyle, 3> Styles;
9208 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009209
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009210 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009211 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
9212 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
9213 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009214
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009215 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009216 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
9217 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
9218 EXPECT_ALL_STYLES_EQUAL(Styles);
9219
Nico Weber514ecc82014-02-02 20:50:45 +00009220 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009221 EXPECT_TRUE(
9222 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
9223 EXPECT_TRUE(
9224 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
9225 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009226
Nico Weber514ecc82014-02-02 20:50:45 +00009227 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009228 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
9229 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
9230 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009231
9232 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009233 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
9234 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
9235 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009236
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009237 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009238 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
9239 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
9240 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009241
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +00009242 Styles[0] = getGNUStyle();
9243 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
9244 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
9245 EXPECT_ALL_STYLES_EQUAL(Styles);
9246
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009247 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
9248}
9249
9250TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
9251 SmallVector<FormatStyle, 8> Styles;
9252 Styles.resize(2);
9253
9254 Styles[0] = getGoogleStyle();
9255 Styles[1] = getLLVMStyle();
9256 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9257 EXPECT_ALL_STYLES_EQUAL(Styles);
9258
9259 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +00009260 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009261 Styles[1] = getLLVMStyle();
9262 Styles[1].Language = FormatStyle::LK_JavaScript;
9263 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9264
9265 Styles[2] = getLLVMStyle();
9266 Styles[2].Language = FormatStyle::LK_JavaScript;
9267 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
9268 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009269 &Styles[2])
9270 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009271
9272 Styles[3] = getLLVMStyle();
9273 Styles[3].Language = FormatStyle::LK_JavaScript;
9274 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
9275 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009276 &Styles[3])
9277 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009278
9279 Styles[4] = getLLVMStyle();
9280 Styles[4].Language = FormatStyle::LK_JavaScript;
9281 EXPECT_EQ(0, parseConfiguration("---\n"
9282 "BasedOnStyle: LLVM\n"
9283 "IndentWidth: 123\n"
9284 "---\n"
9285 "BasedOnStyle: Google\n"
9286 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009287 &Styles[4])
9288 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009289 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009290}
9291
Daniel Jasper91881d92014-09-29 08:07:46 +00009292#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +00009293 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +00009294 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009295 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +00009296 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +00009297 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009298
Daniel Jasper91881d92014-09-29 08:07:46 +00009299#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
9300
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009301#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
9302 Style.STRUCT.FIELD = false; \
9303 EXPECT_EQ(0, \
9304 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
9305 .value()); \
9306 EXPECT_TRUE(Style.STRUCT.FIELD); \
9307 EXPECT_EQ(0, \
9308 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
9309 .value()); \
9310 EXPECT_FALSE(Style.STRUCT.FIELD);
9311
9312#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
9313 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
9314
Daniel Jasper00853002014-09-16 16:22:30 +00009315#define CHECK_PARSE(TEXT, FIELD, VALUE) \
9316 EXPECT_NE(VALUE, Style.FIELD); \
9317 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
9318 EXPECT_EQ(VALUE, Style.FIELD)
9319
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009320TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009321 FormatStyle Style = {};
9322 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +00009323 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +00009324 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +00009325 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009326 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009327 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +00009328 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +00009329 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009330 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +00009331 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00009332 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +00009333 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00009334 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00009335 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +00009336 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00009337 CHECK_PARSE_BOOL(BreakStringLiterals);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00009338 CHECK_PARSE_BOOL(BreakBeforeInheritanceComma)
Francois Ferrande56a8292017-06-14 12:29:47 +00009339 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009340 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +00009341 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +00009342 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +00009343 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009344 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00009345 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +00009346 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +00009347 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009348 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +00009349 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +00009350 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +00009351 CHECK_PARSE_BOOL(SortIncludes);
Krasimir Georgievac16a202017-06-23 11:46:03 +00009352 CHECK_PARSE_BOOL(SortUsingDeclarations);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009353 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +00009354 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009355 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009356 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +00009357 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009358 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009359 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +00009360 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +00009361 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009362
9363 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
9364 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
9365 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
9366 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
9367 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
9368 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
9369 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
9370 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
9371 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
9372 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
9373 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00009374 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunctionBody);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009375}
Alexander Kornienkod6538332013-05-07 15:32:14 +00009376
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009377#undef CHECK_PARSE_BOOL
9378
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009379TEST_F(FormatTest, ParsesConfiguration) {
9380 FormatStyle Style = {};
9381 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00009382 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009383 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
9384 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +00009385 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009386 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
9387 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +00009388 CHECK_PARSE("PenaltyBreakAssignment: 1234",
9389 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +00009390 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
9391 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009392 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
9393 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
9394 PenaltyReturnTypeOnItsOwnLine, 1234u);
9395 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
9396 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +00009397 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +00009398 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00009399 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +00009400
Daniel Jasper553d4872014-06-17 12:40:34 +00009401 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +00009402 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
9403 FormatStyle::PAS_Left);
9404 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
9405 FormatStyle::PAS_Right);
9406 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
9407 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +00009408 // For backward compatibility:
9409 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
9410 FormatStyle::PAS_Left);
9411 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
9412 FormatStyle::PAS_Right);
9413 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
9414 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +00009415
Alexander Kornienkod6538332013-05-07 15:32:14 +00009416 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +00009417 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
9418 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009419 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
9420 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
9421 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
9422
Daniel Jasperac043c92014-09-15 11:11:00 +00009423 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +00009424 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
9425 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +00009426 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
9427 FormatStyle::BOS_None);
9428 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
9429 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00009430 // For backward compatibility:
9431 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
9432 FormatStyle::BOS_None);
9433 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
9434 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +00009435
Francois Ferranda6b6d512017-05-24 11:36:58 +00009436 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
9437 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
9438 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
9439 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
9440 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
9441 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
9442 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
9443 // For backward compatibility:
9444 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
9445 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
9446
Daniel Jasper6501f7e2015-10-27 12:38:37 +00009447 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9448 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
9449 FormatStyle::BAS_Align);
9450 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
9451 FormatStyle::BAS_DontAlign);
9452 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
9453 FormatStyle::BAS_AlwaysBreak);
9454 // For backward compatibility:
9455 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
9456 FormatStyle::BAS_DontAlign);
9457 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
9458 FormatStyle::BAS_Align);
9459
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009460 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
9461 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
9462 FormatStyle::ENAS_DontAlign);
9463 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
9464 FormatStyle::ENAS_Left);
9465 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
9466 FormatStyle::ENAS_Right);
9467 // For backward compatibility:
9468 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
9469 FormatStyle::ENAS_Left);
9470 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
9471 FormatStyle::ENAS_Right);
9472
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009473 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009474 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
9475 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
9476 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00009477 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
9478 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +00009479 // For backward compatibility:
9480 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
9481 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009482
Daniel Jasperd74cf402014-04-08 12:46:38 +00009483 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +00009484 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
9485 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
9486 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
9487 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +00009488 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
9489 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +00009490 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
9491 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00009492 // For backward compatibility:
9493 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
9494 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
9495 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
9496 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +00009497
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009498 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
9499 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
9500 FormatStyle::SBPO_Never);
9501 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
9502 FormatStyle::SBPO_Always);
9503 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
9504 FormatStyle::SBPO_ControlStatements);
9505 // For backward compatibility:
9506 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
9507 FormatStyle::SBPO_Never);
9508 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
9509 FormatStyle::SBPO_ControlStatements);
9510
Alexander Kornienkod6538332013-05-07 15:32:14 +00009511 Style.ColumnLimit = 123;
9512 FormatStyle BaseStyle = getLLVMStyle();
9513 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
9514 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
9515
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009516 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
9517 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
9518 FormatStyle::BS_Attach);
9519 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
9520 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009521 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
9522 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009523 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
9524 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009525 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
9526 FormatStyle::BS_Allman);
9527 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009528 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
9529 FormatStyle::BS_WebKit);
9530 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
9531 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009532
Zachary Turner448592e2015-12-18 22:20:15 +00009533 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
9534 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
9535 FormatStyle::RTBS_None);
9536 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
9537 FormatStyle::RTBS_All);
9538 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +00009539 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +00009540 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
9541 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
9542 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
9543 AlwaysBreakAfterReturnType,
9544 FormatStyle::RTBS_TopLevelDefinitions);
9545
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00009546 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
9547 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
9548 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
9549 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
9550 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
9551 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
9552 AlwaysBreakAfterDefinitionReturnType,
9553 FormatStyle::DRTBS_TopLevel);
9554
Daniel Jasper65ee3472013-07-31 23:16:02 +00009555 Style.NamespaceIndentation = FormatStyle::NI_All;
9556 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
9557 FormatStyle::NI_None);
9558 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
9559 FormatStyle::NI_Inner);
9560 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
9561 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +00009562
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00009563 // FIXME: This is required because parsing a configuration simply overwrites
9564 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +00009565 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +00009566 std::vector<std::string> BoostForeach;
9567 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00009568 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +00009569 std::vector<std::string> BoostAndQForeach;
9570 BoostAndQForeach.push_back("BOOST_FOREACH");
9571 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00009572 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
9573 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00009574
9575 Style.IncludeCategories.clear();
9576 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
9577 {".*", 1}};
9578 CHECK_PARSE("IncludeCategories:\n"
9579 " - Regex: abc/.*\n"
9580 " Priority: 2\n"
9581 " - Regex: .*\n"
9582 " Priority: 1",
9583 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00009584 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009585}
9586
9587TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
9588 FormatStyle Style = {};
9589 Style.Language = FormatStyle::LK_Cpp;
9590 CHECK_PARSE("Language: Cpp\n"
9591 "IndentWidth: 12",
9592 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +00009593 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
9594 "IndentWidth: 34",
9595 &Style),
9596 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009597 EXPECT_EQ(12u, Style.IndentWidth);
9598 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
9599 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
9600
9601 Style.Language = FormatStyle::LK_JavaScript;
9602 CHECK_PARSE("Language: JavaScript\n"
9603 "IndentWidth: 12",
9604 IndentWidth, 12u);
9605 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +00009606 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
9607 "IndentWidth: 34",
9608 &Style),
9609 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009610 EXPECT_EQ(23u, Style.IndentWidth);
9611 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
9612 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
9613
9614 CHECK_PARSE("BasedOnStyle: LLVM\n"
9615 "IndentWidth: 67",
9616 IndentWidth, 67u);
9617
9618 CHECK_PARSE("---\n"
9619 "Language: JavaScript\n"
9620 "IndentWidth: 12\n"
9621 "---\n"
9622 "Language: Cpp\n"
9623 "IndentWidth: 34\n"
9624 "...\n",
9625 IndentWidth, 12u);
9626
9627 Style.Language = FormatStyle::LK_Cpp;
9628 CHECK_PARSE("---\n"
9629 "Language: JavaScript\n"
9630 "IndentWidth: 12\n"
9631 "---\n"
9632 "Language: Cpp\n"
9633 "IndentWidth: 34\n"
9634 "...\n",
9635 IndentWidth, 34u);
9636 CHECK_PARSE("---\n"
9637 "IndentWidth: 78\n"
9638 "---\n"
9639 "Language: JavaScript\n"
9640 "IndentWidth: 56\n"
9641 "...\n",
9642 IndentWidth, 78u);
9643
9644 Style.ColumnLimit = 123;
9645 Style.IndentWidth = 234;
9646 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
9647 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +00009648 EXPECT_FALSE(parseConfiguration("---\n"
9649 "IndentWidth: 456\n"
9650 "BreakBeforeBraces: Allman\n"
9651 "---\n"
9652 "Language: JavaScript\n"
9653 "IndentWidth: 111\n"
9654 "TabWidth: 111\n"
9655 "---\n"
9656 "Language: Cpp\n"
9657 "BreakBeforeBraces: Stroustrup\n"
9658 "TabWidth: 789\n"
9659 "...\n",
9660 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009661 EXPECT_EQ(123u, Style.ColumnLimit);
9662 EXPECT_EQ(456u, Style.IndentWidth);
9663 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
9664 EXPECT_EQ(789u, Style.TabWidth);
9665
Rafael Espindola1f243172014-06-12 11:35:17 +00009666 EXPECT_EQ(parseConfiguration("---\n"
9667 "Language: JavaScript\n"
9668 "IndentWidth: 56\n"
9669 "---\n"
9670 "IndentWidth: 78\n"
9671 "...\n",
9672 &Style),
9673 ParseError::Error);
9674 EXPECT_EQ(parseConfiguration("---\n"
9675 "Language: JavaScript\n"
9676 "IndentWidth: 56\n"
9677 "---\n"
9678 "Language: JavaScript\n"
9679 "IndentWidth: 78\n"
9680 "...\n",
9681 &Style),
9682 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009683
9684 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
9685}
Daniel Jasper65ee3472013-07-31 23:16:02 +00009686
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009687#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009688
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009689TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
9690 FormatStyle Style = {};
9691 Style.Language = FormatStyle::LK_JavaScript;
9692 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009693 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00009694 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009695
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009696 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009697 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009698 "BasedOnStyle: Google\n"
9699 "---\n"
9700 "Language: JavaScript\n"
9701 "IndentWidth: 76\n"
9702 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009703 &Style)
9704 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00009705 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009706 EXPECT_EQ(76u, Style.IndentWidth);
9707 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
9708}
9709
Alexander Kornienkod6538332013-05-07 15:32:14 +00009710TEST_F(FormatTest, ConfigurationRoundTripTest) {
9711 FormatStyle Style = getLLVMStyle();
9712 std::string YAML = configurationAsText(Style);
9713 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009714 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00009715 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
9716 EXPECT_EQ(Style, ParsedStyle);
9717}
9718
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009719TEST_F(FormatTest, WorksFor8bitEncodings) {
9720 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
9721 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
9722 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
9723 "\"\xef\xee\xf0\xf3...\"",
9724 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
9725 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
9726 "\xef\xee\xf0\xf3...\"",
9727 getLLVMStyleWithColumns(12)));
9728}
9729
Alexander Kornienko393e3082013-11-13 14:04:17 +00009730TEST_F(FormatTest, HandlesUTF8BOM) {
9731 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
9732 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
9733 format("\xef\xbb\xbf#include <iostream>"));
9734 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
9735 format("\xef\xbb\xbf\n#include <iostream>"));
9736}
9737
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +00009738// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
9739#if !defined(_MSC_VER)
9740
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009741TEST_F(FormatTest, CountsUTF8CharactersProperly) {
9742 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
9743 getLLVMStyleWithColumns(35));
9744 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009745 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009746 verifyFormat("// Однажды в студёную зимнюю пору...",
9747 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +00009748 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009749 verifyFormat("/* Однажды в студёную зимнюю пору... */",
9750 getLLVMStyleWithColumns(39));
9751 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009752 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009753}
9754
9755TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +00009756 // Non-printable characters' width is currently considered to be the length in
9757 // bytes in UTF8. The characters can be displayed in very different manner
9758 // (zero-width, single width with a substitution glyph, expanded to their code
9759 // (e.g. "<8d>"), so there's no single correct way to handle them.
9760 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00009761 "\"\xc2\x8d\";",
9762 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +00009763 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00009764 "\"\xc2\x8d\";",
9765 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +00009766 EXPECT_EQ("\"Однажды, в \"\n"
9767 "\"студёную \"\n"
9768 "\"зимнюю \"\n"
9769 "\"пору,\"",
9770 format("\"Однажды, в студёную зимнюю пору,\"",
9771 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009772 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +00009773 "\"一 二 三 \"\n"
9774 "\"四 五六 \"\n"
9775 "\"七 八 九 \"\n"
9776 "\"十\"",
9777 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009778 EXPECT_EQ("\"一\t二 \"\n"
9779 "\"\t三 \"\n"
9780 "\"四 五\t六 \"\n"
9781 "\"\t七 \"\n"
9782 "\"八九十\tqq\"",
9783 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
9784 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +00009785
9786 // UTF8 character in an escape sequence.
9787 EXPECT_EQ("\"aaaaaa\"\n"
9788 "\"\\\xC2\x8D\"",
9789 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009790}
9791
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009792TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
9793 EXPECT_EQ("const char *sssss =\n"
9794 " \"一二三四五六七八\\\n"
9795 " 九 十\";",
9796 format("const char *sssss = \"一二三四五六七八\\\n"
9797 " 九 十\";",
9798 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009799}
9800
9801TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00009802 EXPECT_EQ("// aaaaÄ\xc2\x8d",
9803 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009804 EXPECT_EQ("// Я из лесу\n"
9805 "// вышел; был\n"
9806 "// сильный\n"
9807 "// мороз.",
9808 format("// Я из лесу вышел; был сильный мороз.",
9809 getLLVMStyleWithColumns(13)));
9810 EXPECT_EQ("// 一二三\n"
9811 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009812 "// 八 九\n"
9813 "// 十",
9814 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009815}
9816
9817TEST_F(FormatTest, SplitsUTF8BlockComments) {
9818 EXPECT_EQ("/* Гляжу,\n"
9819 " * поднимается\n"
9820 " * медленно в\n"
9821 " * гору\n"
9822 " * Лошадка,\n"
9823 " * везущая\n"
9824 " * хворосту\n"
9825 " * воз. */",
9826 format("/* Гляжу, поднимается медленно в гору\n"
9827 " * Лошадка, везущая хворосту воз. */",
9828 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009829 EXPECT_EQ(
9830 "/* 一二三\n"
9831 " * 四五六七\n"
9832 " * 八 九\n"
9833 " * 十 */",
9834 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +00009835 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
9836 " * 𝕓𝕪𝕥𝕖\n"
9837 " * 𝖀𝕿𝕱-𝟠 */",
9838 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009839}
9840
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009841#endif // _MSC_VER
9842
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009843TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
9844 FormatStyle Style = getLLVMStyle();
9845
9846 Style.ConstructorInitializerIndentWidth = 4;
9847 verifyFormat(
9848 "SomeClass::Constructor()\n"
9849 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
9850 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
9851 Style);
9852
9853 Style.ConstructorInitializerIndentWidth = 2;
9854 verifyFormat(
9855 "SomeClass::Constructor()\n"
9856 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
9857 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
9858 Style);
9859
9860 Style.ConstructorInitializerIndentWidth = 0;
9861 verifyFormat(
9862 "SomeClass::Constructor()\n"
9863 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
9864 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
9865 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +00009866 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9867 verifyFormat(
9868 "SomeLongTemplateVariableName<\n"
9869 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
9870 Style);
9871 verifyFormat(
9872 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
9873 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
9874 Style);
Daniel Jasper00853002014-09-16 16:22:30 +00009875}
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009876
Daniel Jasper00853002014-09-16 16:22:30 +00009877TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
9878 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +00009879 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009880 Style.ConstructorInitializerIndentWidth = 4;
9881 verifyFormat("SomeClass::Constructor()\n"
9882 " : a(a)\n"
9883 " , b(b)\n"
9884 " , c(c) {}",
9885 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009886 verifyFormat("SomeClass::Constructor()\n"
9887 " : a(a) {}",
9888 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009889
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009890 Style.ColumnLimit = 0;
9891 verifyFormat("SomeClass::Constructor()\n"
9892 " : a(a) {}",
9893 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +00009894 verifyFormat("SomeClass::Constructor() noexcept\n"
9895 " : a(a) {}",
9896 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009897 verifyFormat("SomeClass::Constructor()\n"
9898 " : a(a)\n"
9899 " , b(b)\n"
9900 " , c(c) {}",
9901 Style);
9902 verifyFormat("SomeClass::Constructor()\n"
9903 " : a(a) {\n"
9904 " foo();\n"
9905 " bar();\n"
9906 "}",
9907 Style);
9908
Daniel Jasperd74cf402014-04-08 12:46:38 +00009909 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009910 verifyFormat("SomeClass::Constructor()\n"
9911 " : a(a)\n"
9912 " , b(b)\n"
9913 " , c(c) {\n}",
9914 Style);
9915 verifyFormat("SomeClass::Constructor()\n"
9916 " : a(a) {\n}",
9917 Style);
9918
9919 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +00009920 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009921 Style.ConstructorInitializerIndentWidth = 2;
9922 verifyFormat("SomeClass::Constructor()\n"
9923 " : a(a)\n"
9924 " , b(b)\n"
9925 " , c(c) {}",
9926 Style);
9927
9928 Style.ConstructorInitializerIndentWidth = 0;
9929 verifyFormat("SomeClass::Constructor()\n"
9930 ": a(a)\n"
9931 ", b(b)\n"
9932 ", c(c) {}",
9933 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +00009934
9935 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
9936 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009937 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
9938 verifyFormat(
9939 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
9940 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +00009941 verifyFormat(
9942 "SomeClass::Constructor()\n"
9943 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
9944 Style);
9945 Style.ConstructorInitializerIndentWidth = 4;
9946 Style.ColumnLimit = 60;
9947 verifyFormat("SomeClass::Constructor()\n"
9948 " : aaaaaaaa(aaaaaaaa)\n"
9949 " , aaaaaaaa(aaaaaaaa)\n"
9950 " , aaaaaaaa(aaaaaaaa) {}",
9951 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009952}
9953
Daniel Jasper38efc132014-10-21 07:51:54 +00009954TEST_F(FormatTest, Destructors) {
9955 verifyFormat("void F(int &i) { i.~int(); }");
9956 verifyFormat("void F(int &i) { i->~int(); }");
9957}
9958
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009959TEST_F(FormatTest, FormatsWithWebKitStyle) {
9960 FormatStyle Style = getWebKitStyle();
9961
9962 // Don't indent in outer namespaces.
9963 verifyFormat("namespace outer {\n"
9964 "int i;\n"
9965 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00009966 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009967 "} // namespace inner\n"
9968 "} // namespace outer\n"
9969 "namespace other_outer {\n"
9970 "int i;\n"
9971 "}",
9972 Style);
9973
9974 // Don't indent case labels.
9975 verifyFormat("switch (variable) {\n"
9976 "case 1:\n"
9977 "case 2:\n"
9978 " doSomething();\n"
9979 " break;\n"
9980 "default:\n"
9981 " ++variable;\n"
9982 "}",
9983 Style);
9984
9985 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +00009986 EXPECT_EQ("void f()\n"
9987 "{\n"
9988 " if (aaaaaaaaaaaaaaaa\n"
9989 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
9990 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
9991 " return;\n"
9992 "}",
9993 format("void f() {\n"
9994 "if (aaaaaaaaaaaaaaaa\n"
9995 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
9996 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
9997 "return;\n"
9998 "}",
9999 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010000
Daniel Jasper35995672014-04-29 14:05:20 +000010001 // Allow functions on a single line.
10002 verifyFormat("void f() { return; }", Style);
10003
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010004 // Constructor initializers are formatted one per line with the "," on the
10005 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010006 verifyFormat("Constructor()\n"
10007 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10008 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010009 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010010 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10011 "{\n"
10012 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010013 Style);
10014 verifyFormat("SomeClass::Constructor()\n"
10015 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010016 "{\n"
10017 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010018 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010019 EXPECT_EQ("SomeClass::Constructor()\n"
10020 " : a(a)\n"
10021 "{\n"
10022 "}",
10023 format("SomeClass::Constructor():a(a){}", Style));
10024 verifyFormat("SomeClass::Constructor()\n"
10025 " : a(a)\n"
10026 " , b(b)\n"
10027 " , c(c)\n"
10028 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010029 "}",
10030 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010031 verifyFormat("SomeClass::Constructor()\n"
10032 " : a(a)\n"
10033 "{\n"
10034 " foo();\n"
10035 " bar();\n"
10036 "}",
10037 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010038
Daniel Jasper65ee3472013-07-31 23:16:02 +000010039 // Access specifiers should be aligned left.
10040 verifyFormat("class C {\n"
10041 "public:\n"
10042 " int i;\n"
10043 "};",
10044 Style);
10045
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010046 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010047 verifyFormat("int a; // Do not\n"
10048 "double b; // align comments.",
10049 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010050
Daniel Jasper3219e432014-12-02 13:24:51 +000010051 // Do not align operands.
10052 EXPECT_EQ("ASSERT(aaaa\n"
10053 " || bbbb);",
10054 format("ASSERT ( aaaa\n||bbbb);", Style));
10055
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010056 // Accept input's line breaks.
10057 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10058 " || bbbbbbbbbbbbbbb) {\n"
10059 " i++;\n"
10060 "}",
10061 format("if (aaaaaaaaaaaaaaa\n"
10062 "|| bbbbbbbbbbbbbbb) { i++; }",
10063 Style));
10064 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10065 " i++;\n"
10066 "}",
10067 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010068
10069 // Don't automatically break all macro definitions (llvm.org/PR17842).
10070 verifyFormat("#define aNumber 10", Style);
10071 // However, generally keep the line breaks that the user authored.
10072 EXPECT_EQ("#define aNumber \\\n"
10073 " 10",
10074 format("#define aNumber \\\n"
10075 " 10",
10076 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010077
10078 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010079 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10080 " copyItems:YES];",
10081 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10082 "copyItems:YES];",
10083 Style));
10084 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10085 " copyItems:YES];",
10086 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10087 " copyItems:YES];",
10088 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010089 // FIXME: This does not seem right, there should be more indentation before
10090 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010091 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010092 " @\"a\",\n"
10093 " @\"a\"\n"
10094 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010095 " copyItems:YES];",
10096 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10097 " @\"a\",\n"
10098 " @\"a\"\n"
10099 " ]\n"
10100 " copyItems:YES];",
10101 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010102 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010103 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10104 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010105 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10106 " copyItems:YES];",
10107 Style));
10108
10109 verifyFormat("[self.a b:c c:d];", Style);
10110 EXPECT_EQ("[self.a b:c\n"
10111 " c:d];",
10112 format("[self.a b:c\n"
10113 "c:d];",
10114 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010115}
10116
Manuel Klimekffdeb592013-09-03 15:10:01 +000010117TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010118 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10119 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10120 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10121 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10122 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000010123 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000010124 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010125 verifyFormat("void f() {\n"
10126 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10127 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010128 verifyFormat("void f() {\n"
10129 " other(x.begin(), //\n"
10130 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000010131 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010132 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000010133 verifyFormat("SomeFunction([]() { // A cool function...\n"
10134 " return 43;\n"
10135 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000010136 EXPECT_EQ("SomeFunction([]() {\n"
10137 "#define A a\n"
10138 " return 43;\n"
10139 "});",
10140 format("SomeFunction([](){\n"
10141 "#define A a\n"
10142 "return 43;\n"
10143 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000010144 verifyFormat("void f() {\n"
10145 " SomeFunction([](decltype(x), A *a) {});\n"
10146 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010147 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10148 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000010149 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
10150 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
10151 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000010152 verifyFormat("Constructor()\n"
10153 " : Field([] { // comment\n"
10154 " int i;\n"
10155 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000010156 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
10157 " return some_parameter.size();\n"
10158 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000010159 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
10160 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000010161 verifyFormat("int i = aaaaaa ? 1 //\n"
10162 " : [] {\n"
10163 " return 2; //\n"
10164 " }();");
10165 verifyFormat("llvm::errs() << \"number of twos is \"\n"
10166 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
10167 " return x == 2; // force break\n"
10168 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000010169 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10170 " [=](int iiiiiiiiiiii) {\n"
10171 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
10172 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
10173 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000010174 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000010175 verifyFormat("SomeFunction({[&] {\n"
10176 " // comment\n"
10177 " },\n"
10178 " [&] {\n"
10179 " // comment\n"
10180 " }});");
10181 verifyFormat("SomeFunction({[&] {\n"
10182 " // comment\n"
10183 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000010184 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
10185 " [&]() { return true; },\n"
10186 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010187
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010188 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000010189 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000010190 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000010191 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
10192 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010193 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000010194 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010195 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
10196 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000010197 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010198 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
10199 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010200 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010201 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000010202 verifyFormat(
10203 "aaaaaaaaaaaaaaaaaaaaaa(\n"
10204 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
10205 " return aaaaaaaaaaaaaaaaa;\n"
10206 " });",
10207 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000010208 verifyFormat("[]() //\n"
10209 " -> int {\n"
10210 " return 1; //\n"
10211 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010212
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010213 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000010214 verifyFormat("SomeFunction(\n"
10215 " []() {\n"
10216 " int i = 42;\n"
10217 " return i;\n"
10218 " },\n"
10219 " []() {\n"
10220 " int j = 43;\n"
10221 " return j;\n"
10222 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010223
Daniel Jasperda18fd82014-06-10 06:39:03 +000010224 // More complex introducers.
10225 verifyFormat("return [i, args...] {};");
10226
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010227 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000010228 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000010229 verifyFormat("double &operator[](int i) { return 0; }\n"
10230 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000010231 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000010232 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000010233 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000010234
10235 // Other corner cases.
10236 verifyFormat("void f() {\n"
10237 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000010238 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000010239 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000010240
10241 // Lambdas created through weird macros.
10242 verifyFormat("void f() {\n"
10243 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000010244 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000010245 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000010246
10247 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
10248 " doo_dah();\n"
10249 " doo_dah();\n"
10250 " })) {\n"
10251 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000010252 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
10253 " doo_dah();\n"
10254 " doo_dah();\n"
10255 " })) {\n"
10256 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000010257 verifyFormat("auto lambda = []() {\n"
10258 " int a = 2\n"
10259 "#if A\n"
10260 " + 2\n"
10261 "#endif\n"
10262 " ;\n"
10263 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000010264
10265 // Lambdas with complex multiline introducers.
10266 verifyFormat(
10267 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10268 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
10269 " -> ::std::unordered_set<\n"
10270 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
10271 " //\n"
10272 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000010273}
10274
Manuel Klimek516e0542013-09-04 13:25:30 +000010275TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000010276 FormatStyle ShortBlocks = getLLVMStyle();
10277 ShortBlocks.AllowShortBlocksOnASingleLine = true;
10278 verifyFormat("int (^Block)(int, int);", ShortBlocks);
10279 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
10280 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
10281 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
10282 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
10283 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000010284
Daniel Jasper76284682014-10-22 09:12:44 +000010285 verifyFormat("foo(^{ bar(); });", ShortBlocks);
10286 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
10287 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000010288
Daniel Jasper76284682014-10-22 09:12:44 +000010289 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010290 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010291 "}];");
10292 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010293 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010294 "}]};");
10295 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010296 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010297 "}];");
10298 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010299 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010300 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000010301 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010302 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010303 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010304 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010305 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010306
10307 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010308 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010309 "}];",
10310 getLLVMStyleWithColumns(60));
10311 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010312 " NSString *path = [self sessionFilePath];\n"
10313 " if (path) {\n"
10314 " // ...\n"
10315 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010316 "});");
10317 verifyFormat("[[SessionService sharedService]\n"
10318 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010319 " if (window) {\n"
10320 " [self windowDidLoad:window];\n"
10321 " } else {\n"
10322 " [self errorLoadingWindow];\n"
10323 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010324 " }];");
10325 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010326 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010327 "};\n",
10328 getLLVMStyleWithColumns(40));
10329 verifyFormat("[[SessionService sharedService]\n"
10330 " loadWindowWithCompletionBlock: //\n"
10331 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010332 " if (window) {\n"
10333 " [self windowDidLoad:window];\n"
10334 " } else {\n"
10335 " [self errorLoadingWindow];\n"
10336 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010337 " }];",
10338 getLLVMStyleWithColumns(60));
10339 verifyFormat("[myObject doSomethingWith:arg1\n"
10340 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010341 " // ...\n"
10342 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010343 " }\n"
10344 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010345 " // ...\n"
10346 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000010347 " }\n"
10348 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010349 " // ...\n"
10350 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010351 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000010352 verifyFormat("[myObject doSomethingWith:arg1\n"
10353 " firstBlock:-1\n"
10354 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010355 " // ...\n"
10356 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000010357 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010358
10359 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010360 " @autoreleasepool {\n"
10361 " if (a) {\n"
10362 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010363 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010364 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010365 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000010366 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000010367 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
10368 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000010369
10370 FormatStyle FourIndent = getLLVMStyle();
10371 FourIndent.ObjCBlockIndentWidth = 4;
10372 verifyFormat("[operation setCompletionBlock:^{\n"
10373 " [self onOperationDone];\n"
10374 "}];",
10375 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000010376}
10377
Daniel Jasper289afc02015-04-23 09:23:17 +000010378TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
10379 FormatStyle ZeroColumn = getLLVMStyle();
10380 ZeroColumn.ColumnLimit = 0;
10381
10382 verifyFormat("[[SessionService sharedService] "
10383 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10384 " if (window) {\n"
10385 " [self windowDidLoad:window];\n"
10386 " } else {\n"
10387 " [self errorLoadingWindow];\n"
10388 " }\n"
10389 "}];",
10390 ZeroColumn);
10391 EXPECT_EQ("[[SessionService sharedService]\n"
10392 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10393 " if (window) {\n"
10394 " [self windowDidLoad:window];\n"
10395 " } else {\n"
10396 " [self errorLoadingWindow];\n"
10397 " }\n"
10398 " }];",
10399 format("[[SessionService sharedService]\n"
10400 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10401 " if (window) {\n"
10402 " [self windowDidLoad:window];\n"
10403 " } else {\n"
10404 " [self errorLoadingWindow];\n"
10405 " }\n"
10406 "}];",
10407 ZeroColumn));
10408 verifyFormat("[myObject doSomethingWith:arg1\n"
10409 " firstBlock:^(Foo *a) {\n"
10410 " // ...\n"
10411 " int i;\n"
10412 " }\n"
10413 " secondBlock:^(Bar *b) {\n"
10414 " // ...\n"
10415 " int i;\n"
10416 " }\n"
10417 " thirdBlock:^Foo(Bar *b) {\n"
10418 " // ...\n"
10419 " int i;\n"
10420 " }];",
10421 ZeroColumn);
10422 verifyFormat("f(^{\n"
10423 " @autoreleasepool {\n"
10424 " if (a) {\n"
10425 " g();\n"
10426 " }\n"
10427 " }\n"
10428 "});",
10429 ZeroColumn);
10430 verifyFormat("void (^largeBlock)(void) = ^{\n"
10431 " // ...\n"
10432 "};",
10433 ZeroColumn);
10434
10435 ZeroColumn.AllowShortBlocksOnASingleLine = true;
10436 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010437 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000010438 ZeroColumn.AllowShortBlocksOnASingleLine = false;
10439 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
10440 " int i;\n"
10441 "};",
10442 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
10443}
10444
Alexander Kornienko9e649af2013-09-11 12:25:57 +000010445TEST_F(FormatTest, SupportsCRLF) {
10446 EXPECT_EQ("int a;\r\n"
10447 "int b;\r\n"
10448 "int c;\r\n",
10449 format("int a;\r\n"
10450 " int b;\r\n"
10451 " int c;\r\n",
10452 getLLVMStyle()));
10453 EXPECT_EQ("int a;\r\n"
10454 "int b;\r\n"
10455 "int c;\r\n",
10456 format("int a;\r\n"
10457 " int b;\n"
10458 " int c;\r\n",
10459 getLLVMStyle()));
10460 EXPECT_EQ("int a;\n"
10461 "int b;\n"
10462 "int c;\n",
10463 format("int a;\r\n"
10464 " int b;\n"
10465 " int c;\n",
10466 getLLVMStyle()));
10467 EXPECT_EQ("\"aaaaaaa \"\r\n"
10468 "\"bbbbbbb\";\r\n",
10469 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
10470 EXPECT_EQ("#define A \\\r\n"
10471 " b; \\\r\n"
10472 " c; \\\r\n"
10473 " d;\r\n",
10474 format("#define A \\\r\n"
10475 " b; \\\r\n"
10476 " c; d; \r\n",
10477 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000010478
10479 EXPECT_EQ("/*\r\n"
10480 "multi line block comments\r\n"
10481 "should not introduce\r\n"
10482 "an extra carriage return\r\n"
10483 "*/\r\n",
10484 format("/*\r\n"
10485 "multi line block comments\r\n"
10486 "should not introduce\r\n"
10487 "an extra carriage return\r\n"
10488 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000010489}
10490
Manuel Klimekb212f3b2013-10-12 22:46:56 +000010491TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
10492 verifyFormat("MY_CLASS(C) {\n"
10493 " int i;\n"
10494 " int j;\n"
10495 "};");
10496}
10497
Daniel Jasper6633ab82013-10-18 10:38:14 +000010498TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
10499 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
10500 TwoIndent.ContinuationIndentWidth = 2;
10501
10502 EXPECT_EQ("int i =\n"
10503 " longFunction(\n"
10504 " arg);",
10505 format("int i = longFunction(arg);", TwoIndent));
10506
10507 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
10508 SixIndent.ContinuationIndentWidth = 6;
10509
10510 EXPECT_EQ("int i =\n"
10511 " longFunction(\n"
10512 " arg);",
10513 format("int i = longFunction(arg);", SixIndent));
10514}
10515
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010516TEST_F(FormatTest, SpacesInAngles) {
10517 FormatStyle Spaces = getLLVMStyle();
10518 Spaces.SpacesInAngles = true;
10519
10520 verifyFormat("static_cast< int >(arg);", Spaces);
10521 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
10522 verifyFormat("f< int, float >();", Spaces);
10523 verifyFormat("template <> g() {}", Spaces);
10524 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000010525 verifyFormat("std::function< void(int, int) > fct;", Spaces);
10526 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
10527 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010528
10529 Spaces.Standard = FormatStyle::LS_Cpp03;
10530 Spaces.SpacesInAngles = true;
10531 verifyFormat("A< A< int > >();", Spaces);
10532
10533 Spaces.SpacesInAngles = false;
10534 verifyFormat("A<A<int> >();", Spaces);
10535
10536 Spaces.Standard = FormatStyle::LS_Cpp11;
10537 Spaces.SpacesInAngles = true;
10538 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000010539
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010540 Spaces.SpacesInAngles = false;
10541 verifyFormat("A<A<int>>();", Spaces);
10542}
10543
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010544TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
10545 FormatStyle Style = getLLVMStyle();
10546 Style.SpaceAfterTemplateKeyword = false;
10547 verifyFormat("template<int> void foo();", Style);
10548}
10549
Jacques Pienaarfc275112015-02-18 23:48:37 +000010550TEST_F(FormatTest, TripleAngleBrackets) {
10551 verifyFormat("f<<<1, 1>>>();");
10552 verifyFormat("f<<<1, 1, 1, s>>>();");
10553 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000010554 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010555 verifyFormat("f<param><<<1, 1>>>();");
10556 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000010557 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010558 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10559 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000010560 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
10561 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000010562}
10563
10564TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000010565 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000010566 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010567 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10568 "aaallvm::outs() <<");
10569 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10570 "aaaallvm::outs()\n <<");
10571}
10572
Manuel Klimek819788d2014-03-18 11:22:45 +000010573TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
10574 std::string code = "#if A\n"
10575 "#if B\n"
10576 "a.\n"
10577 "#endif\n"
10578 " a = 1;\n"
10579 "#else\n"
10580 "#endif\n"
10581 "#if C\n"
10582 "#else\n"
10583 "#endif\n";
10584 EXPECT_EQ(code, format(code));
10585}
10586
Manuel Klimek68b03042014-04-14 09:14:11 +000010587TEST_F(FormatTest, HandleConflictMarkers) {
10588 // Git/SVN conflict markers.
10589 EXPECT_EQ("int a;\n"
10590 "void f() {\n"
10591 " callme(some(parameter1,\n"
10592 "<<<<<<< text by the vcs\n"
10593 " parameter2),\n"
10594 "||||||| text by the vcs\n"
10595 " parameter2),\n"
10596 " parameter3,\n"
10597 "======= text by the vcs\n"
10598 " parameter2, parameter3),\n"
10599 ">>>>>>> text by the vcs\n"
10600 " otherparameter);\n",
10601 format("int a;\n"
10602 "void f() {\n"
10603 " callme(some(parameter1,\n"
10604 "<<<<<<< text by the vcs\n"
10605 " parameter2),\n"
10606 "||||||| text by the vcs\n"
10607 " parameter2),\n"
10608 " parameter3,\n"
10609 "======= text by the vcs\n"
10610 " parameter2,\n"
10611 " parameter3),\n"
10612 ">>>>>>> text by the vcs\n"
10613 " otherparameter);\n"));
10614
10615 // Perforce markers.
10616 EXPECT_EQ("void f() {\n"
10617 " function(\n"
10618 ">>>> text by the vcs\n"
10619 " parameter,\n"
10620 "==== text by the vcs\n"
10621 " parameter,\n"
10622 "==== text by the vcs\n"
10623 " parameter,\n"
10624 "<<<< text by the vcs\n"
10625 " parameter);\n",
10626 format("void f() {\n"
10627 " function(\n"
10628 ">>>> text by the vcs\n"
10629 " parameter,\n"
10630 "==== text by the vcs\n"
10631 " parameter,\n"
10632 "==== text by the vcs\n"
10633 " parameter,\n"
10634 "<<<< text by the vcs\n"
10635 " parameter);\n"));
10636
10637 EXPECT_EQ("<<<<<<<\n"
10638 "|||||||\n"
10639 "=======\n"
10640 ">>>>>>>",
10641 format("<<<<<<<\n"
10642 "|||||||\n"
10643 "=======\n"
10644 ">>>>>>>"));
10645
10646 EXPECT_EQ("<<<<<<<\n"
10647 "|||||||\n"
10648 "int i;\n"
10649 "=======\n"
10650 ">>>>>>>",
10651 format("<<<<<<<\n"
10652 "|||||||\n"
10653 "int i;\n"
10654 "=======\n"
10655 ">>>>>>>"));
10656
10657 // FIXME: Handle parsing of macros around conflict markers correctly:
10658 EXPECT_EQ("#define Macro \\\n"
10659 "<<<<<<<\n"
10660 "Something \\\n"
10661 "|||||||\n"
10662 "Else \\\n"
10663 "=======\n"
10664 "Other \\\n"
10665 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000010666 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000010667 format("#define Macro \\\n"
10668 "<<<<<<<\n"
10669 " Something \\\n"
10670 "|||||||\n"
10671 " Else \\\n"
10672 "=======\n"
10673 " Other \\\n"
10674 ">>>>>>>\n"
10675 " End\n"
10676 "int i;\n"));
10677}
10678
Daniel Jasper471894432014-08-06 13:40:26 +000010679TEST_F(FormatTest, DisableRegions) {
10680 EXPECT_EQ("int i;\n"
10681 "// clang-format off\n"
10682 " int j;\n"
10683 "// clang-format on\n"
10684 "int k;",
10685 format(" int i;\n"
10686 " // clang-format off\n"
10687 " int j;\n"
10688 " // clang-format on\n"
10689 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000010690 EXPECT_EQ("int i;\n"
10691 "/* clang-format off */\n"
10692 " int j;\n"
10693 "/* clang-format on */\n"
10694 "int k;",
10695 format(" int i;\n"
10696 " /* clang-format off */\n"
10697 " int j;\n"
10698 " /* clang-format on */\n"
10699 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000010700
10701 // Don't reflow comments within disabled regions.
10702 EXPECT_EQ(
10703 "// clang-format off\n"
10704 "// long long long long long long line\n"
10705 "/* clang-format on */\n"
10706 "/* long long long\n"
10707 " * long long long\n"
10708 " * line */\n"
10709 "int i;\n"
10710 "/* clang-format off */\n"
10711 "/* long long long long long long line */\n",
10712 format("// clang-format off\n"
10713 "// long long long long long long line\n"
10714 "/* clang-format on */\n"
10715 "/* long long long long long long line */\n"
10716 "int i;\n"
10717 "/* clang-format off */\n"
10718 "/* long long long long long long line */\n",
10719 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000010720}
10721
Manuel Klimekf0c95b32015-06-11 10:14:13 +000010722TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
10723 format("? ) =");
10724 verifyNoCrash("#define a\\\n /**/}");
10725}
Manuel Klimek5f594f82014-08-13 14:00:41 +000010726
Daniel Jasper498f5582015-12-25 08:53:31 +000010727TEST_F(FormatTest, FormatsTableGenCode) {
10728 FormatStyle Style = getLLVMStyle();
10729 Style.Language = FormatStyle::LK_TableGen;
10730 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
10731}
10732
Nico Weberb2673a12016-11-10 21:49:25 +000010733TEST_F(FormatTest, ArrayOfTemplates) {
10734 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
10735 format("auto a = new unique_ptr<int > [ 10];"));
10736
10737 FormatStyle Spaces = getLLVMStyle();
10738 Spaces.SpacesInSquareBrackets = true;
10739 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
10740 format("auto a = new unique_ptr<int > [10];", Spaces));
10741}
10742
10743TEST_F(FormatTest, ArrayAsTemplateType) {
10744 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
10745 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
10746
10747 FormatStyle Spaces = getLLVMStyle();
10748 Spaces.SpacesInSquareBrackets = true;
10749 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
10750 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
10751}
10752
Martin Probstc9c51c42017-03-16 10:21:35 +000010753TEST_F(FormatTest, NoSpaceAfterSuper) {
10754 verifyFormat("__super::FooBar();");
10755}
10756
Eric Liu547d8792016-03-24 13:22:42 +000010757TEST(FormatStyle, GetStyleOfFile) {
10758 vfs::InMemoryFileSystem FS;
10759 // Test 1: format file in the same directory.
10760 ASSERT_TRUE(
10761 FS.addFile("/a/.clang-format", 0,
10762 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
10763 ASSERT_TRUE(
10764 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010765 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000010766 ASSERT_TRUE((bool)Style1);
10767 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000010768
Antonio Maiorano7eb75072017-01-20 01:22:42 +000010769 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000010770 ASSERT_TRUE(
10771 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010772 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000010773 ASSERT_TRUE((bool)Style2);
10774 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000010775
Antonio Maiorano7eb75072017-01-20 01:22:42 +000010776 // Test 2.2: no format on 'none' fallback style.
10777 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
10778 ASSERT_TRUE((bool)Style2);
10779 ASSERT_EQ(*Style2, getNoStyle());
10780
10781 // Test 2.3: format if config is found with no based style while fallback is
10782 // 'none'.
10783 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
10784 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
10785 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
10786 ASSERT_TRUE((bool)Style2);
10787 ASSERT_EQ(*Style2, getLLVMStyle());
10788
10789 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
10790 Style2 = getStyle("{}", "a.h", "none", "", &FS);
10791 ASSERT_TRUE((bool)Style2);
10792 ASSERT_EQ(*Style2, getLLVMStyle());
10793
Eric Liu547d8792016-03-24 13:22:42 +000010794 // Test 3: format file in parent directory.
10795 ASSERT_TRUE(
10796 FS.addFile("/c/.clang-format", 0,
10797 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
10798 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
10799 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010800 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000010801 ASSERT_TRUE((bool)Style3);
10802 ASSERT_EQ(*Style3, getGoogleStyle());
10803
10804 // Test 4: error on invalid fallback style
10805 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
10806 ASSERT_FALSE((bool)Style4);
10807 llvm::consumeError(Style4.takeError());
10808
10809 // Test 5: error on invalid yaml on command line
10810 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
10811 ASSERT_FALSE((bool)Style5);
10812 llvm::consumeError(Style5.takeError());
10813
10814 // Test 6: error on invalid style
10815 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
10816 ASSERT_FALSE((bool)Style6);
10817 llvm::consumeError(Style6.takeError());
10818
10819 // Test 7: found config file, error on parsing it
10820 ASSERT_TRUE(
10821 FS.addFile("/d/.clang-format", 0,
10822 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
10823 "InvalidKey: InvalidValue")));
10824 ASSERT_TRUE(
10825 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
10826 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
10827 ASSERT_FALSE((bool)Style7);
10828 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000010829}
10830
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010831TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
10832 // Column limit is 20.
10833 std::string Code = "Type *a =\n"
10834 " new Type();\n"
10835 "g(iiiii, 0, jjjjj,\n"
10836 " 0, kkkkk, 0, mm);\n"
10837 "int bad = format ;";
10838 std::string Expected = "auto a = new Type();\n"
10839 "g(iiiii, nullptr,\n"
10840 " jjjjj, nullptr,\n"
10841 " kkkkk, nullptr,\n"
10842 " mm);\n"
10843 "int bad = format ;";
10844 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000010845 tooling::Replacements Replaces = toReplacements(
10846 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
10847 "auto "),
10848 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
10849 "nullptr"),
10850 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
10851 "nullptr"),
10852 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
10853 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010854
10855 format::FormatStyle Style = format::getLLVMStyle();
10856 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000010857 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
10858 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
10859 << llvm::toString(FormattedReplaces.takeError()) << "\n";
10860 auto Result = applyAllReplacements(Code, *FormattedReplaces);
10861 EXPECT_TRUE(static_cast<bool>(Result));
10862 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010863}
10864
Eric Liubaf58c22016-05-18 13:43:48 +000010865TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
10866 std::string Code = "#include \"a.h\"\n"
10867 "#include \"c.h\"\n"
10868 "\n"
10869 "int main() {\n"
10870 " return 0;\n"
10871 "}";
10872 std::string Expected = "#include \"a.h\"\n"
10873 "#include \"b.h\"\n"
10874 "#include \"c.h\"\n"
10875 "\n"
10876 "int main() {\n"
10877 " return 0;\n"
10878 "}";
10879 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000010880 tooling::Replacements Replaces = toReplacements(
10881 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
10882 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000010883
10884 format::FormatStyle Style = format::getLLVMStyle();
10885 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000010886 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
10887 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
10888 << llvm::toString(FormattedReplaces.takeError()) << "\n";
10889 auto Result = applyAllReplacements(Code, *FormattedReplaces);
10890 EXPECT_TRUE(static_cast<bool>(Result));
10891 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000010892}
10893
Krasimir Georgievac16a202017-06-23 11:46:03 +000010894TEST_F(FormatTest, FormatSortsUsingDeclarations) {
10895 EXPECT_EQ("using std::cin;\n"
10896 "using std::cout;",
10897 format("using std::cout;\n"
10898 "using std::cin;", getGoogleStyle()));
10899}
10900
Nico Weberdc065182017-04-05 18:10:42 +000010901TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
10902 format::FormatStyle Style = format::getLLVMStyle();
10903 Style.Standard = FormatStyle::LS_Cpp03;
10904 // cpp03 recognize this string as identifier u8 and literal character 'a'
10905 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
10906}
10907
10908TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
10909 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
10910 // all modes, including C++11, C++14 and C++17
10911 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
10912}
10913
Daniel Jasperd246a5a2015-06-15 15:25:11 +000010914} // end namespace
10915} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000010916} // end namespace clang