blob: 64bb28e0be2354779f29c8a90e87b25e091efaba [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"
6007 " 1, 2, 3, 4,\n"
6008 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006009 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6010 verifyFormat("f({1, 2});");
6011 verifyFormat("auto v = Foo{-1};");
6012 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6013 verifyFormat("Class::Class : member{1, 2, 3} {}");
6014 verifyFormat("new vector<int>{1, 2, 3};");
6015 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006016 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006017 verifyFormat("return {arg1, arg2};");
6018 verifyFormat("return {arg1, SomeType{parameter}};");
6019 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6020 verifyFormat("new T{arg1, arg2};");
6021 verifyFormat("f(MyMap[{composite, key}]);");
6022 verifyFormat("class Class {\n"
6023 " T member = {arg1, arg2};\n"
6024 "};");
6025 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00006026 verifyFormat("const struct A a = {.a = 1, .b = 2};");
6027 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006028 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6029 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006030
Daniel Jasper438059e2014-05-22 12:11:13 +00006031 verifyFormat("int foo(int i) { return fo1{}(i); }");
6032 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006033 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006034 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006035 verifyFormat("Node n{1, Node{1000}, //\n"
6036 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006037 verifyFormat("Aaaa aaaaaaa{\n"
6038 " {\n"
6039 " aaaa,\n"
6040 " },\n"
6041 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006042 verifyFormat("class C : public D {\n"
6043 " SomeClass SC{2};\n"
6044 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006045 verifyFormat("class C : public A {\n"
6046 " class D : public B {\n"
6047 " void f() { int i{2}; }\n"
6048 " };\n"
6049 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006050 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006051
Daniel Jaspere4ada022016-12-13 10:05:03 +00006052 // Cases where distinguising braced lists and blocks is hard.
6053 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
6054 verifyFormat("void f() {\n"
6055 " return; // comment\n"
6056 "}\n"
6057 "SomeType t;");
6058 verifyFormat("void f() {\n"
6059 " if (a) {\n"
6060 " f();\n"
6061 " }\n"
6062 "}\n"
6063 "SomeType t;");
6064
Daniel Jasper08434342015-05-26 07:26:26 +00006065 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006066 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006067 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006068 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6069 " bbbbb,\n"
6070 " ccccc,\n"
6071 " ddddd,\n"
6072 " eeeee,\n"
6073 " ffffff,\n"
6074 " ggggg,\n"
6075 " hhhhhh,\n"
6076 " iiiiii,\n"
6077 " jjjjjj,\n"
6078 " kkkkkk};",
6079 NoBinPacking);
6080 verifyFormat("const Aaaaaa aaaaa = {\n"
6081 " aaaaa,\n"
6082 " bbbbb,\n"
6083 " ccccc,\n"
6084 " ddddd,\n"
6085 " eeeee,\n"
6086 " ffffff,\n"
6087 " ggggg,\n"
6088 " hhhhhh,\n"
6089 " iiiiii,\n"
6090 " jjjjjj,\n"
6091 " kkkkkk,\n"
6092 "};",
6093 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006094 verifyFormat(
6095 "const Aaaaaa aaaaa = {\n"
6096 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6097 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6098 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6099 "};",
6100 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006101
Chandler Carruthf8b72662014-03-02 12:37:31 +00006102 // FIXME: The alignment of these trailing comments might be bad. Then again,
6103 // this might be utterly useless in real code.
6104 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006105 " : some_value{ //\n"
6106 " aaaaaaa, //\n"
6107 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006108
Chandler Carruthf8b72662014-03-02 12:37:31 +00006109 // In braced lists, the first comment is always assumed to belong to the
6110 // first element. Thus, it can be moved to the next or previous line as
6111 // appropriate.
6112 EXPECT_EQ("function({// First element:\n"
6113 " 1,\n"
6114 " // Second element:\n"
6115 " 2});",
6116 format("function({\n"
6117 " // First element:\n"
6118 " 1,\n"
6119 " // Second element:\n"
6120 " 2});"));
6121 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6122 " // First element:\n"
6123 " 1,\n"
6124 " // Second element:\n"
6125 " 2};",
6126 format("std::vector<int> MyNumbers{// First element:\n"
6127 " 1,\n"
6128 " // Second element:\n"
6129 " 2};",
6130 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00006131 // A trailing comma should still lead to an enforced line break.
6132 EXPECT_EQ("vector<int> SomeVector = {\n"
6133 " // aaa\n"
6134 " 1, 2,\n"
6135 "};",
6136 format("vector<int> SomeVector = { // aaa\n"
6137 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006138
Chandler Carruthf8b72662014-03-02 12:37:31 +00006139 FormatStyle ExtraSpaces = getLLVMStyle();
6140 ExtraSpaces.Cpp11BracedListStyle = false;
6141 ExtraSpaces.ColumnLimit = 75;
6142 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6143 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6144 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6145 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6146 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6147 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6148 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6149 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6150 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6151 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6152 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6153 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6154 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6155 verifyFormat("class Class {\n"
6156 " T member = { arg1, arg2 };\n"
6157 "};",
6158 ExtraSpaces);
6159 verifyFormat(
6160 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6161 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6162 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6163 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6164 ExtraSpaces);
6165 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006166 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006167 ExtraSpaces);
6168 verifyFormat(
6169 "someFunction(OtherParam,\n"
6170 " BracedList{ // comment 1 (Forcing interesting break)\n"
6171 " param1, param2,\n"
6172 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006173 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006174 ExtraSpaces);
6175 verifyFormat(
6176 "std::this_thread::sleep_for(\n"
6177 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6178 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00006179 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006180 " aaaaaaa,\n"
6181 " aaaaaaaaaa,\n"
6182 " aaaaa,\n"
6183 " aaaaaaaaaaaaaaa,\n"
6184 " aaa,\n"
6185 " aaaaaaaaaa,\n"
6186 " a,\n"
6187 " aaaaaaaaaaaaaaaaaaaaa,\n"
6188 " aaaaaaaaaaaa,\n"
6189 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6190 " aaaaaaa,\n"
6191 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006192 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Francois Ferrand5f07f442017-06-19 14:41:21 +00006193 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
6194 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006195}
6196
Daniel Jasper33b909c2013-10-25 14:29:37 +00006197TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006198 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6199 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6200 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6201 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6202 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6203 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006204 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006205 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006206 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006207 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6208 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006209 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006210 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6211 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6212 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6213 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6214 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6215 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6216 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006217 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006218 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6219 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006220 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6221 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6222 " // Separating comment.\n"
6223 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6224 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6225 " // Leading comment\n"
6226 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6227 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006228 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6229 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006230 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006231 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6232 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006233 getLLVMStyleWithColumns(38));
6234 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006235 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6236 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006237 verifyFormat(
6238 "static unsigned SomeValues[10][3] = {\n"
6239 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6240 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6241 verifyFormat("static auto fields = new vector<string>{\n"
6242 " \"aaaaaaaaaaaaa\",\n"
6243 " \"aaaaaaaaaaaaa\",\n"
6244 " \"aaaaaaaaaaaa\",\n"
6245 " \"aaaaaaaaaaaaaa\",\n"
6246 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6247 " \"aaaaaaaaaaaa\",\n"
6248 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6249 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006250 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6251 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6252 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6253 " 3, cccccccccccccccccccccc};",
6254 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006255
6256 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006257 verifyFormat("vector<int> x = {\n"
6258 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6259 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006260 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006261 verifyFormat("vector<int> x = {\n"
6262 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006263 "};",
6264 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006265 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6266 " 1, 1, 1, 1,\n"
6267 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006268 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006269
Daniel Jasper60c27072015-05-13 08:16:00 +00006270 // Trailing comment in the first line.
6271 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6272 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6273 " 111111111, 222222222, 3333333333, 444444444, //\n"
6274 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006275 // Trailing comment in the last line.
6276 verifyFormat("int aaaaa[] = {\n"
6277 " 1, 2, 3, // comment\n"
6278 " 4, 5, 6 // comment\n"
6279 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006280
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006281 // With nested lists, we should either format one item per line or all nested
6282 // lists one on line.
6283 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006284 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6285 " {aaaaaaaaaaaaaaaaaaa},\n"
6286 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6287 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006288 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006289 verifyFormat(
6290 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006291 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6292 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6293 " {aaa, aaa},\n"
6294 " {aaa, aaa},\n"
6295 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6296 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6297 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006298
6299 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006300 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
6301 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006302
6303 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006304
Daniel Jaspereb65e912015-12-21 18:31:15 +00006305 // No braced initializer here.
6306 verifyFormat("void f() {\n"
6307 " struct Dummy {};\n"
6308 " f(v);\n"
6309 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006310
6311 // Long lists should be formatted in columns even if they are nested.
6312 verifyFormat(
6313 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6314 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6315 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6316 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6317 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6318 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00006319
6320 // Allow "single-column" layout even if that violates the column limit. There
6321 // isn't going to be a better way.
6322 verifyFormat("std::vector<int> a = {\n"
6323 " aaaaaaaa,\n"
6324 " aaaaaaaa,\n"
6325 " aaaaaaaa,\n"
6326 " aaaaaaaa,\n"
6327 " aaaaaaaaaa,\n"
6328 " aaaaaaaa,\n"
6329 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
6330 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00006331 verifyFormat("vector<int> aaaa = {\n"
6332 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6333 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6334 " aaaaaa.aaaaaaa,\n"
6335 " aaaaaa.aaaaaaa,\n"
6336 " aaaaaa.aaaaaaa,\n"
6337 " aaaaaa.aaaaaaa,\n"
6338 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006339
6340 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006341 verifyFormat("someFunction(Param, {List1, List2,\n"
6342 " List3});",
6343 getLLVMStyleWithColumns(35));
6344 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006345 " {List1, List2,\n"
6346 " List3});",
6347 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00006348 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
6349 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006350}
6351
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006352TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006353 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006354 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006355
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006356 verifyFormat("void f() { return 42; }");
6357 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006358 " return 42;\n"
6359 "}",
6360 DoNotMerge);
6361 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006362 " // Comment\n"
6363 "}");
6364 verifyFormat("{\n"
6365 "#error {\n"
6366 " int a;\n"
6367 "}");
6368 verifyFormat("{\n"
6369 " int a;\n"
6370 "#error {\n"
6371 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00006372 verifyFormat("void f() {} // comment");
6373 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00006374 verifyFormat("void f() {\n"
6375 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006376 DoNotMerge);
6377 verifyFormat("void f() {\n"
6378 " int a;\n"
6379 "} // comment",
6380 DoNotMerge);
6381 verifyFormat("void f() {\n"
6382 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00006383 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006384
6385 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
6386 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
6387
6388 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
6389 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00006390 verifyFormat("class C {\n"
6391 " C()\n"
6392 " : iiiiiiii(nullptr),\n"
6393 " kkkkkkk(nullptr),\n"
6394 " mmmmmmm(nullptr),\n"
6395 " nnnnnnn(nullptr) {}\n"
6396 "};",
6397 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00006398
6399 FormatStyle NoColumnLimit = getLLVMStyle();
6400 NoColumnLimit.ColumnLimit = 0;
6401 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
6402 EXPECT_EQ("class C {\n"
6403 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00006404 "};",
6405 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00006406 EXPECT_EQ("A()\n"
6407 " : b(0) {\n"
6408 "}",
6409 format("A()\n:b(0)\n{\n}", NoColumnLimit));
6410
6411 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00006412 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
6413 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00006414 EXPECT_EQ("A()\n"
6415 " : b(0) {\n"
6416 "}",
6417 format("A():b(0){}", DoNotMergeNoColumnLimit));
6418 EXPECT_EQ("A()\n"
6419 " : b(0) {\n"
6420 "}",
6421 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00006422
6423 verifyFormat("#define A \\\n"
6424 " void f() { \\\n"
6425 " int i; \\\n"
6426 " }",
6427 getLLVMStyleWithColumns(20));
6428 verifyFormat("#define A \\\n"
6429 " void f() { int i; }",
6430 getLLVMStyleWithColumns(21));
6431 verifyFormat("#define A \\\n"
6432 " void f() { \\\n"
6433 " int i; \\\n"
6434 " } \\\n"
6435 " int j;",
6436 getLLVMStyleWithColumns(22));
6437 verifyFormat("#define A \\\n"
6438 " void f() { int i; } \\\n"
6439 " int j;",
6440 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006441}
6442
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006443TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
6444 FormatStyle MergeEmptyOnly = getLLVMStyle();
6445 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
6446 verifyFormat("class C {\n"
6447 " int f() {}\n"
6448 "};",
6449 MergeEmptyOnly);
6450 verifyFormat("class C {\n"
6451 " int f() {\n"
6452 " return 42;\n"
6453 " }\n"
6454 "};",
6455 MergeEmptyOnly);
6456 verifyFormat("int f() {}", MergeEmptyOnly);
6457 verifyFormat("int f() {\n"
6458 " return 42;\n"
6459 "}",
6460 MergeEmptyOnly);
6461
6462 // Also verify behavior when BraceWrapping.AfterFunction = true
6463 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
6464 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
6465 verifyFormat("int f() {}", MergeEmptyOnly);
6466 verifyFormat("class C {\n"
6467 " int f() {}\n"
6468 "};",
6469 MergeEmptyOnly);
6470}
6471
Daniel Jasperd74cf402014-04-08 12:46:38 +00006472TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
6473 FormatStyle MergeInlineOnly = getLLVMStyle();
6474 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6475 verifyFormat("class C {\n"
6476 " int f() { return 42; }\n"
6477 "};",
6478 MergeInlineOnly);
6479 verifyFormat("int f() {\n"
6480 " return 42;\n"
6481 "}",
6482 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006483
6484 // SFS_Inline implies SFS_Empty
6485 verifyFormat("class C {\n"
6486 " int f() {}\n"
6487 "};",
6488 MergeInlineOnly);
6489 verifyFormat("int f() {}", MergeInlineOnly);
6490
6491 // Also verify behavior when BraceWrapping.AfterFunction = true
6492 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
6493 MergeInlineOnly.BraceWrapping.AfterFunction = true;
6494 verifyFormat("class C {\n"
6495 " int f() { return 42; }\n"
6496 "};",
6497 MergeInlineOnly);
6498 verifyFormat("int f()\n"
6499 "{\n"
6500 " return 42;\n"
6501 "}",
6502 MergeInlineOnly);
6503
6504 // SFS_Inline implies SFS_Empty
6505 verifyFormat("int f() {}", MergeInlineOnly);
6506 verifyFormat("class C {\n"
6507 " int f() {}\n"
6508 "};",
6509 MergeInlineOnly);
6510}
6511
Francois Ferrandd3f0e3d2017-06-21 13:56:02 +00006512TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
6513 FormatStyle MergeInlineOnly = getLLVMStyle();
6514 MergeInlineOnly.AllowShortFunctionsOnASingleLine =
6515 FormatStyle::SFS_InlineOnly;
6516 verifyFormat("class C {\n"
6517 " int f() { return 42; }\n"
6518 "};",
6519 MergeInlineOnly);
6520 verifyFormat("int f() {\n"
6521 " return 42;\n"
6522 "}",
6523 MergeInlineOnly);
6524
6525 // SFS_InlineOnly does not imply SFS_Empty
6526 verifyFormat("class C {\n"
6527 " int f() {}\n"
6528 "};",
6529 MergeInlineOnly);
6530 verifyFormat("int f() {\n"
6531 "}",
6532 MergeInlineOnly);
6533
6534 // Also verify behavior when BraceWrapping.AfterFunction = true
6535 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
6536 MergeInlineOnly.BraceWrapping.AfterFunction = true;
6537 verifyFormat("class C {\n"
6538 " int f() { return 42; }\n"
6539 "};",
6540 MergeInlineOnly);
6541 verifyFormat("int f()\n"
6542 "{\n"
6543 " return 42;\n"
6544 "}",
6545 MergeInlineOnly);
6546
6547 // SFS_InlineOnly does not imply SFS_Empty
6548 verifyFormat("int f()\n"
6549 "{\n"
6550 "}",
6551 MergeInlineOnly);
6552 verifyFormat("class C {\n"
6553 " int f() {}\n"
6554 "};",
6555 MergeInlineOnly);
6556}
6557
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006558TEST_F(FormatTest, SplitEmptyFunctionBody) {
6559 FormatStyle Style = getLLVMStyle();
6560 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
6561 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
6562 Style.BraceWrapping.AfterFunction = true;
6563 Style.BraceWrapping.SplitEmptyFunctionBody = false;
6564 Style.ColumnLimit = 40;
6565
6566 verifyFormat("int f()\n"
6567 "{}",
6568 Style);
6569 verifyFormat("int f()\n"
6570 "{\n"
6571 " return 42;\n"
6572 "}",
6573 Style);
6574 verifyFormat("int f()\n"
6575 "{\n"
6576 " // some comment\n"
6577 "}",
6578 Style);
6579
6580 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
6581 verifyFormat("int f() {}", Style);
6582 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6583 "{}",
6584 Style);
6585 verifyFormat("int f()\n"
6586 "{\n"
6587 " return 0;\n"
6588 "}",
6589 Style);
6590
6591 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6592 verifyFormat("class Foo {\n"
6593 " int f() {}\n"
6594 "};\n",
6595 Style);
6596 verifyFormat("class Foo {\n"
6597 " int f() { return 0; }\n"
6598 "};\n",
6599 Style);
6600 verifyFormat("class Foo {\n"
6601 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6602 " {}\n"
6603 "};\n",
6604 Style);
6605 verifyFormat("class Foo {\n"
6606 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6607 " {\n"
6608 " return 0;\n"
6609 " }\n"
6610 "};\n",
6611 Style);
6612
6613 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
6614 verifyFormat("int f() {}", Style);
6615 verifyFormat("int f() { return 0; }", Style);
6616 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6617 "{}",
6618 Style);
6619 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6620 "{\n"
6621 " return 0;\n"
6622 "}",
6623 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00006624}
6625
Manuel Klimeke01bab52013-01-15 13:38:33 +00006626TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
6627 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006628 verifyFormat("struct foo a = {bar};\nint n;");
6629 verifyFormat("class foo a = {bar};\nint n;");
6630 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006631
6632 // Elaborate types inside function definitions.
6633 verifyFormat("struct foo f() {}\nint n;");
6634 verifyFormat("class foo f() {}\nint n;");
6635 verifyFormat("union foo f() {}\nint n;");
6636
6637 // Templates.
6638 verifyFormat("template <class X> void f() {}\nint n;");
6639 verifyFormat("template <struct X> void f() {}\nint n;");
6640 verifyFormat("template <union X> void f() {}\nint n;");
6641
6642 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006643 verifyFormat("struct {\n} n;");
6644 verifyFormat(
6645 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006646 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006647 verifyFormat("class MACRO Z {\n} n;");
6648 verifyFormat("class MACRO(X) Z {\n} n;");
6649 verifyFormat("class __attribute__(X) Z {\n} n;");
6650 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00006651 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00006652 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00006653 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
6654 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006655
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006656 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006657 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006658
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006659 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00006660 verifyFormat(
6661 "template <typename F>\n"
6662 "Matcher(const Matcher<F> &Other,\n"
6663 " typename enable_if_c<is_base_of<F, T>::value &&\n"
6664 " !is_same<F, T>::value>::type * = 0)\n"
6665 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
6666
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006667 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006668 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00006669 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006670
6671 // FIXME:
6672 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006673 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006674
Manuel Klimeke01bab52013-01-15 13:38:33 +00006675 // Elaborate types where incorrectly parsing the structural element would
6676 // break the indent.
6677 verifyFormat("if (true)\n"
6678 " class X x;\n"
6679 "else\n"
6680 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00006681
6682 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00006683 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00006684}
6685
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006686TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00006687 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
6688 format("#error Leave all white!!!!! space* alone!\n"));
6689 EXPECT_EQ(
6690 "#warning Leave all white!!!!! space* alone!\n",
6691 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006692 EXPECT_EQ("#error 1", format(" # error 1"));
6693 EXPECT_EQ("#warning 1", format(" # warning 1"));
6694}
6695
Daniel Jasper4431aa92013-04-23 13:54:04 +00006696TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00006697 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00006698 verifyFormat("#if (AAAA && BBBB)");
6699 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00006700 // FIXME: Come up with a better indentation for #elif.
6701 verifyFormat(
6702 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
6703 " defined(BBBBBBBB)\n"
6704 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
6705 " defined(BBBBBBBB)\n"
6706 "#endif",
6707 getLLVMStyleWithColumns(65));
6708}
6709
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006710TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
6711 FormatStyle AllowsMergedIf = getGoogleStyle();
6712 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
6713 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
6714 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00006715 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
6716 EXPECT_EQ("if (true) return 42;",
6717 format("if (true)\nreturn 42;", AllowsMergedIf));
6718 FormatStyle ShortMergedIf = AllowsMergedIf;
6719 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006720 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006721 " if (true) return 42;",
6722 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006723 verifyFormat("#define A \\\n"
6724 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006725 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006726 "#define B",
6727 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006728 verifyFormat("#define A \\\n"
6729 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006730 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006731 "g();",
6732 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00006733 verifyFormat("{\n"
6734 "#ifdef A\n"
6735 " // Comment\n"
6736 " if (true) continue;\n"
6737 "#endif\n"
6738 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00006739 " if (true) continue;\n"
6740 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006741 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00006742 ShortMergedIf.ColumnLimit = 33;
6743 verifyFormat("#define A \\\n"
6744 " if constexpr (true) return 42;",
6745 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00006746 ShortMergedIf.ColumnLimit = 29;
6747 verifyFormat("#define A \\\n"
6748 " if (aaaaaaaaaa) return 1; \\\n"
6749 " return 2;",
6750 ShortMergedIf);
6751 ShortMergedIf.ColumnLimit = 28;
6752 verifyFormat("#define A \\\n"
6753 " if (aaaaaaaaaa) \\\n"
6754 " return 1; \\\n"
6755 " return 2;",
6756 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00006757 verifyFormat("#define A \\\n"
6758 " if constexpr (aaaaaaa) \\\n"
6759 " return 1; \\\n"
6760 " return 2;",
6761 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006762}
6763
Manuel Klimekd33516e2013-01-23 10:09:28 +00006764TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00006765 verifyFormat("void f(int *a);");
6766 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00006767 verifyFormat("class A {\n void f(int *a);\n};");
6768 verifyFormat("class A {\n int *a;\n};");
6769 verifyFormat("namespace a {\n"
6770 "namespace b {\n"
6771 "class A {\n"
6772 " void f() {}\n"
6773 " int *a;\n"
6774 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006775 "} // namespace b\n"
6776 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00006777}
6778
Manuel Klimekd33516e2013-01-23 10:09:28 +00006779TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
6780 verifyFormat("while");
6781 verifyFormat("operator");
6782}
6783
Daniel Jasperfda47cd2016-10-31 13:23:00 +00006784TEST_F(FormatTest, SkipsDeeplyNestedLines) {
6785 // This code would be painfully slow to format if we didn't skip it.
6786 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
6787 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6788 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6789 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6790 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6791 "A(1, 1)\n"
6792 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
6793 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6794 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6795 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6796 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6797 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6798 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6799 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6800 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6801 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
6802 // Deeply nested part is untouched, rest is formatted.
6803 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
6804 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00006805 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00006806}
6807
Nico Weber7e6a7a12013-01-08 17:56:31 +00006808//===----------------------------------------------------------------------===//
6809// Objective-C tests.
6810//===----------------------------------------------------------------------===//
6811
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006812TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
6813 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
6814 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
6815 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00006816 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006817 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
6818 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
6819 format("-(NSInteger)Method3:(id)anObject;"));
6820 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
6821 format("-(NSInteger)Method4:(id)anObject;"));
6822 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
6823 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
6824 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
6825 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00006826 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
6827 "forAllCells:(BOOL)flag;",
6828 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
6829 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00006830
6831 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00006832 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
6833 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00006834 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
6835 " inRange:(NSRange)range\n"
6836 " outRange:(NSRange)out_range\n"
6837 " outRange1:(NSRange)out_range1\n"
6838 " outRange2:(NSRange)out_range2\n"
6839 " outRange3:(NSRange)out_range3\n"
6840 " outRange4:(NSRange)out_range4\n"
6841 " outRange5:(NSRange)out_range5\n"
6842 " outRange6:(NSRange)out_range6\n"
6843 " outRange7:(NSRange)out_range7\n"
6844 " outRange8:(NSRange)out_range8\n"
6845 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00006846
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00006847 // When the function name has to be wrapped.
6848 FormatStyle Style = getLLVMStyle();
6849 Style.IndentWrappedFunctionNames = false;
6850 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
6851 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
6852 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
6853 "}",
6854 Style);
6855 Style.IndentWrappedFunctionNames = true;
6856 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
6857 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
6858 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
6859 "}",
6860 Style);
6861
Nico Weberd6f962f2013-01-10 20:18:33 +00006862 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00006863 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00006864 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
6865 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00006866 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00006867
Daniel Jasper37194282013-05-28 08:33:00 +00006868 verifyFormat("- (int (*)())foo:(int (*)())f;");
6869 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00006870
6871 // If there's no return type (very rare in practice!), LLVM and Google style
6872 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00006873 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00006874 verifyFormat("- foo:(int)f;");
6875 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006876}
6877
Nico Weber0588b502013-02-07 00:19:29 +00006878
Alexander Kornienko64a42b82014-04-15 14:52:43 +00006879TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00006880 EXPECT_EQ("\"some text \"\n"
6881 "\"other\";",
6882 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00006883 EXPECT_EQ("\"some text \"\n"
6884 "\"other\";",
6885 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006886 EXPECT_EQ(
6887 "#define A \\\n"
6888 " \"some \" \\\n"
6889 " \"text \" \\\n"
6890 " \"other\";",
6891 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
6892 EXPECT_EQ(
6893 "#define A \\\n"
6894 " \"so \" \\\n"
6895 " \"text \" \\\n"
6896 " \"other\";",
6897 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
6898
6899 EXPECT_EQ("\"some text\"",
6900 format("\"some text\"", getLLVMStyleWithColumns(1)));
6901 EXPECT_EQ("\"some text\"",
6902 format("\"some text\"", getLLVMStyleWithColumns(11)));
6903 EXPECT_EQ("\"some \"\n"
6904 "\"text\"",
6905 format("\"some text\"", getLLVMStyleWithColumns(10)));
6906 EXPECT_EQ("\"some \"\n"
6907 "\"text\"",
6908 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00006909 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00006910 "\" tex\"\n"
6911 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00006912 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00006913 EXPECT_EQ("\"some\"\n"
6914 "\" tex\"\n"
6915 "\" and\"",
6916 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
6917 EXPECT_EQ("\"some\"\n"
6918 "\"/tex\"\n"
6919 "\"/and\"",
6920 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006921
6922 EXPECT_EQ("variable =\n"
6923 " \"long string \"\n"
6924 " \"literal\";",
6925 format("variable = \"long string literal\";",
6926 getLLVMStyleWithColumns(20)));
6927
6928 EXPECT_EQ("variable = f(\n"
6929 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006930 " \"literal\",\n"
6931 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00006932 " loooooooooooooooooooong);",
6933 format("variable = f(\"long string literal\", short, "
6934 "loooooooooooooooooooong);",
6935 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00006936
Daniel Jaspera44991332015-04-29 13:06:49 +00006937 EXPECT_EQ(
6938 "f(g(\"long string \"\n"
6939 " \"literal\"),\n"
6940 " b);",
6941 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00006942 EXPECT_EQ("f(g(\"long string \"\n"
6943 " \"literal\",\n"
6944 " a),\n"
6945 " b);",
6946 format("f(g(\"long string literal\", a), b);",
6947 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006948 EXPECT_EQ(
6949 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00006950 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00006951 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
6952 EXPECT_EQ("f(\"one two three four five six \"\n"
6953 " \"seven\".split(\n"
6954 " really_looooong_variable));",
6955 format("f(\"one two three four five six seven\"."
6956 "split(really_looooong_variable));",
6957 getLLVMStyleWithColumns(33)));
6958
6959 EXPECT_EQ("f(\"some \"\n"
6960 " \"text\",\n"
6961 " other);",
6962 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00006963
6964 // Only break as a last resort.
6965 verifyFormat(
6966 "aaaaaaaaaaaaaaaaaaaa(\n"
6967 " aaaaaaaaaaaaaaaaaaaa,\n"
6968 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00006969
Daniel Jaspera44991332015-04-29 13:06:49 +00006970 EXPECT_EQ("\"splitmea\"\n"
6971 "\"trandomp\"\n"
6972 "\"oint\"",
6973 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00006974
Daniel Jaspera44991332015-04-29 13:06:49 +00006975 EXPECT_EQ("\"split/\"\n"
6976 "\"pathat/\"\n"
6977 "\"slashes\"",
6978 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006979
Daniel Jaspera44991332015-04-29 13:06:49 +00006980 EXPECT_EQ("\"split/\"\n"
6981 "\"pathat/\"\n"
6982 "\"slashes\"",
6983 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00006984 EXPECT_EQ("\"split at \"\n"
6985 "\"spaces/at/\"\n"
6986 "\"slashes.at.any$\"\n"
6987 "\"non-alphanumeric%\"\n"
6988 "\"1111111111characte\"\n"
6989 "\"rs\"",
6990 format("\"split at "
6991 "spaces/at/"
6992 "slashes.at."
6993 "any$non-"
6994 "alphanumeric%"
6995 "1111111111characte"
6996 "rs\"",
6997 getLLVMStyleWithColumns(20)));
6998
Daniel Jasper5aad4e52013-07-12 11:37:05 +00006999 // Verify that splitting the strings understands
7000 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00007001 EXPECT_EQ(
7002 "aaaaaaaaaaaa(\n"
7003 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
7004 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
7005 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
7006 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7007 "aaaaaaaaaaaaaaaaaaaaaa\");",
7008 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00007009 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7010 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
7011 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
7012 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7013 "aaaaaaaaaaaaaaaaaaaaaa\";",
7014 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00007015 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7016 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7017 format("llvm::outs() << "
7018 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
7019 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00007020 EXPECT_EQ("ffff(\n"
7021 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7022 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7023 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
7024 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7025 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007026
Daniel Jaspere1a7b762016-02-01 11:21:02 +00007027 FormatStyle Style = getLLVMStyleWithColumns(12);
7028 Style.BreakStringLiterals = false;
7029 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
7030
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007031 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007032 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00007033 EXPECT_EQ("#define A \\\n"
7034 " \"some \" \\\n"
7035 " \"text \" \\\n"
7036 " \"other\";",
7037 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007038}
7039
Manuel Klimek9e321992015-07-28 15:50:24 +00007040TEST_F(FormatTest, FullyRemoveEmptyLines) {
7041 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
7042 NoEmptyLines.MaxEmptyLinesToKeep = 0;
7043 EXPECT_EQ("int i = a(b());",
7044 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
7045}
7046
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007047TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
7048 EXPECT_EQ(
7049 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7050 "(\n"
7051 " \"x\t\");",
7052 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7053 "aaaaaaa("
7054 "\"x\t\");"));
7055}
7056
Daniel Jasper174b0122014-01-09 14:18:12 +00007057TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00007058 EXPECT_EQ(
7059 "u8\"utf8 string \"\n"
7060 "u8\"literal\";",
7061 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
7062 EXPECT_EQ(
7063 "u\"utf16 string \"\n"
7064 "u\"literal\";",
7065 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
7066 EXPECT_EQ(
7067 "U\"utf32 string \"\n"
7068 "U\"literal\";",
7069 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
7070 EXPECT_EQ("L\"wide string \"\n"
7071 "L\"literal\";",
7072 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00007073 EXPECT_EQ("@\"NSString \"\n"
7074 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00007075 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00007076 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00007077
7078 // This input makes clang-format try to split the incomplete unicode escape
7079 // sequence, which used to lead to a crasher.
7080 verifyNoCrash(
7081 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7082 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007083}
7084
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00007085TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
7086 FormatStyle Style = getGoogleStyleWithColumns(15);
7087 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
7088 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
7089 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
7090 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
7091 EXPECT_EQ("u8R\"x(raw literal)x\";",
7092 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007093}
7094
7095TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
7096 FormatStyle Style = getLLVMStyleWithColumns(20);
7097 EXPECT_EQ(
7098 "_T(\"aaaaaaaaaaaaaa\")\n"
7099 "_T(\"aaaaaaaaaaaaaa\")\n"
7100 "_T(\"aaaaaaaaaaaa\")",
7101 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007102 EXPECT_EQ("f(x,\n"
7103 " _T(\"aaaaaaaaaaaa\")\n"
7104 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00007105 " z);",
7106 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
7107
7108 // FIXME: Handle embedded spaces in one iteration.
7109 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
7110 // "_T(\"aaaaaaaaaaaaa\")\n"
7111 // "_T(\"aaaaaaaaaaaaa\")\n"
7112 // "_T(\"a\")",
7113 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7114 // getLLVMStyleWithColumns(20)));
7115 EXPECT_EQ(
7116 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7117 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007118 EXPECT_EQ("f(\n"
7119 "#if !TEST\n"
7120 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7121 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00007122 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007123 format("f(\n"
7124 "#if !TEST\n"
7125 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7126 "#endif\n"
7127 ");"));
7128 EXPECT_EQ("f(\n"
7129 "\n"
7130 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
7131 format("f(\n"
7132 "\n"
7133 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007134}
7135
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007136TEST_F(FormatTest, BreaksStringLiteralOperands) {
7137 // In a function call with two operands, the second can be broken with no line
7138 // break before it.
7139 EXPECT_EQ("func(a, \"long long \"\n"
7140 " \"long long\");",
7141 format("func(a, \"long long long long\");",
7142 getLLVMStyleWithColumns(24)));
7143 // In a function call with three operands, the second must be broken with a
7144 // line break before it.
7145 EXPECT_EQ("func(a,\n"
7146 " \"long long long \"\n"
7147 " \"long\",\n"
7148 " c);",
7149 format("func(a, \"long long long long\", c);",
7150 getLLVMStyleWithColumns(24)));
7151 // In a function call with three operands, the third must be broken with a
7152 // line break before it.
7153 EXPECT_EQ("func(a, b,\n"
7154 " \"long long long \"\n"
7155 " \"long\");",
7156 format("func(a, b, \"long long long long\");",
7157 getLLVMStyleWithColumns(24)));
7158 // In a function call with three operands, both the second and the third must
7159 // be broken with a line break before them.
7160 EXPECT_EQ("func(a,\n"
7161 " \"long long long \"\n"
7162 " \"long\",\n"
7163 " \"long long long \"\n"
7164 " \"long\");",
7165 format("func(a, \"long long long long\", \"long long long long\");",
7166 getLLVMStyleWithColumns(24)));
7167 // In a chain of << with two operands, the second can be broken with no line
7168 // break before it.
7169 EXPECT_EQ("a << \"line line \"\n"
7170 " \"line\";",
7171 format("a << \"line line line\";",
7172 getLLVMStyleWithColumns(20)));
7173 // In a chain of << with three operands, the second can be broken with no line
7174 // break before it.
7175 EXPECT_EQ("abcde << \"line \"\n"
7176 " \"line line\"\n"
7177 " << c;",
7178 format("abcde << \"line line line\" << c;",
7179 getLLVMStyleWithColumns(20)));
7180 // In a chain of << with three operands, the third must be broken with a line
7181 // break before it.
7182 EXPECT_EQ("a << b\n"
7183 " << \"line line \"\n"
7184 " \"line\";",
7185 format("a << b << \"line line line\";",
7186 getLLVMStyleWithColumns(20)));
7187 // In a chain of << with three operands, the second can be broken with no line
7188 // break before it and the third must be broken with a line break before it.
7189 EXPECT_EQ("abcd << \"line line \"\n"
7190 " \"line\"\n"
7191 " << \"line line \"\n"
7192 " \"line\";",
7193 format("abcd << \"line line line\" << \"line line line\";",
7194 getLLVMStyleWithColumns(20)));
7195 // In a chain of binary operators with two operands, the second can be broken
7196 // with no line break before it.
7197 EXPECT_EQ("abcd + \"line line \"\n"
7198 " \"line line\";",
7199 format("abcd + \"line line line line\";",
7200 getLLVMStyleWithColumns(20)));
7201 // In a chain of binary operators with three operands, the second must be
7202 // broken with a line break before it.
7203 EXPECT_EQ("abcd +\n"
7204 " \"line line \"\n"
7205 " \"line line\" +\n"
7206 " e;",
7207 format("abcd + \"line line line line\" + e;",
7208 getLLVMStyleWithColumns(20)));
7209 // In a function call with two operands, with AlignAfterOpenBracket enabled,
7210 // the first must be broken with a line break before it.
7211 FormatStyle Style = getLLVMStyleWithColumns(25);
7212 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
7213 EXPECT_EQ("someFunction(\n"
7214 " \"long long long \"\n"
7215 " \"long\",\n"
7216 " a);",
7217 format("someFunction(\"long long long long\", a);", Style));
7218}
7219
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007220TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007221 EXPECT_EQ(
7222 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7223 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7224 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7225 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7226 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7227 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
7228}
7229
7230TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
7231 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007232 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007233 EXPECT_EQ("fffffffffff(g(R\"x(\n"
7234 "multiline raw string literal xxxxxxxxxxxxxx\n"
7235 ")x\",\n"
7236 " a),\n"
7237 " b);",
7238 format("fffffffffff(g(R\"x(\n"
7239 "multiline raw string literal xxxxxxxxxxxxxx\n"
7240 ")x\", a), b);",
7241 getGoogleStyleWithColumns(20)));
7242 EXPECT_EQ("fffffffffff(\n"
7243 " g(R\"x(qqq\n"
7244 "multiline raw string literal xxxxxxxxxxxxxx\n"
7245 ")x\",\n"
7246 " a),\n"
7247 " b);",
7248 format("fffffffffff(g(R\"x(qqq\n"
7249 "multiline raw string literal xxxxxxxxxxxxxx\n"
7250 ")x\", a), b);",
7251 getGoogleStyleWithColumns(20)));
7252
7253 EXPECT_EQ("fffffffffff(R\"x(\n"
7254 "multiline raw string literal xxxxxxxxxxxxxx\n"
7255 ")x\");",
7256 format("fffffffffff(R\"x(\n"
7257 "multiline raw string literal xxxxxxxxxxxxxx\n"
7258 ")x\");",
7259 getGoogleStyleWithColumns(20)));
7260 EXPECT_EQ("fffffffffff(R\"x(\n"
7261 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007262 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007263 format("fffffffffff(R\"x(\n"
7264 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007265 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007266 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007267 EXPECT_EQ("fffffffffff(\n"
7268 " R\"x(\n"
7269 "multiline raw string literal xxxxxxxxxxxxxx\n"
7270 ")x\" +\n"
7271 " bbbbbb);",
7272 format("fffffffffff(\n"
7273 " R\"x(\n"
7274 "multiline raw string literal xxxxxxxxxxxxxx\n"
7275 ")x\" + bbbbbb);",
7276 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007277}
7278
Alexander Kornienkobe633902013-06-14 11:46:10 +00007279TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00007280 verifyFormat("string a = \"unterminated;");
7281 EXPECT_EQ("function(\"unterminated,\n"
7282 " OtherParameter);",
7283 format("function( \"unterminated,\n"
7284 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00007285}
7286
7287TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007288 FormatStyle Style = getLLVMStyle();
7289 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00007290 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007291 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00007292}
7293
Daniel Jaspera44991332015-04-29 13:06:49 +00007294TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00007295
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007296TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
7297 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
7298 " \"ddeeefff\");",
7299 format("someFunction(\"aaabbbcccdddeeefff\");",
7300 getLLVMStyleWithColumns(25)));
7301 EXPECT_EQ("someFunction1234567890(\n"
7302 " \"aaabbbcccdddeeefff\");",
7303 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7304 getLLVMStyleWithColumns(26)));
7305 EXPECT_EQ("someFunction1234567890(\n"
7306 " \"aaabbbcccdddeeeff\"\n"
7307 " \"f\");",
7308 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7309 getLLVMStyleWithColumns(25)));
7310 EXPECT_EQ("someFunction1234567890(\n"
7311 " \"aaabbbcccdddeeeff\"\n"
7312 " \"f\");",
7313 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7314 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00007315 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
7316 " \"ddde \"\n"
7317 " \"efff\");",
7318 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007319 getLLVMStyleWithColumns(25)));
7320 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
7321 " \"ddeeefff\");",
7322 format("someFunction(\"aaabbbccc ddeeefff\");",
7323 getLLVMStyleWithColumns(25)));
7324 EXPECT_EQ("someFunction1234567890(\n"
7325 " \"aaabb \"\n"
7326 " \"cccdddeeefff\");",
7327 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
7328 getLLVMStyleWithColumns(25)));
7329 EXPECT_EQ("#define A \\\n"
7330 " string s = \\\n"
7331 " \"123456789\" \\\n"
7332 " \"0\"; \\\n"
7333 " int i;",
7334 format("#define A string s = \"1234567890\"; int i;",
7335 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00007336 // FIXME: Put additional penalties on breaking at non-whitespace locations.
7337 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
7338 " \"dddeeeff\"\n"
7339 " \"f\");",
7340 format("someFunction(\"aaabbbcc dddeeefff\");",
7341 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007342}
7343
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007344TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00007345 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
7346 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007347 EXPECT_EQ("\"test\"\n"
7348 "\"\\n\"",
7349 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
7350 EXPECT_EQ("\"tes\\\\\"\n"
7351 "\"n\"",
7352 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
7353 EXPECT_EQ("\"\\\\\\\\\"\n"
7354 "\"\\n\"",
7355 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00007356 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007357 EXPECT_EQ("\"\\uff01\"\n"
7358 "\"test\"",
7359 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
7360 EXPECT_EQ("\"\\Uff01ff02\"",
7361 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
7362 EXPECT_EQ("\"\\x000000000001\"\n"
7363 "\"next\"",
7364 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
7365 EXPECT_EQ("\"\\x000000000001next\"",
7366 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
7367 EXPECT_EQ("\"\\x000000000001\"",
7368 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
7369 EXPECT_EQ("\"test\"\n"
7370 "\"\\000000\"\n"
7371 "\"000001\"",
7372 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
7373 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007374 "\"00000000\"\n"
7375 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007376 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007377}
7378
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00007379TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
7380 verifyFormat("void f() {\n"
7381 " return g() {}\n"
7382 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007383 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00007384 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00007385 "}");
7386}
7387
Manuel Klimek421147e2014-01-24 09:25:23 +00007388TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
7389 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00007390 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00007391}
7392
Manuel Klimek13b97d82013-05-13 08:42:42 +00007393TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
7394 verifyFormat("class X {\n"
7395 " void f() {\n"
7396 " }\n"
7397 "};",
7398 getLLVMStyleWithColumns(12));
7399}
7400
7401TEST_F(FormatTest, ConfigurableIndentWidth) {
7402 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
7403 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00007404 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00007405 verifyFormat("void f() {\n"
7406 " someFunction();\n"
7407 " if (true) {\n"
7408 " f();\n"
7409 " }\n"
7410 "}",
7411 EightIndent);
7412 verifyFormat("class X {\n"
7413 " void f() {\n"
7414 " }\n"
7415 "};",
7416 EightIndent);
7417 verifyFormat("int x[] = {\n"
7418 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007419 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00007420 EightIndent);
7421}
7422
Alexander Kornienko34a87e82013-06-22 01:35:36 +00007423TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00007424 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00007425 "f();",
7426 getLLVMStyleWithColumns(8));
7427}
7428
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007429TEST_F(FormatTest, ConfigurableUseOfTab) {
7430 FormatStyle Tab = getLLVMStyleWithColumns(42);
7431 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007432 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007433 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00007434
7435 EXPECT_EQ("if (aaaaaaaa && // q\n"
7436 " bb)\t\t// w\n"
7437 "\t;",
7438 format("if (aaaaaaaa &&// q\n"
7439 "bb)// w\n"
7440 ";",
7441 Tab));
7442 EXPECT_EQ("if (aaa && bbb) // w\n"
7443 "\t;",
7444 format("if(aaa&&bbb)// w\n"
7445 ";",
7446 Tab));
7447
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007448 verifyFormat("class X {\n"
7449 "\tvoid f() {\n"
7450 "\t\tsomeFunction(parameter1,\n"
7451 "\t\t\t parameter2);\n"
7452 "\t}\n"
7453 "};",
7454 Tab);
7455 verifyFormat("#define A \\\n"
7456 "\tvoid f() { \\\n"
7457 "\t\tsomeFunction( \\\n"
7458 "\t\t parameter1, \\\n"
7459 "\t\t parameter2); \\\n"
7460 "\t}",
7461 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00007462
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00007463 Tab.TabWidth = 4;
7464 Tab.IndentWidth = 8;
7465 verifyFormat("class TabWidth4Indent8 {\n"
7466 "\t\tvoid f() {\n"
7467 "\t\t\t\tsomeFunction(parameter1,\n"
7468 "\t\t\t\t\t\t\t parameter2);\n"
7469 "\t\t}\n"
7470 "};",
7471 Tab);
7472
7473 Tab.TabWidth = 4;
7474 Tab.IndentWidth = 4;
7475 verifyFormat("class TabWidth4Indent4 {\n"
7476 "\tvoid f() {\n"
7477 "\t\tsomeFunction(parameter1,\n"
7478 "\t\t\t\t\t parameter2);\n"
7479 "\t}\n"
7480 "};",
7481 Tab);
7482
7483 Tab.TabWidth = 8;
7484 Tab.IndentWidth = 4;
7485 verifyFormat("class TabWidth8Indent4 {\n"
7486 " void f() {\n"
7487 "\tsomeFunction(parameter1,\n"
7488 "\t\t parameter2);\n"
7489 " }\n"
7490 "};",
7491 Tab);
7492
Alexander Kornienko39856b72013-09-10 09:38:25 +00007493 Tab.TabWidth = 8;
7494 Tab.IndentWidth = 8;
7495 EXPECT_EQ("/*\n"
7496 "\t a\t\tcomment\n"
7497 "\t in multiple lines\n"
7498 " */",
7499 format(" /*\t \t \n"
7500 " \t \t a\t\tcomment\t \t\n"
7501 " \t \t in multiple lines\t\n"
7502 " \t */",
7503 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00007504
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007505 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00007506 verifyFormat("{\n"
7507 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7508 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7509 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7510 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7511 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7512 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00007513 "};",
7514 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00007515 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00007516 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00007517 "\ta2,\n"
7518 "\ta3\n"
7519 "};",
7520 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007521 EXPECT_EQ("if (aaaaaaaa && // q\n"
7522 " bb) // w\n"
7523 "\t;",
7524 format("if (aaaaaaaa &&// q\n"
7525 "bb)// w\n"
7526 ";",
7527 Tab));
7528 verifyFormat("class X {\n"
7529 "\tvoid f() {\n"
7530 "\t\tsomeFunction(parameter1,\n"
7531 "\t\t parameter2);\n"
7532 "\t}\n"
7533 "};",
7534 Tab);
7535 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00007536 "\tQ(\n"
7537 "\t {\n"
7538 "\t\t int a;\n"
7539 "\t\t someFunction(aaaaaaaa,\n"
7540 "\t\t bbbbbbb);\n"
7541 "\t },\n"
7542 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007543 "}",
7544 Tab);
7545 EXPECT_EQ("{\n"
7546 "\t/* aaaa\n"
7547 "\t bbbb */\n"
7548 "}",
7549 format("{\n"
7550 "/* aaaa\n"
7551 " bbbb */\n"
7552 "}",
7553 Tab));
7554 EXPECT_EQ("{\n"
7555 "\t/*\n"
7556 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7557 "\t bbbbbbbbbbbbb\n"
7558 "\t*/\n"
7559 "}",
7560 format("{\n"
7561 "/*\n"
7562 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7563 "*/\n"
7564 "}",
7565 Tab));
7566 EXPECT_EQ("{\n"
7567 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7568 "\t// bbbbbbbbbbbbb\n"
7569 "}",
7570 format("{\n"
7571 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7572 "}",
7573 Tab));
7574 EXPECT_EQ("{\n"
7575 "\t/*\n"
7576 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7577 "\t bbbbbbbbbbbbb\n"
7578 "\t*/\n"
7579 "}",
7580 format("{\n"
7581 "\t/*\n"
7582 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7583 "\t*/\n"
7584 "}",
7585 Tab));
7586 EXPECT_EQ("{\n"
7587 "\t/*\n"
7588 "\n"
7589 "\t*/\n"
7590 "}",
7591 format("{\n"
7592 "\t/*\n"
7593 "\n"
7594 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00007595 "}",
7596 Tab));
7597 EXPECT_EQ("{\n"
7598 "\t/*\n"
7599 " asdf\n"
7600 "\t*/\n"
7601 "}",
7602 format("{\n"
7603 "\t/*\n"
7604 " asdf\n"
7605 "\t*/\n"
7606 "}",
7607 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007608
7609 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00007610 EXPECT_EQ("/*\n"
7611 " a\t\tcomment\n"
7612 " in multiple lines\n"
7613 " */",
7614 format(" /*\t \t \n"
7615 " \t \t a\t\tcomment\t \t\n"
7616 " \t \t in multiple lines\t\n"
7617 " \t */",
7618 Tab));
7619 EXPECT_EQ("/* some\n"
7620 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007621 format(" \t \t /* some\n"
7622 " \t \t comment */",
7623 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00007624 EXPECT_EQ("int a; /* some\n"
7625 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007626 format(" \t \t int a; /* some\n"
7627 " \t \t comment */",
7628 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00007629
Alexander Kornienko39856b72013-09-10 09:38:25 +00007630 EXPECT_EQ("int a; /* some\n"
7631 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007632 format(" \t \t int\ta; /* some\n"
7633 " \t \t comment */",
7634 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00007635 EXPECT_EQ("f(\"\t\t\"); /* some\n"
7636 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007637 format(" \t \t f(\"\t\t\"); /* some\n"
7638 " \t \t comment */",
7639 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00007640 EXPECT_EQ("{\n"
7641 " /*\n"
7642 " * Comment\n"
7643 " */\n"
7644 " int i;\n"
7645 "}",
7646 format("{\n"
7647 "\t/*\n"
7648 "\t * Comment\n"
7649 "\t */\n"
7650 "\t int i;\n"
7651 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00007652
7653 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
7654 Tab.TabWidth = 8;
7655 Tab.IndentWidth = 8;
7656 EXPECT_EQ("if (aaaaaaaa && // q\n"
7657 " bb) // w\n"
7658 "\t;",
7659 format("if (aaaaaaaa &&// q\n"
7660 "bb)// w\n"
7661 ";",
7662 Tab));
7663 EXPECT_EQ("if (aaa && bbb) // w\n"
7664 "\t;",
7665 format("if(aaa&&bbb)// w\n"
7666 ";",
7667 Tab));
7668 verifyFormat("class X {\n"
7669 "\tvoid f() {\n"
7670 "\t\tsomeFunction(parameter1,\n"
7671 "\t\t\t parameter2);\n"
7672 "\t}\n"
7673 "};",
7674 Tab);
7675 verifyFormat("#define A \\\n"
7676 "\tvoid f() { \\\n"
7677 "\t\tsomeFunction( \\\n"
7678 "\t\t parameter1, \\\n"
7679 "\t\t parameter2); \\\n"
7680 "\t}",
7681 Tab);
7682 Tab.TabWidth = 4;
7683 Tab.IndentWidth = 8;
7684 verifyFormat("class TabWidth4Indent8 {\n"
7685 "\t\tvoid f() {\n"
7686 "\t\t\t\tsomeFunction(parameter1,\n"
7687 "\t\t\t\t\t\t\t parameter2);\n"
7688 "\t\t}\n"
7689 "};",
7690 Tab);
7691 Tab.TabWidth = 4;
7692 Tab.IndentWidth = 4;
7693 verifyFormat("class TabWidth4Indent4 {\n"
7694 "\tvoid f() {\n"
7695 "\t\tsomeFunction(parameter1,\n"
7696 "\t\t\t\t\t parameter2);\n"
7697 "\t}\n"
7698 "};",
7699 Tab);
7700 Tab.TabWidth = 8;
7701 Tab.IndentWidth = 4;
7702 verifyFormat("class TabWidth8Indent4 {\n"
7703 " void f() {\n"
7704 "\tsomeFunction(parameter1,\n"
7705 "\t\t parameter2);\n"
7706 " }\n"
7707 "};",
7708 Tab);
7709 Tab.TabWidth = 8;
7710 Tab.IndentWidth = 8;
7711 EXPECT_EQ("/*\n"
7712 "\t a\t\tcomment\n"
7713 "\t in multiple lines\n"
7714 " */",
7715 format(" /*\t \t \n"
7716 " \t \t a\t\tcomment\t \t\n"
7717 " \t \t in multiple lines\t\n"
7718 " \t */",
7719 Tab));
7720 verifyFormat("{\n"
7721 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7722 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7723 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7724 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7725 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7726 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7727 "};",
7728 Tab);
7729 verifyFormat("enum AA {\n"
7730 "\ta1, // Force multiple lines\n"
7731 "\ta2,\n"
7732 "\ta3\n"
7733 "};",
7734 Tab);
7735 EXPECT_EQ("if (aaaaaaaa && // q\n"
7736 " bb) // w\n"
7737 "\t;",
7738 format("if (aaaaaaaa &&// q\n"
7739 "bb)// w\n"
7740 ";",
7741 Tab));
7742 verifyFormat("class X {\n"
7743 "\tvoid f() {\n"
7744 "\t\tsomeFunction(parameter1,\n"
7745 "\t\t\t parameter2);\n"
7746 "\t}\n"
7747 "};",
7748 Tab);
7749 verifyFormat("{\n"
7750 "\tQ(\n"
7751 "\t {\n"
7752 "\t\t int a;\n"
7753 "\t\t someFunction(aaaaaaaa,\n"
7754 "\t\t\t\t bbbbbbb);\n"
7755 "\t },\n"
7756 "\t p);\n"
7757 "}",
7758 Tab);
7759 EXPECT_EQ("{\n"
7760 "\t/* aaaa\n"
7761 "\t bbbb */\n"
7762 "}",
7763 format("{\n"
7764 "/* aaaa\n"
7765 " bbbb */\n"
7766 "}",
7767 Tab));
7768 EXPECT_EQ("{\n"
7769 "\t/*\n"
7770 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7771 "\t bbbbbbbbbbbbb\n"
7772 "\t*/\n"
7773 "}",
7774 format("{\n"
7775 "/*\n"
7776 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7777 "*/\n"
7778 "}",
7779 Tab));
7780 EXPECT_EQ("{\n"
7781 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7782 "\t// bbbbbbbbbbbbb\n"
7783 "}",
7784 format("{\n"
7785 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7786 "}",
7787 Tab));
7788 EXPECT_EQ("{\n"
7789 "\t/*\n"
7790 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7791 "\t bbbbbbbbbbbbb\n"
7792 "\t*/\n"
7793 "}",
7794 format("{\n"
7795 "\t/*\n"
7796 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7797 "\t*/\n"
7798 "}",
7799 Tab));
7800 EXPECT_EQ("{\n"
7801 "\t/*\n"
7802 "\n"
7803 "\t*/\n"
7804 "}",
7805 format("{\n"
7806 "\t/*\n"
7807 "\n"
7808 "\t*/\n"
7809 "}",
7810 Tab));
7811 EXPECT_EQ("{\n"
7812 "\t/*\n"
7813 " asdf\n"
7814 "\t*/\n"
7815 "}",
7816 format("{\n"
7817 "\t/*\n"
7818 " asdf\n"
7819 "\t*/\n"
7820 "}",
7821 Tab));
7822 EXPECT_EQ("/*\n"
7823 "\t a\t\tcomment\n"
7824 "\t in multiple lines\n"
7825 " */",
7826 format(" /*\t \t \n"
7827 " \t \t a\t\tcomment\t \t\n"
7828 " \t \t in multiple lines\t\n"
7829 " \t */",
7830 Tab));
7831 EXPECT_EQ("/* some\n"
7832 " comment */",
7833 format(" \t \t /* some\n"
7834 " \t \t comment */",
7835 Tab));
7836 EXPECT_EQ("int a; /* some\n"
7837 " comment */",
7838 format(" \t \t int a; /* some\n"
7839 " \t \t comment */",
7840 Tab));
7841 EXPECT_EQ("int a; /* some\n"
7842 "comment */",
7843 format(" \t \t int\ta; /* some\n"
7844 " \t \t comment */",
7845 Tab));
7846 EXPECT_EQ("f(\"\t\t\"); /* some\n"
7847 " comment */",
7848 format(" \t \t f(\"\t\t\"); /* some\n"
7849 " \t \t comment */",
7850 Tab));
7851 EXPECT_EQ("{\n"
7852 " /*\n"
7853 " * Comment\n"
7854 " */\n"
7855 " int i;\n"
7856 "}",
7857 format("{\n"
7858 "\t/*\n"
7859 "\t * Comment\n"
7860 "\t */\n"
7861 "\t int i;\n"
7862 "}"));
7863 Tab.AlignConsecutiveAssignments = true;
7864 Tab.AlignConsecutiveDeclarations = true;
7865 Tab.TabWidth = 4;
7866 Tab.IndentWidth = 4;
7867 verifyFormat("class Assign {\n"
7868 "\tvoid f() {\n"
7869 "\t\tint x = 123;\n"
7870 "\t\tint random = 4;\n"
7871 "\t\tstd::string alphabet =\n"
7872 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
7873 "\t}\n"
7874 "};",
7875 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007876}
7877
Alexander Kornienko917f9e02013-09-10 12:29:48 +00007878TEST_F(FormatTest, CalculatesOriginalColumn) {
7879 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7880 "q\"; /* some\n"
7881 " comment */",
7882 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7883 "q\"; /* some\n"
7884 " comment */",
7885 getLLVMStyle()));
7886 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
7887 "/* some\n"
7888 " comment */",
7889 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
7890 " /* some\n"
7891 " comment */",
7892 getLLVMStyle()));
7893 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7894 "qqq\n"
7895 "/* some\n"
7896 " comment */",
7897 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7898 "qqq\n"
7899 " /* some\n"
7900 " comment */",
7901 getLLVMStyle()));
7902 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7903 "wwww; /* some\n"
7904 " comment */",
7905 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7906 "wwww; /* some\n"
7907 " comment */",
7908 getLLVMStyle()));
7909}
7910
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007911TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00007912 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007913 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00007914
7915 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007916 " continue;",
7917 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007918 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007919 " continue;",
7920 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007921 verifyFormat("if(true)\n"
7922 " f();\n"
7923 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007924 " f();",
7925 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007926 verifyFormat("do {\n"
7927 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007928 "} while(something());",
7929 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007930 verifyFormat("switch(x) {\n"
7931 "default:\n"
7932 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007933 "}",
7934 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00007935 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00007936 verifyFormat("size_t x = sizeof(x);", NoSpace);
7937 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
7938 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
7939 verifyFormat("alignas(128) char a[128];", NoSpace);
7940 verifyFormat("size_t x = alignof(MyType);", NoSpace);
7941 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
7942 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00007943 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00007944 verifyFormat("T A::operator()();", NoSpace);
7945 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007946
7947 FormatStyle Space = getLLVMStyle();
7948 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
7949
7950 verifyFormat("int f ();", Space);
7951 verifyFormat("void f (int a, T b) {\n"
7952 " while (true)\n"
7953 " continue;\n"
7954 "}",
7955 Space);
7956 verifyFormat("if (true)\n"
7957 " f ();\n"
7958 "else if (true)\n"
7959 " f ();",
7960 Space);
7961 verifyFormat("do {\n"
7962 " do_something ();\n"
7963 "} while (something ());",
7964 Space);
7965 verifyFormat("switch (x) {\n"
7966 "default:\n"
7967 " break;\n"
7968 "}",
7969 Space);
7970 verifyFormat("A::A () : a (1) {}", Space);
7971 verifyFormat("void f () __attribute__ ((asdf));", Space);
7972 verifyFormat("*(&a + 1);\n"
7973 "&((&a)[1]);\n"
7974 "a[(b + c) * d];\n"
7975 "(((a + 1) * 2) + 3) * 4;",
7976 Space);
7977 verifyFormat("#define A(x) x", Space);
7978 verifyFormat("#define A (x) x", Space);
7979 verifyFormat("#if defined(x)\n"
7980 "#endif",
7981 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00007982 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00007983 verifyFormat("size_t x = sizeof (x);", Space);
7984 verifyFormat("auto f (int x) -> decltype (x);", Space);
7985 verifyFormat("int f (T x) noexcept (x.create ());", Space);
7986 verifyFormat("alignas (128) char a[128];", Space);
7987 verifyFormat("size_t x = alignof (MyType);", Space);
7988 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
7989 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00007990 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00007991 verifyFormat("T A::operator() ();", Space);
7992 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007993}
7994
7995TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
7996 FormatStyle Spaces = getLLVMStyle();
7997
7998 Spaces.SpacesInParentheses = true;
7999 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008000 verifyFormat("call();", Spaces);
8001 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008002 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8003 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008004 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008005 " continue;",
8006 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008007 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008008 " continue;",
8009 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008010 verifyFormat("if ( true )\n"
8011 " f();\n"
8012 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008013 " f();",
8014 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008015 verifyFormat("do {\n"
8016 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008017 "} while ( something() );",
8018 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008019 verifyFormat("switch ( x ) {\n"
8020 "default:\n"
8021 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008022 "}",
8023 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008024
8025 Spaces.SpacesInParentheses = false;
8026 Spaces.SpacesInCStyleCastParentheses = true;
8027 verifyFormat("Type *A = ( Type * )P;", Spaces);
8028 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8029 verifyFormat("x = ( int32 )y;", Spaces);
8030 verifyFormat("int a = ( int )(2.0f);", Spaces);
8031 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8032 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8033 verifyFormat("#define x (( int )-1)", Spaces);
8034
Daniel Jasper92e09822015-03-18 12:59:19 +00008035 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008036 Spaces.SpacesInParentheses = false;
8037 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008038 Spaces.SpacesInCStyleCastParentheses = true;
8039 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008040 verifyFormat("call( );", Spaces);
8041 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008042 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008043 " continue;",
8044 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008045 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008046 " continue;",
8047 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008048 verifyFormat("if (true)\n"
8049 " f( );\n"
8050 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008051 " f( );",
8052 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008053 verifyFormat("do {\n"
8054 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008055 "} while (something( ));",
8056 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008057 verifyFormat("switch (x) {\n"
8058 "default:\n"
8059 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008060 "}",
8061 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008062
Daniel Jasper92e09822015-03-18 12:59:19 +00008063 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008064 Spaces.SpaceAfterCStyleCast = true;
8065 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008066 verifyFormat("call( );", Spaces);
8067 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008068 verifyFormat("while (( bool ) 1)\n"
8069 " continue;",
8070 Spaces);
8071 verifyFormat("for (;;)\n"
8072 " continue;",
8073 Spaces);
8074 verifyFormat("if (true)\n"
8075 " f( );\n"
8076 "else if (true)\n"
8077 " f( );",
8078 Spaces);
8079 verifyFormat("do {\n"
8080 " do_something(( int ) i);\n"
8081 "} while (something( ));",
8082 Spaces);
8083 verifyFormat("switch (x) {\n"
8084 "default:\n"
8085 " break;\n"
8086 "}",
8087 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008088
8089 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008090 Spaces.SpacesInCStyleCastParentheses = false;
8091 Spaces.SpaceAfterCStyleCast = true;
8092 verifyFormat("while ((bool) 1)\n"
8093 " continue;",
8094 Spaces);
8095 verifyFormat("do {\n"
8096 " do_something((int) i);\n"
8097 "} while (something( ));",
8098 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008099}
8100
Daniel Jasperad981f82014-08-26 11:41:14 +00008101TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
8102 verifyFormat("int a[5];");
8103 verifyFormat("a[3] += 42;");
8104
8105 FormatStyle Spaces = getLLVMStyle();
8106 Spaces.SpacesInSquareBrackets = true;
8107 // Lambdas unchanged.
8108 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
8109 verifyFormat("return [i, args...] {};", Spaces);
8110
8111 // Not lambdas.
8112 verifyFormat("int a[ 5 ];", Spaces);
8113 verifyFormat("a[ 3 ] += 42;", Spaces);
8114 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
8115 verifyFormat("double &operator[](int i) { return 0; }\n"
8116 "int i;",
8117 Spaces);
8118 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
8119 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
8120 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
8121}
8122
Daniel Jasperd94bff32013-09-25 15:15:02 +00008123TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
8124 verifyFormat("int a = 5;");
8125 verifyFormat("a += 42;");
8126 verifyFormat("a or_eq 8;");
8127
8128 FormatStyle Spaces = getLLVMStyle();
8129 Spaces.SpaceBeforeAssignmentOperators = false;
8130 verifyFormat("int a= 5;", Spaces);
8131 verifyFormat("a+= 42;", Spaces);
8132 verifyFormat("a or_eq 8;", Spaces);
8133}
8134
Daniel Jaspera44991332015-04-29 13:06:49 +00008135TEST_F(FormatTest, AlignConsecutiveAssignments) {
8136 FormatStyle Alignment = getLLVMStyle();
8137 Alignment.AlignConsecutiveAssignments = false;
8138 verifyFormat("int a = 5;\n"
8139 "int oneTwoThree = 123;",
8140 Alignment);
8141 verifyFormat("int a = 5;\n"
8142 "int oneTwoThree = 123;",
8143 Alignment);
8144
8145 Alignment.AlignConsecutiveAssignments = true;
8146 verifyFormat("int a = 5;\n"
8147 "int oneTwoThree = 123;",
8148 Alignment);
8149 verifyFormat("int a = method();\n"
8150 "int oneTwoThree = 133;",
8151 Alignment);
8152 verifyFormat("a &= 5;\n"
8153 "bcd *= 5;\n"
8154 "ghtyf += 5;\n"
8155 "dvfvdb -= 5;\n"
8156 "a /= 5;\n"
8157 "vdsvsv %= 5;\n"
8158 "sfdbddfbdfbb ^= 5;\n"
8159 "dvsdsv |= 5;\n"
8160 "int dsvvdvsdvvv = 123;",
8161 Alignment);
8162 verifyFormat("int i = 1, j = 10;\n"
8163 "something = 2000;",
8164 Alignment);
8165 verifyFormat("something = 2000;\n"
8166 "int i = 1, j = 10;\n",
8167 Alignment);
8168 verifyFormat("something = 2000;\n"
8169 "another = 911;\n"
8170 "int i = 1, j = 10;\n"
8171 "oneMore = 1;\n"
8172 "i = 2;",
8173 Alignment);
8174 verifyFormat("int a = 5;\n"
8175 "int one = 1;\n"
8176 "method();\n"
8177 "int oneTwoThree = 123;\n"
8178 "int oneTwo = 12;",
8179 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00008180 verifyFormat("int oneTwoThree = 123;\n"
8181 "int oneTwo = 12;\n"
8182 "method();\n",
8183 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008184 verifyFormat("int oneTwoThree = 123; // comment\n"
8185 "int oneTwo = 12; // comment",
8186 Alignment);
8187 EXPECT_EQ("int a = 5;\n"
8188 "\n"
8189 "int oneTwoThree = 123;",
8190 format("int a = 5;\n"
8191 "\n"
8192 "int oneTwoThree= 123;",
8193 Alignment));
8194 EXPECT_EQ("int a = 5;\n"
8195 "int one = 1;\n"
8196 "\n"
8197 "int oneTwoThree = 123;",
8198 format("int a = 5;\n"
8199 "int one = 1;\n"
8200 "\n"
8201 "int oneTwoThree = 123;",
8202 Alignment));
8203 EXPECT_EQ("int a = 5;\n"
8204 "int one = 1;\n"
8205 "\n"
8206 "int oneTwoThree = 123;\n"
8207 "int oneTwo = 12;",
8208 format("int a = 5;\n"
8209 "int one = 1;\n"
8210 "\n"
8211 "int oneTwoThree = 123;\n"
8212 "int oneTwo = 12;",
8213 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008214 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
8215 verifyFormat("#define A \\\n"
8216 " int aaaa = 12; \\\n"
8217 " int b = 23; \\\n"
8218 " int ccc = 234; \\\n"
8219 " int dddddddddd = 2345;",
8220 Alignment);
8221 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00008222 verifyFormat("#define A \\\n"
8223 " int aaaa = 12; \\\n"
8224 " int b = 23; \\\n"
8225 " int ccc = 234; \\\n"
8226 " int dddddddddd = 2345;",
8227 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008228 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00008229 verifyFormat("#define A "
8230 " \\\n"
8231 " int aaaa = 12; "
8232 " \\\n"
8233 " int b = 23; "
8234 " \\\n"
8235 " int ccc = 234; "
8236 " \\\n"
8237 " int dddddddddd = 2345;",
8238 Alignment);
8239 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
8240 "k = 4, int l = 5,\n"
8241 " int m = 6) {\n"
8242 " int j = 10;\n"
8243 " otherThing = 1;\n"
8244 "}",
8245 Alignment);
8246 verifyFormat("void SomeFunction(int parameter = 0) {\n"
8247 " int i = 1;\n"
8248 " int j = 2;\n"
8249 " int big = 10000;\n"
8250 "}",
8251 Alignment);
8252 verifyFormat("class C {\n"
8253 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00008254 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008255 " virtual void f() = 0;\n"
8256 "};",
8257 Alignment);
8258 verifyFormat("int i = 1;\n"
8259 "if (SomeType t = getSomething()) {\n"
8260 "}\n"
8261 "int j = 2;\n"
8262 "int big = 10000;",
8263 Alignment);
8264 verifyFormat("int j = 7;\n"
8265 "for (int k = 0; k < N; ++k) {\n"
8266 "}\n"
8267 "int j = 2;\n"
8268 "int big = 10000;\n"
8269 "}",
8270 Alignment);
8271 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8272 verifyFormat("int i = 1;\n"
8273 "LooooooooooongType loooooooooooooooooooooongVariable\n"
8274 " = someLooooooooooooooooongFunction();\n"
8275 "int j = 2;",
8276 Alignment);
8277 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
8278 verifyFormat("int i = 1;\n"
8279 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
8280 " someLooooooooooooooooongFunction();\n"
8281 "int j = 2;",
8282 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00008283
8284 verifyFormat("auto lambda = []() {\n"
8285 " auto i = 0;\n"
8286 " return 0;\n"
8287 "};\n"
8288 "int i = 0;\n"
8289 "auto v = type{\n"
8290 " i = 1, //\n"
8291 " (i = 2), //\n"
8292 " i = 3 //\n"
8293 "};",
8294 Alignment);
8295
Daniel Jaspera44991332015-04-29 13:06:49 +00008296 verifyFormat(
8297 "int i = 1;\n"
8298 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
8299 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008300 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00008301 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00008302
8303 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
8304 " typename B = very_long_type_name_1,\n"
8305 " typename T_2 = very_long_type_name_2>\n"
8306 "auto foo() {}\n",
8307 Alignment);
8308 verifyFormat("int a, b = 1;\n"
8309 "int c = 2;\n"
8310 "int dd = 3;\n",
8311 Alignment);
8312 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8313 "float b[1][] = {{3.f}};\n",
8314 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008315 verifyFormat("for (int i = 0; i < 1; i++)\n"
8316 " int x = 1;\n",
8317 Alignment);
8318 verifyFormat("for (i = 0; i < 1; i++)\n"
8319 " x = 1;\n"
8320 "y = 1;\n",
8321 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008322}
8323
Daniel Jaspere12597c2015-10-01 10:06:54 +00008324TEST_F(FormatTest, AlignConsecutiveDeclarations) {
8325 FormatStyle Alignment = getLLVMStyle();
8326 Alignment.AlignConsecutiveDeclarations = false;
8327 verifyFormat("float const a = 5;\n"
8328 "int oneTwoThree = 123;",
8329 Alignment);
8330 verifyFormat("int a = 5;\n"
8331 "float const oneTwoThree = 123;",
8332 Alignment);
8333
8334 Alignment.AlignConsecutiveDeclarations = true;
8335 verifyFormat("float const a = 5;\n"
8336 "int oneTwoThree = 123;",
8337 Alignment);
8338 verifyFormat("int a = method();\n"
8339 "float const oneTwoThree = 133;",
8340 Alignment);
8341 verifyFormat("int i = 1, j = 10;\n"
8342 "something = 2000;",
8343 Alignment);
8344 verifyFormat("something = 2000;\n"
8345 "int i = 1, j = 10;\n",
8346 Alignment);
8347 verifyFormat("float something = 2000;\n"
8348 "double another = 911;\n"
8349 "int i = 1, j = 10;\n"
8350 "const int *oneMore = 1;\n"
8351 "unsigned i = 2;",
8352 Alignment);
8353 verifyFormat("float a = 5;\n"
8354 "int one = 1;\n"
8355 "method();\n"
8356 "const double oneTwoThree = 123;\n"
8357 "const unsigned int oneTwo = 12;",
8358 Alignment);
8359 verifyFormat("int oneTwoThree{0}; // comment\n"
8360 "unsigned oneTwo; // comment",
8361 Alignment);
8362 EXPECT_EQ("float const a = 5;\n"
8363 "\n"
8364 "int oneTwoThree = 123;",
8365 format("float const a = 5;\n"
8366 "\n"
8367 "int oneTwoThree= 123;",
8368 Alignment));
8369 EXPECT_EQ("float a = 5;\n"
8370 "int one = 1;\n"
8371 "\n"
8372 "unsigned oneTwoThree = 123;",
8373 format("float a = 5;\n"
8374 "int one = 1;\n"
8375 "\n"
8376 "unsigned oneTwoThree = 123;",
8377 Alignment));
8378 EXPECT_EQ("float a = 5;\n"
8379 "int one = 1;\n"
8380 "\n"
8381 "unsigned oneTwoThree = 123;\n"
8382 "int oneTwo = 12;",
8383 format("float a = 5;\n"
8384 "int one = 1;\n"
8385 "\n"
8386 "unsigned oneTwoThree = 123;\n"
8387 "int oneTwo = 12;",
8388 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008389 // Function prototype alignment
8390 verifyFormat("int a();\n"
8391 "double b();",
8392 Alignment);
8393 verifyFormat("int a(int x);\n"
8394 "double b();",
8395 Alignment);
8396 unsigned OldColumnLimit = Alignment.ColumnLimit;
8397 // We need to set ColumnLimit to zero, in order to stress nested alignments,
8398 // otherwise the function parameters will be re-flowed onto a single line.
8399 Alignment.ColumnLimit = 0;
8400 EXPECT_EQ("int a(int x,\n"
8401 " float y);\n"
8402 "double b(int x,\n"
8403 " double y);",
8404 format("int a(int x,\n"
8405 " float y);\n"
8406 "double b(int x,\n"
8407 " double y);",
8408 Alignment));
8409 // This ensures that function parameters of function declarations are
8410 // correctly indented when their owning functions are indented.
8411 // The failure case here is for 'double y' to not be indented enough.
8412 EXPECT_EQ("double a(int x);\n"
8413 "int b(int y,\n"
8414 " double z);",
8415 format("double a(int x);\n"
8416 "int b(int y,\n"
8417 " double z);",
8418 Alignment));
8419 // Set ColumnLimit low so that we induce wrapping immediately after
8420 // the function name and opening paren.
8421 Alignment.ColumnLimit = 13;
8422 verifyFormat("int function(\n"
8423 " int x,\n"
8424 " bool y);",
8425 Alignment);
8426 Alignment.ColumnLimit = OldColumnLimit;
8427 // Ensure function pointers don't screw up recursive alignment
8428 verifyFormat("int a(int x, void (*fp)(int y));\n"
8429 "double b();",
8430 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008431 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008432 // Ensure recursive alignment is broken by function braces, so that the
8433 // "a = 1" does not align with subsequent assignments inside the function
8434 // body.
8435 verifyFormat("int func(int a = 1) {\n"
8436 " int b = 2;\n"
8437 " int cc = 3;\n"
8438 "}",
8439 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008440 verifyFormat("float something = 2000;\n"
8441 "double another = 911;\n"
8442 "int i = 1, j = 10;\n"
8443 "const int *oneMore = 1;\n"
8444 "unsigned i = 2;",
8445 Alignment);
8446 verifyFormat("int oneTwoThree = {0}; // comment\n"
8447 "unsigned oneTwo = 0; // comment",
8448 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008449 // Make sure that scope is correctly tracked, in the absence of braces
8450 verifyFormat("for (int i = 0; i < n; i++)\n"
8451 " j = i;\n"
8452 "double x = 1;\n",
8453 Alignment);
8454 verifyFormat("if (int i = 0)\n"
8455 " j = i;\n"
8456 "double x = 1;\n",
8457 Alignment);
8458 // Ensure operator[] and operator() are comprehended
8459 verifyFormat("struct test {\n"
8460 " long long int foo();\n"
8461 " int operator[](int a);\n"
8462 " double bar();\n"
8463 "};\n",
8464 Alignment);
8465 verifyFormat("struct test {\n"
8466 " long long int foo();\n"
8467 " int operator()(int a);\n"
8468 " double bar();\n"
8469 "};\n",
8470 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008471 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
8472 " int const i = 1;\n"
8473 " int * j = 2;\n"
8474 " int big = 10000;\n"
8475 "\n"
8476 " unsigned oneTwoThree = 123;\n"
8477 " int oneTwo = 12;\n"
8478 " method();\n"
8479 " float k = 2;\n"
8480 " int ll = 10000;\n"
8481 "}",
8482 format("void SomeFunction(int parameter= 0) {\n"
8483 " int const i= 1;\n"
8484 " int *j=2;\n"
8485 " int big = 10000;\n"
8486 "\n"
8487 "unsigned oneTwoThree =123;\n"
8488 "int oneTwo = 12;\n"
8489 " method();\n"
8490 "float k= 2;\n"
8491 "int ll=10000;\n"
8492 "}",
8493 Alignment));
8494 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008495 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
8496 verifyFormat("#define A \\\n"
8497 " int aaaa = 12; \\\n"
8498 " float b = 23; \\\n"
8499 " const int ccc = 234; \\\n"
8500 " unsigned dddddddddd = 2345;",
8501 Alignment);
8502 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00008503 verifyFormat("#define A \\\n"
8504 " int aaaa = 12; \\\n"
8505 " float b = 23; \\\n"
8506 " const int ccc = 234; \\\n"
8507 " unsigned dddddddddd = 2345;",
8508 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008509 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00008510 Alignment.ColumnLimit = 30;
8511 verifyFormat("#define A \\\n"
8512 " int aaaa = 12; \\\n"
8513 " float b = 23; \\\n"
8514 " const int ccc = 234; \\\n"
8515 " int dddddddddd = 2345;",
8516 Alignment);
8517 Alignment.ColumnLimit = 80;
8518 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
8519 "k = 4, int l = 5,\n"
8520 " int m = 6) {\n"
8521 " const int j = 10;\n"
8522 " otherThing = 1;\n"
8523 "}",
8524 Alignment);
8525 verifyFormat("void SomeFunction(int parameter = 0) {\n"
8526 " int const i = 1;\n"
8527 " int * j = 2;\n"
8528 " int big = 10000;\n"
8529 "}",
8530 Alignment);
8531 verifyFormat("class C {\n"
8532 "public:\n"
8533 " int i = 1;\n"
8534 " virtual void f() = 0;\n"
8535 "};",
8536 Alignment);
8537 verifyFormat("float i = 1;\n"
8538 "if (SomeType t = getSomething()) {\n"
8539 "}\n"
8540 "const unsigned j = 2;\n"
8541 "int big = 10000;",
8542 Alignment);
8543 verifyFormat("float j = 7;\n"
8544 "for (int k = 0; k < N; ++k) {\n"
8545 "}\n"
8546 "unsigned j = 2;\n"
8547 "int big = 10000;\n"
8548 "}",
8549 Alignment);
8550 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8551 verifyFormat("float i = 1;\n"
8552 "LooooooooooongType loooooooooooooooooooooongVariable\n"
8553 " = someLooooooooooooooooongFunction();\n"
8554 "int j = 2;",
8555 Alignment);
8556 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
8557 verifyFormat("int i = 1;\n"
8558 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
8559 " someLooooooooooooooooongFunction();\n"
8560 "int j = 2;",
8561 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00008562
8563 Alignment.AlignConsecutiveAssignments = true;
8564 verifyFormat("auto lambda = []() {\n"
8565 " auto ii = 0;\n"
8566 " float j = 0;\n"
8567 " return 0;\n"
8568 "};\n"
8569 "int i = 0;\n"
8570 "float i2 = 0;\n"
8571 "auto v = type{\n"
8572 " i = 1, //\n"
8573 " (i = 2), //\n"
8574 " i = 3 //\n"
8575 "};",
8576 Alignment);
8577 Alignment.AlignConsecutiveAssignments = false;
8578
Daniel Jaspere12597c2015-10-01 10:06:54 +00008579 verifyFormat(
8580 "int i = 1;\n"
8581 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
8582 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008583 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00008584 Alignment);
8585
8586 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
8587 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008588 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00008589 // happens.
8590 Alignment.AlignConsecutiveAssignments = true;
8591 Alignment.ColumnLimit = 30;
8592 verifyFormat("float ii = 1;\n"
8593 "unsigned j = 2;\n"
8594 "int someVerylongVariable = 1;\n"
8595 "AnotherLongType ll = 123456;\n"
8596 "VeryVeryLongType k = 2;\n"
8597 "int myvar = 1;",
8598 Alignment);
8599 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00008600 Alignment.AlignConsecutiveAssignments = false;
8601
8602 verifyFormat(
8603 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
8604 " typename LongType, typename B>\n"
8605 "auto foo() {}\n",
8606 Alignment);
8607 verifyFormat("float a, b = 1;\n"
8608 "int c = 2;\n"
8609 "int dd = 3;\n",
8610 Alignment);
8611 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8612 "float b[1][] = {{3.f}};\n",
8613 Alignment);
8614 Alignment.AlignConsecutiveAssignments = true;
8615 verifyFormat("float a, b = 1;\n"
8616 "int c = 2;\n"
8617 "int dd = 3;\n",
8618 Alignment);
8619 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8620 "float b[1][] = {{3.f}};\n",
8621 Alignment);
8622 Alignment.AlignConsecutiveAssignments = false;
8623
8624 Alignment.ColumnLimit = 30;
8625 Alignment.BinPackParameters = false;
8626 verifyFormat("void foo(float a,\n"
8627 " float b,\n"
8628 " int c,\n"
8629 " uint32_t *d) {\n"
8630 " int * e = 0;\n"
8631 " float f = 0;\n"
8632 " double g = 0;\n"
8633 "}\n"
8634 "void bar(ino_t a,\n"
8635 " int b,\n"
8636 " uint32_t *c,\n"
8637 " bool d) {}\n",
8638 Alignment);
8639 Alignment.BinPackParameters = true;
8640 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00008641}
8642
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008643TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008644 FormatStyle LinuxBraceStyle = getLLVMStyle();
8645 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008646 verifyFormat("namespace a\n"
8647 "{\n"
8648 "class A\n"
8649 "{\n"
8650 " void f()\n"
8651 " {\n"
8652 " if (true) {\n"
8653 " a();\n"
8654 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00008655 " } else {\n"
8656 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008657 " }\n"
8658 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008659 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008660 "};\n"
8661 "struct B {\n"
8662 " int x;\n"
8663 "};\n"
8664 "}\n",
8665 LinuxBraceStyle);
8666 verifyFormat("enum X {\n"
8667 " Y = 0,\n"
8668 "}\n",
8669 LinuxBraceStyle);
8670 verifyFormat("struct S {\n"
8671 " int Type;\n"
8672 " union {\n"
8673 " int x;\n"
8674 " double y;\n"
8675 " } Value;\n"
8676 " class C\n"
8677 " {\n"
8678 " MyFavoriteType Value;\n"
8679 " } Class;\n"
8680 "}\n",
8681 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008682}
8683
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00008684TEST_F(FormatTest, MozillaBraceBreaking) {
8685 FormatStyle MozillaBraceStyle = getLLVMStyle();
8686 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00008687 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00008688 verifyFormat("namespace a {\n"
8689 "class A\n"
8690 "{\n"
8691 " void f()\n"
8692 " {\n"
8693 " if (true) {\n"
8694 " a();\n"
8695 " b();\n"
8696 " }\n"
8697 " }\n"
8698 " void g() { return; }\n"
8699 "};\n"
8700 "enum E\n"
8701 "{\n"
8702 " A,\n"
8703 " // foo\n"
8704 " B,\n"
8705 " C\n"
8706 "};\n"
8707 "struct B\n"
8708 "{\n"
8709 " int x;\n"
8710 "};\n"
8711 "}\n",
8712 MozillaBraceStyle);
8713 verifyFormat("struct S\n"
8714 "{\n"
8715 " int Type;\n"
8716 " union\n"
8717 " {\n"
8718 " int x;\n"
8719 " double y;\n"
8720 " } Value;\n"
8721 " class C\n"
8722 " {\n"
8723 " MyFavoriteType Value;\n"
8724 " } Class;\n"
8725 "}\n",
8726 MozillaBraceStyle);
8727}
8728
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008729TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008730 FormatStyle StroustrupBraceStyle = getLLVMStyle();
8731 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008732 verifyFormat("namespace a {\n"
8733 "class A {\n"
8734 " void f()\n"
8735 " {\n"
8736 " if (true) {\n"
8737 " a();\n"
8738 " b();\n"
8739 " }\n"
8740 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008741 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008742 "};\n"
8743 "struct B {\n"
8744 " int x;\n"
8745 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00008746 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008747 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008748
Daniel Jasperd9670872014-08-05 12:06:20 +00008749 verifyFormat("void foo()\n"
8750 "{\n"
8751 " if (a) {\n"
8752 " a();\n"
8753 " }\n"
8754 " else {\n"
8755 " b();\n"
8756 " }\n"
8757 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008758 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00008759
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008760 verifyFormat("#ifdef _DEBUG\n"
8761 "int foo(int i = 0)\n"
8762 "#else\n"
8763 "int foo(int i = 5)\n"
8764 "#endif\n"
8765 "{\n"
8766 " return i;\n"
8767 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008768 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008769
8770 verifyFormat("void foo() {}\n"
8771 "void bar()\n"
8772 "#ifdef _DEBUG\n"
8773 "{\n"
8774 " foo();\n"
8775 "}\n"
8776 "#else\n"
8777 "{\n"
8778 "}\n"
8779 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008780 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008781
8782 verifyFormat("void foobar() { int i = 5; }\n"
8783 "#ifdef _DEBUG\n"
8784 "void bar() {}\n"
8785 "#else\n"
8786 "void bar() { foobar(); }\n"
8787 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008788 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008789}
8790
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008791TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008792 FormatStyle AllmanBraceStyle = getLLVMStyle();
8793 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008794 verifyFormat("namespace a\n"
8795 "{\n"
8796 "class A\n"
8797 "{\n"
8798 " void f()\n"
8799 " {\n"
8800 " if (true)\n"
8801 " {\n"
8802 " a();\n"
8803 " b();\n"
8804 " }\n"
8805 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008806 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008807 "};\n"
8808 "struct B\n"
8809 "{\n"
8810 " int x;\n"
8811 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008812 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008813 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008814
8815 verifyFormat("void f()\n"
8816 "{\n"
8817 " if (true)\n"
8818 " {\n"
8819 " a();\n"
8820 " }\n"
8821 " else if (false)\n"
8822 " {\n"
8823 " b();\n"
8824 " }\n"
8825 " else\n"
8826 " {\n"
8827 " c();\n"
8828 " }\n"
8829 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008830 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008831
8832 verifyFormat("void f()\n"
8833 "{\n"
8834 " for (int i = 0; i < 10; ++i)\n"
8835 " {\n"
8836 " a();\n"
8837 " }\n"
8838 " while (false)\n"
8839 " {\n"
8840 " b();\n"
8841 " }\n"
8842 " do\n"
8843 " {\n"
8844 " c();\n"
8845 " } while (false)\n"
8846 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008847 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008848
8849 verifyFormat("void f(int a)\n"
8850 "{\n"
8851 " switch (a)\n"
8852 " {\n"
8853 " case 0:\n"
8854 " break;\n"
8855 " case 1:\n"
8856 " {\n"
8857 " break;\n"
8858 " }\n"
8859 " case 2:\n"
8860 " {\n"
8861 " }\n"
8862 " break;\n"
8863 " default:\n"
8864 " break;\n"
8865 " }\n"
8866 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008867 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00008868
8869 verifyFormat("enum X\n"
8870 "{\n"
8871 " Y = 0,\n"
8872 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008873 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00008874 verifyFormat("enum X\n"
8875 "{\n"
8876 " Y = 0\n"
8877 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008878 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00008879
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008880 verifyFormat("@interface BSApplicationController ()\n"
8881 "{\n"
8882 "@private\n"
8883 " id _extraIvar;\n"
8884 "}\n"
8885 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008886 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008887
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008888 verifyFormat("#ifdef _DEBUG\n"
8889 "int foo(int i = 0)\n"
8890 "#else\n"
8891 "int foo(int i = 5)\n"
8892 "#endif\n"
8893 "{\n"
8894 " return i;\n"
8895 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008896 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008897
8898 verifyFormat("void foo() {}\n"
8899 "void bar()\n"
8900 "#ifdef _DEBUG\n"
8901 "{\n"
8902 " foo();\n"
8903 "}\n"
8904 "#else\n"
8905 "{\n"
8906 "}\n"
8907 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008908 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008909
8910 verifyFormat("void foobar() { int i = 5; }\n"
8911 "#ifdef _DEBUG\n"
8912 "void bar() {}\n"
8913 "#else\n"
8914 "void bar() { foobar(); }\n"
8915 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008916 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008917
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008918 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008919 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00008920 " // ...\n"
8921 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008922 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008923 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008924 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00008925 " // ...\n"
8926 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008927 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008928 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008929 // .. or dict literals.
8930 verifyFormat("void f()\n"
8931 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00008932 " // ...\n"
8933 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
8934 "}",
8935 AllmanBraceStyle);
8936 verifyFormat("void f()\n"
8937 "{\n"
8938 " // ...\n"
8939 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008940 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008941 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00008942 verifyFormat("int f()\n"
8943 "{ // comment\n"
8944 " return 42;\n"
8945 "}",
8946 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008947
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008948 AllmanBraceStyle.ColumnLimit = 19;
8949 verifyFormat("void f() { int i; }", AllmanBraceStyle);
8950 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00008951 verifyFormat("void f()\n"
8952 "{\n"
8953 " int i;\n"
8954 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008955 AllmanBraceStyle);
8956 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00008957
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008958 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00008959 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
8960 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
8961 verifyFormat("void f(bool b)\n"
8962 "{\n"
8963 " if (b)\n"
8964 " {\n"
8965 " return;\n"
8966 " }\n"
8967 "}\n",
8968 BreakBeforeBraceShortIfs);
8969 verifyFormat("void f(bool b)\n"
8970 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00008971 " if constexpr (b)\n"
8972 " {\n"
8973 " return;\n"
8974 " }\n"
8975 "}\n",
8976 BreakBeforeBraceShortIfs);
8977 verifyFormat("void f(bool b)\n"
8978 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00008979 " if (b) return;\n"
8980 "}\n",
8981 BreakBeforeBraceShortIfs);
8982 verifyFormat("void f(bool b)\n"
8983 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00008984 " if constexpr (b) return;\n"
8985 "}\n",
8986 BreakBeforeBraceShortIfs);
8987 verifyFormat("void f(bool b)\n"
8988 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00008989 " while (b)\n"
8990 " {\n"
8991 " return;\n"
8992 " }\n"
8993 "}\n",
8994 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008995}
8996
Alexander Kornienko3a33f022013-12-12 09:49:52 +00008997TEST_F(FormatTest, GNUBraceBreaking) {
8998 FormatStyle GNUBraceStyle = getLLVMStyle();
8999 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9000 verifyFormat("namespace a\n"
9001 "{\n"
9002 "class A\n"
9003 "{\n"
9004 " void f()\n"
9005 " {\n"
9006 " int a;\n"
9007 " {\n"
9008 " int b;\n"
9009 " }\n"
9010 " if (true)\n"
9011 " {\n"
9012 " a();\n"
9013 " b();\n"
9014 " }\n"
9015 " }\n"
9016 " void g() { return; }\n"
9017 "}\n"
9018 "}",
9019 GNUBraceStyle);
9020
9021 verifyFormat("void f()\n"
9022 "{\n"
9023 " if (true)\n"
9024 " {\n"
9025 " a();\n"
9026 " }\n"
9027 " else if (false)\n"
9028 " {\n"
9029 " b();\n"
9030 " }\n"
9031 " else\n"
9032 " {\n"
9033 " c();\n"
9034 " }\n"
9035 "}\n",
9036 GNUBraceStyle);
9037
9038 verifyFormat("void f()\n"
9039 "{\n"
9040 " for (int i = 0; i < 10; ++i)\n"
9041 " {\n"
9042 " a();\n"
9043 " }\n"
9044 " while (false)\n"
9045 " {\n"
9046 " b();\n"
9047 " }\n"
9048 " do\n"
9049 " {\n"
9050 " c();\n"
9051 " }\n"
9052 " while (false);\n"
9053 "}\n",
9054 GNUBraceStyle);
9055
9056 verifyFormat("void f(int a)\n"
9057 "{\n"
9058 " switch (a)\n"
9059 " {\n"
9060 " case 0:\n"
9061 " break;\n"
9062 " case 1:\n"
9063 " {\n"
9064 " break;\n"
9065 " }\n"
9066 " case 2:\n"
9067 " {\n"
9068 " }\n"
9069 " break;\n"
9070 " default:\n"
9071 " break;\n"
9072 " }\n"
9073 "}\n",
9074 GNUBraceStyle);
9075
9076 verifyFormat("enum X\n"
9077 "{\n"
9078 " Y = 0,\n"
9079 "}\n",
9080 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009081
9082 verifyFormat("@interface BSApplicationController ()\n"
9083 "{\n"
9084 "@private\n"
9085 " id _extraIvar;\n"
9086 "}\n"
9087 "@end\n",
9088 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009089
9090 verifyFormat("#ifdef _DEBUG\n"
9091 "int foo(int i = 0)\n"
9092 "#else\n"
9093 "int foo(int i = 5)\n"
9094 "#endif\n"
9095 "{\n"
9096 " return i;\n"
9097 "}",
9098 GNUBraceStyle);
9099
9100 verifyFormat("void foo() {}\n"
9101 "void bar()\n"
9102 "#ifdef _DEBUG\n"
9103 "{\n"
9104 " foo();\n"
9105 "}\n"
9106 "#else\n"
9107 "{\n"
9108 "}\n"
9109 "#endif",
9110 GNUBraceStyle);
9111
9112 verifyFormat("void foobar() { int i = 5; }\n"
9113 "#ifdef _DEBUG\n"
9114 "void bar() {}\n"
9115 "#else\n"
9116 "void bar() { foobar(); }\n"
9117 "#endif",
9118 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009119}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009120
9121TEST_F(FormatTest, WebKitBraceBreaking) {
9122 FormatStyle WebKitBraceStyle = getLLVMStyle();
9123 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009124 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009125 verifyFormat("namespace a {\n"
9126 "class A {\n"
9127 " void f()\n"
9128 " {\n"
9129 " if (true) {\n"
9130 " a();\n"
9131 " b();\n"
9132 " }\n"
9133 " }\n"
9134 " void g() { return; }\n"
9135 "};\n"
9136 "enum E {\n"
9137 " A,\n"
9138 " // foo\n"
9139 " B,\n"
9140 " C\n"
9141 "};\n"
9142 "struct B {\n"
9143 " int x;\n"
9144 "};\n"
9145 "}\n",
9146 WebKitBraceStyle);
9147 verifyFormat("struct S {\n"
9148 " int Type;\n"
9149 " union {\n"
9150 " int x;\n"
9151 " double y;\n"
9152 " } Value;\n"
9153 " class C {\n"
9154 " MyFavoriteType Value;\n"
9155 " } Class;\n"
9156 "};\n",
9157 WebKitBraceStyle);
9158}
9159
Manuel Klimekd5735502013-08-12 03:51:17 +00009160TEST_F(FormatTest, CatchExceptionReferenceBinding) {
9161 verifyFormat("void f() {\n"
9162 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00009163 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00009164 " }\n"
9165 "}\n",
9166 getLLVMStyle());
9167}
9168
Daniel Jasper9613c812013-08-07 16:29:23 +00009169TEST_F(FormatTest, UnderstandsPragmas) {
9170 verifyFormat("#pragma omp reduction(| : var)");
9171 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +00009172
9173 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
9174 "(including parentheses).",
9175 format("#pragma mark Any non-hyphenated or hyphenated string "
9176 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +00009177}
9178
Daniel Jasperee4a8a12015-04-22 09:45:42 +00009179TEST_F(FormatTest, UnderstandPragmaOption) {
9180 verifyFormat("#pragma option -C -A");
9181
9182 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
9183}
9184
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009185#define EXPECT_ALL_STYLES_EQUAL(Styles) \
9186 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +00009187 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
9188 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +00009189
9190TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009191 SmallVector<FormatStyle, 3> Styles;
9192 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009193
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009194 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009195 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
9196 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
9197 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009198
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009199 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009200 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
9201 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
9202 EXPECT_ALL_STYLES_EQUAL(Styles);
9203
Nico Weber514ecc82014-02-02 20:50:45 +00009204 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009205 EXPECT_TRUE(
9206 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
9207 EXPECT_TRUE(
9208 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
9209 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009210
Nico Weber514ecc82014-02-02 20:50:45 +00009211 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009212 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
9213 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
9214 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009215
9216 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009217 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
9218 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
9219 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009220
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009221 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009222 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
9223 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
9224 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009225
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +00009226 Styles[0] = getGNUStyle();
9227 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
9228 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
9229 EXPECT_ALL_STYLES_EQUAL(Styles);
9230
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009231 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
9232}
9233
9234TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
9235 SmallVector<FormatStyle, 8> Styles;
9236 Styles.resize(2);
9237
9238 Styles[0] = getGoogleStyle();
9239 Styles[1] = getLLVMStyle();
9240 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9241 EXPECT_ALL_STYLES_EQUAL(Styles);
9242
9243 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +00009244 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009245 Styles[1] = getLLVMStyle();
9246 Styles[1].Language = FormatStyle::LK_JavaScript;
9247 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9248
9249 Styles[2] = getLLVMStyle();
9250 Styles[2].Language = FormatStyle::LK_JavaScript;
9251 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
9252 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009253 &Styles[2])
9254 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009255
9256 Styles[3] = getLLVMStyle();
9257 Styles[3].Language = FormatStyle::LK_JavaScript;
9258 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
9259 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009260 &Styles[3])
9261 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009262
9263 Styles[4] = getLLVMStyle();
9264 Styles[4].Language = FormatStyle::LK_JavaScript;
9265 EXPECT_EQ(0, parseConfiguration("---\n"
9266 "BasedOnStyle: LLVM\n"
9267 "IndentWidth: 123\n"
9268 "---\n"
9269 "BasedOnStyle: Google\n"
9270 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009271 &Styles[4])
9272 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009273 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009274}
9275
Daniel Jasper91881d92014-09-29 08:07:46 +00009276#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +00009277 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +00009278 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009279 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +00009280 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +00009281 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009282
Daniel Jasper91881d92014-09-29 08:07:46 +00009283#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
9284
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009285#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
9286 Style.STRUCT.FIELD = false; \
9287 EXPECT_EQ(0, \
9288 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
9289 .value()); \
9290 EXPECT_TRUE(Style.STRUCT.FIELD); \
9291 EXPECT_EQ(0, \
9292 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
9293 .value()); \
9294 EXPECT_FALSE(Style.STRUCT.FIELD);
9295
9296#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
9297 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
9298
Daniel Jasper00853002014-09-16 16:22:30 +00009299#define CHECK_PARSE(TEXT, FIELD, VALUE) \
9300 EXPECT_NE(VALUE, Style.FIELD); \
9301 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
9302 EXPECT_EQ(VALUE, Style.FIELD)
9303
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009304TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009305 FormatStyle Style = {};
9306 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +00009307 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +00009308 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +00009309 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009310 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009311 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +00009312 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +00009313 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009314 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +00009315 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00009316 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +00009317 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00009318 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00009319 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +00009320 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00009321 CHECK_PARSE_BOOL(BreakStringLiterals);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00009322 CHECK_PARSE_BOOL(BreakBeforeInheritanceComma)
Francois Ferrande56a8292017-06-14 12:29:47 +00009323 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009324 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +00009325 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +00009326 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +00009327 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009328 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00009329 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +00009330 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +00009331 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009332 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +00009333 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +00009334 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +00009335 CHECK_PARSE_BOOL(SortIncludes);
Krasimir Georgievac16a202017-06-23 11:46:03 +00009336 CHECK_PARSE_BOOL(SortUsingDeclarations);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009337 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +00009338 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009339 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009340 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +00009341 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009342 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009343 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +00009344 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +00009345 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009346
9347 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
9348 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
9349 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
9350 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
9351 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
9352 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
9353 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
9354 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
9355 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
9356 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
9357 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00009358 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunctionBody);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009359}
Alexander Kornienkod6538332013-05-07 15:32:14 +00009360
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009361#undef CHECK_PARSE_BOOL
9362
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009363TEST_F(FormatTest, ParsesConfiguration) {
9364 FormatStyle Style = {};
9365 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00009366 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009367 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
9368 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +00009369 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009370 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
9371 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +00009372 CHECK_PARSE("PenaltyBreakAssignment: 1234",
9373 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +00009374 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
9375 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009376 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
9377 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
9378 PenaltyReturnTypeOnItsOwnLine, 1234u);
9379 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
9380 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +00009381 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +00009382 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00009383 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +00009384
Daniel Jasper553d4872014-06-17 12:40:34 +00009385 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +00009386 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
9387 FormatStyle::PAS_Left);
9388 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
9389 FormatStyle::PAS_Right);
9390 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
9391 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +00009392 // For backward compatibility:
9393 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
9394 FormatStyle::PAS_Left);
9395 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
9396 FormatStyle::PAS_Right);
9397 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
9398 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +00009399
Alexander Kornienkod6538332013-05-07 15:32:14 +00009400 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +00009401 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
9402 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009403 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
9404 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
9405 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
9406
Daniel Jasperac043c92014-09-15 11:11:00 +00009407 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +00009408 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
9409 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +00009410 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
9411 FormatStyle::BOS_None);
9412 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
9413 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00009414 // For backward compatibility:
9415 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
9416 FormatStyle::BOS_None);
9417 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
9418 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +00009419
Francois Ferranda6b6d512017-05-24 11:36:58 +00009420 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
9421 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
9422 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
9423 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
9424 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
9425 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
9426 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
9427 // For backward compatibility:
9428 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
9429 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
9430
Daniel Jasper6501f7e2015-10-27 12:38:37 +00009431 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9432 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
9433 FormatStyle::BAS_Align);
9434 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
9435 FormatStyle::BAS_DontAlign);
9436 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
9437 FormatStyle::BAS_AlwaysBreak);
9438 // For backward compatibility:
9439 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
9440 FormatStyle::BAS_DontAlign);
9441 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
9442 FormatStyle::BAS_Align);
9443
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009444 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
9445 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
9446 FormatStyle::ENAS_DontAlign);
9447 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
9448 FormatStyle::ENAS_Left);
9449 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
9450 FormatStyle::ENAS_Right);
9451 // For backward compatibility:
9452 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
9453 FormatStyle::ENAS_Left);
9454 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
9455 FormatStyle::ENAS_Right);
9456
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009457 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009458 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
9459 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
9460 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00009461 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
9462 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +00009463 // For backward compatibility:
9464 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
9465 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009466
Daniel Jasperd74cf402014-04-08 12:46:38 +00009467 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +00009468 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
9469 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
9470 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
9471 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +00009472 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
9473 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +00009474 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
9475 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00009476 // For backward compatibility:
9477 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
9478 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
9479 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
9480 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +00009481
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009482 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
9483 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
9484 FormatStyle::SBPO_Never);
9485 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
9486 FormatStyle::SBPO_Always);
9487 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
9488 FormatStyle::SBPO_ControlStatements);
9489 // For backward compatibility:
9490 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
9491 FormatStyle::SBPO_Never);
9492 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
9493 FormatStyle::SBPO_ControlStatements);
9494
Alexander Kornienkod6538332013-05-07 15:32:14 +00009495 Style.ColumnLimit = 123;
9496 FormatStyle BaseStyle = getLLVMStyle();
9497 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
9498 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
9499
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009500 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
9501 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
9502 FormatStyle::BS_Attach);
9503 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
9504 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009505 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
9506 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009507 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
9508 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009509 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
9510 FormatStyle::BS_Allman);
9511 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009512 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
9513 FormatStyle::BS_WebKit);
9514 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
9515 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009516
Zachary Turner448592e2015-12-18 22:20:15 +00009517 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
9518 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
9519 FormatStyle::RTBS_None);
9520 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
9521 FormatStyle::RTBS_All);
9522 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +00009523 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +00009524 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
9525 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
9526 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
9527 AlwaysBreakAfterReturnType,
9528 FormatStyle::RTBS_TopLevelDefinitions);
9529
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00009530 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
9531 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
9532 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
9533 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
9534 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
9535 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
9536 AlwaysBreakAfterDefinitionReturnType,
9537 FormatStyle::DRTBS_TopLevel);
9538
Daniel Jasper65ee3472013-07-31 23:16:02 +00009539 Style.NamespaceIndentation = FormatStyle::NI_All;
9540 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
9541 FormatStyle::NI_None);
9542 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
9543 FormatStyle::NI_Inner);
9544 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
9545 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +00009546
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00009547 // FIXME: This is required because parsing a configuration simply overwrites
9548 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +00009549 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +00009550 std::vector<std::string> BoostForeach;
9551 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00009552 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +00009553 std::vector<std::string> BoostAndQForeach;
9554 BoostAndQForeach.push_back("BOOST_FOREACH");
9555 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00009556 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
9557 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00009558
9559 Style.IncludeCategories.clear();
9560 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
9561 {".*", 1}};
9562 CHECK_PARSE("IncludeCategories:\n"
9563 " - Regex: abc/.*\n"
9564 " Priority: 2\n"
9565 " - Regex: .*\n"
9566 " Priority: 1",
9567 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00009568 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009569}
9570
9571TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
9572 FormatStyle Style = {};
9573 Style.Language = FormatStyle::LK_Cpp;
9574 CHECK_PARSE("Language: Cpp\n"
9575 "IndentWidth: 12",
9576 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +00009577 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
9578 "IndentWidth: 34",
9579 &Style),
9580 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009581 EXPECT_EQ(12u, Style.IndentWidth);
9582 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
9583 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
9584
9585 Style.Language = FormatStyle::LK_JavaScript;
9586 CHECK_PARSE("Language: JavaScript\n"
9587 "IndentWidth: 12",
9588 IndentWidth, 12u);
9589 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +00009590 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
9591 "IndentWidth: 34",
9592 &Style),
9593 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009594 EXPECT_EQ(23u, Style.IndentWidth);
9595 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
9596 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
9597
9598 CHECK_PARSE("BasedOnStyle: LLVM\n"
9599 "IndentWidth: 67",
9600 IndentWidth, 67u);
9601
9602 CHECK_PARSE("---\n"
9603 "Language: JavaScript\n"
9604 "IndentWidth: 12\n"
9605 "---\n"
9606 "Language: Cpp\n"
9607 "IndentWidth: 34\n"
9608 "...\n",
9609 IndentWidth, 12u);
9610
9611 Style.Language = FormatStyle::LK_Cpp;
9612 CHECK_PARSE("---\n"
9613 "Language: JavaScript\n"
9614 "IndentWidth: 12\n"
9615 "---\n"
9616 "Language: Cpp\n"
9617 "IndentWidth: 34\n"
9618 "...\n",
9619 IndentWidth, 34u);
9620 CHECK_PARSE("---\n"
9621 "IndentWidth: 78\n"
9622 "---\n"
9623 "Language: JavaScript\n"
9624 "IndentWidth: 56\n"
9625 "...\n",
9626 IndentWidth, 78u);
9627
9628 Style.ColumnLimit = 123;
9629 Style.IndentWidth = 234;
9630 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
9631 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +00009632 EXPECT_FALSE(parseConfiguration("---\n"
9633 "IndentWidth: 456\n"
9634 "BreakBeforeBraces: Allman\n"
9635 "---\n"
9636 "Language: JavaScript\n"
9637 "IndentWidth: 111\n"
9638 "TabWidth: 111\n"
9639 "---\n"
9640 "Language: Cpp\n"
9641 "BreakBeforeBraces: Stroustrup\n"
9642 "TabWidth: 789\n"
9643 "...\n",
9644 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009645 EXPECT_EQ(123u, Style.ColumnLimit);
9646 EXPECT_EQ(456u, Style.IndentWidth);
9647 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
9648 EXPECT_EQ(789u, Style.TabWidth);
9649
Rafael Espindola1f243172014-06-12 11:35:17 +00009650 EXPECT_EQ(parseConfiguration("---\n"
9651 "Language: JavaScript\n"
9652 "IndentWidth: 56\n"
9653 "---\n"
9654 "IndentWidth: 78\n"
9655 "...\n",
9656 &Style),
9657 ParseError::Error);
9658 EXPECT_EQ(parseConfiguration("---\n"
9659 "Language: JavaScript\n"
9660 "IndentWidth: 56\n"
9661 "---\n"
9662 "Language: JavaScript\n"
9663 "IndentWidth: 78\n"
9664 "...\n",
9665 &Style),
9666 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009667
9668 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
9669}
Daniel Jasper65ee3472013-07-31 23:16:02 +00009670
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009671#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009672
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009673TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
9674 FormatStyle Style = {};
9675 Style.Language = FormatStyle::LK_JavaScript;
9676 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009677 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00009678 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009679
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009680 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009681 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009682 "BasedOnStyle: Google\n"
9683 "---\n"
9684 "Language: JavaScript\n"
9685 "IndentWidth: 76\n"
9686 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009687 &Style)
9688 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00009689 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009690 EXPECT_EQ(76u, Style.IndentWidth);
9691 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
9692}
9693
Alexander Kornienkod6538332013-05-07 15:32:14 +00009694TEST_F(FormatTest, ConfigurationRoundTripTest) {
9695 FormatStyle Style = getLLVMStyle();
9696 std::string YAML = configurationAsText(Style);
9697 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009698 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00009699 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
9700 EXPECT_EQ(Style, ParsedStyle);
9701}
9702
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009703TEST_F(FormatTest, WorksFor8bitEncodings) {
9704 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
9705 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
9706 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
9707 "\"\xef\xee\xf0\xf3...\"",
9708 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
9709 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
9710 "\xef\xee\xf0\xf3...\"",
9711 getLLVMStyleWithColumns(12)));
9712}
9713
Alexander Kornienko393e3082013-11-13 14:04:17 +00009714TEST_F(FormatTest, HandlesUTF8BOM) {
9715 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
9716 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
9717 format("\xef\xbb\xbf#include <iostream>"));
9718 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
9719 format("\xef\xbb\xbf\n#include <iostream>"));
9720}
9721
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +00009722// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
9723#if !defined(_MSC_VER)
9724
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009725TEST_F(FormatTest, CountsUTF8CharactersProperly) {
9726 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
9727 getLLVMStyleWithColumns(35));
9728 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009729 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009730 verifyFormat("// Однажды в студёную зимнюю пору...",
9731 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +00009732 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009733 verifyFormat("/* Однажды в студёную зимнюю пору... */",
9734 getLLVMStyleWithColumns(39));
9735 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009736 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009737}
9738
9739TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +00009740 // Non-printable characters' width is currently considered to be the length in
9741 // bytes in UTF8. The characters can be displayed in very different manner
9742 // (zero-width, single width with a substitution glyph, expanded to their code
9743 // (e.g. "<8d>"), so there's no single correct way to handle them.
9744 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00009745 "\"\xc2\x8d\";",
9746 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +00009747 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00009748 "\"\xc2\x8d\";",
9749 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +00009750 EXPECT_EQ("\"Однажды, в \"\n"
9751 "\"студёную \"\n"
9752 "\"зимнюю \"\n"
9753 "\"пору,\"",
9754 format("\"Однажды, в студёную зимнюю пору,\"",
9755 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009756 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +00009757 "\"一 二 三 \"\n"
9758 "\"四 五六 \"\n"
9759 "\"七 八 九 \"\n"
9760 "\"十\"",
9761 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009762 EXPECT_EQ("\"一\t二 \"\n"
9763 "\"\t三 \"\n"
9764 "\"四 五\t六 \"\n"
9765 "\"\t七 \"\n"
9766 "\"八九十\tqq\"",
9767 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
9768 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +00009769
9770 // UTF8 character in an escape sequence.
9771 EXPECT_EQ("\"aaaaaa\"\n"
9772 "\"\\\xC2\x8D\"",
9773 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009774}
9775
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009776TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
9777 EXPECT_EQ("const char *sssss =\n"
9778 " \"一二三四五六七八\\\n"
9779 " 九 十\";",
9780 format("const char *sssss = \"一二三四五六七八\\\n"
9781 " 九 十\";",
9782 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009783}
9784
9785TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00009786 EXPECT_EQ("// aaaaÄ\xc2\x8d",
9787 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009788 EXPECT_EQ("// Я из лесу\n"
9789 "// вышел; был\n"
9790 "// сильный\n"
9791 "// мороз.",
9792 format("// Я из лесу вышел; был сильный мороз.",
9793 getLLVMStyleWithColumns(13)));
9794 EXPECT_EQ("// 一二三\n"
9795 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009796 "// 八 九\n"
9797 "// 十",
9798 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009799}
9800
9801TEST_F(FormatTest, SplitsUTF8BlockComments) {
9802 EXPECT_EQ("/* Гляжу,\n"
9803 " * поднимается\n"
9804 " * медленно в\n"
9805 " * гору\n"
9806 " * Лошадка,\n"
9807 " * везущая\n"
9808 " * хворосту\n"
9809 " * воз. */",
9810 format("/* Гляжу, поднимается медленно в гору\n"
9811 " * Лошадка, везущая хворосту воз. */",
9812 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009813 EXPECT_EQ(
9814 "/* 一二三\n"
9815 " * 四五六七\n"
9816 " * 八 九\n"
9817 " * 十 */",
9818 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +00009819 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
9820 " * 𝕓𝕪𝕥𝕖\n"
9821 " * 𝖀𝕿𝕱-𝟠 */",
9822 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009823}
9824
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009825#endif // _MSC_VER
9826
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009827TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
9828 FormatStyle Style = getLLVMStyle();
9829
9830 Style.ConstructorInitializerIndentWidth = 4;
9831 verifyFormat(
9832 "SomeClass::Constructor()\n"
9833 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
9834 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
9835 Style);
9836
9837 Style.ConstructorInitializerIndentWidth = 2;
9838 verifyFormat(
9839 "SomeClass::Constructor()\n"
9840 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
9841 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
9842 Style);
9843
9844 Style.ConstructorInitializerIndentWidth = 0;
9845 verifyFormat(
9846 "SomeClass::Constructor()\n"
9847 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
9848 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
9849 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +00009850 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9851 verifyFormat(
9852 "SomeLongTemplateVariableName<\n"
9853 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
9854 Style);
9855 verifyFormat(
9856 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
9857 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
9858 Style);
Daniel Jasper00853002014-09-16 16:22:30 +00009859}
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009860
Daniel Jasper00853002014-09-16 16:22:30 +00009861TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
9862 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +00009863 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009864 Style.ConstructorInitializerIndentWidth = 4;
9865 verifyFormat("SomeClass::Constructor()\n"
9866 " : a(a)\n"
9867 " , b(b)\n"
9868 " , c(c) {}",
9869 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009870 verifyFormat("SomeClass::Constructor()\n"
9871 " : a(a) {}",
9872 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009873
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009874 Style.ColumnLimit = 0;
9875 verifyFormat("SomeClass::Constructor()\n"
9876 " : a(a) {}",
9877 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +00009878 verifyFormat("SomeClass::Constructor() noexcept\n"
9879 " : a(a) {}",
9880 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009881 verifyFormat("SomeClass::Constructor()\n"
9882 " : a(a)\n"
9883 " , b(b)\n"
9884 " , c(c) {}",
9885 Style);
9886 verifyFormat("SomeClass::Constructor()\n"
9887 " : a(a) {\n"
9888 " foo();\n"
9889 " bar();\n"
9890 "}",
9891 Style);
9892
Daniel Jasperd74cf402014-04-08 12:46:38 +00009893 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009894 verifyFormat("SomeClass::Constructor()\n"
9895 " : a(a)\n"
9896 " , b(b)\n"
9897 " , c(c) {\n}",
9898 Style);
9899 verifyFormat("SomeClass::Constructor()\n"
9900 " : a(a) {\n}",
9901 Style);
9902
9903 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +00009904 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009905 Style.ConstructorInitializerIndentWidth = 2;
9906 verifyFormat("SomeClass::Constructor()\n"
9907 " : a(a)\n"
9908 " , b(b)\n"
9909 " , c(c) {}",
9910 Style);
9911
9912 Style.ConstructorInitializerIndentWidth = 0;
9913 verifyFormat("SomeClass::Constructor()\n"
9914 ": a(a)\n"
9915 ", b(b)\n"
9916 ", c(c) {}",
9917 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +00009918
9919 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
9920 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009921 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
9922 verifyFormat(
9923 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
9924 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +00009925 verifyFormat(
9926 "SomeClass::Constructor()\n"
9927 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
9928 Style);
9929 Style.ConstructorInitializerIndentWidth = 4;
9930 Style.ColumnLimit = 60;
9931 verifyFormat("SomeClass::Constructor()\n"
9932 " : aaaaaaaa(aaaaaaaa)\n"
9933 " , aaaaaaaa(aaaaaaaa)\n"
9934 " , aaaaaaaa(aaaaaaaa) {}",
9935 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009936}
9937
Daniel Jasper38efc132014-10-21 07:51:54 +00009938TEST_F(FormatTest, Destructors) {
9939 verifyFormat("void F(int &i) { i.~int(); }");
9940 verifyFormat("void F(int &i) { i->~int(); }");
9941}
9942
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009943TEST_F(FormatTest, FormatsWithWebKitStyle) {
9944 FormatStyle Style = getWebKitStyle();
9945
9946 // Don't indent in outer namespaces.
9947 verifyFormat("namespace outer {\n"
9948 "int i;\n"
9949 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00009950 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009951 "} // namespace inner\n"
9952 "} // namespace outer\n"
9953 "namespace other_outer {\n"
9954 "int i;\n"
9955 "}",
9956 Style);
9957
9958 // Don't indent case labels.
9959 verifyFormat("switch (variable) {\n"
9960 "case 1:\n"
9961 "case 2:\n"
9962 " doSomething();\n"
9963 " break;\n"
9964 "default:\n"
9965 " ++variable;\n"
9966 "}",
9967 Style);
9968
9969 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +00009970 EXPECT_EQ("void f()\n"
9971 "{\n"
9972 " if (aaaaaaaaaaaaaaaa\n"
9973 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
9974 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
9975 " return;\n"
9976 "}",
9977 format("void f() {\n"
9978 "if (aaaaaaaaaaaaaaaa\n"
9979 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
9980 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
9981 "return;\n"
9982 "}",
9983 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009984
Daniel Jasper35995672014-04-29 14:05:20 +00009985 // Allow functions on a single line.
9986 verifyFormat("void f() { return; }", Style);
9987
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009988 // Constructor initializers are formatted one per line with the "," on the
9989 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009990 verifyFormat("Constructor()\n"
9991 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
9992 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00009993 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +00009994 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
9995 "{\n"
9996 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009997 Style);
9998 verifyFormat("SomeClass::Constructor()\n"
9999 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010000 "{\n"
10001 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010002 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010003 EXPECT_EQ("SomeClass::Constructor()\n"
10004 " : a(a)\n"
10005 "{\n"
10006 "}",
10007 format("SomeClass::Constructor():a(a){}", Style));
10008 verifyFormat("SomeClass::Constructor()\n"
10009 " : a(a)\n"
10010 " , b(b)\n"
10011 " , c(c)\n"
10012 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010013 "}",
10014 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010015 verifyFormat("SomeClass::Constructor()\n"
10016 " : a(a)\n"
10017 "{\n"
10018 " foo();\n"
10019 " bar();\n"
10020 "}",
10021 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010022
Daniel Jasper65ee3472013-07-31 23:16:02 +000010023 // Access specifiers should be aligned left.
10024 verifyFormat("class C {\n"
10025 "public:\n"
10026 " int i;\n"
10027 "};",
10028 Style);
10029
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010030 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010031 verifyFormat("int a; // Do not\n"
10032 "double b; // align comments.",
10033 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010034
Daniel Jasper3219e432014-12-02 13:24:51 +000010035 // Do not align operands.
10036 EXPECT_EQ("ASSERT(aaaa\n"
10037 " || bbbb);",
10038 format("ASSERT ( aaaa\n||bbbb);", Style));
10039
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010040 // Accept input's line breaks.
10041 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10042 " || bbbbbbbbbbbbbbb) {\n"
10043 " i++;\n"
10044 "}",
10045 format("if (aaaaaaaaaaaaaaa\n"
10046 "|| bbbbbbbbbbbbbbb) { i++; }",
10047 Style));
10048 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10049 " i++;\n"
10050 "}",
10051 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010052
10053 // Don't automatically break all macro definitions (llvm.org/PR17842).
10054 verifyFormat("#define aNumber 10", Style);
10055 // However, generally keep the line breaks that the user authored.
10056 EXPECT_EQ("#define aNumber \\\n"
10057 " 10",
10058 format("#define aNumber \\\n"
10059 " 10",
10060 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010061
10062 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010063 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10064 " copyItems:YES];",
10065 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10066 "copyItems:YES];",
10067 Style));
10068 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10069 " copyItems:YES];",
10070 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10071 " copyItems:YES];",
10072 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010073 // FIXME: This does not seem right, there should be more indentation before
10074 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010075 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010076 " @\"a\",\n"
10077 " @\"a\"\n"
10078 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010079 " copyItems:YES];",
10080 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10081 " @\"a\",\n"
10082 " @\"a\"\n"
10083 " ]\n"
10084 " copyItems:YES];",
10085 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010086 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010087 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10088 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010089 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10090 " copyItems:YES];",
10091 Style));
10092
10093 verifyFormat("[self.a b:c c:d];", Style);
10094 EXPECT_EQ("[self.a b:c\n"
10095 " c:d];",
10096 format("[self.a b:c\n"
10097 "c:d];",
10098 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010099}
10100
Manuel Klimekffdeb592013-09-03 15:10:01 +000010101TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010102 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10103 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10104 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10105 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10106 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000010107 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000010108 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010109 verifyFormat("void f() {\n"
10110 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10111 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010112 verifyFormat("void f() {\n"
10113 " other(x.begin(), //\n"
10114 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000010115 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010116 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000010117 verifyFormat("SomeFunction([]() { // A cool function...\n"
10118 " return 43;\n"
10119 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000010120 EXPECT_EQ("SomeFunction([]() {\n"
10121 "#define A a\n"
10122 " return 43;\n"
10123 "});",
10124 format("SomeFunction([](){\n"
10125 "#define A a\n"
10126 "return 43;\n"
10127 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000010128 verifyFormat("void f() {\n"
10129 " SomeFunction([](decltype(x), A *a) {});\n"
10130 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010131 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10132 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000010133 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
10134 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
10135 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000010136 verifyFormat("Constructor()\n"
10137 " : Field([] { // comment\n"
10138 " int i;\n"
10139 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000010140 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
10141 " return some_parameter.size();\n"
10142 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000010143 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
10144 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000010145 verifyFormat("int i = aaaaaa ? 1 //\n"
10146 " : [] {\n"
10147 " return 2; //\n"
10148 " }();");
10149 verifyFormat("llvm::errs() << \"number of twos is \"\n"
10150 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
10151 " return x == 2; // force break\n"
10152 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000010153 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10154 " [=](int iiiiiiiiiiii) {\n"
10155 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
10156 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
10157 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000010158 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000010159 verifyFormat("SomeFunction({[&] {\n"
10160 " // comment\n"
10161 " },\n"
10162 " [&] {\n"
10163 " // comment\n"
10164 " }});");
10165 verifyFormat("SomeFunction({[&] {\n"
10166 " // comment\n"
10167 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000010168 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
10169 " [&]() { return true; },\n"
10170 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010171
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010172 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000010173 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000010174 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000010175 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
10176 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010177 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000010178 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010179 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
10180 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000010181 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010182 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
10183 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010184 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010185 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000010186 verifyFormat(
10187 "aaaaaaaaaaaaaaaaaaaaaa(\n"
10188 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
10189 " return aaaaaaaaaaaaaaaaa;\n"
10190 " });",
10191 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000010192 verifyFormat("[]() //\n"
10193 " -> int {\n"
10194 " return 1; //\n"
10195 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010196
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010197 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000010198 verifyFormat("SomeFunction(\n"
10199 " []() {\n"
10200 " int i = 42;\n"
10201 " return i;\n"
10202 " },\n"
10203 " []() {\n"
10204 " int j = 43;\n"
10205 " return j;\n"
10206 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010207
Daniel Jasperda18fd82014-06-10 06:39:03 +000010208 // More complex introducers.
10209 verifyFormat("return [i, args...] {};");
10210
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010211 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000010212 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000010213 verifyFormat("double &operator[](int i) { return 0; }\n"
10214 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000010215 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000010216 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000010217 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000010218
10219 // Other corner cases.
10220 verifyFormat("void f() {\n"
10221 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000010222 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000010223 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000010224
10225 // Lambdas created through weird macros.
10226 verifyFormat("void f() {\n"
10227 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000010228 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000010229 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000010230
10231 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
10232 " doo_dah();\n"
10233 " doo_dah();\n"
10234 " })) {\n"
10235 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000010236 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
10237 " doo_dah();\n"
10238 " doo_dah();\n"
10239 " })) {\n"
10240 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000010241 verifyFormat("auto lambda = []() {\n"
10242 " int a = 2\n"
10243 "#if A\n"
10244 " + 2\n"
10245 "#endif\n"
10246 " ;\n"
10247 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000010248
10249 // Lambdas with complex multiline introducers.
10250 verifyFormat(
10251 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10252 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
10253 " -> ::std::unordered_set<\n"
10254 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
10255 " //\n"
10256 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000010257}
10258
Manuel Klimek516e0542013-09-04 13:25:30 +000010259TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000010260 FormatStyle ShortBlocks = getLLVMStyle();
10261 ShortBlocks.AllowShortBlocksOnASingleLine = true;
10262 verifyFormat("int (^Block)(int, int);", ShortBlocks);
10263 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
10264 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
10265 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
10266 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
10267 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000010268
Daniel Jasper76284682014-10-22 09:12:44 +000010269 verifyFormat("foo(^{ bar(); });", ShortBlocks);
10270 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
10271 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000010272
Daniel Jasper76284682014-10-22 09:12:44 +000010273 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010274 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010275 "}];");
10276 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010277 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010278 "}]};");
10279 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010280 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010281 "}];");
10282 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010283 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010284 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000010285 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010286 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010287 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010288 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010289 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010290
10291 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010292 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010293 "}];",
10294 getLLVMStyleWithColumns(60));
10295 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010296 " NSString *path = [self sessionFilePath];\n"
10297 " if (path) {\n"
10298 " // ...\n"
10299 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010300 "});");
10301 verifyFormat("[[SessionService sharedService]\n"
10302 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010303 " if (window) {\n"
10304 " [self windowDidLoad:window];\n"
10305 " } else {\n"
10306 " [self errorLoadingWindow];\n"
10307 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010308 " }];");
10309 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010310 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010311 "};\n",
10312 getLLVMStyleWithColumns(40));
10313 verifyFormat("[[SessionService sharedService]\n"
10314 " loadWindowWithCompletionBlock: //\n"
10315 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010316 " if (window) {\n"
10317 " [self windowDidLoad:window];\n"
10318 " } else {\n"
10319 " [self errorLoadingWindow];\n"
10320 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010321 " }];",
10322 getLLVMStyleWithColumns(60));
10323 verifyFormat("[myObject doSomethingWith:arg1\n"
10324 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010325 " // ...\n"
10326 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010327 " }\n"
10328 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010329 " // ...\n"
10330 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000010331 " }\n"
10332 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010333 " // ...\n"
10334 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010335 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000010336 verifyFormat("[myObject doSomethingWith:arg1\n"
10337 " firstBlock:-1\n"
10338 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010339 " // ...\n"
10340 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000010341 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010342
10343 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010344 " @autoreleasepool {\n"
10345 " if (a) {\n"
10346 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010347 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010348 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010349 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000010350 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000010351 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
10352 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000010353
10354 FormatStyle FourIndent = getLLVMStyle();
10355 FourIndent.ObjCBlockIndentWidth = 4;
10356 verifyFormat("[operation setCompletionBlock:^{\n"
10357 " [self onOperationDone];\n"
10358 "}];",
10359 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000010360}
10361
Daniel Jasper289afc02015-04-23 09:23:17 +000010362TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
10363 FormatStyle ZeroColumn = getLLVMStyle();
10364 ZeroColumn.ColumnLimit = 0;
10365
10366 verifyFormat("[[SessionService sharedService] "
10367 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10368 " if (window) {\n"
10369 " [self windowDidLoad:window];\n"
10370 " } else {\n"
10371 " [self errorLoadingWindow];\n"
10372 " }\n"
10373 "}];",
10374 ZeroColumn);
10375 EXPECT_EQ("[[SessionService sharedService]\n"
10376 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10377 " if (window) {\n"
10378 " [self windowDidLoad:window];\n"
10379 " } else {\n"
10380 " [self errorLoadingWindow];\n"
10381 " }\n"
10382 " }];",
10383 format("[[SessionService sharedService]\n"
10384 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10385 " if (window) {\n"
10386 " [self windowDidLoad:window];\n"
10387 " } else {\n"
10388 " [self errorLoadingWindow];\n"
10389 " }\n"
10390 "}];",
10391 ZeroColumn));
10392 verifyFormat("[myObject doSomethingWith:arg1\n"
10393 " firstBlock:^(Foo *a) {\n"
10394 " // ...\n"
10395 " int i;\n"
10396 " }\n"
10397 " secondBlock:^(Bar *b) {\n"
10398 " // ...\n"
10399 " int i;\n"
10400 " }\n"
10401 " thirdBlock:^Foo(Bar *b) {\n"
10402 " // ...\n"
10403 " int i;\n"
10404 " }];",
10405 ZeroColumn);
10406 verifyFormat("f(^{\n"
10407 " @autoreleasepool {\n"
10408 " if (a) {\n"
10409 " g();\n"
10410 " }\n"
10411 " }\n"
10412 "});",
10413 ZeroColumn);
10414 verifyFormat("void (^largeBlock)(void) = ^{\n"
10415 " // ...\n"
10416 "};",
10417 ZeroColumn);
10418
10419 ZeroColumn.AllowShortBlocksOnASingleLine = true;
10420 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010421 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000010422 ZeroColumn.AllowShortBlocksOnASingleLine = false;
10423 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
10424 " int i;\n"
10425 "};",
10426 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
10427}
10428
Alexander Kornienko9e649af2013-09-11 12:25:57 +000010429TEST_F(FormatTest, SupportsCRLF) {
10430 EXPECT_EQ("int a;\r\n"
10431 "int b;\r\n"
10432 "int c;\r\n",
10433 format("int a;\r\n"
10434 " int b;\r\n"
10435 " int c;\r\n",
10436 getLLVMStyle()));
10437 EXPECT_EQ("int a;\r\n"
10438 "int b;\r\n"
10439 "int c;\r\n",
10440 format("int a;\r\n"
10441 " int b;\n"
10442 " int c;\r\n",
10443 getLLVMStyle()));
10444 EXPECT_EQ("int a;\n"
10445 "int b;\n"
10446 "int c;\n",
10447 format("int a;\r\n"
10448 " int b;\n"
10449 " int c;\n",
10450 getLLVMStyle()));
10451 EXPECT_EQ("\"aaaaaaa \"\r\n"
10452 "\"bbbbbbb\";\r\n",
10453 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
10454 EXPECT_EQ("#define A \\\r\n"
10455 " b; \\\r\n"
10456 " c; \\\r\n"
10457 " d;\r\n",
10458 format("#define A \\\r\n"
10459 " b; \\\r\n"
10460 " c; d; \r\n",
10461 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000010462
10463 EXPECT_EQ("/*\r\n"
10464 "multi line block comments\r\n"
10465 "should not introduce\r\n"
10466 "an extra carriage return\r\n"
10467 "*/\r\n",
10468 format("/*\r\n"
10469 "multi line block comments\r\n"
10470 "should not introduce\r\n"
10471 "an extra carriage return\r\n"
10472 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000010473}
10474
Manuel Klimekb212f3b2013-10-12 22:46:56 +000010475TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
10476 verifyFormat("MY_CLASS(C) {\n"
10477 " int i;\n"
10478 " int j;\n"
10479 "};");
10480}
10481
Daniel Jasper6633ab82013-10-18 10:38:14 +000010482TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
10483 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
10484 TwoIndent.ContinuationIndentWidth = 2;
10485
10486 EXPECT_EQ("int i =\n"
10487 " longFunction(\n"
10488 " arg);",
10489 format("int i = longFunction(arg);", TwoIndent));
10490
10491 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
10492 SixIndent.ContinuationIndentWidth = 6;
10493
10494 EXPECT_EQ("int i =\n"
10495 " longFunction(\n"
10496 " arg);",
10497 format("int i = longFunction(arg);", SixIndent));
10498}
10499
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010500TEST_F(FormatTest, SpacesInAngles) {
10501 FormatStyle Spaces = getLLVMStyle();
10502 Spaces.SpacesInAngles = true;
10503
10504 verifyFormat("static_cast< int >(arg);", Spaces);
10505 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
10506 verifyFormat("f< int, float >();", Spaces);
10507 verifyFormat("template <> g() {}", Spaces);
10508 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000010509 verifyFormat("std::function< void(int, int) > fct;", Spaces);
10510 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
10511 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010512
10513 Spaces.Standard = FormatStyle::LS_Cpp03;
10514 Spaces.SpacesInAngles = true;
10515 verifyFormat("A< A< int > >();", Spaces);
10516
10517 Spaces.SpacesInAngles = false;
10518 verifyFormat("A<A<int> >();", Spaces);
10519
10520 Spaces.Standard = FormatStyle::LS_Cpp11;
10521 Spaces.SpacesInAngles = true;
10522 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000010523
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010524 Spaces.SpacesInAngles = false;
10525 verifyFormat("A<A<int>>();", Spaces);
10526}
10527
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010528TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
10529 FormatStyle Style = getLLVMStyle();
10530 Style.SpaceAfterTemplateKeyword = false;
10531 verifyFormat("template<int> void foo();", Style);
10532}
10533
Jacques Pienaarfc275112015-02-18 23:48:37 +000010534TEST_F(FormatTest, TripleAngleBrackets) {
10535 verifyFormat("f<<<1, 1>>>();");
10536 verifyFormat("f<<<1, 1, 1, s>>>();");
10537 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000010538 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010539 verifyFormat("f<param><<<1, 1>>>();");
10540 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000010541 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010542 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10543 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000010544 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
10545 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000010546}
10547
10548TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000010549 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000010550 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010551 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10552 "aaallvm::outs() <<");
10553 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10554 "aaaallvm::outs()\n <<");
10555}
10556
Manuel Klimek819788d2014-03-18 11:22:45 +000010557TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
10558 std::string code = "#if A\n"
10559 "#if B\n"
10560 "a.\n"
10561 "#endif\n"
10562 " a = 1;\n"
10563 "#else\n"
10564 "#endif\n"
10565 "#if C\n"
10566 "#else\n"
10567 "#endif\n";
10568 EXPECT_EQ(code, format(code));
10569}
10570
Manuel Klimek68b03042014-04-14 09:14:11 +000010571TEST_F(FormatTest, HandleConflictMarkers) {
10572 // Git/SVN conflict markers.
10573 EXPECT_EQ("int a;\n"
10574 "void f() {\n"
10575 " callme(some(parameter1,\n"
10576 "<<<<<<< text by the vcs\n"
10577 " parameter2),\n"
10578 "||||||| text by the vcs\n"
10579 " parameter2),\n"
10580 " parameter3,\n"
10581 "======= text by the vcs\n"
10582 " parameter2, parameter3),\n"
10583 ">>>>>>> text by the vcs\n"
10584 " otherparameter);\n",
10585 format("int a;\n"
10586 "void f() {\n"
10587 " callme(some(parameter1,\n"
10588 "<<<<<<< text by the vcs\n"
10589 " parameter2),\n"
10590 "||||||| text by the vcs\n"
10591 " parameter2),\n"
10592 " parameter3,\n"
10593 "======= text by the vcs\n"
10594 " parameter2,\n"
10595 " parameter3),\n"
10596 ">>>>>>> text by the vcs\n"
10597 " otherparameter);\n"));
10598
10599 // Perforce markers.
10600 EXPECT_EQ("void f() {\n"
10601 " function(\n"
10602 ">>>> text by the vcs\n"
10603 " parameter,\n"
10604 "==== text by the vcs\n"
10605 " parameter,\n"
10606 "==== text by the vcs\n"
10607 " parameter,\n"
10608 "<<<< text by the vcs\n"
10609 " parameter);\n",
10610 format("void f() {\n"
10611 " function(\n"
10612 ">>>> text by the vcs\n"
10613 " parameter,\n"
10614 "==== text by the vcs\n"
10615 " parameter,\n"
10616 "==== text by the vcs\n"
10617 " parameter,\n"
10618 "<<<< text by the vcs\n"
10619 " parameter);\n"));
10620
10621 EXPECT_EQ("<<<<<<<\n"
10622 "|||||||\n"
10623 "=======\n"
10624 ">>>>>>>",
10625 format("<<<<<<<\n"
10626 "|||||||\n"
10627 "=======\n"
10628 ">>>>>>>"));
10629
10630 EXPECT_EQ("<<<<<<<\n"
10631 "|||||||\n"
10632 "int i;\n"
10633 "=======\n"
10634 ">>>>>>>",
10635 format("<<<<<<<\n"
10636 "|||||||\n"
10637 "int i;\n"
10638 "=======\n"
10639 ">>>>>>>"));
10640
10641 // FIXME: Handle parsing of macros around conflict markers correctly:
10642 EXPECT_EQ("#define Macro \\\n"
10643 "<<<<<<<\n"
10644 "Something \\\n"
10645 "|||||||\n"
10646 "Else \\\n"
10647 "=======\n"
10648 "Other \\\n"
10649 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000010650 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000010651 format("#define Macro \\\n"
10652 "<<<<<<<\n"
10653 " Something \\\n"
10654 "|||||||\n"
10655 " Else \\\n"
10656 "=======\n"
10657 " Other \\\n"
10658 ">>>>>>>\n"
10659 " End\n"
10660 "int i;\n"));
10661}
10662
Daniel Jasper471894432014-08-06 13:40:26 +000010663TEST_F(FormatTest, DisableRegions) {
10664 EXPECT_EQ("int i;\n"
10665 "// clang-format off\n"
10666 " int j;\n"
10667 "// clang-format on\n"
10668 "int k;",
10669 format(" int i;\n"
10670 " // clang-format off\n"
10671 " int j;\n"
10672 " // clang-format on\n"
10673 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000010674 EXPECT_EQ("int i;\n"
10675 "/* clang-format off */\n"
10676 " int j;\n"
10677 "/* clang-format on */\n"
10678 "int k;",
10679 format(" int i;\n"
10680 " /* clang-format off */\n"
10681 " int j;\n"
10682 " /* clang-format on */\n"
10683 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000010684
10685 // Don't reflow comments within disabled regions.
10686 EXPECT_EQ(
10687 "// clang-format off\n"
10688 "// long long long long long long line\n"
10689 "/* clang-format on */\n"
10690 "/* long long long\n"
10691 " * long long long\n"
10692 " * line */\n"
10693 "int i;\n"
10694 "/* clang-format off */\n"
10695 "/* long long long long long long line */\n",
10696 format("// clang-format off\n"
10697 "// long long long long long long line\n"
10698 "/* clang-format on */\n"
10699 "/* long long long long long long line */\n"
10700 "int i;\n"
10701 "/* clang-format off */\n"
10702 "/* long long long long long long line */\n",
10703 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000010704}
10705
Manuel Klimekf0c95b32015-06-11 10:14:13 +000010706TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
10707 format("? ) =");
10708 verifyNoCrash("#define a\\\n /**/}");
10709}
Manuel Klimek5f594f82014-08-13 14:00:41 +000010710
Daniel Jasper498f5582015-12-25 08:53:31 +000010711TEST_F(FormatTest, FormatsTableGenCode) {
10712 FormatStyle Style = getLLVMStyle();
10713 Style.Language = FormatStyle::LK_TableGen;
10714 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
10715}
10716
Nico Weberb2673a12016-11-10 21:49:25 +000010717TEST_F(FormatTest, ArrayOfTemplates) {
10718 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
10719 format("auto a = new unique_ptr<int > [ 10];"));
10720
10721 FormatStyle Spaces = getLLVMStyle();
10722 Spaces.SpacesInSquareBrackets = true;
10723 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
10724 format("auto a = new unique_ptr<int > [10];", Spaces));
10725}
10726
10727TEST_F(FormatTest, ArrayAsTemplateType) {
10728 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
10729 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
10730
10731 FormatStyle Spaces = getLLVMStyle();
10732 Spaces.SpacesInSquareBrackets = true;
10733 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
10734 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
10735}
10736
Martin Probstc9c51c42017-03-16 10:21:35 +000010737TEST_F(FormatTest, NoSpaceAfterSuper) {
10738 verifyFormat("__super::FooBar();");
10739}
10740
Eric Liu547d8792016-03-24 13:22:42 +000010741TEST(FormatStyle, GetStyleOfFile) {
10742 vfs::InMemoryFileSystem FS;
10743 // Test 1: format file in the same directory.
10744 ASSERT_TRUE(
10745 FS.addFile("/a/.clang-format", 0,
10746 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
10747 ASSERT_TRUE(
10748 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010749 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000010750 ASSERT_TRUE((bool)Style1);
10751 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000010752
Antonio Maiorano7eb75072017-01-20 01:22:42 +000010753 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000010754 ASSERT_TRUE(
10755 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010756 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000010757 ASSERT_TRUE((bool)Style2);
10758 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000010759
Antonio Maiorano7eb75072017-01-20 01:22:42 +000010760 // Test 2.2: no format on 'none' fallback style.
10761 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
10762 ASSERT_TRUE((bool)Style2);
10763 ASSERT_EQ(*Style2, getNoStyle());
10764
10765 // Test 2.3: format if config is found with no based style while fallback is
10766 // 'none'.
10767 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
10768 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
10769 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
10770 ASSERT_TRUE((bool)Style2);
10771 ASSERT_EQ(*Style2, getLLVMStyle());
10772
10773 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
10774 Style2 = getStyle("{}", "a.h", "none", "", &FS);
10775 ASSERT_TRUE((bool)Style2);
10776 ASSERT_EQ(*Style2, getLLVMStyle());
10777
Eric Liu547d8792016-03-24 13:22:42 +000010778 // Test 3: format file in parent directory.
10779 ASSERT_TRUE(
10780 FS.addFile("/c/.clang-format", 0,
10781 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
10782 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
10783 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010784 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000010785 ASSERT_TRUE((bool)Style3);
10786 ASSERT_EQ(*Style3, getGoogleStyle());
10787
10788 // Test 4: error on invalid fallback style
10789 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
10790 ASSERT_FALSE((bool)Style4);
10791 llvm::consumeError(Style4.takeError());
10792
10793 // Test 5: error on invalid yaml on command line
10794 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
10795 ASSERT_FALSE((bool)Style5);
10796 llvm::consumeError(Style5.takeError());
10797
10798 // Test 6: error on invalid style
10799 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
10800 ASSERT_FALSE((bool)Style6);
10801 llvm::consumeError(Style6.takeError());
10802
10803 // Test 7: found config file, error on parsing it
10804 ASSERT_TRUE(
10805 FS.addFile("/d/.clang-format", 0,
10806 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
10807 "InvalidKey: InvalidValue")));
10808 ASSERT_TRUE(
10809 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
10810 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
10811 ASSERT_FALSE((bool)Style7);
10812 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000010813}
10814
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010815TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
10816 // Column limit is 20.
10817 std::string Code = "Type *a =\n"
10818 " new Type();\n"
10819 "g(iiiii, 0, jjjjj,\n"
10820 " 0, kkkkk, 0, mm);\n"
10821 "int bad = format ;";
10822 std::string Expected = "auto a = new Type();\n"
10823 "g(iiiii, nullptr,\n"
10824 " jjjjj, nullptr,\n"
10825 " kkkkk, nullptr,\n"
10826 " mm);\n"
10827 "int bad = format ;";
10828 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000010829 tooling::Replacements Replaces = toReplacements(
10830 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
10831 "auto "),
10832 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
10833 "nullptr"),
10834 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
10835 "nullptr"),
10836 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
10837 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010838
10839 format::FormatStyle Style = format::getLLVMStyle();
10840 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000010841 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
10842 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
10843 << llvm::toString(FormattedReplaces.takeError()) << "\n";
10844 auto Result = applyAllReplacements(Code, *FormattedReplaces);
10845 EXPECT_TRUE(static_cast<bool>(Result));
10846 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010847}
10848
Eric Liubaf58c22016-05-18 13:43:48 +000010849TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
10850 std::string Code = "#include \"a.h\"\n"
10851 "#include \"c.h\"\n"
10852 "\n"
10853 "int main() {\n"
10854 " return 0;\n"
10855 "}";
10856 std::string Expected = "#include \"a.h\"\n"
10857 "#include \"b.h\"\n"
10858 "#include \"c.h\"\n"
10859 "\n"
10860 "int main() {\n"
10861 " return 0;\n"
10862 "}";
10863 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000010864 tooling::Replacements Replaces = toReplacements(
10865 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
10866 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000010867
10868 format::FormatStyle Style = format::getLLVMStyle();
10869 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000010870 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
10871 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
10872 << llvm::toString(FormattedReplaces.takeError()) << "\n";
10873 auto Result = applyAllReplacements(Code, *FormattedReplaces);
10874 EXPECT_TRUE(static_cast<bool>(Result));
10875 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000010876}
10877
Krasimir Georgievac16a202017-06-23 11:46:03 +000010878TEST_F(FormatTest, FormatSortsUsingDeclarations) {
10879 EXPECT_EQ("using std::cin;\n"
10880 "using std::cout;",
10881 format("using std::cout;\n"
10882 "using std::cin;", getGoogleStyle()));
10883}
10884
Nico Weberdc065182017-04-05 18:10:42 +000010885TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
10886 format::FormatStyle Style = format::getLLVMStyle();
10887 Style.Standard = FormatStyle::LS_Cpp03;
10888 // cpp03 recognize this string as identifier u8 and literal character 'a'
10889 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
10890}
10891
10892TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
10893 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
10894 // all modes, including C++11, C++14 and C++17
10895 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
10896}
10897
Daniel Jasperd246a5a2015-06-15 15:25:11 +000010898} // end namespace
10899} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000010900} // end namespace clang