1 //===- 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 10 #include "clang/Format/Format.h" 11 12 #include "../Tooling/ReplacementTest.h" 13 #include "FormatTestUtils.h" 14 15 #include "clang/Frontend/TextDiagnosticPrinter.h" 16 #include "llvm/Support/Debug.h" 17 #include "llvm/Support/MemoryBuffer.h" 18 #include "gtest/gtest.h" 19 20 #define DEBUG_TYPE "format-test" 21 22 using clang::tooling::ReplacementTest; 23 using clang::tooling::toReplacements; 24 25 namespace clang { 26 namespace format { 27 namespace { 28 29 FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); } 30 31 class FormatTest : public ::testing::Test { 32 protected: 33 enum IncompleteCheck { 34 IC_ExpectComplete, 35 IC_ExpectIncomplete, 36 IC_DoNotCheck 37 }; 38 39 std::string format(llvm::StringRef Code, 40 const FormatStyle &Style = getLLVMStyle(), 41 IncompleteCheck CheckIncomplete = IC_ExpectComplete) { 42 DEBUG(llvm::errs() << "---\n"); 43 DEBUG(llvm::errs() << Code << "\n\n"); 44 std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size())); 45 bool IncompleteFormat = false; 46 tooling::Replacements Replaces = 47 reformat(Style, Code, Ranges, "<stdin>", &IncompleteFormat); 48 if (CheckIncomplete != IC_DoNotCheck) { 49 bool ExpectedIncompleteFormat = CheckIncomplete == IC_ExpectIncomplete; 50 EXPECT_EQ(ExpectedIncompleteFormat, IncompleteFormat) << Code << "\n\n"; 51 } 52 ReplacementCount = Replaces.size(); 53 auto Result = applyAllReplacements(Code, Replaces); 54 EXPECT_TRUE(static_cast<bool>(Result)); 55 DEBUG(llvm::errs() << "\n" << *Result << "\n\n"); 56 return *Result; 57 } 58 59 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) { 60 FormatStyle Style = getLLVMStyle(); 61 Style.ColumnLimit = ColumnLimit; 62 return Style; 63 } 64 65 FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) { 66 FormatStyle Style = getGoogleStyle(); 67 Style.ColumnLimit = ColumnLimit; 68 return Style; 69 } 70 71 void verifyFormat(llvm::StringRef Code, 72 const FormatStyle &Style = getLLVMStyle()) { 73 EXPECT_EQ(Code.str(), format(test::messUp(Code), Style)); 74 } 75 76 void verifyIncompleteFormat(llvm::StringRef Code, 77 const FormatStyle &Style = getLLVMStyle()) { 78 EXPECT_EQ(Code.str(), 79 format(test::messUp(Code), Style, IC_ExpectIncomplete)); 80 } 81 82 void verifyGoogleFormat(llvm::StringRef Code) { 83 verifyFormat(Code, getGoogleStyle()); 84 } 85 86 void verifyIndependentOfContext(llvm::StringRef text) { 87 verifyFormat(text); 88 verifyFormat(llvm::Twine("void f() { " + text + " }").str()); 89 } 90 91 /// \brief Verify that clang-format does not crash on the given input. 92 void verifyNoCrash(llvm::StringRef Code, 93 const FormatStyle &Style = getLLVMStyle()) { 94 format(Code, Style, IC_DoNotCheck); 95 } 96 97 int ReplacementCount; 98 }; 99 100 TEST_F(FormatTest, MessUp) { 101 EXPECT_EQ("1 2 3", test::messUp("1 2 3")); 102 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n")); 103 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc")); 104 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc")); 105 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne")); 106 } 107 108 //===----------------------------------------------------------------------===// 109 // Basic function tests. 110 //===----------------------------------------------------------------------===// 111 112 TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) { 113 EXPECT_EQ(";", format(";")); 114 } 115 116 TEST_F(FormatTest, FormatsGlobalStatementsAt0) { 117 EXPECT_EQ("int i;", format(" int i;")); 118 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;")); 119 EXPECT_EQ("int i;\nint j;", format(" int i; int j;")); 120 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;")); 121 } 122 123 TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) { 124 EXPECT_EQ("int i;", format("int\ni;")); 125 } 126 127 TEST_F(FormatTest, FormatsNestedBlockStatements) { 128 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}")); 129 } 130 131 TEST_F(FormatTest, FormatsNestedCall) { 132 verifyFormat("Method(f1, f2(f3));"); 133 verifyFormat("Method(f1(f2, f3()));"); 134 verifyFormat("Method(f1(f2, (f3())));"); 135 } 136 137 TEST_F(FormatTest, NestedNameSpecifiers) { 138 verifyFormat("vector<::Type> v;"); 139 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())"); 140 verifyFormat("static constexpr bool Bar = decltype(bar())::value;"); 141 verifyFormat("bool a = 2 < ::SomeFunction();"); 142 } 143 144 TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) { 145 EXPECT_EQ("if (a) {\n" 146 " f();\n" 147 "}", 148 format("if(a){f();}")); 149 EXPECT_EQ(4, ReplacementCount); 150 EXPECT_EQ("if (a) {\n" 151 " f();\n" 152 "}", 153 format("if (a) {\n" 154 " f();\n" 155 "}")); 156 EXPECT_EQ(0, ReplacementCount); 157 EXPECT_EQ("/*\r\n" 158 "\r\n" 159 "*/\r\n", 160 format("/*\r\n" 161 "\r\n" 162 "*/\r\n")); 163 EXPECT_EQ(0, ReplacementCount); 164 } 165 166 TEST_F(FormatTest, RemovesEmptyLines) { 167 EXPECT_EQ("class C {\n" 168 " int i;\n" 169 "};", 170 format("class C {\n" 171 " int i;\n" 172 "\n" 173 "};")); 174 175 // Don't remove empty lines at the start of namespaces or extern "C" blocks. 176 EXPECT_EQ("namespace N {\n" 177 "\n" 178 "int i;\n" 179 "}", 180 format("namespace N {\n" 181 "\n" 182 "int i;\n" 183 "}", 184 getGoogleStyle())); 185 EXPECT_EQ("extern /**/ \"C\" /**/ {\n" 186 "\n" 187 "int i;\n" 188 "}", 189 format("extern /**/ \"C\" /**/ {\n" 190 "\n" 191 "int i;\n" 192 "}", 193 getGoogleStyle())); 194 195 // ...but do keep inlining and removing empty lines for non-block extern "C" 196 // functions. 197 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle()); 198 EXPECT_EQ("extern \"C\" int f() {\n" 199 " int i = 42;\n" 200 " return i;\n" 201 "}", 202 format("extern \"C\" int f() {\n" 203 "\n" 204 " int i = 42;\n" 205 " return i;\n" 206 "}", 207 getGoogleStyle())); 208 209 // Remove empty lines at the beginning and end of blocks. 210 EXPECT_EQ("void f() {\n" 211 "\n" 212 " if (a) {\n" 213 "\n" 214 " f();\n" 215 " }\n" 216 "}", 217 format("void f() {\n" 218 "\n" 219 " if (a) {\n" 220 "\n" 221 " f();\n" 222 "\n" 223 " }\n" 224 "\n" 225 "}", 226 getLLVMStyle())); 227 EXPECT_EQ("void f() {\n" 228 " if (a) {\n" 229 " f();\n" 230 " }\n" 231 "}", 232 format("void f() {\n" 233 "\n" 234 " if (a) {\n" 235 "\n" 236 " f();\n" 237 "\n" 238 " }\n" 239 "\n" 240 "}", 241 getGoogleStyle())); 242 243 // Don't remove empty lines in more complex control statements. 244 EXPECT_EQ("void f() {\n" 245 " if (a) {\n" 246 " f();\n" 247 "\n" 248 " } else if (b) {\n" 249 " f();\n" 250 " }\n" 251 "}", 252 format("void f() {\n" 253 " if (a) {\n" 254 " f();\n" 255 "\n" 256 " } else if (b) {\n" 257 " f();\n" 258 "\n" 259 " }\n" 260 "\n" 261 "}")); 262 263 // FIXME: This is slightly inconsistent. 264 EXPECT_EQ("namespace {\n" 265 "int i;\n" 266 "}", 267 format("namespace {\n" 268 "int i;\n" 269 "\n" 270 "}")); 271 EXPECT_EQ("namespace {\n" 272 "int i;\n" 273 "\n" 274 "} // namespace", 275 format("namespace {\n" 276 "int i;\n" 277 "\n" 278 "} // namespace")); 279 280 FormatStyle Style = getLLVMStyle(); 281 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 282 Style.MaxEmptyLinesToKeep = 2; 283 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 284 Style.BraceWrapping.AfterClass = true; 285 Style.BraceWrapping.AfterFunction = true; 286 Style.KeepEmptyLinesAtTheStartOfBlocks = false; 287 288 EXPECT_EQ("class Foo\n" 289 "{\n" 290 " Foo() {}\n" 291 "\n" 292 " void funk() {}\n" 293 "};", 294 format("class Foo\n" 295 "{\n" 296 " Foo()\n" 297 " {\n" 298 " }\n" 299 "\n" 300 " void funk() {}\n" 301 "};", 302 Style)); 303 } 304 305 TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) { 306 verifyFormat("x = (a) and (b);"); 307 verifyFormat("x = (a) or (b);"); 308 verifyFormat("x = (a) bitand (b);"); 309 verifyFormat("x = (a) bitor (b);"); 310 verifyFormat("x = (a) not_eq (b);"); 311 verifyFormat("x = (a) and_eq (b);"); 312 verifyFormat("x = (a) or_eq (b);"); 313 verifyFormat("x = (a) xor (b);"); 314 } 315 316 //===----------------------------------------------------------------------===// 317 // Tests for control statements. 318 //===----------------------------------------------------------------------===// 319 320 TEST_F(FormatTest, FormatIfWithoutCompoundStatement) { 321 verifyFormat("if (true)\n f();\ng();"); 322 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();"); 323 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();"); 324 325 FormatStyle AllowsMergedIf = getLLVMStyle(); 326 AllowsMergedIf.AlignEscapedNewlinesLeft = true; 327 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true; 328 verifyFormat("if (a)\n" 329 " // comment\n" 330 " f();", 331 AllowsMergedIf); 332 verifyFormat("{\n" 333 " if (a)\n" 334 " label:\n" 335 " f();\n" 336 "}", 337 AllowsMergedIf); 338 verifyFormat("#define A \\\n" 339 " if (a) \\\n" 340 " label: \\\n" 341 " f()", 342 AllowsMergedIf); 343 verifyFormat("if (a)\n" 344 " ;", 345 AllowsMergedIf); 346 verifyFormat("if (a)\n" 347 " if (b) return;", 348 AllowsMergedIf); 349 350 verifyFormat("if (a) // Can't merge this\n" 351 " f();\n", 352 AllowsMergedIf); 353 verifyFormat("if (a) /* still don't merge */\n" 354 " f();", 355 AllowsMergedIf); 356 verifyFormat("if (a) { // Never merge this\n" 357 " f();\n" 358 "}", 359 AllowsMergedIf); 360 verifyFormat("if (a) { /* Never merge this */\n" 361 " f();\n" 362 "}", 363 AllowsMergedIf); 364 365 AllowsMergedIf.ColumnLimit = 14; 366 verifyFormat("if (a) return;", AllowsMergedIf); 367 verifyFormat("if (aaaaaaaaa)\n" 368 " return;", 369 AllowsMergedIf); 370 371 AllowsMergedIf.ColumnLimit = 13; 372 verifyFormat("if (a)\n return;", AllowsMergedIf); 373 } 374 375 TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) { 376 FormatStyle AllowsMergedLoops = getLLVMStyle(); 377 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true; 378 verifyFormat("while (true) continue;", AllowsMergedLoops); 379 verifyFormat("for (;;) continue;", AllowsMergedLoops); 380 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops); 381 verifyFormat("while (true)\n" 382 " ;", 383 AllowsMergedLoops); 384 verifyFormat("for (;;)\n" 385 " ;", 386 AllowsMergedLoops); 387 verifyFormat("for (;;)\n" 388 " for (;;) continue;", 389 AllowsMergedLoops); 390 verifyFormat("for (;;) // Can't merge this\n" 391 " continue;", 392 AllowsMergedLoops); 393 verifyFormat("for (;;) /* still don't merge */\n" 394 " continue;", 395 AllowsMergedLoops); 396 } 397 398 TEST_F(FormatTest, FormatShortBracedStatements) { 399 FormatStyle AllowSimpleBracedStatements = getLLVMStyle(); 400 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true; 401 402 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true; 403 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true; 404 405 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 406 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 407 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 408 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements); 409 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements); 410 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements); 411 verifyFormat("if (true) { //\n" 412 " f();\n" 413 "}", 414 AllowSimpleBracedStatements); 415 verifyFormat("if (true) {\n" 416 " f();\n" 417 " f();\n" 418 "}", 419 AllowSimpleBracedStatements); 420 verifyFormat("if (true) {\n" 421 " f();\n" 422 "} else {\n" 423 " f();\n" 424 "}", 425 AllowSimpleBracedStatements); 426 427 verifyFormat("template <int> struct A2 {\n" 428 " struct B {};\n" 429 "};", 430 AllowSimpleBracedStatements); 431 432 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false; 433 verifyFormat("if (true) {\n" 434 " f();\n" 435 "}", 436 AllowSimpleBracedStatements); 437 verifyFormat("if (true) {\n" 438 " f();\n" 439 "} else {\n" 440 " f();\n" 441 "}", 442 AllowSimpleBracedStatements); 443 444 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false; 445 verifyFormat("while (true) {\n" 446 " f();\n" 447 "}", 448 AllowSimpleBracedStatements); 449 verifyFormat("for (;;) {\n" 450 " f();\n" 451 "}", 452 AllowSimpleBracedStatements); 453 } 454 455 TEST_F(FormatTest, ParseIfElse) { 456 verifyFormat("if (true)\n" 457 " if (true)\n" 458 " if (true)\n" 459 " f();\n" 460 " else\n" 461 " g();\n" 462 " else\n" 463 " h();\n" 464 "else\n" 465 " i();"); 466 verifyFormat("if (true)\n" 467 " if (true)\n" 468 " if (true) {\n" 469 " if (true)\n" 470 " f();\n" 471 " } else {\n" 472 " g();\n" 473 " }\n" 474 " else\n" 475 " h();\n" 476 "else {\n" 477 " i();\n" 478 "}"); 479 verifyFormat("void f() {\n" 480 " if (a) {\n" 481 " } else {\n" 482 " }\n" 483 "}"); 484 } 485 486 TEST_F(FormatTest, ElseIf) { 487 verifyFormat("if (a) {\n} else if (b) {\n}"); 488 verifyFormat("if (a)\n" 489 " f();\n" 490 "else if (b)\n" 491 " g();\n" 492 "else\n" 493 " h();"); 494 verifyFormat("if (a) {\n" 495 " f();\n" 496 "}\n" 497 "// or else ..\n" 498 "else {\n" 499 " g()\n" 500 "}"); 501 502 verifyFormat("if (a) {\n" 503 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 504 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 505 "}"); 506 verifyFormat("if (a) {\n" 507 "} else if (\n" 508 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 509 "}", 510 getLLVMStyleWithColumns(62)); 511 } 512 513 TEST_F(FormatTest, FormatsForLoop) { 514 verifyFormat( 515 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n" 516 " ++VeryVeryLongLoopVariable)\n" 517 " ;"); 518 verifyFormat("for (;;)\n" 519 " f();"); 520 verifyFormat("for (;;) {\n}"); 521 verifyFormat("for (;;) {\n" 522 " f();\n" 523 "}"); 524 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}"); 525 526 verifyFormat( 527 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 528 " E = UnwrappedLines.end();\n" 529 " I != E; ++I) {\n}"); 530 531 verifyFormat( 532 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n" 533 " ++IIIII) {\n}"); 534 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n" 535 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n" 536 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}"); 537 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n" 538 " I = FD->getDeclsInPrototypeScope().begin(),\n" 539 " E = FD->getDeclsInPrototypeScope().end();\n" 540 " I != E; ++I) {\n}"); 541 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n" 542 " I = Container.begin(),\n" 543 " E = Container.end();\n" 544 " I != E; ++I) {\n}", 545 getLLVMStyleWithColumns(76)); 546 547 verifyFormat( 548 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 549 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n" 550 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 551 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 552 " ++aaaaaaaaaaa) {\n}"); 553 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 554 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n" 555 " ++i) {\n}"); 556 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n" 557 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 558 "}"); 559 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n" 560 " aaaaaaaaaa);\n" 561 " iter; ++iter) {\n" 562 "}"); 563 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 564 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 565 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n" 566 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {"); 567 568 FormatStyle NoBinPacking = getLLVMStyle(); 569 NoBinPacking.BinPackParameters = false; 570 verifyFormat("for (int aaaaaaaaaaa = 1;\n" 571 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n" 572 " aaaaaaaaaaaaaaaa,\n" 573 " aaaaaaaaaaaaaaaa,\n" 574 " aaaaaaaaaaaaaaaa);\n" 575 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 576 "}", 577 NoBinPacking); 578 verifyFormat( 579 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 580 " E = UnwrappedLines.end();\n" 581 " I != E;\n" 582 " ++I) {\n}", 583 NoBinPacking); 584 } 585 586 TEST_F(FormatTest, RangeBasedForLoops) { 587 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 588 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 589 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n" 590 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}"); 591 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n" 592 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 593 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n" 594 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}"); 595 } 596 597 TEST_F(FormatTest, ForEachLoops) { 598 verifyFormat("void f() {\n" 599 " foreach (Item *item, itemlist) {}\n" 600 " Q_FOREACH (Item *item, itemlist) {}\n" 601 " BOOST_FOREACH (Item *item, itemlist) {}\n" 602 " UNKNOWN_FORACH(Item * item, itemlist) {}\n" 603 "}"); 604 605 // As function-like macros. 606 verifyFormat("#define foreach(x, y)\n" 607 "#define Q_FOREACH(x, y)\n" 608 "#define BOOST_FOREACH(x, y)\n" 609 "#define UNKNOWN_FOREACH(x, y)\n"); 610 611 // Not as function-like macros. 612 verifyFormat("#define foreach (x, y)\n" 613 "#define Q_FOREACH (x, y)\n" 614 "#define BOOST_FOREACH (x, y)\n" 615 "#define UNKNOWN_FOREACH (x, y)\n"); 616 } 617 618 TEST_F(FormatTest, FormatsWhileLoop) { 619 verifyFormat("while (true) {\n}"); 620 verifyFormat("while (true)\n" 621 " f();"); 622 verifyFormat("while () {\n}"); 623 verifyFormat("while () {\n" 624 " f();\n" 625 "}"); 626 } 627 628 TEST_F(FormatTest, FormatsDoWhile) { 629 verifyFormat("do {\n" 630 " do_something();\n" 631 "} while (something());"); 632 verifyFormat("do\n" 633 " do_something();\n" 634 "while (something());"); 635 } 636 637 TEST_F(FormatTest, FormatsSwitchStatement) { 638 verifyFormat("switch (x) {\n" 639 "case 1:\n" 640 " f();\n" 641 " break;\n" 642 "case kFoo:\n" 643 "case ns::kBar:\n" 644 "case kBaz:\n" 645 " break;\n" 646 "default:\n" 647 " g();\n" 648 " break;\n" 649 "}"); 650 verifyFormat("switch (x) {\n" 651 "case 1: {\n" 652 " f();\n" 653 " break;\n" 654 "}\n" 655 "case 2: {\n" 656 " break;\n" 657 "}\n" 658 "}"); 659 verifyFormat("switch (x) {\n" 660 "case 1: {\n" 661 " f();\n" 662 " {\n" 663 " g();\n" 664 " h();\n" 665 " }\n" 666 " break;\n" 667 "}\n" 668 "}"); 669 verifyFormat("switch (x) {\n" 670 "case 1: {\n" 671 " f();\n" 672 " if (foo) {\n" 673 " g();\n" 674 " h();\n" 675 " }\n" 676 " break;\n" 677 "}\n" 678 "}"); 679 verifyFormat("switch (x) {\n" 680 "case 1: {\n" 681 " f();\n" 682 " g();\n" 683 "} break;\n" 684 "}"); 685 verifyFormat("switch (test)\n" 686 " ;"); 687 verifyFormat("switch (x) {\n" 688 "default: {\n" 689 " // Do nothing.\n" 690 "}\n" 691 "}"); 692 verifyFormat("switch (x) {\n" 693 "// comment\n" 694 "// if 1, do f()\n" 695 "case 1:\n" 696 " f();\n" 697 "}"); 698 verifyFormat("switch (x) {\n" 699 "case 1:\n" 700 " // Do amazing stuff\n" 701 " {\n" 702 " f();\n" 703 " g();\n" 704 " }\n" 705 " break;\n" 706 "}"); 707 verifyFormat("#define A \\\n" 708 " switch (x) { \\\n" 709 " case a: \\\n" 710 " foo = b; \\\n" 711 " }", 712 getLLVMStyleWithColumns(20)); 713 verifyFormat("#define OPERATION_CASE(name) \\\n" 714 " case OP_name: \\\n" 715 " return operations::Operation##name\n", 716 getLLVMStyleWithColumns(40)); 717 verifyFormat("switch (x) {\n" 718 "case 1:;\n" 719 "default:;\n" 720 " int i;\n" 721 "}"); 722 723 verifyGoogleFormat("switch (x) {\n" 724 " case 1:\n" 725 " f();\n" 726 " break;\n" 727 " case kFoo:\n" 728 " case ns::kBar:\n" 729 " case kBaz:\n" 730 " break;\n" 731 " default:\n" 732 " g();\n" 733 " break;\n" 734 "}"); 735 verifyGoogleFormat("switch (x) {\n" 736 " case 1: {\n" 737 " f();\n" 738 " break;\n" 739 " }\n" 740 "}"); 741 verifyGoogleFormat("switch (test)\n" 742 " ;"); 743 744 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n" 745 " case OP_name: \\\n" 746 " return operations::Operation##name\n"); 747 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n" 748 " // Get the correction operation class.\n" 749 " switch (OpCode) {\n" 750 " CASE(Add);\n" 751 " CASE(Subtract);\n" 752 " default:\n" 753 " return operations::Unknown;\n" 754 " }\n" 755 "#undef OPERATION_CASE\n" 756 "}"); 757 verifyFormat("DEBUG({\n" 758 " switch (x) {\n" 759 " case A:\n" 760 " f();\n" 761 " break;\n" 762 " // On B:\n" 763 " case B:\n" 764 " g();\n" 765 " break;\n" 766 " }\n" 767 "});"); 768 verifyFormat("switch (a) {\n" 769 "case (b):\n" 770 " return;\n" 771 "}"); 772 773 verifyFormat("switch (a) {\n" 774 "case some_namespace::\n" 775 " some_constant:\n" 776 " return;\n" 777 "}", 778 getLLVMStyleWithColumns(34)); 779 } 780 781 TEST_F(FormatTest, CaseRanges) { 782 verifyFormat("switch (x) {\n" 783 "case 'A' ... 'Z':\n" 784 "case 1 ... 5:\n" 785 "case a ... b:\n" 786 " break;\n" 787 "}"); 788 } 789 790 TEST_F(FormatTest, ShortCaseLabels) { 791 FormatStyle Style = getLLVMStyle(); 792 Style.AllowShortCaseLabelsOnASingleLine = true; 793 verifyFormat("switch (a) {\n" 794 "case 1: x = 1; break;\n" 795 "case 2: return;\n" 796 "case 3:\n" 797 "case 4:\n" 798 "case 5: return;\n" 799 "case 6: // comment\n" 800 " return;\n" 801 "case 7:\n" 802 " // comment\n" 803 " return;\n" 804 "case 8:\n" 805 " x = 8; // comment\n" 806 " break;\n" 807 "default: y = 1; break;\n" 808 "}", 809 Style); 810 verifyFormat("switch (a) {\n" 811 "#if FOO\n" 812 "case 0: return 0;\n" 813 "#endif\n" 814 "}", 815 Style); 816 verifyFormat("switch (a) {\n" 817 "case 1: {\n" 818 "}\n" 819 "case 2: {\n" 820 " return;\n" 821 "}\n" 822 "case 3: {\n" 823 " x = 1;\n" 824 " return;\n" 825 "}\n" 826 "case 4:\n" 827 " if (x)\n" 828 " return;\n" 829 "}", 830 Style); 831 Style.ColumnLimit = 21; 832 verifyFormat("switch (a) {\n" 833 "case 1: x = 1; break;\n" 834 "case 2: return;\n" 835 "case 3:\n" 836 "case 4:\n" 837 "case 5: return;\n" 838 "default:\n" 839 " y = 1;\n" 840 " break;\n" 841 "}", 842 Style); 843 } 844 845 TEST_F(FormatTest, FormatsLabels) { 846 verifyFormat("void f() {\n" 847 " some_code();\n" 848 "test_label:\n" 849 " some_other_code();\n" 850 " {\n" 851 " some_more_code();\n" 852 " another_label:\n" 853 " some_more_code();\n" 854 " }\n" 855 "}"); 856 verifyFormat("{\n" 857 " some_code();\n" 858 "test_label:\n" 859 " some_other_code();\n" 860 "}"); 861 verifyFormat("{\n" 862 " some_code();\n" 863 "test_label:;\n" 864 " int i = 0;\n" 865 "}"); 866 } 867 868 //===----------------------------------------------------------------------===// 869 // Tests for classes, namespaces, etc. 870 //===----------------------------------------------------------------------===// 871 872 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) { 873 verifyFormat("class A {};"); 874 } 875 876 TEST_F(FormatTest, UnderstandsAccessSpecifiers) { 877 verifyFormat("class A {\n" 878 "public:\n" 879 "public: // comment\n" 880 "protected:\n" 881 "private:\n" 882 " void f() {}\n" 883 "};"); 884 verifyGoogleFormat("class A {\n" 885 " public:\n" 886 " protected:\n" 887 " private:\n" 888 " void f() {}\n" 889 "};"); 890 verifyFormat("class A {\n" 891 "public slots:\n" 892 " void f1() {}\n" 893 "public Q_SLOTS:\n" 894 " void f2() {}\n" 895 "protected slots:\n" 896 " void f3() {}\n" 897 "protected Q_SLOTS:\n" 898 " void f4() {}\n" 899 "private slots:\n" 900 " void f5() {}\n" 901 "private Q_SLOTS:\n" 902 " void f6() {}\n" 903 "signals:\n" 904 " void g1();\n" 905 "Q_SIGNALS:\n" 906 " void g2();\n" 907 "};"); 908 909 // Don't interpret 'signals' the wrong way. 910 verifyFormat("signals.set();"); 911 verifyFormat("for (Signals signals : f()) {\n}"); 912 verifyFormat("{\n" 913 " signals.set(); // This needs indentation.\n" 914 "}"); 915 verifyFormat("void f() {\n" 916 "label:\n" 917 " signals.baz();\n" 918 "}"); 919 } 920 921 TEST_F(FormatTest, SeparatesLogicalBlocks) { 922 EXPECT_EQ("class A {\n" 923 "public:\n" 924 " void f();\n" 925 "\n" 926 "private:\n" 927 " void g() {}\n" 928 " // test\n" 929 "protected:\n" 930 " int h;\n" 931 "};", 932 format("class A {\n" 933 "public:\n" 934 "void f();\n" 935 "private:\n" 936 "void g() {}\n" 937 "// test\n" 938 "protected:\n" 939 "int h;\n" 940 "};")); 941 EXPECT_EQ("class A {\n" 942 "protected:\n" 943 "public:\n" 944 " void f();\n" 945 "};", 946 format("class A {\n" 947 "protected:\n" 948 "\n" 949 "public:\n" 950 "\n" 951 " void f();\n" 952 "};")); 953 954 // Even ensure proper spacing inside macros. 955 EXPECT_EQ("#define B \\\n" 956 " class A { \\\n" 957 " protected: \\\n" 958 " public: \\\n" 959 " void f(); \\\n" 960 " };", 961 format("#define B \\\n" 962 " class A { \\\n" 963 " protected: \\\n" 964 " \\\n" 965 " public: \\\n" 966 " \\\n" 967 " void f(); \\\n" 968 " };", 969 getGoogleStyle())); 970 // But don't remove empty lines after macros ending in access specifiers. 971 EXPECT_EQ("#define A private:\n" 972 "\n" 973 "int i;", 974 format("#define A private:\n" 975 "\n" 976 "int i;")); 977 } 978 979 TEST_F(FormatTest, FormatsClasses) { 980 verifyFormat("class A : public B {};"); 981 verifyFormat("class A : public ::B {};"); 982 983 verifyFormat( 984 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 985 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 986 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n" 987 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 988 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 989 verifyFormat( 990 "class A : public B, public C, public D, public E, public F {};"); 991 verifyFormat("class AAAAAAAAAAAA : public B,\n" 992 " public C,\n" 993 " public D,\n" 994 " public E,\n" 995 " public F,\n" 996 " public G {};"); 997 998 verifyFormat("class\n" 999 " ReallyReallyLongClassName {\n" 1000 " int i;\n" 1001 "};", 1002 getLLVMStyleWithColumns(32)); 1003 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n" 1004 " aaaaaaaaaaaaaaaa> {};"); 1005 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n" 1006 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n" 1007 " aaaaaaaaaaaaaaaaaaaaaa> {};"); 1008 verifyFormat("template <class R, class C>\n" 1009 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n" 1010 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};"); 1011 verifyFormat("class ::A::B {};"); 1012 } 1013 1014 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) { 1015 verifyFormat("class A {\n} a, b;"); 1016 verifyFormat("struct A {\n} a, b;"); 1017 verifyFormat("union A {\n} a;"); 1018 } 1019 1020 TEST_F(FormatTest, FormatsEnum) { 1021 verifyFormat("enum {\n" 1022 " Zero,\n" 1023 " One = 1,\n" 1024 " Two = One + 1,\n" 1025 " Three = (One + Two),\n" 1026 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1027 " Five = (One, Two, Three, Four, 5)\n" 1028 "};"); 1029 verifyGoogleFormat("enum {\n" 1030 " Zero,\n" 1031 " One = 1,\n" 1032 " Two = One + 1,\n" 1033 " Three = (One + Two),\n" 1034 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1035 " Five = (One, Two, Three, Four, 5)\n" 1036 "};"); 1037 verifyFormat("enum Enum {};"); 1038 verifyFormat("enum {};"); 1039 verifyFormat("enum X E {} d;"); 1040 verifyFormat("enum __attribute__((...)) E {} d;"); 1041 verifyFormat("enum __declspec__((...)) E {} d;"); 1042 verifyFormat("enum {\n" 1043 " Bar = Foo<int, int>::value\n" 1044 "};", 1045 getLLVMStyleWithColumns(30)); 1046 1047 verifyFormat("enum ShortEnum { A, B, C };"); 1048 verifyGoogleFormat("enum ShortEnum { A, B, C };"); 1049 1050 EXPECT_EQ("enum KeepEmptyLines {\n" 1051 " ONE,\n" 1052 "\n" 1053 " TWO,\n" 1054 "\n" 1055 " THREE\n" 1056 "}", 1057 format("enum KeepEmptyLines {\n" 1058 " ONE,\n" 1059 "\n" 1060 " TWO,\n" 1061 "\n" 1062 "\n" 1063 " THREE\n" 1064 "}")); 1065 verifyFormat("enum E { // comment\n" 1066 " ONE,\n" 1067 " TWO\n" 1068 "};\n" 1069 "int i;"); 1070 // Not enums. 1071 verifyFormat("enum X f() {\n" 1072 " a();\n" 1073 " return 42;\n" 1074 "}"); 1075 verifyFormat("enum X Type::f() {\n" 1076 " a();\n" 1077 " return 42;\n" 1078 "}"); 1079 verifyFormat("enum ::X f() {\n" 1080 " a();\n" 1081 " return 42;\n" 1082 "}"); 1083 verifyFormat("enum ns::X f() {\n" 1084 " a();\n" 1085 " return 42;\n" 1086 "}"); 1087 } 1088 1089 TEST_F(FormatTest, FormatsEnumsWithErrors) { 1090 verifyFormat("enum Type {\n" 1091 " One = 0; // These semicolons should be commas.\n" 1092 " Two = 1;\n" 1093 "};"); 1094 verifyFormat("namespace n {\n" 1095 "enum Type {\n" 1096 " One,\n" 1097 " Two, // missing };\n" 1098 " int i;\n" 1099 "}\n" 1100 "void g() {}"); 1101 } 1102 1103 TEST_F(FormatTest, FormatsEnumStruct) { 1104 verifyFormat("enum struct {\n" 1105 " Zero,\n" 1106 " One = 1,\n" 1107 " Two = One + 1,\n" 1108 " Three = (One + Two),\n" 1109 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1110 " Five = (One, Two, Three, Four, 5)\n" 1111 "};"); 1112 verifyFormat("enum struct Enum {};"); 1113 verifyFormat("enum struct {};"); 1114 verifyFormat("enum struct X E {} d;"); 1115 verifyFormat("enum struct __attribute__((...)) E {} d;"); 1116 verifyFormat("enum struct __declspec__((...)) E {} d;"); 1117 verifyFormat("enum struct X f() {\n a();\n return 42;\n}"); 1118 } 1119 1120 TEST_F(FormatTest, FormatsEnumClass) { 1121 verifyFormat("enum class {\n" 1122 " Zero,\n" 1123 " One = 1,\n" 1124 " Two = One + 1,\n" 1125 " Three = (One + Two),\n" 1126 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1127 " Five = (One, Two, Three, Four, 5)\n" 1128 "};"); 1129 verifyFormat("enum class Enum {};"); 1130 verifyFormat("enum class {};"); 1131 verifyFormat("enum class X E {} d;"); 1132 verifyFormat("enum class __attribute__((...)) E {} d;"); 1133 verifyFormat("enum class __declspec__((...)) E {} d;"); 1134 verifyFormat("enum class X f() {\n a();\n return 42;\n}"); 1135 } 1136 1137 TEST_F(FormatTest, FormatsEnumTypes) { 1138 verifyFormat("enum X : int {\n" 1139 " A, // Force multiple lines.\n" 1140 " B\n" 1141 "};"); 1142 verifyFormat("enum X : int { A, B };"); 1143 verifyFormat("enum X : std::uint32_t { A, B };"); 1144 } 1145 1146 TEST_F(FormatTest, FormatsNSEnums) { 1147 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }"); 1148 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n" 1149 " // Information about someDecentlyLongValue.\n" 1150 " someDecentlyLongValue,\n" 1151 " // Information about anotherDecentlyLongValue.\n" 1152 " anotherDecentlyLongValue,\n" 1153 " // Information about aThirdDecentlyLongValue.\n" 1154 " aThirdDecentlyLongValue\n" 1155 "};"); 1156 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n" 1157 " a = 1,\n" 1158 " b = 2,\n" 1159 " c = 3,\n" 1160 "};"); 1161 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n" 1162 " a = 1,\n" 1163 " b = 2,\n" 1164 " c = 3,\n" 1165 "};"); 1166 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n" 1167 " a = 1,\n" 1168 " b = 2,\n" 1169 " c = 3,\n" 1170 "};"); 1171 } 1172 1173 TEST_F(FormatTest, FormatsBitfields) { 1174 verifyFormat("struct Bitfields {\n" 1175 " unsigned sClass : 8;\n" 1176 " unsigned ValueKind : 2;\n" 1177 "};"); 1178 verifyFormat("struct A {\n" 1179 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n" 1180 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n" 1181 "};"); 1182 verifyFormat("struct MyStruct {\n" 1183 " uchar data;\n" 1184 " uchar : 8;\n" 1185 " uchar : 8;\n" 1186 " uchar other;\n" 1187 "};"); 1188 } 1189 1190 TEST_F(FormatTest, FormatsNamespaces) { 1191 verifyFormat("namespace some_namespace {\n" 1192 "class A {};\n" 1193 "void f() { f(); }\n" 1194 "}"); 1195 verifyFormat("namespace {\n" 1196 "class A {};\n" 1197 "void f() { f(); }\n" 1198 "}"); 1199 verifyFormat("inline namespace X {\n" 1200 "class A {};\n" 1201 "void f() { f(); }\n" 1202 "}"); 1203 verifyFormat("using namespace some_namespace;\n" 1204 "class A {};\n" 1205 "void f() { f(); }"); 1206 1207 // This code is more common than we thought; if we 1208 // layout this correctly the semicolon will go into 1209 // its own line, which is undesirable. 1210 verifyFormat("namespace {};"); 1211 verifyFormat("namespace {\n" 1212 "class A {};\n" 1213 "};"); 1214 1215 verifyFormat("namespace {\n" 1216 "int SomeVariable = 0; // comment\n" 1217 "} // namespace"); 1218 EXPECT_EQ("#ifndef HEADER_GUARD\n" 1219 "#define HEADER_GUARD\n" 1220 "namespace my_namespace {\n" 1221 "int i;\n" 1222 "} // my_namespace\n" 1223 "#endif // HEADER_GUARD", 1224 format("#ifndef HEADER_GUARD\n" 1225 " #define HEADER_GUARD\n" 1226 " namespace my_namespace {\n" 1227 "int i;\n" 1228 "} // my_namespace\n" 1229 "#endif // HEADER_GUARD")); 1230 1231 EXPECT_EQ("namespace A::B {\n" 1232 "class C {};\n" 1233 "}", 1234 format("namespace A::B {\n" 1235 "class C {};\n" 1236 "}")); 1237 1238 FormatStyle Style = getLLVMStyle(); 1239 Style.NamespaceIndentation = FormatStyle::NI_All; 1240 EXPECT_EQ("namespace out {\n" 1241 " int i;\n" 1242 " namespace in {\n" 1243 " int i;\n" 1244 " } // namespace\n" 1245 "} // namespace", 1246 format("namespace out {\n" 1247 "int i;\n" 1248 "namespace in {\n" 1249 "int i;\n" 1250 "} // namespace\n" 1251 "} // namespace", 1252 Style)); 1253 1254 Style.NamespaceIndentation = FormatStyle::NI_Inner; 1255 EXPECT_EQ("namespace out {\n" 1256 "int i;\n" 1257 "namespace in {\n" 1258 " int i;\n" 1259 "} // namespace\n" 1260 "} // namespace", 1261 format("namespace out {\n" 1262 "int i;\n" 1263 "namespace in {\n" 1264 "int i;\n" 1265 "} // namespace\n" 1266 "} // namespace", 1267 Style)); 1268 } 1269 1270 TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); } 1271 1272 TEST_F(FormatTest, FormatsInlineASM) { 1273 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));"); 1274 verifyFormat("asm(\"nop\" ::: \"memory\");"); 1275 verifyFormat( 1276 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n" 1277 " \"cpuid\\n\\t\"\n" 1278 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n" 1279 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n" 1280 " : \"a\"(value));"); 1281 EXPECT_EQ( 1282 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 1283 " __asm {\n" 1284 " mov edx,[that] // vtable in edx\n" 1285 " mov eax,methodIndex\n" 1286 " call [edx][eax*4] // stdcall\n" 1287 " }\n" 1288 "}", 1289 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 1290 " __asm {\n" 1291 " mov edx,[that] // vtable in edx\n" 1292 " mov eax,methodIndex\n" 1293 " call [edx][eax*4] // stdcall\n" 1294 " }\n" 1295 "}")); 1296 EXPECT_EQ("_asm {\n" 1297 " xor eax, eax;\n" 1298 " cpuid;\n" 1299 "}", 1300 format("_asm {\n" 1301 " xor eax, eax;\n" 1302 " cpuid;\n" 1303 "}")); 1304 verifyFormat("void function() {\n" 1305 " // comment\n" 1306 " asm(\"\");\n" 1307 "}"); 1308 EXPECT_EQ("__asm {\n" 1309 "}\n" 1310 "int i;", 1311 format("__asm {\n" 1312 "}\n" 1313 "int i;")); 1314 } 1315 1316 TEST_F(FormatTest, FormatTryCatch) { 1317 verifyFormat("try {\n" 1318 " throw a * b;\n" 1319 "} catch (int a) {\n" 1320 " // Do nothing.\n" 1321 "} catch (...) {\n" 1322 " exit(42);\n" 1323 "}"); 1324 1325 // Function-level try statements. 1326 verifyFormat("int f() try { return 4; } catch (...) {\n" 1327 " return 5;\n" 1328 "}"); 1329 verifyFormat("class A {\n" 1330 " int a;\n" 1331 " A() try : a(0) {\n" 1332 " } catch (...) {\n" 1333 " throw;\n" 1334 " }\n" 1335 "};\n"); 1336 1337 // Incomplete try-catch blocks. 1338 verifyIncompleteFormat("try {} catch ("); 1339 } 1340 1341 TEST_F(FormatTest, FormatSEHTryCatch) { 1342 verifyFormat("__try {\n" 1343 " int a = b * c;\n" 1344 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n" 1345 " // Do nothing.\n" 1346 "}"); 1347 1348 verifyFormat("__try {\n" 1349 " int a = b * c;\n" 1350 "} __finally {\n" 1351 " // Do nothing.\n" 1352 "}"); 1353 1354 verifyFormat("DEBUG({\n" 1355 " __try {\n" 1356 " } __finally {\n" 1357 " }\n" 1358 "});\n"); 1359 } 1360 1361 TEST_F(FormatTest, IncompleteTryCatchBlocks) { 1362 verifyFormat("try {\n" 1363 " f();\n" 1364 "} catch {\n" 1365 " g();\n" 1366 "}"); 1367 verifyFormat("try {\n" 1368 " f();\n" 1369 "} catch (A a) MACRO(x) {\n" 1370 " g();\n" 1371 "} catch (B b) MACRO(x) {\n" 1372 " g();\n" 1373 "}"); 1374 } 1375 1376 TEST_F(FormatTest, FormatTryCatchBraceStyles) { 1377 FormatStyle Style = getLLVMStyle(); 1378 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla, 1379 FormatStyle::BS_WebKit}) { 1380 Style.BreakBeforeBraces = BraceStyle; 1381 verifyFormat("try {\n" 1382 " // something\n" 1383 "} catch (...) {\n" 1384 " // something\n" 1385 "}", 1386 Style); 1387 } 1388 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 1389 verifyFormat("try {\n" 1390 " // something\n" 1391 "}\n" 1392 "catch (...) {\n" 1393 " // something\n" 1394 "}", 1395 Style); 1396 verifyFormat("__try {\n" 1397 " // something\n" 1398 "}\n" 1399 "__finally {\n" 1400 " // something\n" 1401 "}", 1402 Style); 1403 verifyFormat("@try {\n" 1404 " // something\n" 1405 "}\n" 1406 "@finally {\n" 1407 " // something\n" 1408 "}", 1409 Style); 1410 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 1411 verifyFormat("try\n" 1412 "{\n" 1413 " // something\n" 1414 "}\n" 1415 "catch (...)\n" 1416 "{\n" 1417 " // something\n" 1418 "}", 1419 Style); 1420 Style.BreakBeforeBraces = FormatStyle::BS_GNU; 1421 verifyFormat("try\n" 1422 " {\n" 1423 " // something\n" 1424 " }\n" 1425 "catch (...)\n" 1426 " {\n" 1427 " // something\n" 1428 " }", 1429 Style); 1430 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1431 Style.BraceWrapping.BeforeCatch = true; 1432 verifyFormat("try {\n" 1433 " // something\n" 1434 "}\n" 1435 "catch (...) {\n" 1436 " // something\n" 1437 "}", 1438 Style); 1439 } 1440 1441 TEST_F(FormatTest, StaticInitializers) { 1442 verifyFormat("static SomeClass SC = {1, 'a'};"); 1443 1444 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n" 1445 " 100000000, " 1446 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};"); 1447 1448 // Here, everything other than the "}" would fit on a line. 1449 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n" 1450 " 10000000000000000000000000};"); 1451 EXPECT_EQ("S s = {a,\n" 1452 "\n" 1453 " b};", 1454 format("S s = {\n" 1455 " a,\n" 1456 "\n" 1457 " b\n" 1458 "};")); 1459 1460 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first 1461 // line. However, the formatting looks a bit off and this probably doesn't 1462 // happen often in practice. 1463 verifyFormat("static int Variable[1] = {\n" 1464 " {1000000000000000000000000000000000000}};", 1465 getLLVMStyleWithColumns(40)); 1466 } 1467 1468 TEST_F(FormatTest, DesignatedInitializers) { 1469 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 1470 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n" 1471 " .bbbbbbbbbb = 2,\n" 1472 " .cccccccccc = 3,\n" 1473 " .dddddddddd = 4,\n" 1474 " .eeeeeeeeee = 5};"); 1475 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 1476 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n" 1477 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n" 1478 " .ccccccccccccccccccccccccccc = 3,\n" 1479 " .ddddddddddddddddddddddddddd = 4,\n" 1480 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};"); 1481 1482 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};"); 1483 } 1484 1485 TEST_F(FormatTest, NestedStaticInitializers) { 1486 verifyFormat("static A x = {{{}}};\n"); 1487 verifyFormat("static A x = {{{init1, init2, init3, init4},\n" 1488 " {init1, init2, init3, init4}}};", 1489 getLLVMStyleWithColumns(50)); 1490 1491 verifyFormat("somes Status::global_reps[3] = {\n" 1492 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 1493 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 1494 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};", 1495 getLLVMStyleWithColumns(60)); 1496 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n" 1497 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 1498 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 1499 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};"); 1500 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n" 1501 " {rect.fRight - rect.fLeft, rect.fBottom - " 1502 "rect.fTop}};"); 1503 1504 verifyFormat( 1505 "SomeArrayOfSomeType a = {\n" 1506 " {{1, 2, 3},\n" 1507 " {1, 2, 3},\n" 1508 " {111111111111111111111111111111, 222222222222222222222222222222,\n" 1509 " 333333333333333333333333333333},\n" 1510 " {1, 2, 3},\n" 1511 " {1, 2, 3}}};"); 1512 verifyFormat( 1513 "SomeArrayOfSomeType a = {\n" 1514 " {{1, 2, 3}},\n" 1515 " {{1, 2, 3}},\n" 1516 " {{111111111111111111111111111111, 222222222222222222222222222222,\n" 1517 " 333333333333333333333333333333}},\n" 1518 " {{1, 2, 3}},\n" 1519 " {{1, 2, 3}}};"); 1520 1521 verifyFormat("struct {\n" 1522 " unsigned bit;\n" 1523 " const char *const name;\n" 1524 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n" 1525 " {kOsWin, \"Windows\"},\n" 1526 " {kOsLinux, \"Linux\"},\n" 1527 " {kOsCrOS, \"Chrome OS\"}};"); 1528 verifyFormat("struct {\n" 1529 " unsigned bit;\n" 1530 " const char *const name;\n" 1531 "} kBitsToOs[] = {\n" 1532 " {kOsMac, \"Mac\"},\n" 1533 " {kOsWin, \"Windows\"},\n" 1534 " {kOsLinux, \"Linux\"},\n" 1535 " {kOsCrOS, \"Chrome OS\"},\n" 1536 "};"); 1537 } 1538 1539 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) { 1540 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 1541 " \\\n" 1542 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)"); 1543 } 1544 1545 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) { 1546 verifyFormat("virtual void write(ELFWriter *writerrr,\n" 1547 " OwningPtr<FileOutputBuffer> &buffer) = 0;"); 1548 1549 // Do break defaulted and deleted functions. 1550 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 1551 " default;", 1552 getLLVMStyleWithColumns(40)); 1553 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 1554 " delete;", 1555 getLLVMStyleWithColumns(40)); 1556 } 1557 1558 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) { 1559 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3", 1560 getLLVMStyleWithColumns(40)); 1561 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 1562 getLLVMStyleWithColumns(40)); 1563 EXPECT_EQ("#define Q \\\n" 1564 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n" 1565 " \"aaaaaaaa.cpp\"", 1566 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 1567 getLLVMStyleWithColumns(40))); 1568 } 1569 1570 TEST_F(FormatTest, UnderstandsLinePPDirective) { 1571 EXPECT_EQ("# 123 \"A string literal\"", 1572 format(" # 123 \"A string literal\"")); 1573 } 1574 1575 TEST_F(FormatTest, LayoutUnknownPPDirective) { 1576 EXPECT_EQ("#;", format("#;")); 1577 verifyFormat("#\n;\n;\n;"); 1578 } 1579 1580 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) { 1581 EXPECT_EQ("#line 42 \"test\"\n", 1582 format("# \\\n line \\\n 42 \\\n \"test\"\n")); 1583 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n", 1584 getLLVMStyleWithColumns(12))); 1585 } 1586 1587 TEST_F(FormatTest, EndOfFileEndsPPDirective) { 1588 EXPECT_EQ("#line 42 \"test\"", 1589 format("# \\\n line \\\n 42 \\\n \"test\"")); 1590 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B")); 1591 } 1592 1593 TEST_F(FormatTest, DoesntRemoveUnknownTokens) { 1594 verifyFormat("#define A \\x20"); 1595 verifyFormat("#define A \\ x20"); 1596 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20")); 1597 verifyFormat("#define A ''"); 1598 verifyFormat("#define A ''qqq"); 1599 verifyFormat("#define A `qqq"); 1600 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");"); 1601 EXPECT_EQ("const char *c = STRINGIFY(\n" 1602 "\\na : b);", 1603 format("const char * c = STRINGIFY(\n" 1604 "\\na : b);")); 1605 1606 verifyFormat("a\r\\"); 1607 verifyFormat("a\v\\"); 1608 verifyFormat("a\f\\"); 1609 } 1610 1611 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) { 1612 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13)); 1613 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12)); 1614 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12)); 1615 // FIXME: We never break before the macro name. 1616 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12)); 1617 1618 verifyFormat("#define A A\n#define A A"); 1619 verifyFormat("#define A(X) A\n#define A A"); 1620 1621 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23)); 1622 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22)); 1623 } 1624 1625 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) { 1626 EXPECT_EQ("// somecomment\n" 1627 "#include \"a.h\"\n" 1628 "#define A( \\\n" 1629 " A, B)\n" 1630 "#include \"b.h\"\n" 1631 "// somecomment\n", 1632 format(" // somecomment\n" 1633 " #include \"a.h\"\n" 1634 "#define A(A,\\\n" 1635 " B)\n" 1636 " #include \"b.h\"\n" 1637 " // somecomment\n", 1638 getLLVMStyleWithColumns(13))); 1639 } 1640 1641 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); } 1642 1643 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) { 1644 EXPECT_EQ("#define A \\\n" 1645 " c; \\\n" 1646 " e;\n" 1647 "f;", 1648 format("#define A c; e;\n" 1649 "f;", 1650 getLLVMStyleWithColumns(14))); 1651 } 1652 1653 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); } 1654 1655 TEST_F(FormatTest, MacroDefinitionInsideStatement) { 1656 EXPECT_EQ("int x,\n" 1657 "#define A\n" 1658 " y;", 1659 format("int x,\n#define A\ny;")); 1660 } 1661 1662 TEST_F(FormatTest, HashInMacroDefinition) { 1663 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle())); 1664 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11)); 1665 verifyFormat("#define A \\\n" 1666 " { \\\n" 1667 " f(#c); \\\n" 1668 " }", 1669 getLLVMStyleWithColumns(11)); 1670 1671 verifyFormat("#define A(X) \\\n" 1672 " void function##X()", 1673 getLLVMStyleWithColumns(22)); 1674 1675 verifyFormat("#define A(a, b, c) \\\n" 1676 " void a##b##c()", 1677 getLLVMStyleWithColumns(22)); 1678 1679 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22)); 1680 } 1681 1682 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) { 1683 EXPECT_EQ("#define A (x)", format("#define A (x)")); 1684 EXPECT_EQ("#define A(x)", format("#define A(x)")); 1685 } 1686 1687 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) { 1688 EXPECT_EQ("#define A b;", format("#define A \\\n" 1689 " \\\n" 1690 " b;", 1691 getLLVMStyleWithColumns(25))); 1692 EXPECT_EQ("#define A \\\n" 1693 " \\\n" 1694 " a; \\\n" 1695 " b;", 1696 format("#define A \\\n" 1697 " \\\n" 1698 " a; \\\n" 1699 " b;", 1700 getLLVMStyleWithColumns(11))); 1701 EXPECT_EQ("#define A \\\n" 1702 " a; \\\n" 1703 " \\\n" 1704 " b;", 1705 format("#define A \\\n" 1706 " a; \\\n" 1707 " \\\n" 1708 " b;", 1709 getLLVMStyleWithColumns(11))); 1710 } 1711 1712 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) { 1713 verifyIncompleteFormat("#define A :"); 1714 verifyFormat("#define SOMECASES \\\n" 1715 " case 1: \\\n" 1716 " case 2\n", 1717 getLLVMStyleWithColumns(20)); 1718 verifyFormat("#define MACRO(a) \\\n" 1719 " if (a) \\\n" 1720 " f(); \\\n" 1721 " else \\\n" 1722 " g()", 1723 getLLVMStyleWithColumns(18)); 1724 verifyFormat("#define A template <typename T>"); 1725 verifyIncompleteFormat("#define STR(x) #x\n" 1726 "f(STR(this_is_a_string_literal{));"); 1727 verifyFormat("#pragma omp threadprivate( \\\n" 1728 " y)), // expected-warning", 1729 getLLVMStyleWithColumns(28)); 1730 verifyFormat("#d, = };"); 1731 verifyFormat("#if \"a"); 1732 verifyIncompleteFormat("({\n" 1733 "#define b \\\n" 1734 " } \\\n" 1735 " a\n" 1736 "a", 1737 getLLVMStyleWithColumns(15)); 1738 verifyFormat("#define A \\\n" 1739 " { \\\n" 1740 " {\n" 1741 "#define B \\\n" 1742 " } \\\n" 1743 " }", 1744 getLLVMStyleWithColumns(15)); 1745 verifyNoCrash("#if a\na(\n#else\n#endif\n{a"); 1746 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}"); 1747 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};"); 1748 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}"); 1749 } 1750 1751 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) { 1752 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline. 1753 EXPECT_EQ("class A : public QObject {\n" 1754 " Q_OBJECT\n" 1755 "\n" 1756 " A() {}\n" 1757 "};", 1758 format("class A : public QObject {\n" 1759 " Q_OBJECT\n" 1760 "\n" 1761 " A() {\n}\n" 1762 "} ;")); 1763 EXPECT_EQ("MACRO\n" 1764 "/*static*/ int i;", 1765 format("MACRO\n" 1766 " /*static*/ int i;")); 1767 EXPECT_EQ("SOME_MACRO\n" 1768 "namespace {\n" 1769 "void f();\n" 1770 "}", 1771 format("SOME_MACRO\n" 1772 " namespace {\n" 1773 "void f( );\n" 1774 "}")); 1775 // Only if the identifier contains at least 5 characters. 1776 EXPECT_EQ("HTTP f();", format("HTTP\nf();")); 1777 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();")); 1778 // Only if everything is upper case. 1779 EXPECT_EQ("class A : public QObject {\n" 1780 " Q_Object A() {}\n" 1781 "};", 1782 format("class A : public QObject {\n" 1783 " Q_Object\n" 1784 " A() {\n}\n" 1785 "} ;")); 1786 1787 // Only if the next line can actually start an unwrapped line. 1788 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;", 1789 format("SOME_WEIRD_LOG_MACRO\n" 1790 "<< SomeThing;")); 1791 1792 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), " 1793 "(n, buffers))\n", 1794 getChromiumStyle(FormatStyle::LK_Cpp)); 1795 } 1796 1797 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) { 1798 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 1799 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 1800 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 1801 "class X {};\n" 1802 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 1803 "int *createScopDetectionPass() { return 0; }", 1804 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 1805 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 1806 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 1807 " class X {};\n" 1808 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 1809 " int *createScopDetectionPass() { return 0; }")); 1810 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as 1811 // braces, so that inner block is indented one level more. 1812 EXPECT_EQ("int q() {\n" 1813 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 1814 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 1815 " IPC_END_MESSAGE_MAP()\n" 1816 "}", 1817 format("int q() {\n" 1818 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 1819 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 1820 " IPC_END_MESSAGE_MAP()\n" 1821 "}")); 1822 1823 // Same inside macros. 1824 EXPECT_EQ("#define LIST(L) \\\n" 1825 " L(A) \\\n" 1826 " L(B) \\\n" 1827 " L(C)", 1828 format("#define LIST(L) \\\n" 1829 " L(A) \\\n" 1830 " L(B) \\\n" 1831 " L(C)", 1832 getGoogleStyle())); 1833 1834 // These must not be recognized as macros. 1835 EXPECT_EQ("int q() {\n" 1836 " f(x);\n" 1837 " f(x) {}\n" 1838 " f(x)->g();\n" 1839 " f(x)->*g();\n" 1840 " f(x).g();\n" 1841 " f(x) = x;\n" 1842 " f(x) += x;\n" 1843 " f(x) -= x;\n" 1844 " f(x) *= x;\n" 1845 " f(x) /= x;\n" 1846 " f(x) %= x;\n" 1847 " f(x) &= x;\n" 1848 " f(x) |= x;\n" 1849 " f(x) ^= x;\n" 1850 " f(x) >>= x;\n" 1851 " f(x) <<= x;\n" 1852 " f(x)[y].z();\n" 1853 " LOG(INFO) << x;\n" 1854 " ifstream(x) >> x;\n" 1855 "}\n", 1856 format("int q() {\n" 1857 " f(x)\n;\n" 1858 " f(x)\n {}\n" 1859 " f(x)\n->g();\n" 1860 " f(x)\n->*g();\n" 1861 " f(x)\n.g();\n" 1862 " f(x)\n = x;\n" 1863 " f(x)\n += x;\n" 1864 " f(x)\n -= x;\n" 1865 " f(x)\n *= x;\n" 1866 " f(x)\n /= x;\n" 1867 " f(x)\n %= x;\n" 1868 " f(x)\n &= x;\n" 1869 " f(x)\n |= x;\n" 1870 " f(x)\n ^= x;\n" 1871 " f(x)\n >>= x;\n" 1872 " f(x)\n <<= x;\n" 1873 " f(x)\n[y].z();\n" 1874 " LOG(INFO)\n << x;\n" 1875 " ifstream(x)\n >> x;\n" 1876 "}\n")); 1877 EXPECT_EQ("int q() {\n" 1878 " F(x)\n" 1879 " if (1) {\n" 1880 " }\n" 1881 " F(x)\n" 1882 " while (1) {\n" 1883 " }\n" 1884 " F(x)\n" 1885 " G(x);\n" 1886 " F(x)\n" 1887 " try {\n" 1888 " Q();\n" 1889 " } catch (...) {\n" 1890 " }\n" 1891 "}\n", 1892 format("int q() {\n" 1893 "F(x)\n" 1894 "if (1) {}\n" 1895 "F(x)\n" 1896 "while (1) {}\n" 1897 "F(x)\n" 1898 "G(x);\n" 1899 "F(x)\n" 1900 "try { Q(); } catch (...) {}\n" 1901 "}\n")); 1902 EXPECT_EQ("class A {\n" 1903 " A() : t(0) {}\n" 1904 " A(int i) noexcept() : {}\n" 1905 " A(X x)\n" // FIXME: function-level try blocks are broken. 1906 " try : t(0) {\n" 1907 " } catch (...) {\n" 1908 " }\n" 1909 "};", 1910 format("class A {\n" 1911 " A()\n : t(0) {}\n" 1912 " A(int i)\n noexcept() : {}\n" 1913 " A(X x)\n" 1914 " try : t(0) {} catch (...) {}\n" 1915 "};")); 1916 EXPECT_EQ("class SomeClass {\n" 1917 "public:\n" 1918 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 1919 "};", 1920 format("class SomeClass {\n" 1921 "public:\n" 1922 " SomeClass()\n" 1923 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 1924 "};")); 1925 EXPECT_EQ("class SomeClass {\n" 1926 "public:\n" 1927 " SomeClass()\n" 1928 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 1929 "};", 1930 format("class SomeClass {\n" 1931 "public:\n" 1932 " SomeClass()\n" 1933 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 1934 "};", 1935 getLLVMStyleWithColumns(40))); 1936 1937 verifyFormat("MACRO(>)"); 1938 } 1939 1940 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) { 1941 verifyFormat("#define A \\\n" 1942 " f({ \\\n" 1943 " g(); \\\n" 1944 " });", 1945 getLLVMStyleWithColumns(11)); 1946 } 1947 1948 TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) { 1949 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}")); 1950 } 1951 1952 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) { 1953 verifyFormat("{\n { a #c; }\n}"); 1954 } 1955 1956 TEST_F(FormatTest, FormatUnbalancedStructuralElements) { 1957 EXPECT_EQ("#define A \\\n { \\\n {\nint i;", 1958 format("#define A { {\nint i;", getLLVMStyleWithColumns(11))); 1959 EXPECT_EQ("#define A \\\n } \\\n }\nint i;", 1960 format("#define A } }\nint i;", getLLVMStyleWithColumns(11))); 1961 } 1962 1963 TEST_F(FormatTest, EscapedNewlines) { 1964 EXPECT_EQ( 1965 "#define A \\\n int i; \\\n int j;", 1966 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11))); 1967 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;")); 1968 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 1969 EXPECT_EQ("/* \\ \\ \\\n*/", format("\\\n/* \\ \\ \\\n*/")); 1970 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>")); 1971 } 1972 1973 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) { 1974 verifyFormat("#define A \\\n" 1975 " int v( \\\n" 1976 " a); \\\n" 1977 " int i;", 1978 getLLVMStyleWithColumns(11)); 1979 } 1980 1981 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) { 1982 EXPECT_EQ( 1983 "#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 1984 " \\\n" 1985 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 1986 "\n" 1987 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 1988 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n", 1989 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro(" 1990 "\\\n" 1991 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 1992 " \n" 1993 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 1994 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n")); 1995 } 1996 1997 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) { 1998 EXPECT_EQ("int\n" 1999 "#define A\n" 2000 " a;", 2001 format("int\n#define A\na;")); 2002 verifyFormat("functionCallTo(\n" 2003 " someOtherFunction(\n" 2004 " withSomeParameters, whichInSequence,\n" 2005 " areLongerThanALine(andAnotherCall,\n" 2006 "#define A B\n" 2007 " withMoreParamters,\n" 2008 " whichStronglyInfluenceTheLayout),\n" 2009 " andMoreParameters),\n" 2010 " trailing);", 2011 getLLVMStyleWithColumns(69)); 2012 verifyFormat("Foo::Foo()\n" 2013 "#ifdef BAR\n" 2014 " : baz(0)\n" 2015 "#endif\n" 2016 "{\n" 2017 "}"); 2018 verifyFormat("void f() {\n" 2019 " if (true)\n" 2020 "#ifdef A\n" 2021 " f(42);\n" 2022 " x();\n" 2023 "#else\n" 2024 " g();\n" 2025 " x();\n" 2026 "#endif\n" 2027 "}"); 2028 verifyFormat("void f(param1, param2,\n" 2029 " param3,\n" 2030 "#ifdef A\n" 2031 " param4(param5,\n" 2032 "#ifdef A1\n" 2033 " param6,\n" 2034 "#ifdef A2\n" 2035 " param7),\n" 2036 "#else\n" 2037 " param8),\n" 2038 " param9,\n" 2039 "#endif\n" 2040 " param10,\n" 2041 "#endif\n" 2042 " param11)\n" 2043 "#else\n" 2044 " param12)\n" 2045 "#endif\n" 2046 "{\n" 2047 " x();\n" 2048 "}", 2049 getLLVMStyleWithColumns(28)); 2050 verifyFormat("#if 1\n" 2051 "int i;"); 2052 verifyFormat("#if 1\n" 2053 "#endif\n" 2054 "#if 1\n" 2055 "#else\n" 2056 "#endif\n"); 2057 verifyFormat("DEBUG({\n" 2058 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 2059 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 2060 "});\n" 2061 "#if a\n" 2062 "#else\n" 2063 "#endif"); 2064 2065 verifyIncompleteFormat("void f(\n" 2066 "#if A\n" 2067 " );\n" 2068 "#else\n" 2069 "#endif"); 2070 } 2071 2072 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) { 2073 verifyFormat("#endif\n" 2074 "#if B"); 2075 } 2076 2077 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) { 2078 FormatStyle SingleLine = getLLVMStyle(); 2079 SingleLine.AllowShortIfStatementsOnASingleLine = true; 2080 verifyFormat("#if 0\n" 2081 "#elif 1\n" 2082 "#endif\n" 2083 "void foo() {\n" 2084 " if (test) foo2();\n" 2085 "}", 2086 SingleLine); 2087 } 2088 2089 TEST_F(FormatTest, LayoutBlockInsideParens) { 2090 verifyFormat("functionCall({ int i; });"); 2091 verifyFormat("functionCall({\n" 2092 " int i;\n" 2093 " int j;\n" 2094 "});"); 2095 verifyFormat("functionCall(\n" 2096 " {\n" 2097 " int i;\n" 2098 " int j;\n" 2099 " },\n" 2100 " aaaa, bbbb, cccc);"); 2101 verifyFormat("functionA(functionB({\n" 2102 " int i;\n" 2103 " int j;\n" 2104 " }),\n" 2105 " aaaa, bbbb, cccc);"); 2106 verifyFormat("functionCall(\n" 2107 " {\n" 2108 " int i;\n" 2109 " int j;\n" 2110 " },\n" 2111 " aaaa, bbbb, // comment\n" 2112 " cccc);"); 2113 verifyFormat("functionA(functionB({\n" 2114 " int i;\n" 2115 " int j;\n" 2116 " }),\n" 2117 " aaaa, bbbb, // comment\n" 2118 " cccc);"); 2119 verifyFormat("functionCall(aaaa, bbbb, { int i; });"); 2120 verifyFormat("functionCall(aaaa, bbbb, {\n" 2121 " int i;\n" 2122 " int j;\n" 2123 "});"); 2124 verifyFormat( 2125 "Aaa(\n" // FIXME: There shouldn't be a linebreak here. 2126 " {\n" 2127 " int i; // break\n" 2128 " },\n" 2129 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 2130 " ccccccccccccccccc));"); 2131 verifyFormat("DEBUG({\n" 2132 " if (a)\n" 2133 " f();\n" 2134 "});"); 2135 } 2136 2137 TEST_F(FormatTest, LayoutBlockInsideStatement) { 2138 EXPECT_EQ("SOME_MACRO { int i; }\n" 2139 "int i;", 2140 format(" SOME_MACRO {int i;} int i;")); 2141 } 2142 2143 TEST_F(FormatTest, LayoutNestedBlocks) { 2144 verifyFormat("void AddOsStrings(unsigned bitmask) {\n" 2145 " struct s {\n" 2146 " int i;\n" 2147 " };\n" 2148 " s kBitsToOs[] = {{10}};\n" 2149 " for (int i = 0; i < 10; ++i)\n" 2150 " return;\n" 2151 "}"); 2152 verifyFormat("call(parameter, {\n" 2153 " something();\n" 2154 " // Comment using all columns.\n" 2155 " somethingelse();\n" 2156 "});", 2157 getLLVMStyleWithColumns(40)); 2158 verifyFormat("DEBUG( //\n" 2159 " { f(); }, a);"); 2160 verifyFormat("DEBUG( //\n" 2161 " {\n" 2162 " f(); //\n" 2163 " },\n" 2164 " a);"); 2165 2166 EXPECT_EQ("call(parameter, {\n" 2167 " something();\n" 2168 " // Comment too\n" 2169 " // looooooooooong.\n" 2170 " somethingElse();\n" 2171 "});", 2172 format("call(parameter, {\n" 2173 " something();\n" 2174 " // Comment too looooooooooong.\n" 2175 " somethingElse();\n" 2176 "});", 2177 getLLVMStyleWithColumns(29))); 2178 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });")); 2179 EXPECT_EQ("DEBUG({ // comment\n" 2180 " int i;\n" 2181 "});", 2182 format("DEBUG({ // comment\n" 2183 "int i;\n" 2184 "});")); 2185 EXPECT_EQ("DEBUG({\n" 2186 " int i;\n" 2187 "\n" 2188 " // comment\n" 2189 " int j;\n" 2190 "});", 2191 format("DEBUG({\n" 2192 " int i;\n" 2193 "\n" 2194 " // comment\n" 2195 " int j;\n" 2196 "});")); 2197 2198 verifyFormat("DEBUG({\n" 2199 " if (a)\n" 2200 " return;\n" 2201 "});"); 2202 verifyGoogleFormat("DEBUG({\n" 2203 " if (a) return;\n" 2204 "});"); 2205 FormatStyle Style = getGoogleStyle(); 2206 Style.ColumnLimit = 45; 2207 verifyFormat("Debug(aaaaa,\n" 2208 " {\n" 2209 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n" 2210 " },\n" 2211 " a);", 2212 Style); 2213 2214 verifyFormat("SomeFunction({MACRO({ return output; }), b});"); 2215 2216 verifyNoCrash("^{v^{a}}"); 2217 } 2218 2219 TEST_F(FormatTest, FormatNestedBlocksInMacros) { 2220 EXPECT_EQ("#define MACRO() \\\n" 2221 " Debug(aaa, /* force line break */ \\\n" 2222 " { \\\n" 2223 " int i; \\\n" 2224 " int j; \\\n" 2225 " })", 2226 format("#define MACRO() Debug(aaa, /* force line break */ \\\n" 2227 " { int i; int j; })", 2228 getGoogleStyle())); 2229 2230 EXPECT_EQ("#define A \\\n" 2231 " [] { \\\n" 2232 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 2233 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n" 2234 " }", 2235 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 2236 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }", 2237 getGoogleStyle())); 2238 } 2239 2240 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) { 2241 EXPECT_EQ("{}", format("{}")); 2242 verifyFormat("enum E {};"); 2243 verifyFormat("enum E {}"); 2244 } 2245 2246 TEST_F(FormatTest, FormatBeginBlockEndMacros) { 2247 FormatStyle Style = getLLVMStyle(); 2248 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$"; 2249 Style.MacroBlockEnd = "^[A-Z_]+_END$"; 2250 verifyFormat("FOO_BEGIN\n" 2251 " FOO_ENTRY\n" 2252 "FOO_END", Style); 2253 verifyFormat("FOO_BEGIN\n" 2254 " NESTED_FOO_BEGIN\n" 2255 " NESTED_FOO_ENTRY\n" 2256 " NESTED_FOO_END\n" 2257 "FOO_END", Style); 2258 verifyFormat("FOO_BEGIN(Foo, Bar)\n" 2259 " int x;\n" 2260 " x = 1;\n" 2261 "FOO_END(Baz)", Style); 2262 } 2263 2264 //===----------------------------------------------------------------------===// 2265 // Line break tests. 2266 //===----------------------------------------------------------------------===// 2267 2268 TEST_F(FormatTest, PreventConfusingIndents) { 2269 verifyFormat( 2270 "void f() {\n" 2271 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n" 2272 " parameter, parameter, parameter)),\n" 2273 " SecondLongCall(parameter));\n" 2274 "}"); 2275 verifyFormat( 2276 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 2277 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 2278 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 2279 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 2280 verifyFormat( 2281 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2282 " [aaaaaaaaaaaaaaaaaaaaaaaa\n" 2283 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 2284 " [aaaaaaaaaaaaaaaaaaaaaaaa]];"); 2285 verifyFormat( 2286 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 2287 " aaaaaaaaaaaaaaaaaaaaaaaa<\n" 2288 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n" 2289 " aaaaaaaaaaaaaaaaaaaaaaaa>;"); 2290 verifyFormat("int a = bbbb && ccc &&\n" 2291 " fffff(\n" 2292 "#define A Just forcing a new line\n" 2293 " ddd);"); 2294 } 2295 2296 TEST_F(FormatTest, LineBreakingInBinaryExpressions) { 2297 verifyFormat( 2298 "bool aaaaaaa =\n" 2299 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n" 2300 " bbbbbbbb();"); 2301 verifyFormat( 2302 "bool aaaaaaa =\n" 2303 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n" 2304 " bbbbbbbb();"); 2305 2306 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 2307 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n" 2308 " ccccccccc == ddddddddddd;"); 2309 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 2310 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n" 2311 " ccccccccc == ddddddddddd;"); 2312 verifyFormat( 2313 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 2314 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n" 2315 " ccccccccc == ddddddddddd;"); 2316 2317 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 2318 " aaaaaa) &&\n" 2319 " bbbbbb && cccccc;"); 2320 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 2321 " aaaaaa) >>\n" 2322 " bbbbbb;"); 2323 verifyFormat("aa = Whitespaces.addUntouchableComment(\n" 2324 " SourceMgr.getSpellingColumnNumber(\n" 2325 " TheLine.Last->FormatTok.Tok.getLocation()) -\n" 2326 " 1);"); 2327 2328 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 2329 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n" 2330 " cccccc) {\n}"); 2331 verifyFormat("b = a &&\n" 2332 " // Comment\n" 2333 " b.c && d;"); 2334 2335 // If the LHS of a comparison is not a binary expression itself, the 2336 // additional linebreak confuses many people. 2337 verifyFormat( 2338 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 2339 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n" 2340 "}"); 2341 verifyFormat( 2342 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 2343 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 2344 "}"); 2345 verifyFormat( 2346 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n" 2347 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 2348 "}"); 2349 // Even explicit parentheses stress the precedence enough to make the 2350 // additional break unnecessary. 2351 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 2352 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 2353 "}"); 2354 // This cases is borderline, but with the indentation it is still readable. 2355 verifyFormat( 2356 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 2357 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 2358 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 2359 "}", 2360 getLLVMStyleWithColumns(75)); 2361 2362 // If the LHS is a binary expression, we should still use the additional break 2363 // as otherwise the formatting hides the operator precedence. 2364 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 2365 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 2366 " 5) {\n" 2367 "}"); 2368 2369 FormatStyle OnePerLine = getLLVMStyle(); 2370 OnePerLine.BinPackParameters = false; 2371 verifyFormat( 2372 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 2373 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 2374 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}", 2375 OnePerLine); 2376 2377 verifyFormat("int i = someFunction(aaaaaaa, 0)\n" 2378 " .aaa(aaaaaaaaaaaaa) *\n" 2379 " aaaaaaa +\n" 2380 " aaaaaaa;", 2381 getLLVMStyleWithColumns(40)); 2382 } 2383 2384 TEST_F(FormatTest, ExpressionIndentation) { 2385 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 2386 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 2387 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 2388 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 2389 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 2390 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n" 2391 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 2392 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n" 2393 " ccccccccccccccccccccccccccccccccccccccccc;"); 2394 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 2395 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 2396 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 2397 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 2398 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 2399 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 2400 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 2401 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 2402 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 2403 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 2404 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 2405 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 2406 verifyFormat("if () {\n" 2407 "} else if (aaaaa && bbbbb > // break\n" 2408 " ccccc) {\n" 2409 "}"); 2410 verifyFormat("if () {\n" 2411 "} else if (aaaaa &&\n" 2412 " bbbbb > // break\n" 2413 " ccccc &&\n" 2414 " ddddd) {\n" 2415 "}"); 2416 2417 // Presence of a trailing comment used to change indentation of b. 2418 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n" 2419 " b;\n" 2420 "return aaaaaaaaaaaaaaaaaaa +\n" 2421 " b; //", 2422 getLLVMStyleWithColumns(30)); 2423 } 2424 2425 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) { 2426 // Not sure what the best system is here. Like this, the LHS can be found 2427 // immediately above an operator (everything with the same or a higher 2428 // indent). The RHS is aligned right of the operator and so compasses 2429 // everything until something with the same indent as the operator is found. 2430 // FIXME: Is this a good system? 2431 FormatStyle Style = getLLVMStyle(); 2432 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 2433 verifyFormat( 2434 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2435 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2436 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2437 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2438 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 2439 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 2440 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2441 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2442 " > ccccccccccccccccccccccccccccccccccccccccc;", 2443 Style); 2444 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2445 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2446 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2447 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 2448 Style); 2449 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2450 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2451 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2452 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 2453 Style); 2454 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2455 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2456 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2457 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 2458 Style); 2459 verifyFormat("if () {\n" 2460 "} else if (aaaaa\n" 2461 " && bbbbb // break\n" 2462 " > ccccc) {\n" 2463 "}", 2464 Style); 2465 verifyFormat("return (a)\n" 2466 " // comment\n" 2467 " + b;", 2468 Style); 2469 verifyFormat( 2470 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2471 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 2472 " + cc;", 2473 Style); 2474 2475 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2476 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 2477 Style); 2478 2479 // Forced by comments. 2480 verifyFormat( 2481 "unsigned ContentSize =\n" 2482 " sizeof(int16_t) // DWARF ARange version number\n" 2483 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 2484 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 2485 " + sizeof(int8_t); // Segment Size (in bytes)"); 2486 2487 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n" 2488 " == boost::fusion::at_c<1>(iiii).second;", 2489 Style); 2490 2491 Style.ColumnLimit = 60; 2492 verifyFormat("zzzzzzzzzz\n" 2493 " = bbbbbbbbbbbbbbbbb\n" 2494 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);", 2495 Style); 2496 } 2497 2498 TEST_F(FormatTest, EnforcedOperatorWraps) { 2499 // Here we'd like to wrap after the || operators, but a comment is forcing an 2500 // earlier wrap. 2501 verifyFormat("bool x = aaaaa //\n" 2502 " || bbbbb\n" 2503 " //\n" 2504 " || cccc;"); 2505 } 2506 2507 TEST_F(FormatTest, NoOperandAlignment) { 2508 FormatStyle Style = getLLVMStyle(); 2509 Style.AlignOperands = false; 2510 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n" 2511 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 2512 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 2513 Style); 2514 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 2515 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2516 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2517 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2518 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2519 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 2520 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 2521 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2522 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2523 " > ccccccccccccccccccccccccccccccccccccccccc;", 2524 Style); 2525 2526 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2527 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 2528 " + cc;", 2529 Style); 2530 verifyFormat("int a = aa\n" 2531 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 2532 " * cccccccccccccccccccccccccccccccccccc;\n", 2533 Style); 2534 2535 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 2536 verifyFormat("return (a > b\n" 2537 " // comment1\n" 2538 " // comment2\n" 2539 " || c);", 2540 Style); 2541 } 2542 2543 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) { 2544 FormatStyle Style = getLLVMStyle(); 2545 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 2546 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 2547 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2548 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 2549 Style); 2550 } 2551 2552 TEST_F(FormatTest, ConstructorInitializers) { 2553 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 2554 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}", 2555 getLLVMStyleWithColumns(45)); 2556 verifyFormat("Constructor()\n" 2557 " : Inttializer(FitsOnTheLine) {}", 2558 getLLVMStyleWithColumns(44)); 2559 verifyFormat("Constructor()\n" 2560 " : Inttializer(FitsOnTheLine) {}", 2561 getLLVMStyleWithColumns(43)); 2562 2563 verifyFormat("template <typename T>\n" 2564 "Constructor() : Initializer(FitsOnTheLine) {}", 2565 getLLVMStyleWithColumns(45)); 2566 2567 verifyFormat( 2568 "SomeClass::Constructor()\n" 2569 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 2570 2571 verifyFormat( 2572 "SomeClass::Constructor()\n" 2573 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 2574 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}"); 2575 verifyFormat( 2576 "SomeClass::Constructor()\n" 2577 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 2578 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 2579 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 2580 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 2581 " : aaaaaaaaaa(aaaaaa) {}"); 2582 2583 verifyFormat("Constructor()\n" 2584 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 2585 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 2586 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 2587 " aaaaaaaaaaaaaaaaaaaaaaa() {}"); 2588 2589 verifyFormat("Constructor()\n" 2590 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 2591 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 2592 2593 verifyFormat("Constructor(int Parameter = 0)\n" 2594 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 2595 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}"); 2596 verifyFormat("Constructor()\n" 2597 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 2598 "}", 2599 getLLVMStyleWithColumns(60)); 2600 verifyFormat("Constructor()\n" 2601 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 2602 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}"); 2603 2604 // Here a line could be saved by splitting the second initializer onto two 2605 // lines, but that is not desirable. 2606 verifyFormat("Constructor()\n" 2607 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 2608 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 2609 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 2610 2611 FormatStyle OnePerLine = getLLVMStyle(); 2612 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 2613 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false; 2614 verifyFormat("SomeClass::Constructor()\n" 2615 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 2616 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 2617 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 2618 OnePerLine); 2619 verifyFormat("SomeClass::Constructor()\n" 2620 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 2621 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 2622 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 2623 OnePerLine); 2624 verifyFormat("MyClass::MyClass(int var)\n" 2625 " : some_var_(var), // 4 space indent\n" 2626 " some_other_var_(var + 1) { // lined up\n" 2627 "}", 2628 OnePerLine); 2629 verifyFormat("Constructor()\n" 2630 " : aaaaa(aaaaaa),\n" 2631 " aaaaa(aaaaaa),\n" 2632 " aaaaa(aaaaaa),\n" 2633 " aaaaa(aaaaaa),\n" 2634 " aaaaa(aaaaaa) {}", 2635 OnePerLine); 2636 verifyFormat("Constructor()\n" 2637 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 2638 " aaaaaaaaaaaaaaaaaaaaaa) {}", 2639 OnePerLine); 2640 OnePerLine.BinPackParameters = false; 2641 verifyFormat( 2642 "Constructor()\n" 2643 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n" 2644 " aaaaaaaaaaa().aaa(),\n" 2645 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 2646 OnePerLine); 2647 OnePerLine.ColumnLimit = 60; 2648 verifyFormat("Constructor()\n" 2649 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 2650 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 2651 OnePerLine); 2652 2653 EXPECT_EQ("Constructor()\n" 2654 " : // Comment forcing unwanted break.\n" 2655 " aaaa(aaaa) {}", 2656 format("Constructor() :\n" 2657 " // Comment forcing unwanted break.\n" 2658 " aaaa(aaaa) {}")); 2659 } 2660 2661 TEST_F(FormatTest, MemoizationTests) { 2662 // This breaks if the memoization lookup does not take \c Indent and 2663 // \c LastSpace into account. 2664 verifyFormat( 2665 "extern CFRunLoopTimerRef\n" 2666 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n" 2667 " CFTimeInterval interval, CFOptionFlags flags,\n" 2668 " CFIndex order, CFRunLoopTimerCallBack callout,\n" 2669 " CFRunLoopTimerContext *context) {}"); 2670 2671 // Deep nesting somewhat works around our memoization. 2672 verifyFormat( 2673 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 2674 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 2675 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 2676 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 2677 " aaaaa())))))))))))))))))))))))))))))))))))))));", 2678 getLLVMStyleWithColumns(65)); 2679 verifyFormat( 2680 "aaaaa(\n" 2681 " aaaaa,\n" 2682 " aaaaa(\n" 2683 " aaaaa,\n" 2684 " aaaaa(\n" 2685 " aaaaa,\n" 2686 " aaaaa(\n" 2687 " aaaaa,\n" 2688 " aaaaa(\n" 2689 " aaaaa,\n" 2690 " aaaaa(\n" 2691 " aaaaa,\n" 2692 " aaaaa(\n" 2693 " aaaaa,\n" 2694 " aaaaa(\n" 2695 " aaaaa,\n" 2696 " aaaaa(\n" 2697 " aaaaa,\n" 2698 " aaaaa(\n" 2699 " aaaaa,\n" 2700 " aaaaa(\n" 2701 " aaaaa,\n" 2702 " aaaaa(\n" 2703 " aaaaa,\n" 2704 " aaaaa))))))))))));", 2705 getLLVMStyleWithColumns(65)); 2706 verifyFormat( 2707 "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" 2708 " a),\n" 2709 " a),\n" 2710 " a),\n" 2711 " a),\n" 2712 " a),\n" 2713 " a),\n" 2714 " a),\n" 2715 " a),\n" 2716 " a),\n" 2717 " a),\n" 2718 " a),\n" 2719 " a),\n" 2720 " a),\n" 2721 " a),\n" 2722 " a),\n" 2723 " a),\n" 2724 " a)", 2725 getLLVMStyleWithColumns(65)); 2726 2727 // This test takes VERY long when memoization is broken. 2728 FormatStyle OnePerLine = getLLVMStyle(); 2729 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 2730 OnePerLine.BinPackParameters = false; 2731 std::string input = "Constructor()\n" 2732 " : aaaa(a,\n"; 2733 for (unsigned i = 0, e = 80; i != e; ++i) { 2734 input += " a,\n"; 2735 } 2736 input += " a) {}"; 2737 verifyFormat(input, OnePerLine); 2738 } 2739 2740 TEST_F(FormatTest, BreaksAsHighAsPossible) { 2741 verifyFormat( 2742 "void f() {\n" 2743 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n" 2744 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n" 2745 " f();\n" 2746 "}"); 2747 verifyFormat("if (Intervals[i].getRange().getFirst() <\n" 2748 " Intervals[i - 1].getRange().getLast()) {\n}"); 2749 } 2750 2751 TEST_F(FormatTest, BreaksFunctionDeclarations) { 2752 // Principially, we break function declarations in a certain order: 2753 // 1) break amongst arguments. 2754 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n" 2755 " Cccccccccccccc cccccccccccccc);"); 2756 verifyFormat("template <class TemplateIt>\n" 2757 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n" 2758 " TemplateIt *stop) {}"); 2759 2760 // 2) break after return type. 2761 verifyFormat( 2762 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2763 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);", 2764 getGoogleStyle()); 2765 2766 // 3) break after (. 2767 verifyFormat( 2768 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n" 2769 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);", 2770 getGoogleStyle()); 2771 2772 // 4) break before after nested name specifiers. 2773 verifyFormat( 2774 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2775 "SomeClasssssssssssssssssssssssssssssssssssssss::\n" 2776 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);", 2777 getGoogleStyle()); 2778 2779 // However, there are exceptions, if a sufficient amount of lines can be 2780 // saved. 2781 // FIXME: The precise cut-offs wrt. the number of saved lines might need some 2782 // more adjusting. 2783 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 2784 " Cccccccccccccc cccccccccc,\n" 2785 " Cccccccccccccc cccccccccc,\n" 2786 " Cccccccccccccc cccccccccc,\n" 2787 " Cccccccccccccc cccccccccc);"); 2788 verifyFormat( 2789 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2790 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 2791 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 2792 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);", 2793 getGoogleStyle()); 2794 verifyFormat( 2795 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 2796 " Cccccccccccccc cccccccccc,\n" 2797 " Cccccccccccccc cccccccccc,\n" 2798 " Cccccccccccccc cccccccccc,\n" 2799 " Cccccccccccccc cccccccccc,\n" 2800 " Cccccccccccccc cccccccccc,\n" 2801 " Cccccccccccccc cccccccccc);"); 2802 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 2803 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 2804 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 2805 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 2806 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);"); 2807 2808 // Break after multi-line parameters. 2809 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 2810 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2811 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 2812 " bbbb bbbb);"); 2813 verifyFormat("void SomeLoooooooooooongFunction(\n" 2814 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 2815 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 2816 " int bbbbbbbbbbbbb);"); 2817 2818 // Treat overloaded operators like other functions. 2819 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 2820 "operator>(const SomeLoooooooooooooooooooooooooogType &other);"); 2821 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 2822 "operator>>(const SomeLooooooooooooooooooooooooogType &other);"); 2823 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 2824 "operator<<(const SomeLooooooooooooooooooooooooogType &other);"); 2825 verifyGoogleFormat( 2826 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n" 2827 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 2828 verifyGoogleFormat( 2829 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n" 2830 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 2831 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 2832 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 2833 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n" 2834 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 2835 verifyGoogleFormat( 2836 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n" 2837 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 2838 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}"); 2839 verifyGoogleFormat( 2840 "template <typename T>\n" 2841 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2842 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n" 2843 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);"); 2844 2845 FormatStyle Style = getLLVMStyle(); 2846 Style.PointerAlignment = FormatStyle::PAS_Left; 2847 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 2848 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}", 2849 Style); 2850 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n" 2851 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 2852 Style); 2853 } 2854 2855 TEST_F(FormatTest, TrailingReturnType) { 2856 verifyFormat("auto foo() -> int;\n"); 2857 verifyFormat("struct S {\n" 2858 " auto bar() const -> int;\n" 2859 "};"); 2860 verifyFormat("template <size_t Order, typename T>\n" 2861 "auto load_img(const std::string &filename)\n" 2862 " -> alias::tensor<Order, T, mem::tag::cpu> {}"); 2863 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n" 2864 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}"); 2865 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}"); 2866 verifyFormat("template <typename T>\n" 2867 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n" 2868 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());"); 2869 2870 // Not trailing return types. 2871 verifyFormat("void f() { auto a = b->c(); }"); 2872 } 2873 2874 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) { 2875 // Avoid breaking before trailing 'const' or other trailing annotations, if 2876 // they are not function-like. 2877 FormatStyle Style = getGoogleStyle(); 2878 Style.ColumnLimit = 47; 2879 verifyFormat("void someLongFunction(\n" 2880 " int someLoooooooooooooongParameter) const {\n}", 2881 getLLVMStyleWithColumns(47)); 2882 verifyFormat("LoooooongReturnType\n" 2883 "someLoooooooongFunction() const {}", 2884 getLLVMStyleWithColumns(47)); 2885 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n" 2886 " const {}", 2887 Style); 2888 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 2889 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;"); 2890 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 2891 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;"); 2892 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 2893 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;"); 2894 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n" 2895 " aaaaaaaaaaa aaaaa) const override;"); 2896 verifyGoogleFormat( 2897 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 2898 " const override;"); 2899 2900 // Even if the first parameter has to be wrapped. 2901 verifyFormat("void someLongFunction(\n" 2902 " int someLongParameter) const {}", 2903 getLLVMStyleWithColumns(46)); 2904 verifyFormat("void someLongFunction(\n" 2905 " int someLongParameter) const {}", 2906 Style); 2907 verifyFormat("void someLongFunction(\n" 2908 " int someLongParameter) override {}", 2909 Style); 2910 verifyFormat("void someLongFunction(\n" 2911 " int someLongParameter) OVERRIDE {}", 2912 Style); 2913 verifyFormat("void someLongFunction(\n" 2914 " int someLongParameter) final {}", 2915 Style); 2916 verifyFormat("void someLongFunction(\n" 2917 " int someLongParameter) FINAL {}", 2918 Style); 2919 verifyFormat("void someLongFunction(\n" 2920 " int parameter) const override {}", 2921 Style); 2922 2923 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 2924 verifyFormat("void someLongFunction(\n" 2925 " int someLongParameter) const\n" 2926 "{\n" 2927 "}", 2928 Style); 2929 2930 // Unless these are unknown annotations. 2931 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n" 2932 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 2933 " LONG_AND_UGLY_ANNOTATION;"); 2934 2935 // Breaking before function-like trailing annotations is fine to keep them 2936 // close to their arguments. 2937 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 2938 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 2939 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 2940 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 2941 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 2942 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}"); 2943 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n" 2944 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);"); 2945 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});"); 2946 2947 verifyFormat( 2948 "void aaaaaaaaaaaaaaaaaa()\n" 2949 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n" 2950 " aaaaaaaaaaaaaaaaaaaaaaaaa));"); 2951 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2952 " __attribute__((unused));"); 2953 verifyGoogleFormat( 2954 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2955 " GUARDED_BY(aaaaaaaaaaaa);"); 2956 verifyGoogleFormat( 2957 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2958 " GUARDED_BY(aaaaaaaaaaaa);"); 2959 verifyGoogleFormat( 2960 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 2961 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 2962 verifyGoogleFormat( 2963 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 2964 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 2965 } 2966 2967 TEST_F(FormatTest, FunctionAnnotations) { 2968 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 2969 "int OldFunction(const string ¶meter) {}"); 2970 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 2971 "string OldFunction(const string ¶meter) {}"); 2972 verifyFormat("template <typename T>\n" 2973 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 2974 "string OldFunction(const string ¶meter) {}"); 2975 2976 // Not function annotations. 2977 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 2978 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); 2979 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n" 2980 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}"); 2981 verifyFormat("MACRO(abc).function() // wrap\n" 2982 " << abc;"); 2983 verifyFormat("MACRO(abc)->function() // wrap\n" 2984 " << abc;"); 2985 verifyFormat("MACRO(abc)::function() // wrap\n" 2986 " << abc;"); 2987 } 2988 2989 TEST_F(FormatTest, BreaksDesireably) { 2990 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 2991 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 2992 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}"); 2993 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 2994 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 2995 "}"); 2996 2997 verifyFormat( 2998 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 2999 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 3000 3001 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3002 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3003 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 3004 3005 verifyFormat( 3006 "aaaaaaaa(aaaaaaaaaaaaa,\n" 3007 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3008 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 3009 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3010 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));"); 3011 3012 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3013 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 3014 3015 verifyFormat( 3016 "void f() {\n" 3017 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n" 3018 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 3019 "}"); 3020 verifyFormat( 3021 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3022 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 3023 verifyFormat( 3024 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3025 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 3026 verifyFormat( 3027 "aaaaaa(aaa,\n" 3028 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3029 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 3030 " aaaa);"); 3031 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3032 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3033 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 3034 3035 // Indent consistently independent of call expression and unary operator. 3036 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 3037 " dddddddddddddddddddddddddddddd));"); 3038 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 3039 " dddddddddddddddddddddddddddddd));"); 3040 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n" 3041 " dddddddddddddddddddddddddddddd));"); 3042 3043 // This test case breaks on an incorrect memoization, i.e. an optimization not 3044 // taking into account the StopAt value. 3045 verifyFormat( 3046 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 3047 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 3048 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 3049 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 3050 3051 verifyFormat("{\n {\n {\n" 3052 " Annotation.SpaceRequiredBefore =\n" 3053 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n" 3054 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n" 3055 " }\n }\n}"); 3056 3057 // Break on an outer level if there was a break on an inner level. 3058 EXPECT_EQ("f(g(h(a, // comment\n" 3059 " b, c),\n" 3060 " d, e),\n" 3061 " x, y);", 3062 format("f(g(h(a, // comment\n" 3063 " b, c), d, e), x, y);")); 3064 3065 // Prefer breaking similar line breaks. 3066 verifyFormat( 3067 "const int kTrackingOptions = NSTrackingMouseMoved |\n" 3068 " NSTrackingMouseEnteredAndExited |\n" 3069 " NSTrackingActiveAlways;"); 3070 } 3071 3072 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) { 3073 FormatStyle NoBinPacking = getGoogleStyle(); 3074 NoBinPacking.BinPackParameters = false; 3075 NoBinPacking.BinPackArguments = true; 3076 verifyFormat("void f() {\n" 3077 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n" 3078 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 3079 "}", 3080 NoBinPacking); 3081 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n" 3082 " int aaaaaaaaaaaaaaaaaaaa,\n" 3083 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 3084 NoBinPacking); 3085 3086 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 3087 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3088 " vector<int> bbbbbbbbbbbbbbb);", 3089 NoBinPacking); 3090 // FIXME: This behavior difference is probably not wanted. However, currently 3091 // we cannot distinguish BreakBeforeParameter being set because of the wrapped 3092 // template arguments from BreakBeforeParameter being set because of the 3093 // one-per-line formatting. 3094 verifyFormat( 3095 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n" 3096 " aaaaaaaaaa> aaaaaaaaaa);", 3097 NoBinPacking); 3098 verifyFormat( 3099 "void fffffffffff(\n" 3100 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n" 3101 " aaaaaaaaaa);"); 3102 } 3103 3104 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) { 3105 FormatStyle NoBinPacking = getGoogleStyle(); 3106 NoBinPacking.BinPackParameters = false; 3107 NoBinPacking.BinPackArguments = false; 3108 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n" 3109 " aaaaaaaaaaaaaaaaaaaa,\n" 3110 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);", 3111 NoBinPacking); 3112 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n" 3113 " aaaaaaaaaaaaa,\n" 3114 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));", 3115 NoBinPacking); 3116 verifyFormat( 3117 "aaaaaaaa(aaaaaaaaaaaaa,\n" 3118 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3119 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 3120 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3121 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));", 3122 NoBinPacking); 3123 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 3124 " .aaaaaaaaaaaaaaaaaa();", 3125 NoBinPacking); 3126 verifyFormat("void f() {\n" 3127 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3128 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n" 3129 "}", 3130 NoBinPacking); 3131 3132 verifyFormat( 3133 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3134 " aaaaaaaaaaaa,\n" 3135 " aaaaaaaaaaaa);", 3136 NoBinPacking); 3137 verifyFormat( 3138 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n" 3139 " ddddddddddddddddddddddddddddd),\n" 3140 " test);", 3141 NoBinPacking); 3142 3143 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n" 3144 " aaaaaaaaaaaaaaaaaaaaaaa,\n" 3145 " aaaaaaaaaaaaaaaaaaaaaaa>\n" 3146 " aaaaaaaaaaaaaaaaaa;", 3147 NoBinPacking); 3148 verifyFormat("a(\"a\"\n" 3149 " \"a\",\n" 3150 " a);"); 3151 3152 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 3153 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n" 3154 " aaaaaaaaa,\n" 3155 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 3156 NoBinPacking); 3157 verifyFormat( 3158 "void f() {\n" 3159 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 3160 " .aaaaaaa();\n" 3161 "}", 3162 NoBinPacking); 3163 verifyFormat( 3164 "template <class SomeType, class SomeOtherType>\n" 3165 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}", 3166 NoBinPacking); 3167 } 3168 3169 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) { 3170 FormatStyle Style = getLLVMStyleWithColumns(15); 3171 Style.ExperimentalAutoDetectBinPacking = true; 3172 EXPECT_EQ("aaa(aaaa,\n" 3173 " aaaa,\n" 3174 " aaaa);\n" 3175 "aaa(aaaa,\n" 3176 " aaaa,\n" 3177 " aaaa);", 3178 format("aaa(aaaa,\n" // one-per-line 3179 " aaaa,\n" 3180 " aaaa );\n" 3181 "aaa(aaaa, aaaa, aaaa);", // inconclusive 3182 Style)); 3183 EXPECT_EQ("aaa(aaaa, aaaa,\n" 3184 " aaaa);\n" 3185 "aaa(aaaa, aaaa,\n" 3186 " aaaa);", 3187 format("aaa(aaaa, aaaa,\n" // bin-packed 3188 " aaaa );\n" 3189 "aaa(aaaa, aaaa, aaaa);", // inconclusive 3190 Style)); 3191 } 3192 3193 TEST_F(FormatTest, FormatsBuilderPattern) { 3194 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n" 3195 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n" 3196 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n" 3197 " .StartsWith(\".init\", ORDER_INIT)\n" 3198 " .StartsWith(\".fini\", ORDER_FINI)\n" 3199 " .StartsWith(\".hash\", ORDER_HASH)\n" 3200 " .Default(ORDER_TEXT);\n"); 3201 3202 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n" 3203 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();"); 3204 verifyFormat( 3205 "aaaaaaa->aaaaaaa\n" 3206 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3207 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 3208 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 3209 verifyFormat( 3210 "aaaaaaa->aaaaaaa\n" 3211 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 3212 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 3213 verifyFormat( 3214 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n" 3215 " aaaaaaaaaaaaaa);"); 3216 verifyFormat( 3217 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n" 3218 " aaaaaa->aaaaaaaaaaaa()\n" 3219 " ->aaaaaaaaaaaaaaaa(\n" 3220 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 3221 " ->aaaaaaaaaaaaaaaaa();"); 3222 verifyGoogleFormat( 3223 "void f() {\n" 3224 " someo->Add((new util::filetools::Handler(dir))\n" 3225 " ->OnEvent1(NewPermanentCallback(\n" 3226 " this, &HandlerHolderClass::EventHandlerCBA))\n" 3227 " ->OnEvent2(NewPermanentCallback(\n" 3228 " this, &HandlerHolderClass::EventHandlerCBB))\n" 3229 " ->OnEvent3(NewPermanentCallback(\n" 3230 " this, &HandlerHolderClass::EventHandlerCBC))\n" 3231 " ->OnEvent5(NewPermanentCallback(\n" 3232 " this, &HandlerHolderClass::EventHandlerCBD))\n" 3233 " ->OnEvent6(NewPermanentCallback(\n" 3234 " this, &HandlerHolderClass::EventHandlerCBE)));\n" 3235 "}"); 3236 3237 verifyFormat( 3238 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();"); 3239 verifyFormat("aaaaaaaaaaaaaaa()\n" 3240 " .aaaaaaaaaaaaaaa()\n" 3241 " .aaaaaaaaaaaaaaa()\n" 3242 " .aaaaaaaaaaaaaaa()\n" 3243 " .aaaaaaaaaaaaaaa();"); 3244 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 3245 " .aaaaaaaaaaaaaaa()\n" 3246 " .aaaaaaaaaaaaaaa()\n" 3247 " .aaaaaaaaaaaaaaa();"); 3248 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 3249 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 3250 " .aaaaaaaaaaaaaaa();"); 3251 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n" 3252 " ->aaaaaaaaaaaaaae(0)\n" 3253 " ->aaaaaaaaaaaaaaa();"); 3254 3255 // Don't linewrap after very short segments. 3256 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 3257 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 3258 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 3259 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 3260 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 3261 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 3262 verifyFormat("aaa()\n" 3263 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 3264 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 3265 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 3266 3267 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 3268 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 3269 " .has<bbbbbbbbbbbbbbbbbbbbb>();"); 3270 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 3271 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 3272 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();"); 3273 3274 // Prefer not to break after empty parentheses. 3275 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n" 3276 " First->LastNewlineOffset);"); 3277 3278 // Prefer not to create "hanging" indents. 3279 verifyFormat( 3280 "return !soooooooooooooome_map\n" 3281 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 3282 " .second;"); 3283 verifyFormat( 3284 "return aaaaaaaaaaaaaaaa\n" 3285 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n" 3286 " .aaaa(aaaaaaaaaaaaaa);"); 3287 // No hanging indent here. 3288 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n" 3289 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 3290 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n" 3291 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 3292 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 3293 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 3294 getLLVMStyleWithColumns(60)); 3295 verifyFormat("aaaaaaaaaaaaaaaaaa\n" 3296 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 3297 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 3298 getLLVMStyleWithColumns(59)); 3299 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3300 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 3301 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 3302 } 3303 3304 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) { 3305 verifyFormat( 3306 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3307 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}"); 3308 verifyFormat( 3309 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n" 3310 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}"); 3311 3312 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 3313 " ccccccccccccccccccccccccc) {\n}"); 3314 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n" 3315 " ccccccccccccccccccccccccc) {\n}"); 3316 3317 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 3318 " ccccccccccccccccccccccccc) {\n}"); 3319 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n" 3320 " ccccccccccccccccccccccccc) {\n}"); 3321 3322 verifyFormat( 3323 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n" 3324 " ccccccccccccccccccccccccc) {\n}"); 3325 verifyFormat( 3326 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n" 3327 " ccccccccccccccccccccccccc) {\n}"); 3328 3329 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n" 3330 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n" 3331 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n" 3332 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 3333 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n" 3334 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n" 3335 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n" 3336 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 3337 3338 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n" 3339 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n" 3340 " aaaaaaaaaaaaaaa != aa) {\n}"); 3341 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n" 3342 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n" 3343 " aaaaaaaaaaaaaaa != aa) {\n}"); 3344 } 3345 3346 TEST_F(FormatTest, BreaksAfterAssignments) { 3347 verifyFormat( 3348 "unsigned Cost =\n" 3349 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n" 3350 " SI->getPointerAddressSpaceee());\n"); 3351 verifyFormat( 3352 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n" 3353 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());"); 3354 3355 verifyFormat( 3356 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n" 3357 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);"); 3358 verifyFormat("unsigned OriginalStartColumn =\n" 3359 " SourceMgr.getSpellingColumnNumber(\n" 3360 " Current.FormatTok.getStartOfNonWhitespace()) -\n" 3361 " 1;"); 3362 } 3363 3364 TEST_F(FormatTest, AlignsAfterAssignments) { 3365 verifyFormat( 3366 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3367 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 3368 verifyFormat( 3369 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3370 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 3371 verifyFormat( 3372 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3373 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 3374 verifyFormat( 3375 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3376 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 3377 verifyFormat( 3378 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n" 3379 " aaaaaaaaaaaaaaaaaaaaaaaa +\n" 3380 " aaaaaaaaaaaaaaaaaaaaaaaa;"); 3381 } 3382 3383 TEST_F(FormatTest, AlignsAfterReturn) { 3384 verifyFormat( 3385 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3386 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 3387 verifyFormat( 3388 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3389 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 3390 verifyFormat( 3391 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 3392 " aaaaaaaaaaaaaaaaaaaaaa();"); 3393 verifyFormat( 3394 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 3395 " aaaaaaaaaaaaaaaaaaaaaa());"); 3396 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3397 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 3398 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3399 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n" 3400 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 3401 verifyFormat("return\n" 3402 " // true if code is one of a or b.\n" 3403 " code == a || code == b;"); 3404 } 3405 3406 TEST_F(FormatTest, AlignsAfterOpenBracket) { 3407 verifyFormat( 3408 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 3409 " aaaaaaaaa aaaaaaa) {}"); 3410 verifyFormat( 3411 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 3412 " aaaaaaaaaaa aaaaaaaaa);"); 3413 verifyFormat( 3414 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 3415 " aaaaaaaaaaaaaaaaaaaaa));"); 3416 FormatStyle Style = getLLVMStyle(); 3417 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 3418 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3419 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}", 3420 Style); 3421 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 3422 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);", 3423 Style); 3424 verifyFormat("SomeLongVariableName->someFunction(\n" 3425 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));", 3426 Style); 3427 verifyFormat( 3428 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 3429 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 3430 Style); 3431 verifyFormat( 3432 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 3433 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 3434 Style); 3435 verifyFormat( 3436 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 3437 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 3438 Style); 3439 3440 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n" 3441 " ccccccc(aaaaaaaaaaaaaaaaa, //\n" 3442 " b));", 3443 Style); 3444 3445 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 3446 Style.BinPackArguments = false; 3447 Style.BinPackParameters = false; 3448 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3449 " aaaaaaaaaaa aaaaaaaa,\n" 3450 " aaaaaaaaa aaaaaaa,\n" 3451 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 3452 Style); 3453 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 3454 " aaaaaaaaaaa aaaaaaaaa,\n" 3455 " aaaaaaaaaaa aaaaaaaaa,\n" 3456 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 3457 Style); 3458 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n" 3459 " aaaaaaaaaaaaaaa,\n" 3460 " aaaaaaaaaaaaaaaaaaaaa,\n" 3461 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 3462 Style); 3463 verifyFormat( 3464 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n" 3465 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 3466 Style); 3467 verifyFormat( 3468 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n" 3469 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 3470 Style); 3471 verifyFormat( 3472 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 3473 " aaaaaaaaaaaaaaaaaaaaa(\n" 3474 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n" 3475 " aaaaaaaaaaaaaaaa);", 3476 Style); 3477 verifyFormat( 3478 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 3479 " aaaaaaaaaaaaaaaaaaaaa(\n" 3480 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n" 3481 " aaaaaaaaaaaaaaaa);", 3482 Style); 3483 } 3484 3485 TEST_F(FormatTest, ParenthesesAndOperandAlignment) { 3486 FormatStyle Style = getLLVMStyleWithColumns(40); 3487 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 3488 " bbbbbbbbbbbbbbbbbbbbbb);", 3489 Style); 3490 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; 3491 Style.AlignOperands = false; 3492 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 3493 " bbbbbbbbbbbbbbbbbbbbbb);", 3494 Style); 3495 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 3496 Style.AlignOperands = true; 3497 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 3498 " bbbbbbbbbbbbbbbbbbbbbb);", 3499 Style); 3500 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 3501 Style.AlignOperands = false; 3502 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 3503 " bbbbbbbbbbbbbbbbbbbbbb);", 3504 Style); 3505 } 3506 3507 TEST_F(FormatTest, BreaksConditionalExpressions) { 3508 verifyFormat( 3509 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3510 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3511 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 3512 verifyFormat( 3513 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 3514 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3515 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 3516 verifyFormat( 3517 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3518 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 3519 verifyFormat( 3520 "aaaa(aaaaaaaaa, aaaaaaaaa,\n" 3521 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3522 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 3523 verifyFormat( 3524 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n" 3525 " : aaaaaaaaaaaaa);"); 3526 verifyFormat( 3527 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3528 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3529 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3530 " aaaaaaaaaaaaa);"); 3531 verifyFormat( 3532 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3533 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3534 " aaaaaaaaaaaaa);"); 3535 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3536 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3537 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 3538 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3539 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 3540 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3541 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3542 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3543 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 3544 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3545 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 3546 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 3547 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3548 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3549 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3550 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 3551 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 3552 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3553 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3554 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 3555 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 3556 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3557 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3558 " : aaaaaaaaaaaaaaaa;"); 3559 verifyFormat( 3560 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3561 " ? aaaaaaaaaaaaaaa\n" 3562 " : aaaaaaaaaaaaaaa;"); 3563 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 3564 " aaaaaaaaa\n" 3565 " ? b\n" 3566 " : c);"); 3567 verifyFormat("return aaaa == bbbb\n" 3568 " // comment\n" 3569 " ? aaaa\n" 3570 " : bbbb;"); 3571 verifyFormat("unsigned Indent =\n" 3572 " format(TheLine.First,\n" 3573 " IndentForLevel[TheLine.Level] >= 0\n" 3574 " ? IndentForLevel[TheLine.Level]\n" 3575 " : TheLine * 2,\n" 3576 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 3577 getLLVMStyleWithColumns(60)); 3578 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 3579 " ? aaaaaaaaaaaaaaa\n" 3580 " : bbbbbbbbbbbbbbb //\n" 3581 " ? ccccccccccccccc\n" 3582 " : ddddddddddddddd;"); 3583 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 3584 " ? aaaaaaaaaaaaaaa\n" 3585 " : (bbbbbbbbbbbbbbb //\n" 3586 " ? ccccccccccccccc\n" 3587 " : ddddddddddddddd);"); 3588 verifyFormat( 3589 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3590 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3591 " aaaaaaaaaaaaaaaaaaaaa +\n" 3592 " aaaaaaaaaaaaaaaaaaaaa\n" 3593 " : aaaaaaaaaa;"); 3594 verifyFormat( 3595 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3596 " : aaaaaaaaaaaaaaaaaaaaaa\n" 3597 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 3598 3599 FormatStyle NoBinPacking = getLLVMStyle(); 3600 NoBinPacking.BinPackArguments = false; 3601 verifyFormat( 3602 "void f() {\n" 3603 " g(aaa,\n" 3604 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 3605 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3606 " ? aaaaaaaaaaaaaaa\n" 3607 " : aaaaaaaaaaaaaaa);\n" 3608 "}", 3609 NoBinPacking); 3610 verifyFormat( 3611 "void f() {\n" 3612 " g(aaa,\n" 3613 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 3614 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3615 " ?: aaaaaaaaaaaaaaa);\n" 3616 "}", 3617 NoBinPacking); 3618 3619 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n" 3620 " // comment.\n" 3621 " ccccccccccccccccccccccccccccccccccccccc\n" 3622 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3623 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);"); 3624 3625 // Assignments in conditional expressions. Apparently not uncommon :-(. 3626 verifyFormat("return a != b\n" 3627 " // comment\n" 3628 " ? a = b\n" 3629 " : a = b;"); 3630 verifyFormat("return a != b\n" 3631 " // comment\n" 3632 " ? a = a != b\n" 3633 " // comment\n" 3634 " ? a = b\n" 3635 " : a\n" 3636 " : a;\n"); 3637 verifyFormat("return a != b\n" 3638 " // comment\n" 3639 " ? a\n" 3640 " : a = a != b\n" 3641 " // comment\n" 3642 " ? a = b\n" 3643 " : a;"); 3644 } 3645 3646 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) { 3647 FormatStyle Style = getLLVMStyle(); 3648 Style.BreakBeforeTernaryOperators = false; 3649 Style.ColumnLimit = 70; 3650 verifyFormat( 3651 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 3652 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 3653 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 3654 Style); 3655 verifyFormat( 3656 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 3657 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 3658 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 3659 Style); 3660 verifyFormat( 3661 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 3662 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 3663 Style); 3664 verifyFormat( 3665 "aaaa(aaaaaaaa, aaaaaaaaaa,\n" 3666 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 3667 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 3668 Style); 3669 verifyFormat( 3670 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n" 3671 " aaaaaaaaaaaaa);", 3672 Style); 3673 verifyFormat( 3674 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3675 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 3676 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3677 " aaaaaaaaaaaaa);", 3678 Style); 3679 verifyFormat( 3680 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3681 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3682 " aaaaaaaaaaaaa);", 3683 Style); 3684 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 3685 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3686 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 3687 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3688 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 3689 Style); 3690 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3691 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 3692 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3693 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 3694 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3695 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 3696 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 3697 Style); 3698 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3699 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n" 3700 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3701 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 3702 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 3703 Style); 3704 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 3705 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 3706 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;", 3707 Style); 3708 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 3709 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 3710 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 3711 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 3712 Style); 3713 verifyFormat( 3714 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 3715 " aaaaaaaaaaaaaaa :\n" 3716 " aaaaaaaaaaaaaaa;", 3717 Style); 3718 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 3719 " aaaaaaaaa ?\n" 3720 " b :\n" 3721 " c);", 3722 Style); 3723 verifyFormat("unsigned Indent =\n" 3724 " format(TheLine.First,\n" 3725 " IndentForLevel[TheLine.Level] >= 0 ?\n" 3726 " IndentForLevel[TheLine.Level] :\n" 3727 " TheLine * 2,\n" 3728 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 3729 Style); 3730 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 3731 " aaaaaaaaaaaaaaa :\n" 3732 " bbbbbbbbbbbbbbb ? //\n" 3733 " ccccccccccccccc :\n" 3734 " ddddddddddddddd;", 3735 Style); 3736 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 3737 " aaaaaaaaaaaaaaa :\n" 3738 " (bbbbbbbbbbbbbbb ? //\n" 3739 " ccccccccccccccc :\n" 3740 " ddddddddddddddd);", 3741 Style); 3742 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 3743 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n" 3744 " ccccccccccccccccccccccccccc;", 3745 Style); 3746 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 3747 " aaaaa :\n" 3748 " bbbbbbbbbbbbbbb + cccccccccccccccc;", 3749 Style); 3750 } 3751 3752 TEST_F(FormatTest, DeclarationsOfMultipleVariables) { 3753 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n" 3754 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();"); 3755 verifyFormat("bool a = true, b = false;"); 3756 3757 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n" 3758 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n" 3759 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n" 3760 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);"); 3761 verifyFormat( 3762 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 3763 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n" 3764 " d = e && f;"); 3765 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n" 3766 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;"); 3767 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 3768 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;"); 3769 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n" 3770 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;"); 3771 3772 FormatStyle Style = getGoogleStyle(); 3773 Style.PointerAlignment = FormatStyle::PAS_Left; 3774 Style.DerivePointerAlignment = false; 3775 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3776 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n" 3777 " *b = bbbbbbbbbbbbbbbbbbb;", 3778 Style); 3779 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 3780 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;", 3781 Style); 3782 verifyFormat("vector<int*> a, b;", Style); 3783 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style); 3784 } 3785 3786 TEST_F(FormatTest, ConditionalExpressionsInBrackets) { 3787 verifyFormat("arr[foo ? bar : baz];"); 3788 verifyFormat("f()[foo ? bar : baz];"); 3789 verifyFormat("(a + b)[foo ? bar : baz];"); 3790 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];"); 3791 } 3792 3793 TEST_F(FormatTest, AlignsStringLiterals) { 3794 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n" 3795 " \"short literal\");"); 3796 verifyFormat( 3797 "looooooooooooooooooooooooongFunction(\n" 3798 " \"short literal\"\n" 3799 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");"); 3800 verifyFormat("someFunction(\"Always break between multi-line\"\n" 3801 " \" string literals\",\n" 3802 " and, other, parameters);"); 3803 EXPECT_EQ("fun + \"1243\" /* comment */\n" 3804 " \"5678\";", 3805 format("fun + \"1243\" /* comment */\n" 3806 " \"5678\";", 3807 getLLVMStyleWithColumns(28))); 3808 EXPECT_EQ( 3809 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 3810 " \"aaaaaaaaaaaaaaaaaaaaa\"\n" 3811 " \"aaaaaaaaaaaaaaaa\";", 3812 format("aaaaaa =" 3813 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa " 3814 "aaaaaaaaaaaaaaaaaaaaa\" " 3815 "\"aaaaaaaaaaaaaaaa\";")); 3816 verifyFormat("a = a + \"a\"\n" 3817 " \"a\"\n" 3818 " \"a\";"); 3819 verifyFormat("f(\"a\", \"b\"\n" 3820 " \"c\");"); 3821 3822 verifyFormat( 3823 "#define LL_FORMAT \"ll\"\n" 3824 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n" 3825 " \"d, ddddddddd: %\" LL_FORMAT \"d\");"); 3826 3827 verifyFormat("#define A(X) \\\n" 3828 " \"aaaaa\" #X \"bbbbbb\" \\\n" 3829 " \"ccccc\"", 3830 getLLVMStyleWithColumns(23)); 3831 verifyFormat("#define A \"def\"\n" 3832 "f(\"abc\" A \"ghi\"\n" 3833 " \"jkl\");"); 3834 3835 verifyFormat("f(L\"a\"\n" 3836 " L\"b\");"); 3837 verifyFormat("#define A(X) \\\n" 3838 " L\"aaaaa\" #X L\"bbbbbb\" \\\n" 3839 " L\"ccccc\"", 3840 getLLVMStyleWithColumns(25)); 3841 3842 verifyFormat("f(@\"a\"\n" 3843 " @\"b\");"); 3844 verifyFormat("NSString s = @\"a\"\n" 3845 " @\"b\"\n" 3846 " @\"c\";"); 3847 verifyFormat("NSString s = @\"a\"\n" 3848 " \"b\"\n" 3849 " \"c\";"); 3850 } 3851 3852 TEST_F(FormatTest, ReturnTypeBreakingStyle) { 3853 FormatStyle Style = getLLVMStyle(); 3854 // No declarations or definitions should be moved to own line. 3855 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None; 3856 verifyFormat("class A {\n" 3857 " int f() { return 1; }\n" 3858 " int g();\n" 3859 "};\n" 3860 "int f() { return 1; }\n" 3861 "int g();\n", 3862 Style); 3863 3864 // All declarations and definitions should have the return type moved to its 3865 // own 3866 // line. 3867 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 3868 verifyFormat("class E {\n" 3869 " int\n" 3870 " f() {\n" 3871 " return 1;\n" 3872 " }\n" 3873 " int\n" 3874 " g();\n" 3875 "};\n" 3876 "int\n" 3877 "f() {\n" 3878 " return 1;\n" 3879 "}\n" 3880 "int\n" 3881 "g();\n", 3882 Style); 3883 3884 // Top-level definitions, and no kinds of declarations should have the 3885 // return type moved to its own line. 3886 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions; 3887 verifyFormat("class B {\n" 3888 " int f() { return 1; }\n" 3889 " int g();\n" 3890 "};\n" 3891 "int\n" 3892 "f() {\n" 3893 " return 1;\n" 3894 "}\n" 3895 "int g();\n", 3896 Style); 3897 3898 // Top-level definitions and declarations should have the return type moved 3899 // to its own line. 3900 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel; 3901 verifyFormat("class C {\n" 3902 " int f() { return 1; }\n" 3903 " int g();\n" 3904 "};\n" 3905 "int\n" 3906 "f() {\n" 3907 " return 1;\n" 3908 "}\n" 3909 "int\n" 3910 "g();\n", 3911 Style); 3912 3913 // All definitions should have the return type moved to its own line, but no 3914 // kinds of declarations. 3915 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 3916 verifyFormat("class D {\n" 3917 " int\n" 3918 " f() {\n" 3919 " return 1;\n" 3920 " }\n" 3921 " int g();\n" 3922 "};\n" 3923 "int\n" 3924 "f() {\n" 3925 " return 1;\n" 3926 "}\n" 3927 "int g();\n", 3928 Style); 3929 verifyFormat("const char *\n" 3930 "f(void) {\n" // Break here. 3931 " return \"\";\n" 3932 "}\n" 3933 "const char *bar(void);\n", // No break here. 3934 Style); 3935 verifyFormat("template <class T>\n" 3936 "T *\n" 3937 "f(T &c) {\n" // Break here. 3938 " return NULL;\n" 3939 "}\n" 3940 "template <class T> T *f(T &c);\n", // No break here. 3941 Style); 3942 verifyFormat("class C {\n" 3943 " int\n" 3944 " operator+() {\n" 3945 " return 1;\n" 3946 " }\n" 3947 " int\n" 3948 " operator()() {\n" 3949 " return 1;\n" 3950 " }\n" 3951 "};\n", 3952 Style); 3953 verifyFormat("void\n" 3954 "A::operator()() {}\n" 3955 "void\n" 3956 "A::operator>>() {}\n" 3957 "void\n" 3958 "A::operator+() {}\n", 3959 Style); 3960 verifyFormat("void *operator new(std::size_t s);", // No break here. 3961 Style); 3962 verifyFormat("void *\n" 3963 "operator new(std::size_t s) {}", 3964 Style); 3965 verifyFormat("void *\n" 3966 "operator delete[](void *ptr) {}", 3967 Style); 3968 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 3969 verifyFormat("const char *\n" 3970 "f(void)\n" // Break here. 3971 "{\n" 3972 " return \"\";\n" 3973 "}\n" 3974 "const char *bar(void);\n", // No break here. 3975 Style); 3976 verifyFormat("template <class T>\n" 3977 "T *\n" // Problem here: no line break 3978 "f(T &c)\n" // Break here. 3979 "{\n" 3980 " return NULL;\n" 3981 "}\n" 3982 "template <class T> T *f(T &c);\n", // No break here. 3983 Style); 3984 } 3985 3986 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) { 3987 FormatStyle NoBreak = getLLVMStyle(); 3988 NoBreak.AlwaysBreakBeforeMultilineStrings = false; 3989 FormatStyle Break = getLLVMStyle(); 3990 Break.AlwaysBreakBeforeMultilineStrings = true; 3991 verifyFormat("aaaa = \"bbbb\"\n" 3992 " \"cccc\";", 3993 NoBreak); 3994 verifyFormat("aaaa =\n" 3995 " \"bbbb\"\n" 3996 " \"cccc\";", 3997 Break); 3998 verifyFormat("aaaa(\"bbbb\"\n" 3999 " \"cccc\");", 4000 NoBreak); 4001 verifyFormat("aaaa(\n" 4002 " \"bbbb\"\n" 4003 " \"cccc\");", 4004 Break); 4005 verifyFormat("aaaa(qqq, \"bbbb\"\n" 4006 " \"cccc\");", 4007 NoBreak); 4008 verifyFormat("aaaa(qqq,\n" 4009 " \"bbbb\"\n" 4010 " \"cccc\");", 4011 Break); 4012 verifyFormat("aaaa(qqq,\n" 4013 " L\"bbbb\"\n" 4014 " L\"cccc\");", 4015 Break); 4016 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n" 4017 " \"bbbb\"));", 4018 Break); 4019 verifyFormat("string s = someFunction(\n" 4020 " \"abc\"\n" 4021 " \"abc\");", 4022 Break); 4023 4024 // As we break before unary operators, breaking right after them is bad. 4025 verifyFormat("string foo = abc ? \"x\"\n" 4026 " \"blah blah blah blah blah blah\"\n" 4027 " : \"y\";", 4028 Break); 4029 4030 // Don't break if there is no column gain. 4031 verifyFormat("f(\"aaaa\"\n" 4032 " \"bbbb\");", 4033 Break); 4034 4035 // Treat literals with escaped newlines like multi-line string literals. 4036 EXPECT_EQ("x = \"a\\\n" 4037 "b\\\n" 4038 "c\";", 4039 format("x = \"a\\\n" 4040 "b\\\n" 4041 "c\";", 4042 NoBreak)); 4043 EXPECT_EQ("xxxx =\n" 4044 " \"a\\\n" 4045 "b\\\n" 4046 "c\";", 4047 format("xxxx = \"a\\\n" 4048 "b\\\n" 4049 "c\";", 4050 Break)); 4051 4052 // Exempt ObjC strings for now. 4053 EXPECT_EQ("NSString *const kString = @\"aaaa\"\n" 4054 " @\"bbbb\";", 4055 format("NSString *const kString = @\"aaaa\"\n" 4056 "@\"bbbb\";", 4057 Break)); 4058 4059 Break.ColumnLimit = 0; 4060 verifyFormat("const char *hello = \"hello llvm\";", Break); 4061 } 4062 4063 TEST_F(FormatTest, AlignsPipes) { 4064 verifyFormat( 4065 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4066 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4067 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 4068 verifyFormat( 4069 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n" 4070 " << aaaaaaaaaaaaaaaaaaaa;"); 4071 verifyFormat( 4072 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4073 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 4074 verifyFormat( 4075 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 4076 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 4077 verifyFormat( 4078 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n" 4079 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n" 4080 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";"); 4081 verifyFormat( 4082 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4083 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4084 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 4085 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4086 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4087 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4088 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 4089 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n" 4090 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);"); 4091 verifyFormat( 4092 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4093 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4094 4095 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n" 4096 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();"); 4097 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4098 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4099 " aaaaaaaaaaaaaaaaaaaaa)\n" 4100 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;"); 4101 verifyFormat("LOG_IF(aaa == //\n" 4102 " bbb)\n" 4103 " << a << b;"); 4104 4105 // But sometimes, breaking before the first "<<" is desirable. 4106 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 4107 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);"); 4108 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n" 4109 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4110 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 4111 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n" 4112 " << BEF << IsTemplate << Description << E->getType();"); 4113 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 4114 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4115 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4116 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 4117 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4118 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4119 " << aaa;"); 4120 4121 verifyFormat( 4122 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4123 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 4124 4125 // Incomplete string literal. 4126 EXPECT_EQ("llvm::errs() << \"\n" 4127 " << a;", 4128 format("llvm::errs() << \"\n<<a;")); 4129 4130 verifyFormat("void f() {\n" 4131 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n" 4132 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n" 4133 "}"); 4134 4135 // Handle 'endl'. 4136 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n" 4137 " << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 4138 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 4139 4140 // Handle '\n'. 4141 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n" 4142 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 4143 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n" 4144 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';"); 4145 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n" 4146 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";"); 4147 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 4148 } 4149 4150 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) { 4151 verifyFormat("return out << \"somepacket = {\\n\"\n" 4152 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n" 4153 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n" 4154 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n" 4155 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n" 4156 " << \"}\";"); 4157 4158 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 4159 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 4160 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;"); 4161 verifyFormat( 4162 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n" 4163 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n" 4164 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n" 4165 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n" 4166 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;"); 4167 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n" 4168 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 4169 verifyFormat( 4170 "void f() {\n" 4171 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n" 4172 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 4173 "}"); 4174 4175 // Breaking before the first "<<" is generally not desirable. 4176 verifyFormat( 4177 "llvm::errs()\n" 4178 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4179 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4180 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4181 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 4182 getLLVMStyleWithColumns(70)); 4183 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n" 4184 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4185 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 4186 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4187 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 4188 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 4189 getLLVMStyleWithColumns(70)); 4190 4191 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 4192 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 4193 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;"); 4194 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 4195 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 4196 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);"); 4197 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n" 4198 " (aaaa + aaaa);", 4199 getLLVMStyleWithColumns(40)); 4200 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n" 4201 " (aaaaaaa + aaaaa));", 4202 getLLVMStyleWithColumns(40)); 4203 verifyFormat( 4204 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n" 4205 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n" 4206 " bbbbbbbbbbbbbbbbbbbbbbb);"); 4207 } 4208 4209 TEST_F(FormatTest, UnderstandsEquals) { 4210 verifyFormat( 4211 "aaaaaaaaaaaaaaaaa =\n" 4212 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 4213 verifyFormat( 4214 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 4215 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 4216 verifyFormat( 4217 "if (a) {\n" 4218 " f();\n" 4219 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 4220 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 4221 "}"); 4222 4223 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 4224 " 100000000 + 10000000) {\n}"); 4225 } 4226 4227 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) { 4228 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 4229 " .looooooooooooooooooooooooooooooooooooooongFunction();"); 4230 4231 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 4232 " ->looooooooooooooooooooooooooooooooooooooongFunction();"); 4233 4234 verifyFormat( 4235 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n" 4236 " Parameter2);"); 4237 4238 verifyFormat( 4239 "ShortObject->shortFunction(\n" 4240 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n" 4241 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);"); 4242 4243 verifyFormat("loooooooooooooongFunction(\n" 4244 " LoooooooooooooongObject->looooooooooooooooongFunction());"); 4245 4246 verifyFormat( 4247 "function(LoooooooooooooooooooooooooooooooooooongObject\n" 4248 " ->loooooooooooooooooooooooooooooooooooooooongFunction());"); 4249 4250 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 4251 " .WillRepeatedly(Return(SomeValue));"); 4252 verifyFormat("void f() {\n" 4253 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 4254 " .Times(2)\n" 4255 " .WillRepeatedly(Return(SomeValue));\n" 4256 "}"); 4257 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n" 4258 " ccccccccccccccccccccccc);"); 4259 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4260 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4261 " .aaaaa(aaaaa),\n" 4262 " aaaaaaaaaaaaaaaaaaaaa);"); 4263 verifyFormat("void f() {\n" 4264 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4265 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n" 4266 "}"); 4267 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4268 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4269 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4270 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4271 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 4272 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4273 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4274 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4275 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n" 4276 "}"); 4277 4278 // Here, it is not necessary to wrap at "." or "->". 4279 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n" 4280 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 4281 verifyFormat( 4282 "aaaaaaaaaaa->aaaaaaaaa(\n" 4283 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4284 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n"); 4285 4286 verifyFormat( 4287 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4288 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());"); 4289 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n" 4290 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 4291 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n" 4292 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 4293 4294 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4295 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4296 " .a();"); 4297 4298 FormatStyle NoBinPacking = getLLVMStyle(); 4299 NoBinPacking.BinPackParameters = false; 4300 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 4301 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 4302 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n" 4303 " aaaaaaaaaaaaaaaaaaa,\n" 4304 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4305 NoBinPacking); 4306 4307 // If there is a subsequent call, change to hanging indentation. 4308 verifyFormat( 4309 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4310 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n" 4311 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 4312 verifyFormat( 4313 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4314 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));"); 4315 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4316 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4317 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 4318 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4319 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4320 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 4321 } 4322 4323 TEST_F(FormatTest, WrapsTemplateDeclarations) { 4324 verifyFormat("template <typename T>\n" 4325 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 4326 verifyFormat("template <typename T>\n" 4327 "// T should be one of {A, B}.\n" 4328 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 4329 verifyFormat( 4330 "template <typename T>\n" 4331 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;"); 4332 verifyFormat("template <typename T>\n" 4333 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n" 4334 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);"); 4335 verifyFormat( 4336 "template <typename T>\n" 4337 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n" 4338 " int Paaaaaaaaaaaaaaaaaaaaram2);"); 4339 verifyFormat( 4340 "template <typename T>\n" 4341 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n" 4342 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n" 4343 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4344 verifyFormat("template <typename T>\n" 4345 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4346 " int aaaaaaaaaaaaaaaaaaaaaa);"); 4347 verifyFormat( 4348 "template <typename T1, typename T2 = char, typename T3 = char,\n" 4349 " typename T4 = char>\n" 4350 "void f();"); 4351 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n" 4352 " template <typename> class cccccccccccccccccccccc,\n" 4353 " typename ddddddddddddd>\n" 4354 "class C {};"); 4355 verifyFormat( 4356 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n" 4357 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4358 4359 verifyFormat("void f() {\n" 4360 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n" 4361 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n" 4362 "}"); 4363 4364 verifyFormat("template <typename T> class C {};"); 4365 verifyFormat("template <typename T> void f();"); 4366 verifyFormat("template <typename T> void f() {}"); 4367 verifyFormat( 4368 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 4369 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4370 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n" 4371 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 4372 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4373 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n" 4374 " bbbbbbbbbbbbbbbbbbbbbbbb);", 4375 getLLVMStyleWithColumns(72)); 4376 EXPECT_EQ("static_cast<A< //\n" 4377 " B> *>(\n" 4378 "\n" 4379 " );", 4380 format("static_cast<A<//\n" 4381 " B>*>(\n" 4382 "\n" 4383 " );")); 4384 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4385 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);"); 4386 4387 FormatStyle AlwaysBreak = getLLVMStyle(); 4388 AlwaysBreak.AlwaysBreakTemplateDeclarations = true; 4389 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak); 4390 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak); 4391 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak); 4392 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4393 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 4394 " ccccccccccccccccccccccccccccccccccccccccccccccc);"); 4395 verifyFormat("template <template <typename> class Fooooooo,\n" 4396 " template <typename> class Baaaaaaar>\n" 4397 "struct C {};", 4398 AlwaysBreak); 4399 verifyFormat("template <typename T> // T can be A, B or C.\n" 4400 "struct C {};", 4401 AlwaysBreak); 4402 verifyFormat("template <enum E> class A {\n" 4403 "public:\n" 4404 " E *f();\n" 4405 "};"); 4406 } 4407 4408 TEST_F(FormatTest, WrapsTemplateParameters) { 4409 FormatStyle Style = getLLVMStyle(); 4410 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4411 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 4412 verifyFormat( 4413 "template <typename... a> struct q {};\n" 4414 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 4415 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 4416 " y;", 4417 Style); 4418 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4419 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 4420 verifyFormat( 4421 "template <typename... a> struct r {};\n" 4422 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 4423 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 4424 " y;", 4425 Style); 4426 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 4427 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 4428 verifyFormat( 4429 "template <typename... a> struct s {};\n" 4430 "extern s<\n" 4431 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4432 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n" 4433 " y;", 4434 Style); 4435 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 4436 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 4437 verifyFormat( 4438 "template <typename... a> struct t {};\n" 4439 "extern t<\n" 4440 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4441 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n" 4442 " y;", 4443 Style); 4444 } 4445 4446 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) { 4447 verifyFormat( 4448 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 4449 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 4450 verifyFormat( 4451 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 4452 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4453 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 4454 4455 // FIXME: Should we have the extra indent after the second break? 4456 verifyFormat( 4457 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 4458 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 4459 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 4460 4461 verifyFormat( 4462 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n" 4463 " cccccccccccccccccccccccccccccccccccccccccccccc());"); 4464 4465 // Breaking at nested name specifiers is generally not desirable. 4466 verifyFormat( 4467 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4468 " aaaaaaaaaaaaaaaaaaaaaaa);"); 4469 4470 verifyFormat( 4471 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n" 4472 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 4473 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4474 " aaaaaaaaaaaaaaaaaaaaa);", 4475 getLLVMStyleWithColumns(74)); 4476 4477 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 4478 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4479 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 4480 } 4481 4482 TEST_F(FormatTest, UnderstandsTemplateParameters) { 4483 verifyFormat("A<int> a;"); 4484 verifyFormat("A<A<A<int>>> a;"); 4485 verifyFormat("A<A<A<int, 2>, 3>, 4> a;"); 4486 verifyFormat("bool x = a < 1 || 2 > a;"); 4487 verifyFormat("bool x = 5 < f<int>();"); 4488 verifyFormat("bool x = f<int>() > 5;"); 4489 verifyFormat("bool x = 5 < a<int>::x;"); 4490 verifyFormat("bool x = a < 4 ? a > 2 : false;"); 4491 verifyFormat("bool x = f() ? a < 2 : a > 2;"); 4492 4493 verifyGoogleFormat("A<A<int>> a;"); 4494 verifyGoogleFormat("A<A<A<int>>> a;"); 4495 verifyGoogleFormat("A<A<A<A<int>>>> a;"); 4496 verifyGoogleFormat("A<A<int> > a;"); 4497 verifyGoogleFormat("A<A<A<int> > > a;"); 4498 verifyGoogleFormat("A<A<A<A<int> > > > a;"); 4499 verifyGoogleFormat("A<::A<int>> a;"); 4500 verifyGoogleFormat("A<::A> a;"); 4501 verifyGoogleFormat("A< ::A> a;"); 4502 verifyGoogleFormat("A< ::A<int> > a;"); 4503 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle())); 4504 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle())); 4505 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle())); 4506 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle())); 4507 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };", 4508 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle())); 4509 4510 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp)); 4511 4512 verifyFormat("test >> a >> b;"); 4513 verifyFormat("test << a >> b;"); 4514 4515 verifyFormat("f<int>();"); 4516 verifyFormat("template <typename T> void f() {}"); 4517 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;"); 4518 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : " 4519 "sizeof(char)>::type>;"); 4520 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};"); 4521 verifyFormat("f(a.operator()<A>());"); 4522 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4523 " .template operator()<A>());", 4524 getLLVMStyleWithColumns(35)); 4525 4526 // Not template parameters. 4527 verifyFormat("return a < b && c > d;"); 4528 verifyFormat("void f() {\n" 4529 " while (a < b && c > d) {\n" 4530 " }\n" 4531 "}"); 4532 verifyFormat("template <typename... Types>\n" 4533 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}"); 4534 4535 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4536 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);", 4537 getLLVMStyleWithColumns(60)); 4538 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");"); 4539 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}"); 4540 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <"); 4541 } 4542 4543 TEST_F(FormatTest, BitshiftOperatorWidth) { 4544 EXPECT_EQ("int a = 1 << 2; /* foo\n" 4545 " bar */", 4546 format("int a=1<<2; /* foo\n" 4547 " bar */")); 4548 4549 EXPECT_EQ("int b = 256 >> 1; /* foo\n" 4550 " bar */", 4551 format("int b =256>>1 ; /* foo\n" 4552 " bar */")); 4553 } 4554 4555 TEST_F(FormatTest, UnderstandsBinaryOperators) { 4556 verifyFormat("COMPARE(a, ==, b);"); 4557 verifyFormat("auto s = sizeof...(Ts) - 1;"); 4558 } 4559 4560 TEST_F(FormatTest, UnderstandsPointersToMembers) { 4561 verifyFormat("int A::*x;"); 4562 verifyFormat("int (S::*func)(void *);"); 4563 verifyFormat("void f() { int (S::*func)(void *); }"); 4564 verifyFormat("typedef bool *(Class::*Member)() const;"); 4565 verifyFormat("void f() {\n" 4566 " (a->*f)();\n" 4567 " a->*x;\n" 4568 " (a.*f)();\n" 4569 " ((*a).*f)();\n" 4570 " a.*x;\n" 4571 "}"); 4572 verifyFormat("void f() {\n" 4573 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 4574 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n" 4575 "}"); 4576 verifyFormat( 4577 "(aaaaaaaaaa->*bbbbbbb)(\n" 4578 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 4579 FormatStyle Style = getLLVMStyle(); 4580 Style.PointerAlignment = FormatStyle::PAS_Left; 4581 verifyFormat("typedef bool* (Class::*Member)() const;", Style); 4582 } 4583 4584 TEST_F(FormatTest, UnderstandsUnaryOperators) { 4585 verifyFormat("int a = -2;"); 4586 verifyFormat("f(-1, -2, -3);"); 4587 verifyFormat("a[-1] = 5;"); 4588 verifyFormat("int a = 5 + -2;"); 4589 verifyFormat("if (i == -1) {\n}"); 4590 verifyFormat("if (i != -1) {\n}"); 4591 verifyFormat("if (i > -1) {\n}"); 4592 verifyFormat("if (i < -1) {\n}"); 4593 verifyFormat("++(a->f());"); 4594 verifyFormat("--(a->f());"); 4595 verifyFormat("(a->f())++;"); 4596 verifyFormat("a[42]++;"); 4597 verifyFormat("if (!(a->f())) {\n}"); 4598 4599 verifyFormat("a-- > b;"); 4600 verifyFormat("b ? -a : c;"); 4601 verifyFormat("n * sizeof char16;"); 4602 verifyFormat("n * alignof char16;", getGoogleStyle()); 4603 verifyFormat("sizeof(char);"); 4604 verifyFormat("alignof(char);", getGoogleStyle()); 4605 4606 verifyFormat("return -1;"); 4607 verifyFormat("switch (a) {\n" 4608 "case -1:\n" 4609 " break;\n" 4610 "}"); 4611 verifyFormat("#define X -1"); 4612 verifyFormat("#define X -kConstant"); 4613 4614 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};"); 4615 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};"); 4616 4617 verifyFormat("int a = /* confusing comment */ -1;"); 4618 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case. 4619 verifyFormat("int a = i /* confusing comment */++;"); 4620 } 4621 4622 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) { 4623 verifyFormat("if (!aaaaaaaaaa( // break\n" 4624 " aaaaa)) {\n" 4625 "}"); 4626 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n" 4627 " aaaaa));"); 4628 verifyFormat("*aaa = aaaaaaa( // break\n" 4629 " bbbbbb);"); 4630 } 4631 4632 TEST_F(FormatTest, UnderstandsOverloadedOperators) { 4633 verifyFormat("bool operator<();"); 4634 verifyFormat("bool operator>();"); 4635 verifyFormat("bool operator=();"); 4636 verifyFormat("bool operator==();"); 4637 verifyFormat("bool operator!=();"); 4638 verifyFormat("int operator+();"); 4639 verifyFormat("int operator++();"); 4640 verifyFormat("bool operator,();"); 4641 verifyFormat("bool operator();"); 4642 verifyFormat("bool operator()();"); 4643 verifyFormat("bool operator[]();"); 4644 verifyFormat("operator bool();"); 4645 verifyFormat("operator int();"); 4646 verifyFormat("operator void *();"); 4647 verifyFormat("operator SomeType<int>();"); 4648 verifyFormat("operator SomeType<int, int>();"); 4649 verifyFormat("operator SomeType<SomeType<int>>();"); 4650 verifyFormat("void *operator new(std::size_t size);"); 4651 verifyFormat("void *operator new[](std::size_t size);"); 4652 verifyFormat("void operator delete(void *ptr);"); 4653 verifyFormat("void operator delete[](void *ptr);"); 4654 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n" 4655 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);"); 4656 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n" 4657 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;"); 4658 4659 verifyFormat( 4660 "ostream &operator<<(ostream &OutputStream,\n" 4661 " SomeReallyLongType WithSomeReallyLongValue);"); 4662 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n" 4663 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n" 4664 " return left.group < right.group;\n" 4665 "}"); 4666 verifyFormat("SomeType &operator=(const SomeType &S);"); 4667 verifyFormat("f.template operator()<int>();"); 4668 4669 verifyGoogleFormat("operator void*();"); 4670 verifyGoogleFormat("operator SomeType<SomeType<int>>();"); 4671 verifyGoogleFormat("operator ::A();"); 4672 4673 verifyFormat("using A::operator+;"); 4674 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n" 4675 "int i;"); 4676 } 4677 4678 TEST_F(FormatTest, UnderstandsFunctionRefQualification) { 4679 verifyFormat("Deleted &operator=(const Deleted &) & = default;"); 4680 verifyFormat("Deleted &operator=(const Deleted &) && = delete;"); 4681 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;"); 4682 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;"); 4683 verifyFormat("Deleted &operator=(const Deleted &) &;"); 4684 verifyFormat("Deleted &operator=(const Deleted &) &&;"); 4685 verifyFormat("SomeType MemberFunction(const Deleted &) &;"); 4686 verifyFormat("SomeType MemberFunction(const Deleted &) &&;"); 4687 verifyFormat("SomeType MemberFunction(const Deleted &) && {}"); 4688 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}"); 4689 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}"); 4690 verifyFormat("SomeType MemberFunction(const Deleted &) const &;"); 4691 verifyFormat("template <typename T>\n" 4692 "void F(T) && = delete;", 4693 getGoogleStyle()); 4694 4695 FormatStyle AlignLeft = getLLVMStyle(); 4696 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 4697 verifyFormat("void A::b() && {}", AlignLeft); 4698 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft); 4699 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;", 4700 AlignLeft); 4701 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft); 4702 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft); 4703 verifyFormat("auto Function(T t) & -> void {}", AlignLeft); 4704 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft); 4705 verifyFormat("auto Function(T) & -> void {}", AlignLeft); 4706 verifyFormat("auto Function(T) & -> void;", AlignLeft); 4707 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft); 4708 4709 FormatStyle Spaces = getLLVMStyle(); 4710 Spaces.SpacesInCStyleCastParentheses = true; 4711 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces); 4712 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces); 4713 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces); 4714 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces); 4715 4716 Spaces.SpacesInCStyleCastParentheses = false; 4717 Spaces.SpacesInParentheses = true; 4718 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces); 4719 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces); 4720 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces); 4721 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces); 4722 } 4723 4724 TEST_F(FormatTest, UnderstandsNewAndDelete) { 4725 verifyFormat("void f() {\n" 4726 " A *a = new A;\n" 4727 " A *a = new (placement) A;\n" 4728 " delete a;\n" 4729 " delete (A *)a;\n" 4730 "}"); 4731 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 4732 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 4733 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 4734 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 4735 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 4736 verifyFormat("delete[] h->p;"); 4737 } 4738 4739 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { 4740 verifyFormat("int *f(int *a) {}"); 4741 verifyFormat("int main(int argc, char **argv) {}"); 4742 verifyFormat("Test::Test(int b) : a(b * b) {}"); 4743 verifyIndependentOfContext("f(a, *a);"); 4744 verifyFormat("void g() { f(*a); }"); 4745 verifyIndependentOfContext("int a = b * 10;"); 4746 verifyIndependentOfContext("int a = 10 * b;"); 4747 verifyIndependentOfContext("int a = b * c;"); 4748 verifyIndependentOfContext("int a += b * c;"); 4749 verifyIndependentOfContext("int a -= b * c;"); 4750 verifyIndependentOfContext("int a *= b * c;"); 4751 verifyIndependentOfContext("int a /= b * c;"); 4752 verifyIndependentOfContext("int a = *b;"); 4753 verifyIndependentOfContext("int a = *b * c;"); 4754 verifyIndependentOfContext("int a = b * *c;"); 4755 verifyIndependentOfContext("int a = b * (10);"); 4756 verifyIndependentOfContext("S << b * (10);"); 4757 verifyIndependentOfContext("return 10 * b;"); 4758 verifyIndependentOfContext("return *b * *c;"); 4759 verifyIndependentOfContext("return a & ~b;"); 4760 verifyIndependentOfContext("f(b ? *c : *d);"); 4761 verifyIndependentOfContext("int a = b ? *c : *d;"); 4762 verifyIndependentOfContext("*b = a;"); 4763 verifyIndependentOfContext("a * ~b;"); 4764 verifyIndependentOfContext("a * !b;"); 4765 verifyIndependentOfContext("a * +b;"); 4766 verifyIndependentOfContext("a * -b;"); 4767 verifyIndependentOfContext("a * ++b;"); 4768 verifyIndependentOfContext("a * --b;"); 4769 verifyIndependentOfContext("a[4] * b;"); 4770 verifyIndependentOfContext("a[a * a] = 1;"); 4771 verifyIndependentOfContext("f() * b;"); 4772 verifyIndependentOfContext("a * [self dostuff];"); 4773 verifyIndependentOfContext("int x = a * (a + b);"); 4774 verifyIndependentOfContext("(a *)(a + b);"); 4775 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;"); 4776 verifyIndependentOfContext("int *pa = (int *)&a;"); 4777 verifyIndependentOfContext("return sizeof(int **);"); 4778 verifyIndependentOfContext("return sizeof(int ******);"); 4779 verifyIndependentOfContext("return (int **&)a;"); 4780 verifyIndependentOfContext("f((*PointerToArray)[10]);"); 4781 verifyFormat("void f(Type (*parameter)[10]) {}"); 4782 verifyFormat("void f(Type (¶meter)[10]) {}"); 4783 verifyGoogleFormat("return sizeof(int**);"); 4784 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);"); 4785 verifyGoogleFormat("Type** A = static_cast<Type**>(P);"); 4786 verifyFormat("auto a = [](int **&, int ***) {};"); 4787 verifyFormat("auto PointerBinding = [](const char *S) {};"); 4788 verifyFormat("typedef typeof(int(int, int)) *MyFunc;"); 4789 verifyFormat("[](const decltype(*a) &value) {}"); 4790 verifyFormat("decltype(a * b) F();"); 4791 verifyFormat("#define MACRO() [](A *a) { return 1; }"); 4792 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}"); 4793 verifyIndependentOfContext("typedef void (*f)(int *a);"); 4794 verifyIndependentOfContext("int i{a * b};"); 4795 verifyIndependentOfContext("aaa && aaa->f();"); 4796 verifyIndependentOfContext("int x = ~*p;"); 4797 verifyFormat("Constructor() : a(a), area(width * height) {}"); 4798 verifyFormat("Constructor() : a(a), area(a, width * height) {}"); 4799 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}"); 4800 verifyFormat("void f() { f(a, c * d); }"); 4801 verifyFormat("void f() { f(new a(), c * d); }"); 4802 verifyFormat("void f(const MyOverride &override);"); 4803 verifyFormat("void f(const MyFinal &final);"); 4804 verifyIndependentOfContext("bool a = f() && override.f();"); 4805 verifyIndependentOfContext("bool a = f() && final.f();"); 4806 4807 verifyIndependentOfContext("InvalidRegions[*R] = 0;"); 4808 4809 verifyIndependentOfContext("A<int *> a;"); 4810 verifyIndependentOfContext("A<int **> a;"); 4811 verifyIndependentOfContext("A<int *, int *> a;"); 4812 verifyIndependentOfContext("A<int *[]> a;"); 4813 verifyIndependentOfContext( 4814 "const char *const p = reinterpret_cast<const char *const>(q);"); 4815 verifyIndependentOfContext("A<int **, int **> a;"); 4816 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);"); 4817 verifyFormat("for (char **a = b; *a; ++a) {\n}"); 4818 verifyFormat("for (; a && b;) {\n}"); 4819 verifyFormat("bool foo = true && [] { return false; }();"); 4820 4821 verifyFormat( 4822 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4823 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4824 4825 verifyGoogleFormat("int const* a = &b;"); 4826 verifyGoogleFormat("**outparam = 1;"); 4827 verifyGoogleFormat("*outparam = a * b;"); 4828 verifyGoogleFormat("int main(int argc, char** argv) {}"); 4829 verifyGoogleFormat("A<int*> a;"); 4830 verifyGoogleFormat("A<int**> a;"); 4831 verifyGoogleFormat("A<int*, int*> a;"); 4832 verifyGoogleFormat("A<int**, int**> a;"); 4833 verifyGoogleFormat("f(b ? *c : *d);"); 4834 verifyGoogleFormat("int a = b ? *c : *d;"); 4835 verifyGoogleFormat("Type* t = **x;"); 4836 verifyGoogleFormat("Type* t = *++*x;"); 4837 verifyGoogleFormat("*++*x;"); 4838 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);"); 4839 verifyGoogleFormat("Type* t = x++ * y;"); 4840 verifyGoogleFormat( 4841 "const char* const p = reinterpret_cast<const char* const>(q);"); 4842 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);"); 4843 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);"); 4844 verifyGoogleFormat("template <typename T>\n" 4845 "void f(int i = 0, SomeType** temps = NULL);"); 4846 4847 FormatStyle Left = getLLVMStyle(); 4848 Left.PointerAlignment = FormatStyle::PAS_Left; 4849 verifyFormat("x = *a(x) = *a(y);", Left); 4850 verifyFormat("for (;; *a = b) {\n}", Left); 4851 verifyFormat("return *this += 1;", Left); 4852 4853 verifyIndependentOfContext("a = *(x + y);"); 4854 verifyIndependentOfContext("a = &(x + y);"); 4855 verifyIndependentOfContext("*(x + y).call();"); 4856 verifyIndependentOfContext("&(x + y)->call();"); 4857 verifyFormat("void f() { &(*I).first; }"); 4858 4859 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);"); 4860 verifyFormat( 4861 "int *MyValues = {\n" 4862 " *A, // Operator detection might be confused by the '{'\n" 4863 " *BB // Operator detection might be confused by previous comment\n" 4864 "};"); 4865 4866 verifyIndependentOfContext("if (int *a = &b)"); 4867 verifyIndependentOfContext("if (int &a = *b)"); 4868 verifyIndependentOfContext("if (a & b[i])"); 4869 verifyIndependentOfContext("if (a::b::c::d & b[i])"); 4870 verifyIndependentOfContext("if (*b[i])"); 4871 verifyIndependentOfContext("if (int *a = (&b))"); 4872 verifyIndependentOfContext("while (int *a = &b)"); 4873 verifyIndependentOfContext("size = sizeof *a;"); 4874 verifyIndependentOfContext("if (a && (b = c))"); 4875 verifyFormat("void f() {\n" 4876 " for (const int &v : Values) {\n" 4877 " }\n" 4878 "}"); 4879 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}"); 4880 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}"); 4881 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}"); 4882 4883 verifyFormat("#define A (!a * b)"); 4884 verifyFormat("#define MACRO \\\n" 4885 " int *i = a * b; \\\n" 4886 " void f(a *b);", 4887 getLLVMStyleWithColumns(19)); 4888 4889 verifyIndependentOfContext("A = new SomeType *[Length];"); 4890 verifyIndependentOfContext("A = new SomeType *[Length]();"); 4891 verifyIndependentOfContext("T **t = new T *;"); 4892 verifyIndependentOfContext("T **t = new T *();"); 4893 verifyGoogleFormat("A = new SomeType*[Length]();"); 4894 verifyGoogleFormat("A = new SomeType*[Length];"); 4895 verifyGoogleFormat("T** t = new T*;"); 4896 verifyGoogleFormat("T** t = new T*();"); 4897 4898 FormatStyle PointerLeft = getLLVMStyle(); 4899 PointerLeft.PointerAlignment = FormatStyle::PAS_Left; 4900 verifyFormat("delete *x;", PointerLeft); 4901 verifyFormat("STATIC_ASSERT((a & b) == 0);"); 4902 verifyFormat("STATIC_ASSERT(0 == (a & b));"); 4903 verifyFormat("template <bool a, bool b> " 4904 "typename t::if<x && y>::type f() {}"); 4905 verifyFormat("template <int *y> f() {}"); 4906 verifyFormat("vector<int *> v;"); 4907 verifyFormat("vector<int *const> v;"); 4908 verifyFormat("vector<int *const **const *> v;"); 4909 verifyFormat("vector<int *volatile> v;"); 4910 verifyFormat("vector<a * b> v;"); 4911 verifyFormat("foo<b && false>();"); 4912 verifyFormat("foo<b & 1>();"); 4913 verifyFormat("decltype(*::std::declval<const T &>()) void F();"); 4914 verifyFormat( 4915 "template <class T, class = typename std::enable_if<\n" 4916 " std::is_integral<T>::value &&\n" 4917 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n" 4918 "void F();", 4919 getLLVMStyleWithColumns(70)); 4920 verifyFormat( 4921 "template <class T,\n" 4922 " class = typename std::enable_if<\n" 4923 " std::is_integral<T>::value &&\n" 4924 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n" 4925 " class U>\n" 4926 "void F();", 4927 getLLVMStyleWithColumns(70)); 4928 verifyFormat( 4929 "template <class T,\n" 4930 " class = typename ::std::enable_if<\n" 4931 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n" 4932 "void F();", 4933 getGoogleStyleWithColumns(68)); 4934 4935 verifyIndependentOfContext("MACRO(int *i);"); 4936 verifyIndependentOfContext("MACRO(auto *a);"); 4937 verifyIndependentOfContext("MACRO(const A *a);"); 4938 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');"); 4939 verifyFormat("void f() { f(float{1}, a * a); }"); 4940 // FIXME: Is there a way to make this work? 4941 // verifyIndependentOfContext("MACRO(A *a);"); 4942 4943 verifyFormat("DatumHandle const *operator->() const { return input_; }"); 4944 verifyFormat("return options != nullptr && operator==(*options);"); 4945 4946 EXPECT_EQ("#define OP(x) \\\n" 4947 " ostream &operator<<(ostream &s, const A &a) { \\\n" 4948 " return s << a.DebugString(); \\\n" 4949 " }", 4950 format("#define OP(x) \\\n" 4951 " ostream &operator<<(ostream &s, const A &a) { \\\n" 4952 " return s << a.DebugString(); \\\n" 4953 " }", 4954 getLLVMStyleWithColumns(50))); 4955 4956 // FIXME: We cannot handle this case yet; we might be able to figure out that 4957 // foo<x> d > v; doesn't make sense. 4958 verifyFormat("foo<a<b && c> d> v;"); 4959 4960 FormatStyle PointerMiddle = getLLVMStyle(); 4961 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 4962 verifyFormat("delete *x;", PointerMiddle); 4963 verifyFormat("int * x;", PointerMiddle); 4964 verifyFormat("template <int * y> f() {}", PointerMiddle); 4965 verifyFormat("int * f(int * a) {}", PointerMiddle); 4966 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle); 4967 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle); 4968 verifyFormat("A<int *> a;", PointerMiddle); 4969 verifyFormat("A<int **> a;", PointerMiddle); 4970 verifyFormat("A<int *, int *> a;", PointerMiddle); 4971 verifyFormat("A<int * []> a;", PointerMiddle); 4972 verifyFormat("A = new SomeType *[Length]();", PointerMiddle); 4973 verifyFormat("A = new SomeType *[Length];", PointerMiddle); 4974 verifyFormat("T ** t = new T *;", PointerMiddle); 4975 4976 // Member function reference qualifiers aren't binary operators. 4977 verifyFormat("string // break\n" 4978 "operator()() & {}"); 4979 verifyFormat("string // break\n" 4980 "operator()() && {}"); 4981 verifyGoogleFormat("template <typename T>\n" 4982 "auto x() & -> int {}"); 4983 } 4984 4985 TEST_F(FormatTest, UnderstandsAttributes) { 4986 verifyFormat("SomeType s __attribute__((unused)) (InitValue);"); 4987 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n" 4988 "aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 4989 FormatStyle AfterType = getLLVMStyle(); 4990 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 4991 verifyFormat("__attribute__((nodebug)) void\n" 4992 "foo() {}\n", 4993 AfterType); 4994 } 4995 4996 TEST_F(FormatTest, UnderstandsEllipsis) { 4997 verifyFormat("int printf(const char *fmt, ...);"); 4998 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }"); 4999 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}"); 5000 5001 FormatStyle PointersLeft = getLLVMStyle(); 5002 PointersLeft.PointerAlignment = FormatStyle::PAS_Left; 5003 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft); 5004 } 5005 5006 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) { 5007 EXPECT_EQ("int *a;\n" 5008 "int *a;\n" 5009 "int *a;", 5010 format("int *a;\n" 5011 "int* a;\n" 5012 "int *a;", 5013 getGoogleStyle())); 5014 EXPECT_EQ("int* a;\n" 5015 "int* a;\n" 5016 "int* a;", 5017 format("int* a;\n" 5018 "int* a;\n" 5019 "int *a;", 5020 getGoogleStyle())); 5021 EXPECT_EQ("int *a;\n" 5022 "int *a;\n" 5023 "int *a;", 5024 format("int *a;\n" 5025 "int * a;\n" 5026 "int * a;", 5027 getGoogleStyle())); 5028 EXPECT_EQ("auto x = [] {\n" 5029 " int *a;\n" 5030 " int *a;\n" 5031 " int *a;\n" 5032 "};", 5033 format("auto x=[]{int *a;\n" 5034 "int * a;\n" 5035 "int * a;};", 5036 getGoogleStyle())); 5037 } 5038 5039 TEST_F(FormatTest, UnderstandsRvalueReferences) { 5040 verifyFormat("int f(int &&a) {}"); 5041 verifyFormat("int f(int a, char &&b) {}"); 5042 verifyFormat("void f() { int &&a = b; }"); 5043 verifyGoogleFormat("int f(int a, char&& b) {}"); 5044 verifyGoogleFormat("void f() { int&& a = b; }"); 5045 5046 verifyIndependentOfContext("A<int &&> a;"); 5047 verifyIndependentOfContext("A<int &&, int &&> a;"); 5048 verifyGoogleFormat("A<int&&> a;"); 5049 verifyGoogleFormat("A<int&&, int&&> a;"); 5050 5051 // Not rvalue references: 5052 verifyFormat("template <bool B, bool C> class A {\n" 5053 " static_assert(B && C, \"Something is wrong\");\n" 5054 "};"); 5055 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))"); 5056 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))"); 5057 verifyFormat("#define A(a, b) (a && b)"); 5058 } 5059 5060 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) { 5061 verifyFormat("void f() {\n" 5062 " x[aaaaaaaaa -\n" 5063 " b] = 23;\n" 5064 "}", 5065 getLLVMStyleWithColumns(15)); 5066 } 5067 5068 TEST_F(FormatTest, FormatsCasts) { 5069 verifyFormat("Type *A = static_cast<Type *>(P);"); 5070 verifyFormat("Type *A = (Type *)P;"); 5071 verifyFormat("Type *A = (vector<Type *, int *>)P;"); 5072 verifyFormat("int a = (int)(2.0f);"); 5073 verifyFormat("int a = (int)2.0f;"); 5074 verifyFormat("x[(int32)y];"); 5075 verifyFormat("x = (int32)y;"); 5076 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)"); 5077 verifyFormat("int a = (int)*b;"); 5078 verifyFormat("int a = (int)2.0f;"); 5079 verifyFormat("int a = (int)~0;"); 5080 verifyFormat("int a = (int)++a;"); 5081 verifyFormat("int a = (int)sizeof(int);"); 5082 verifyFormat("int a = (int)+2;"); 5083 verifyFormat("my_int a = (my_int)2.0f;"); 5084 verifyFormat("my_int a = (my_int)sizeof(int);"); 5085 verifyFormat("return (my_int)aaa;"); 5086 verifyFormat("#define x ((int)-1)"); 5087 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1"); 5088 verifyFormat("#define p(q) ((int *)&q)"); 5089 verifyFormat("fn(a)(b) + 1;"); 5090 5091 verifyFormat("void f() { my_int a = (my_int)*b; }"); 5092 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }"); 5093 verifyFormat("my_int a = (my_int)~0;"); 5094 verifyFormat("my_int a = (my_int)++a;"); 5095 verifyFormat("my_int a = (my_int)-2;"); 5096 verifyFormat("my_int a = (my_int)1;"); 5097 verifyFormat("my_int a = (my_int *)1;"); 5098 verifyFormat("my_int a = (const my_int)-1;"); 5099 verifyFormat("my_int a = (const my_int *)-1;"); 5100 verifyFormat("my_int a = (my_int)(my_int)-1;"); 5101 verifyFormat("my_int a = (ns::my_int)-2;"); 5102 verifyFormat("case (my_int)ONE:"); 5103 verifyFormat("auto x = (X)this;"); 5104 5105 // FIXME: single value wrapped with paren will be treated as cast. 5106 verifyFormat("void f(int i = (kValue)*kMask) {}"); 5107 5108 verifyFormat("{ (void)F; }"); 5109 5110 // Don't break after a cast's 5111 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5112 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n" 5113 " bbbbbbbbbbbbbbbbbbbbbb);"); 5114 5115 // These are not casts. 5116 verifyFormat("void f(int *) {}"); 5117 verifyFormat("f(foo)->b;"); 5118 verifyFormat("f(foo).b;"); 5119 verifyFormat("f(foo)(b);"); 5120 verifyFormat("f(foo)[b];"); 5121 verifyFormat("[](foo) { return 4; }(bar);"); 5122 verifyFormat("(*funptr)(foo)[4];"); 5123 verifyFormat("funptrs[4](foo)[4];"); 5124 verifyFormat("void f(int *);"); 5125 verifyFormat("void f(int *) = 0;"); 5126 verifyFormat("void f(SmallVector<int>) {}"); 5127 verifyFormat("void f(SmallVector<int>);"); 5128 verifyFormat("void f(SmallVector<int>) = 0;"); 5129 verifyFormat("void f(int i = (kA * kB) & kMask) {}"); 5130 verifyFormat("int a = sizeof(int) * b;"); 5131 verifyFormat("int a = alignof(int) * b;", getGoogleStyle()); 5132 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;"); 5133 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");"); 5134 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;"); 5135 5136 // These are not casts, but at some point were confused with casts. 5137 verifyFormat("virtual void foo(int *) override;"); 5138 verifyFormat("virtual void foo(char &) const;"); 5139 verifyFormat("virtual void foo(int *a, char *) const;"); 5140 verifyFormat("int a = sizeof(int *) + b;"); 5141 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle()); 5142 verifyFormat("bool b = f(g<int>) && c;"); 5143 verifyFormat("typedef void (*f)(int i) func;"); 5144 5145 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n" 5146 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 5147 // FIXME: The indentation here is not ideal. 5148 verifyFormat( 5149 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5150 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n" 5151 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];"); 5152 } 5153 5154 TEST_F(FormatTest, FormatsFunctionTypes) { 5155 verifyFormat("A<bool()> a;"); 5156 verifyFormat("A<SomeType()> a;"); 5157 verifyFormat("A<void (*)(int, std::string)> a;"); 5158 verifyFormat("A<void *(int)>;"); 5159 verifyFormat("void *(*a)(int *, SomeType *);"); 5160 verifyFormat("int (*func)(void *);"); 5161 verifyFormat("void f() { int (*func)(void *); }"); 5162 verifyFormat("template <class CallbackClass>\n" 5163 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);"); 5164 5165 verifyGoogleFormat("A<void*(int*, SomeType*)>;"); 5166 verifyGoogleFormat("void* (*a)(int);"); 5167 verifyGoogleFormat( 5168 "template <class CallbackClass>\n" 5169 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);"); 5170 5171 // Other constructs can look somewhat like function types: 5172 verifyFormat("A<sizeof(*x)> a;"); 5173 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)"); 5174 verifyFormat("some_var = function(*some_pointer_var)[0];"); 5175 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }"); 5176 verifyFormat("int x = f(&h)();"); 5177 verifyFormat("returnsFunction(¶m1, ¶m2)(param);"); 5178 } 5179 5180 TEST_F(FormatTest, FormatsPointersToArrayTypes) { 5181 verifyFormat("A (*foo_)[6];"); 5182 verifyFormat("vector<int> (*foo_)[6];"); 5183 } 5184 5185 TEST_F(FormatTest, BreaksLongVariableDeclarations) { 5186 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 5187 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 5188 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n" 5189 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 5190 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 5191 " *LoooooooooooooooooooooooooooooooooooooooongVariable;"); 5192 5193 // Different ways of ()-initializiation. 5194 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 5195 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);"); 5196 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 5197 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);"); 5198 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 5199 " LoooooooooooooooooooooooooooooooooooooooongVariable({});"); 5200 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 5201 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);"); 5202 5203 // Lambdas should not confuse the variable declaration heuristic. 5204 verifyFormat("LooooooooooooooooongType\n" 5205 " variable(nullptr, [](A *a) {});", 5206 getLLVMStyleWithColumns(40)); 5207 } 5208 5209 TEST_F(FormatTest, BreaksLongDeclarations) { 5210 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n" 5211 " AnotherNameForTheLongType;"); 5212 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n" 5213 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5214 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 5215 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 5216 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n" 5217 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 5218 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 5219 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 5220 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n" 5221 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 5222 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 5223 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 5224 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 5225 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 5226 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 5227 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);"); 5228 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 5229 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}"); 5230 FormatStyle Indented = getLLVMStyle(); 5231 Indented.IndentWrappedFunctionNames = true; 5232 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 5233 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();", 5234 Indented); 5235 verifyFormat( 5236 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 5237 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 5238 Indented); 5239 verifyFormat( 5240 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 5241 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 5242 Indented); 5243 verifyFormat( 5244 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 5245 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 5246 Indented); 5247 5248 // FIXME: Without the comment, this breaks after "(". 5249 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n" 5250 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();", 5251 getGoogleStyle()); 5252 5253 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n" 5254 " int LoooooooooooooooooooongParam2) {}"); 5255 verifyFormat( 5256 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n" 5257 " SourceLocation L, IdentifierIn *II,\n" 5258 " Type *T) {}"); 5259 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n" 5260 "ReallyReaaallyLongFunctionName(\n" 5261 " const std::string &SomeParameter,\n" 5262 " const SomeType<string, SomeOtherTemplateParameter>\n" 5263 " &ReallyReallyLongParameterName,\n" 5264 " const SomeType<string, SomeOtherTemplateParameter>\n" 5265 " &AnotherLongParameterName) {}"); 5266 verifyFormat("template <typename A>\n" 5267 "SomeLoooooooooooooooooooooongType<\n" 5268 " typename some_namespace::SomeOtherType<A>::Type>\n" 5269 "Function() {}"); 5270 5271 verifyGoogleFormat( 5272 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n" 5273 " aaaaaaaaaaaaaaaaaaaaaaa;"); 5274 verifyGoogleFormat( 5275 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n" 5276 " SourceLocation L) {}"); 5277 verifyGoogleFormat( 5278 "some_namespace::LongReturnType\n" 5279 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n" 5280 " int first_long_parameter, int second_parameter) {}"); 5281 5282 verifyGoogleFormat("template <typename T>\n" 5283 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n" 5284 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}"); 5285 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5286 " int aaaaaaaaaaaaaaaaaaaaaaa);"); 5287 5288 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 5289 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5290 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5291 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5292 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 5293 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 5294 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5295 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 5296 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n" 5297 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5298 } 5299 5300 TEST_F(FormatTest, FormatsArrays) { 5301 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 5302 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;"); 5303 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n" 5304 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;"); 5305 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n" 5306 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}"); 5307 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5308 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 5309 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5310 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;"); 5311 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5312 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 5313 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 5314 verifyFormat( 5315 "llvm::outs() << \"aaaaaaaaaaaa: \"\n" 5316 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 5317 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];"); 5318 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n" 5319 " .aaaaaaaaaaaaaaaaaaaaaa();"); 5320 5321 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n" 5322 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];"); 5323 verifyFormat( 5324 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n" 5325 " .aaaaaaa[0]\n" 5326 " .aaaaaaaaaaaaaaaaaaaaaa();"); 5327 verifyFormat("a[::b::c];"); 5328 5329 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10)); 5330 5331 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0); 5332 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit); 5333 } 5334 5335 TEST_F(FormatTest, LineStartsWithSpecialCharacter) { 5336 verifyFormat("(a)->b();"); 5337 verifyFormat("--a;"); 5338 } 5339 5340 TEST_F(FormatTest, HandlesIncludeDirectives) { 5341 verifyFormat("#include <string>\n" 5342 "#include <a/b/c.h>\n" 5343 "#include \"a/b/string\"\n" 5344 "#include \"string.h\"\n" 5345 "#include \"string.h\"\n" 5346 "#include <a-a>\n" 5347 "#include < path with space >\n" 5348 "#include_next <test.h>" 5349 "#include \"abc.h\" // this is included for ABC\n" 5350 "#include \"some long include\" // with a comment\n" 5351 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"", 5352 getLLVMStyleWithColumns(35)); 5353 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\"")); 5354 EXPECT_EQ("#include <a>", format("#include<a>")); 5355 5356 verifyFormat("#import <string>"); 5357 verifyFormat("#import <a/b/c.h>"); 5358 verifyFormat("#import \"a/b/string\""); 5359 verifyFormat("#import \"string.h\""); 5360 verifyFormat("#import \"string.h\""); 5361 verifyFormat("#if __has_include(<strstream>)\n" 5362 "#include <strstream>\n" 5363 "#endif"); 5364 5365 verifyFormat("#define MY_IMPORT <a/b>"); 5366 5367 verifyFormat("#if __has_include(<a/b>)"); 5368 verifyFormat("#if __has_include_next(<a/b>)"); 5369 verifyFormat("#define F __has_include(<a/b>)"); 5370 verifyFormat("#define F __has_include_next(<a/b>)"); 5371 5372 // Protocol buffer definition or missing "#". 5373 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";", 5374 getLLVMStyleWithColumns(30)); 5375 5376 FormatStyle Style = getLLVMStyle(); 5377 Style.AlwaysBreakBeforeMultilineStrings = true; 5378 Style.ColumnLimit = 0; 5379 verifyFormat("#import \"abc.h\"", Style); 5380 5381 // But 'import' might also be a regular C++ namespace. 5382 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5383 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5384 } 5385 5386 //===----------------------------------------------------------------------===// 5387 // Error recovery tests. 5388 //===----------------------------------------------------------------------===// 5389 5390 TEST_F(FormatTest, IncompleteParameterLists) { 5391 FormatStyle NoBinPacking = getLLVMStyle(); 5392 NoBinPacking.BinPackParameters = false; 5393 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n" 5394 " double *min_x,\n" 5395 " double *max_x,\n" 5396 " double *min_y,\n" 5397 " double *max_y,\n" 5398 " double *min_z,\n" 5399 " double *max_z, ) {}", 5400 NoBinPacking); 5401 } 5402 5403 TEST_F(FormatTest, IncorrectCodeTrailingStuff) { 5404 verifyFormat("void f() { return; }\n42"); 5405 verifyFormat("void f() {\n" 5406 " if (0)\n" 5407 " return;\n" 5408 "}\n" 5409 "42"); 5410 verifyFormat("void f() { return }\n42"); 5411 verifyFormat("void f() {\n" 5412 " if (0)\n" 5413 " return\n" 5414 "}\n" 5415 "42"); 5416 } 5417 5418 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) { 5419 EXPECT_EQ("void f() { return }", format("void f ( ) { return }")); 5420 EXPECT_EQ("void f() {\n" 5421 " if (a)\n" 5422 " return\n" 5423 "}", 5424 format("void f ( ) { if ( a ) return }")); 5425 EXPECT_EQ("namespace N {\n" 5426 "void f()\n" 5427 "}", 5428 format("namespace N { void f() }")); 5429 EXPECT_EQ("namespace N {\n" 5430 "void f() {}\n" 5431 "void g()\n" 5432 "}", 5433 format("namespace N { void f( ) { } void g( ) }")); 5434 } 5435 5436 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) { 5437 verifyFormat("int aaaaaaaa =\n" 5438 " // Overlylongcomment\n" 5439 " b;", 5440 getLLVMStyleWithColumns(20)); 5441 verifyFormat("function(\n" 5442 " ShortArgument,\n" 5443 " LoooooooooooongArgument);\n", 5444 getLLVMStyleWithColumns(20)); 5445 } 5446 5447 TEST_F(FormatTest, IncorrectAccessSpecifier) { 5448 verifyFormat("public:"); 5449 verifyFormat("class A {\n" 5450 "public\n" 5451 " void f() {}\n" 5452 "};"); 5453 verifyFormat("public\n" 5454 "int qwerty;"); 5455 verifyFormat("public\n" 5456 "B {}"); 5457 verifyFormat("public\n" 5458 "{}"); 5459 verifyFormat("public\n" 5460 "B { int x; }"); 5461 } 5462 5463 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) { 5464 verifyFormat("{"); 5465 verifyFormat("#})"); 5466 verifyNoCrash("(/**/[:!] ?[)."); 5467 } 5468 5469 TEST_F(FormatTest, IncorrectCodeDoNoWhile) { 5470 verifyFormat("do {\n}"); 5471 verifyFormat("do {\n}\n" 5472 "f();"); 5473 verifyFormat("do {\n}\n" 5474 "wheeee(fun);"); 5475 verifyFormat("do {\n" 5476 " f();\n" 5477 "}"); 5478 } 5479 5480 TEST_F(FormatTest, IncorrectCodeMissingParens) { 5481 verifyFormat("if {\n foo;\n foo();\n}"); 5482 verifyFormat("switch {\n foo;\n foo();\n}"); 5483 verifyIncompleteFormat("for {\n foo;\n foo();\n}"); 5484 verifyFormat("while {\n foo;\n foo();\n}"); 5485 verifyFormat("do {\n foo;\n foo();\n} while;"); 5486 } 5487 5488 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) { 5489 verifyIncompleteFormat("namespace {\n" 5490 "class Foo { Foo (\n" 5491 "};\n" 5492 "} // comment"); 5493 } 5494 5495 TEST_F(FormatTest, IncorrectCodeErrorDetection) { 5496 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n")); 5497 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n")); 5498 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n")); 5499 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n")); 5500 5501 EXPECT_EQ("{\n" 5502 " {\n" 5503 " breakme(\n" 5504 " qwe);\n" 5505 " }\n", 5506 format("{\n" 5507 " {\n" 5508 " breakme(qwe);\n" 5509 "}\n", 5510 getLLVMStyleWithColumns(10))); 5511 } 5512 5513 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) { 5514 verifyFormat("int x = {\n" 5515 " avariable,\n" 5516 " b(alongervariable)};", 5517 getLLVMStyleWithColumns(25)); 5518 } 5519 5520 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) { 5521 verifyFormat("return (a)(b){1, 2, 3};"); 5522 } 5523 5524 TEST_F(FormatTest, LayoutCxx11BraceInitializers) { 5525 verifyFormat("vector<int> x{1, 2, 3, 4};"); 5526 verifyFormat("vector<int> x{\n" 5527 " 1, 2, 3, 4,\n" 5528 "};"); 5529 verifyFormat("vector<T> x{{}, {}, {}, {}};"); 5530 verifyFormat("f({1, 2});"); 5531 verifyFormat("auto v = Foo{-1};"); 5532 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});"); 5533 verifyFormat("Class::Class : member{1, 2, 3} {}"); 5534 verifyFormat("new vector<int>{1, 2, 3};"); 5535 verifyFormat("new int[3]{1, 2, 3};"); 5536 verifyFormat("new int{1};"); 5537 verifyFormat("return {arg1, arg2};"); 5538 verifyFormat("return {arg1, SomeType{parameter}};"); 5539 verifyFormat("int count = set<int>{f(), g(), h()}.size();"); 5540 verifyFormat("new T{arg1, arg2};"); 5541 verifyFormat("f(MyMap[{composite, key}]);"); 5542 verifyFormat("class Class {\n" 5543 " T member = {arg1, arg2};\n" 5544 "};"); 5545 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};"); 5546 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");"); 5547 verifyFormat("int a = std::is_integral<int>{} + 0;"); 5548 5549 verifyFormat("int foo(int i) { return fo1{}(i); }"); 5550 verifyFormat("int foo(int i) { return fo1{}(i); }"); 5551 verifyFormat("auto i = decltype(x){};"); 5552 verifyFormat("std::vector<int> v = {1, 0 /* comment */};"); 5553 verifyFormat("Node n{1, Node{1000}, //\n" 5554 " 2};"); 5555 verifyFormat("Aaaa aaaaaaa{\n" 5556 " {\n" 5557 " aaaa,\n" 5558 " },\n" 5559 "};"); 5560 verifyFormat("class C : public D {\n" 5561 " SomeClass SC{2};\n" 5562 "};"); 5563 verifyFormat("class C : public A {\n" 5564 " class D : public B {\n" 5565 " void f() { int i{2}; }\n" 5566 " };\n" 5567 "};"); 5568 verifyFormat("#define A {a, a},"); 5569 5570 // Cases where distinguising braced lists and blocks is hard. 5571 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);"); 5572 verifyFormat("void f() {\n" 5573 " return; // comment\n" 5574 "}\n" 5575 "SomeType t;"); 5576 verifyFormat("void f() {\n" 5577 " if (a) {\n" 5578 " f();\n" 5579 " }\n" 5580 "}\n" 5581 "SomeType t;"); 5582 5583 // In combination with BinPackArguments = false. 5584 FormatStyle NoBinPacking = getLLVMStyle(); 5585 NoBinPacking.BinPackArguments = false; 5586 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n" 5587 " bbbbb,\n" 5588 " ccccc,\n" 5589 " ddddd,\n" 5590 " eeeee,\n" 5591 " ffffff,\n" 5592 " ggggg,\n" 5593 " hhhhhh,\n" 5594 " iiiiii,\n" 5595 " jjjjjj,\n" 5596 " kkkkkk};", 5597 NoBinPacking); 5598 verifyFormat("const Aaaaaa aaaaa = {\n" 5599 " aaaaa,\n" 5600 " bbbbb,\n" 5601 " ccccc,\n" 5602 " ddddd,\n" 5603 " eeeee,\n" 5604 " ffffff,\n" 5605 " ggggg,\n" 5606 " hhhhhh,\n" 5607 " iiiiii,\n" 5608 " jjjjjj,\n" 5609 " kkkkkk,\n" 5610 "};", 5611 NoBinPacking); 5612 verifyFormat( 5613 "const Aaaaaa aaaaa = {\n" 5614 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n" 5615 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n" 5616 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n" 5617 "};", 5618 NoBinPacking); 5619 5620 // FIXME: The alignment of these trailing comments might be bad. Then again, 5621 // this might be utterly useless in real code. 5622 verifyFormat("Constructor::Constructor()\n" 5623 " : some_value{ //\n" 5624 " aaaaaaa, //\n" 5625 " bbbbbbb} {}"); 5626 5627 // In braced lists, the first comment is always assumed to belong to the 5628 // first element. Thus, it can be moved to the next or previous line as 5629 // appropriate. 5630 EXPECT_EQ("function({// First element:\n" 5631 " 1,\n" 5632 " // Second element:\n" 5633 " 2});", 5634 format("function({\n" 5635 " // First element:\n" 5636 " 1,\n" 5637 " // Second element:\n" 5638 " 2});")); 5639 EXPECT_EQ("std::vector<int> MyNumbers{\n" 5640 " // First element:\n" 5641 " 1,\n" 5642 " // Second element:\n" 5643 " 2};", 5644 format("std::vector<int> MyNumbers{// First element:\n" 5645 " 1,\n" 5646 " // Second element:\n" 5647 " 2};", 5648 getLLVMStyleWithColumns(30))); 5649 // A trailing comma should still lead to an enforced line break. 5650 EXPECT_EQ("vector<int> SomeVector = {\n" 5651 " // aaa\n" 5652 " 1, 2,\n" 5653 "};", 5654 format("vector<int> SomeVector = { // aaa\n" 5655 " 1, 2, };")); 5656 5657 FormatStyle ExtraSpaces = getLLVMStyle(); 5658 ExtraSpaces.Cpp11BracedListStyle = false; 5659 ExtraSpaces.ColumnLimit = 75; 5660 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces); 5661 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces); 5662 verifyFormat("f({ 1, 2 });", ExtraSpaces); 5663 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces); 5664 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces); 5665 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces); 5666 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces); 5667 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces); 5668 verifyFormat("return { arg1, arg2 };", ExtraSpaces); 5669 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces); 5670 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces); 5671 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces); 5672 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces); 5673 verifyFormat("class Class {\n" 5674 " T member = { arg1, arg2 };\n" 5675 "};", 5676 ExtraSpaces); 5677 verifyFormat( 5678 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5679 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n" 5680 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 5681 " bbbbbbbbbbbbbbbbbbbb, bbbbb };", 5682 ExtraSpaces); 5683 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces); 5684 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });", 5685 ExtraSpaces); 5686 verifyFormat( 5687 "someFunction(OtherParam,\n" 5688 " BracedList{ // comment 1 (Forcing interesting break)\n" 5689 " param1, param2,\n" 5690 " // comment 2\n" 5691 " param3, param4 });", 5692 ExtraSpaces); 5693 verifyFormat( 5694 "std::this_thread::sleep_for(\n" 5695 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);", 5696 ExtraSpaces); 5697 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n" 5698 " aaaaaaa,\n" 5699 " aaaaaaaaaa,\n" 5700 " aaaaa,\n" 5701 " aaaaaaaaaaaaaaa,\n" 5702 " aaa,\n" 5703 " aaaaaaaaaa,\n" 5704 " a,\n" 5705 " aaaaaaaaaaaaaaaaaaaaa,\n" 5706 " aaaaaaaaaaaa,\n" 5707 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n" 5708 " aaaaaaa,\n" 5709 " a};"); 5710 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces); 5711 } 5712 5713 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) { 5714 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 5715 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 5716 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 5717 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 5718 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 5719 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 5720 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n" 5721 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 5722 " 1, 22, 333, 4444, 55555, //\n" 5723 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 5724 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 5725 verifyFormat( 5726 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 5727 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 5728 " 1, 22, 333, 4444, 55555, 666666, // comment\n" 5729 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 5730 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 5731 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 5732 " 7777777};"); 5733 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 5734 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 5735 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 5736 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 5737 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 5738 " // Separating comment.\n" 5739 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 5740 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 5741 " // Leading comment\n" 5742 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 5743 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 5744 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 5745 " 1, 1, 1, 1};", 5746 getLLVMStyleWithColumns(39)); 5747 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 5748 " 1, 1, 1, 1};", 5749 getLLVMStyleWithColumns(38)); 5750 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n" 5751 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};", 5752 getLLVMStyleWithColumns(43)); 5753 verifyFormat( 5754 "static unsigned SomeValues[10][3] = {\n" 5755 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n" 5756 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};"); 5757 verifyFormat("static auto fields = new vector<string>{\n" 5758 " \"aaaaaaaaaaaaa\",\n" 5759 " \"aaaaaaaaaaaaa\",\n" 5760 " \"aaaaaaaaaaaa\",\n" 5761 " \"aaaaaaaaaaaaaa\",\n" 5762 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 5763 " \"aaaaaaaaaaaa\",\n" 5764 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 5765 "};"); 5766 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};"); 5767 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n" 5768 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n" 5769 " 3, cccccccccccccccccccccc};", 5770 getLLVMStyleWithColumns(60)); 5771 5772 // Trailing commas. 5773 verifyFormat("vector<int> x = {\n" 5774 " 1, 1, 1, 1, 1, 1, 1, 1,\n" 5775 "};", 5776 getLLVMStyleWithColumns(39)); 5777 verifyFormat("vector<int> x = {\n" 5778 " 1, 1, 1, 1, 1, 1, 1, 1, //\n" 5779 "};", 5780 getLLVMStyleWithColumns(39)); 5781 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 5782 " 1, 1, 1, 1,\n" 5783 " /**/ /**/};", 5784 getLLVMStyleWithColumns(39)); 5785 5786 // Trailing comment in the first line. 5787 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n" 5788 " 1111111111, 2222222222, 33333333333, 4444444444, //\n" 5789 " 111111111, 222222222, 3333333333, 444444444, //\n" 5790 " 11111111, 22222222, 333333333, 44444444};"); 5791 // Trailing comment in the last line. 5792 verifyFormat("int aaaaa[] = {\n" 5793 " 1, 2, 3, // comment\n" 5794 " 4, 5, 6 // comment\n" 5795 "};"); 5796 5797 // With nested lists, we should either format one item per line or all nested 5798 // lists one on line. 5799 // FIXME: For some nested lists, we can do better. 5800 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n" 5801 " {aaaaaaaaaaaaaaaaaaa},\n" 5802 " {aaaaaaaaaaaaaaaaaaaaa},\n" 5803 " {aaaaaaaaaaaaaaaaa}};", 5804 getLLVMStyleWithColumns(60)); 5805 verifyFormat( 5806 "SomeStruct my_struct_array = {\n" 5807 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n" 5808 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n" 5809 " {aaa, aaa},\n" 5810 " {aaa, aaa},\n" 5811 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n" 5812 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n" 5813 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};"); 5814 5815 // No column layout should be used here. 5816 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n" 5817 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};"); 5818 5819 verifyNoCrash("a<,"); 5820 5821 // No braced initializer here. 5822 verifyFormat("void f() {\n" 5823 " struct Dummy {};\n" 5824 " f(v);\n" 5825 "}"); 5826 5827 // Long lists should be formatted in columns even if they are nested. 5828 verifyFormat( 5829 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n" 5830 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 5831 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 5832 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 5833 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 5834 " 1, 22, 333, 4444, 55555, 666666, 7777777});"); 5835 5836 // Allow "single-column" layout even if that violates the column limit. There 5837 // isn't going to be a better way. 5838 verifyFormat("std::vector<int> a = {\n" 5839 " aaaaaaaa,\n" 5840 " aaaaaaaa,\n" 5841 " aaaaaaaa,\n" 5842 " aaaaaaaa,\n" 5843 " aaaaaaaaaa,\n" 5844 " aaaaaaaa,\n" 5845 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};", 5846 getLLVMStyleWithColumns(30)); 5847 verifyFormat("vector<int> aaaa = {\n" 5848 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5849 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5850 " aaaaaa.aaaaaaa,\n" 5851 " aaaaaa.aaaaaaa,\n" 5852 " aaaaaa.aaaaaaa,\n" 5853 " aaaaaa.aaaaaaa,\n" 5854 "};"); 5855 5856 // Don't create hanging lists. 5857 verifyFormat("someFunction(Param, {List1, List2,\n" 5858 " List3});", 5859 getLLVMStyleWithColumns(35)); 5860 verifyFormat("someFunction(Param, Param,\n" 5861 " {List1, List2,\n" 5862 " List3});", 5863 getLLVMStyleWithColumns(35)); 5864 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n" 5865 " aaaaaaaaaaaaaaaaaaaaaaa);"); 5866 } 5867 5868 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) { 5869 FormatStyle DoNotMerge = getLLVMStyle(); 5870 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 5871 5872 verifyFormat("void f() { return 42; }"); 5873 verifyFormat("void f() {\n" 5874 " return 42;\n" 5875 "}", 5876 DoNotMerge); 5877 verifyFormat("void f() {\n" 5878 " // Comment\n" 5879 "}"); 5880 verifyFormat("{\n" 5881 "#error {\n" 5882 " int a;\n" 5883 "}"); 5884 verifyFormat("{\n" 5885 " int a;\n" 5886 "#error {\n" 5887 "}"); 5888 verifyFormat("void f() {} // comment"); 5889 verifyFormat("void f() { int a; } // comment"); 5890 verifyFormat("void f() {\n" 5891 "} // comment", 5892 DoNotMerge); 5893 verifyFormat("void f() {\n" 5894 " int a;\n" 5895 "} // comment", 5896 DoNotMerge); 5897 verifyFormat("void f() {\n" 5898 "} // comment", 5899 getLLVMStyleWithColumns(15)); 5900 5901 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23)); 5902 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22)); 5903 5904 verifyFormat("void f() {}", getLLVMStyleWithColumns(11)); 5905 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10)); 5906 verifyFormat("class C {\n" 5907 " C()\n" 5908 " : iiiiiiii(nullptr),\n" 5909 " kkkkkkk(nullptr),\n" 5910 " mmmmmmm(nullptr),\n" 5911 " nnnnnnn(nullptr) {}\n" 5912 "};", 5913 getGoogleStyle()); 5914 5915 FormatStyle NoColumnLimit = getLLVMStyle(); 5916 NoColumnLimit.ColumnLimit = 0; 5917 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit)); 5918 EXPECT_EQ("class C {\n" 5919 " A() : b(0) {}\n" 5920 "};", 5921 format("class C{A():b(0){}};", NoColumnLimit)); 5922 EXPECT_EQ("A()\n" 5923 " : b(0) {\n" 5924 "}", 5925 format("A()\n:b(0)\n{\n}", NoColumnLimit)); 5926 5927 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit; 5928 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine = 5929 FormatStyle::SFS_None; 5930 EXPECT_EQ("A()\n" 5931 " : b(0) {\n" 5932 "}", 5933 format("A():b(0){}", DoNotMergeNoColumnLimit)); 5934 EXPECT_EQ("A()\n" 5935 " : b(0) {\n" 5936 "}", 5937 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit)); 5938 5939 verifyFormat("#define A \\\n" 5940 " void f() { \\\n" 5941 " int i; \\\n" 5942 " }", 5943 getLLVMStyleWithColumns(20)); 5944 verifyFormat("#define A \\\n" 5945 " void f() { int i; }", 5946 getLLVMStyleWithColumns(21)); 5947 verifyFormat("#define A \\\n" 5948 " void f() { \\\n" 5949 " int i; \\\n" 5950 " } \\\n" 5951 " int j;", 5952 getLLVMStyleWithColumns(22)); 5953 verifyFormat("#define A \\\n" 5954 " void f() { int i; } \\\n" 5955 " int j;", 5956 getLLVMStyleWithColumns(23)); 5957 } 5958 5959 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) { 5960 FormatStyle MergeInlineOnly = getLLVMStyle(); 5961 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 5962 verifyFormat("class C {\n" 5963 " int f() { return 42; }\n" 5964 "};", 5965 MergeInlineOnly); 5966 verifyFormat("int f() {\n" 5967 " return 42;\n" 5968 "}", 5969 MergeInlineOnly); 5970 } 5971 5972 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) { 5973 // Elaborate type variable declarations. 5974 verifyFormat("struct foo a = {bar};\nint n;"); 5975 verifyFormat("class foo a = {bar};\nint n;"); 5976 verifyFormat("union foo a = {bar};\nint n;"); 5977 5978 // Elaborate types inside function definitions. 5979 verifyFormat("struct foo f() {}\nint n;"); 5980 verifyFormat("class foo f() {}\nint n;"); 5981 verifyFormat("union foo f() {}\nint n;"); 5982 5983 // Templates. 5984 verifyFormat("template <class X> void f() {}\nint n;"); 5985 verifyFormat("template <struct X> void f() {}\nint n;"); 5986 verifyFormat("template <union X> void f() {}\nint n;"); 5987 5988 // Actual definitions... 5989 verifyFormat("struct {\n} n;"); 5990 verifyFormat( 5991 "template <template <class T, class Y>, class Z> class X {\n} n;"); 5992 verifyFormat("union Z {\n int n;\n} x;"); 5993 verifyFormat("class MACRO Z {\n} n;"); 5994 verifyFormat("class MACRO(X) Z {\n} n;"); 5995 verifyFormat("class __attribute__(X) Z {\n} n;"); 5996 verifyFormat("class __declspec(X) Z {\n} n;"); 5997 verifyFormat("class A##B##C {\n} n;"); 5998 verifyFormat("class alignas(16) Z {\n} n;"); 5999 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;"); 6000 verifyFormat("class MACROA MACRO(X) Z {\n} n;"); 6001 6002 // Redefinition from nested context: 6003 verifyFormat("class A::B::C {\n} n;"); 6004 6005 // Template definitions. 6006 verifyFormat( 6007 "template <typename F>\n" 6008 "Matcher(const Matcher<F> &Other,\n" 6009 " typename enable_if_c<is_base_of<F, T>::value &&\n" 6010 " !is_same<F, T>::value>::type * = 0)\n" 6011 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}"); 6012 6013 // FIXME: This is still incorrectly handled at the formatter side. 6014 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};"); 6015 verifyFormat("int i = SomeFunction(a<b, a> b);"); 6016 6017 // FIXME: 6018 // This now gets parsed incorrectly as class definition. 6019 // verifyFormat("class A<int> f() {\n}\nint n;"); 6020 6021 // Elaborate types where incorrectly parsing the structural element would 6022 // break the indent. 6023 verifyFormat("if (true)\n" 6024 " class X x;\n" 6025 "else\n" 6026 " f();\n"); 6027 6028 // This is simply incomplete. Formatting is not important, but must not crash. 6029 verifyFormat("class A:"); 6030 } 6031 6032 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) { 6033 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n", 6034 format("#error Leave all white!!!!! space* alone!\n")); 6035 EXPECT_EQ( 6036 "#warning Leave all white!!!!! space* alone!\n", 6037 format("#warning Leave all white!!!!! space* alone!\n")); 6038 EXPECT_EQ("#error 1", format(" # error 1")); 6039 EXPECT_EQ("#warning 1", format(" # warning 1")); 6040 } 6041 6042 TEST_F(FormatTest, FormatHashIfExpressions) { 6043 verifyFormat("#if AAAA && BBBB"); 6044 verifyFormat("#if (AAAA && BBBB)"); 6045 verifyFormat("#elif (AAAA && BBBB)"); 6046 // FIXME: Come up with a better indentation for #elif. 6047 verifyFormat( 6048 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n" 6049 " defined(BBBBBBBB)\n" 6050 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n" 6051 " defined(BBBBBBBB)\n" 6052 "#endif", 6053 getLLVMStyleWithColumns(65)); 6054 } 6055 6056 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) { 6057 FormatStyle AllowsMergedIf = getGoogleStyle(); 6058 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true; 6059 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf); 6060 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf); 6061 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf); 6062 EXPECT_EQ("if (true) return 42;", 6063 format("if (true)\nreturn 42;", AllowsMergedIf)); 6064 FormatStyle ShortMergedIf = AllowsMergedIf; 6065 ShortMergedIf.ColumnLimit = 25; 6066 verifyFormat("#define A \\\n" 6067 " if (true) return 42;", 6068 ShortMergedIf); 6069 verifyFormat("#define A \\\n" 6070 " f(); \\\n" 6071 " if (true)\n" 6072 "#define B", 6073 ShortMergedIf); 6074 verifyFormat("#define A \\\n" 6075 " f(); \\\n" 6076 " if (true)\n" 6077 "g();", 6078 ShortMergedIf); 6079 verifyFormat("{\n" 6080 "#ifdef A\n" 6081 " // Comment\n" 6082 " if (true) continue;\n" 6083 "#endif\n" 6084 " // Comment\n" 6085 " if (true) continue;\n" 6086 "}", 6087 ShortMergedIf); 6088 ShortMergedIf.ColumnLimit = 29; 6089 verifyFormat("#define A \\\n" 6090 " if (aaaaaaaaaa) return 1; \\\n" 6091 " return 2;", 6092 ShortMergedIf); 6093 ShortMergedIf.ColumnLimit = 28; 6094 verifyFormat("#define A \\\n" 6095 " if (aaaaaaaaaa) \\\n" 6096 " return 1; \\\n" 6097 " return 2;", 6098 ShortMergedIf); 6099 } 6100 6101 TEST_F(FormatTest, FormatStarDependingOnContext) { 6102 verifyFormat("void f(int *a);"); 6103 verifyFormat("void f() { f(fint * b); }"); 6104 verifyFormat("class A {\n void f(int *a);\n};"); 6105 verifyFormat("class A {\n int *a;\n};"); 6106 verifyFormat("namespace a {\n" 6107 "namespace b {\n" 6108 "class A {\n" 6109 " void f() {}\n" 6110 " int *a;\n" 6111 "};\n" 6112 "}\n" 6113 "}"); 6114 } 6115 6116 TEST_F(FormatTest, SpecialTokensAtEndOfLine) { 6117 verifyFormat("while"); 6118 verifyFormat("operator"); 6119 } 6120 6121 TEST_F(FormatTest, SkipsDeeplyNestedLines) { 6122 // This code would be painfully slow to format if we didn't skip it. 6123 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 6124 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 6125 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 6126 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 6127 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 6128 "A(1, 1)\n" 6129 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x 6130 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 6131 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 6132 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 6133 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 6134 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 6135 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 6136 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 6137 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 6138 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n"); 6139 // Deeply nested part is untouched, rest is formatted. 6140 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n", 6141 format(std::string("int i;\n") + Code + "int j;\n", 6142 getLLVMStyle(), IC_ExpectIncomplete)); 6143 } 6144 6145 //===----------------------------------------------------------------------===// 6146 // Objective-C tests. 6147 //===----------------------------------------------------------------------===// 6148 6149 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) { 6150 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;"); 6151 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;", 6152 format("-(NSUInteger)indexOfObject:(id)anObject;")); 6153 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;")); 6154 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;")); 6155 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;", 6156 format("-(NSInteger)Method3:(id)anObject;")); 6157 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;", 6158 format("-(NSInteger)Method4:(id)anObject;")); 6159 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;", 6160 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;")); 6161 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;", 6162 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;")); 6163 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject " 6164 "forAllCells:(BOOL)flag;", 6165 format("- (void)sendAction:(SEL)aSelector to:(id)anObject " 6166 "forAllCells:(BOOL)flag;")); 6167 6168 // Very long objectiveC method declaration. 6169 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n" 6170 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;"); 6171 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n" 6172 " inRange:(NSRange)range\n" 6173 " outRange:(NSRange)out_range\n" 6174 " outRange1:(NSRange)out_range1\n" 6175 " outRange2:(NSRange)out_range2\n" 6176 " outRange3:(NSRange)out_range3\n" 6177 " outRange4:(NSRange)out_range4\n" 6178 " outRange5:(NSRange)out_range5\n" 6179 " outRange6:(NSRange)out_range6\n" 6180 " outRange7:(NSRange)out_range7\n" 6181 " outRange8:(NSRange)out_range8\n" 6182 " outRange9:(NSRange)out_range9;"); 6183 6184 // When the function name has to be wrapped. 6185 FormatStyle Style = getLLVMStyle(); 6186 Style.IndentWrappedFunctionNames = false; 6187 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 6188 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n" 6189 " anotherName:(NSString)bbbbbbbbbbbbbb {\n" 6190 "}", 6191 Style); 6192 Style.IndentWrappedFunctionNames = true; 6193 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 6194 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n" 6195 " anotherName:(NSString)bbbbbbbbbbbbbb {\n" 6196 "}", 6197 Style); 6198 6199 verifyFormat("- (int)sum:(vector<int>)numbers;"); 6200 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;"); 6201 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC 6202 // protocol lists (but not for template classes): 6203 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;"); 6204 6205 verifyFormat("- (int (*)())foo:(int (*)())f;"); 6206 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;"); 6207 6208 // If there's no return type (very rare in practice!), LLVM and Google style 6209 // agree. 6210 verifyFormat("- foo;"); 6211 verifyFormat("- foo:(int)f;"); 6212 verifyGoogleFormat("- foo:(int)foo;"); 6213 } 6214 6215 6216 TEST_F(FormatTest, BreaksStringLiterals) { 6217 EXPECT_EQ("\"some text \"\n" 6218 "\"other\";", 6219 format("\"some text other\";", getLLVMStyleWithColumns(12))); 6220 EXPECT_EQ("\"some text \"\n" 6221 "\"other\";", 6222 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12))); 6223 EXPECT_EQ( 6224 "#define A \\\n" 6225 " \"some \" \\\n" 6226 " \"text \" \\\n" 6227 " \"other\";", 6228 format("#define A \"some text other\";", getLLVMStyleWithColumns(12))); 6229 EXPECT_EQ( 6230 "#define A \\\n" 6231 " \"so \" \\\n" 6232 " \"text \" \\\n" 6233 " \"other\";", 6234 format("#define A \"so text other\";", getLLVMStyleWithColumns(12))); 6235 6236 EXPECT_EQ("\"some text\"", 6237 format("\"some text\"", getLLVMStyleWithColumns(1))); 6238 EXPECT_EQ("\"some text\"", 6239 format("\"some text\"", getLLVMStyleWithColumns(11))); 6240 EXPECT_EQ("\"some \"\n" 6241 "\"text\"", 6242 format("\"some text\"", getLLVMStyleWithColumns(10))); 6243 EXPECT_EQ("\"some \"\n" 6244 "\"text\"", 6245 format("\"some text\"", getLLVMStyleWithColumns(7))); 6246 EXPECT_EQ("\"some\"\n" 6247 "\" tex\"\n" 6248 "\"t\"", 6249 format("\"some text\"", getLLVMStyleWithColumns(6))); 6250 EXPECT_EQ("\"some\"\n" 6251 "\" tex\"\n" 6252 "\" and\"", 6253 format("\"some tex and\"", getLLVMStyleWithColumns(6))); 6254 EXPECT_EQ("\"some\"\n" 6255 "\"/tex\"\n" 6256 "\"/and\"", 6257 format("\"some/tex/and\"", getLLVMStyleWithColumns(6))); 6258 6259 EXPECT_EQ("variable =\n" 6260 " \"long string \"\n" 6261 " \"literal\";", 6262 format("variable = \"long string literal\";", 6263 getLLVMStyleWithColumns(20))); 6264 6265 EXPECT_EQ("variable = f(\n" 6266 " \"long string \"\n" 6267 " \"literal\",\n" 6268 " short,\n" 6269 " loooooooooooooooooooong);", 6270 format("variable = f(\"long string literal\", short, " 6271 "loooooooooooooooooooong);", 6272 getLLVMStyleWithColumns(20))); 6273 6274 EXPECT_EQ( 6275 "f(g(\"long string \"\n" 6276 " \"literal\"),\n" 6277 " b);", 6278 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20))); 6279 EXPECT_EQ("f(g(\"long string \"\n" 6280 " \"literal\",\n" 6281 " a),\n" 6282 " b);", 6283 format("f(g(\"long string literal\", a), b);", 6284 getLLVMStyleWithColumns(20))); 6285 EXPECT_EQ( 6286 "f(\"one two\".split(\n" 6287 " variable));", 6288 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20))); 6289 EXPECT_EQ("f(\"one two three four five six \"\n" 6290 " \"seven\".split(\n" 6291 " really_looooong_variable));", 6292 format("f(\"one two three four five six seven\"." 6293 "split(really_looooong_variable));", 6294 getLLVMStyleWithColumns(33))); 6295 6296 EXPECT_EQ("f(\"some \"\n" 6297 " \"text\",\n" 6298 " other);", 6299 format("f(\"some text\", other);", getLLVMStyleWithColumns(10))); 6300 6301 // Only break as a last resort. 6302 verifyFormat( 6303 "aaaaaaaaaaaaaaaaaaaa(\n" 6304 " aaaaaaaaaaaaaaaaaaaa,\n" 6305 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));"); 6306 6307 EXPECT_EQ("\"splitmea\"\n" 6308 "\"trandomp\"\n" 6309 "\"oint\"", 6310 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10))); 6311 6312 EXPECT_EQ("\"split/\"\n" 6313 "\"pathat/\"\n" 6314 "\"slashes\"", 6315 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 6316 6317 EXPECT_EQ("\"split/\"\n" 6318 "\"pathat/\"\n" 6319 "\"slashes\"", 6320 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 6321 EXPECT_EQ("\"split at \"\n" 6322 "\"spaces/at/\"\n" 6323 "\"slashes.at.any$\"\n" 6324 "\"non-alphanumeric%\"\n" 6325 "\"1111111111characte\"\n" 6326 "\"rs\"", 6327 format("\"split at " 6328 "spaces/at/" 6329 "slashes.at." 6330 "any$non-" 6331 "alphanumeric%" 6332 "1111111111characte" 6333 "rs\"", 6334 getLLVMStyleWithColumns(20))); 6335 6336 // Verify that splitting the strings understands 6337 // Style::AlwaysBreakBeforeMultilineStrings. 6338 EXPECT_EQ( 6339 "aaaaaaaaaaaa(\n" 6340 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n" 6341 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");", 6342 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa " 6343 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 6344 "aaaaaaaaaaaaaaaaaaaaaa\");", 6345 getGoogleStyle())); 6346 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 6347 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";", 6348 format("return \"aaaaaaaaaaaaaaaaaaaaaa " 6349 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 6350 "aaaaaaaaaaaaaaaaaaaaaa\";", 6351 getGoogleStyle())); 6352 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 6353 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 6354 format("llvm::outs() << " 6355 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa" 6356 "aaaaaaaaaaaaaaaaaaa\";")); 6357 EXPECT_EQ("ffff(\n" 6358 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 6359 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 6360 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " 6361 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 6362 getGoogleStyle())); 6363 6364 FormatStyle Style = getLLVMStyleWithColumns(12); 6365 Style.BreakStringLiterals = false; 6366 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style)); 6367 6368 FormatStyle AlignLeft = getLLVMStyleWithColumns(12); 6369 AlignLeft.AlignEscapedNewlinesLeft = true; 6370 EXPECT_EQ("#define A \\\n" 6371 " \"some \" \\\n" 6372 " \"text \" \\\n" 6373 " \"other\";", 6374 format("#define A \"some text other\";", AlignLeft)); 6375 } 6376 6377 TEST_F(FormatTest, FullyRemoveEmptyLines) { 6378 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80); 6379 NoEmptyLines.MaxEmptyLinesToKeep = 0; 6380 EXPECT_EQ("int i = a(b());", 6381 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines)); 6382 } 6383 6384 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) { 6385 EXPECT_EQ( 6386 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 6387 "(\n" 6388 " \"x\t\");", 6389 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 6390 "aaaaaaa(" 6391 "\"x\t\");")); 6392 } 6393 6394 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) { 6395 EXPECT_EQ( 6396 "u8\"utf8 string \"\n" 6397 "u8\"literal\";", 6398 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16))); 6399 EXPECT_EQ( 6400 "u\"utf16 string \"\n" 6401 "u\"literal\";", 6402 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16))); 6403 EXPECT_EQ( 6404 "U\"utf32 string \"\n" 6405 "U\"literal\";", 6406 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16))); 6407 EXPECT_EQ("L\"wide string \"\n" 6408 "L\"literal\";", 6409 format("L\"wide string literal\";", getGoogleStyleWithColumns(16))); 6410 EXPECT_EQ("@\"NSString \"\n" 6411 "@\"literal\";", 6412 format("@\"NSString literal\";", getGoogleStyleWithColumns(19))); 6413 6414 // This input makes clang-format try to split the incomplete unicode escape 6415 // sequence, which used to lead to a crasher. 6416 verifyNoCrash( 6417 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 6418 getLLVMStyleWithColumns(60)); 6419 } 6420 6421 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) { 6422 FormatStyle Style = getGoogleStyleWithColumns(15); 6423 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style)); 6424 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style)); 6425 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style)); 6426 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style)); 6427 EXPECT_EQ("u8R\"x(raw literal)x\";", 6428 format("u8R\"x(raw literal)x\";", Style)); 6429 } 6430 6431 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) { 6432 FormatStyle Style = getLLVMStyleWithColumns(20); 6433 EXPECT_EQ( 6434 "_T(\"aaaaaaaaaaaaaa\")\n" 6435 "_T(\"aaaaaaaaaaaaaa\")\n" 6436 "_T(\"aaaaaaaaaaaa\")", 6437 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style)); 6438 EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n" 6439 " _T(\"aaaaaa\"),\n" 6440 " z);", 6441 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style)); 6442 6443 // FIXME: Handle embedded spaces in one iteration. 6444 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n" 6445 // "_T(\"aaaaaaaaaaaaa\")\n" 6446 // "_T(\"aaaaaaaaaaaaa\")\n" 6447 // "_T(\"a\")", 6448 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 6449 // getLLVMStyleWithColumns(20))); 6450 EXPECT_EQ( 6451 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 6452 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style)); 6453 EXPECT_EQ("f(\n" 6454 "#if !TEST\n" 6455 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 6456 "#endif\n" 6457 " );", 6458 format("f(\n" 6459 "#if !TEST\n" 6460 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 6461 "#endif\n" 6462 ");")); 6463 EXPECT_EQ("f(\n" 6464 "\n" 6465 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));", 6466 format("f(\n" 6467 "\n" 6468 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));")); 6469 } 6470 6471 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) { 6472 EXPECT_EQ( 6473 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 6474 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 6475 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 6476 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 6477 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 6478 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";")); 6479 } 6480 6481 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) { 6482 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);", 6483 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle())); 6484 EXPECT_EQ("fffffffffff(g(R\"x(\n" 6485 "multiline raw string literal xxxxxxxxxxxxxx\n" 6486 ")x\",\n" 6487 " a),\n" 6488 " b);", 6489 format("fffffffffff(g(R\"x(\n" 6490 "multiline raw string literal xxxxxxxxxxxxxx\n" 6491 ")x\", a), b);", 6492 getGoogleStyleWithColumns(20))); 6493 EXPECT_EQ("fffffffffff(\n" 6494 " g(R\"x(qqq\n" 6495 "multiline raw string literal xxxxxxxxxxxxxx\n" 6496 ")x\",\n" 6497 " a),\n" 6498 " b);", 6499 format("fffffffffff(g(R\"x(qqq\n" 6500 "multiline raw string literal xxxxxxxxxxxxxx\n" 6501 ")x\", a), b);", 6502 getGoogleStyleWithColumns(20))); 6503 6504 EXPECT_EQ("fffffffffff(R\"x(\n" 6505 "multiline raw string literal xxxxxxxxxxxxxx\n" 6506 ")x\");", 6507 format("fffffffffff(R\"x(\n" 6508 "multiline raw string literal xxxxxxxxxxxxxx\n" 6509 ")x\");", 6510 getGoogleStyleWithColumns(20))); 6511 EXPECT_EQ("fffffffffff(R\"x(\n" 6512 "multiline raw string literal xxxxxxxxxxxxxx\n" 6513 ")x\" + bbbbbb);", 6514 format("fffffffffff(R\"x(\n" 6515 "multiline raw string literal xxxxxxxxxxxxxx\n" 6516 ")x\" + bbbbbb);", 6517 getGoogleStyleWithColumns(20))); 6518 EXPECT_EQ("fffffffffff(\n" 6519 " R\"x(\n" 6520 "multiline raw string literal xxxxxxxxxxxxxx\n" 6521 ")x\" +\n" 6522 " bbbbbb);", 6523 format("fffffffffff(\n" 6524 " R\"x(\n" 6525 "multiline raw string literal xxxxxxxxxxxxxx\n" 6526 ")x\" + bbbbbb);", 6527 getGoogleStyleWithColumns(20))); 6528 } 6529 6530 TEST_F(FormatTest, SkipsUnknownStringLiterals) { 6531 verifyFormat("string a = \"unterminated;"); 6532 EXPECT_EQ("function(\"unterminated,\n" 6533 " OtherParameter);", 6534 format("function( \"unterminated,\n" 6535 " OtherParameter);")); 6536 } 6537 6538 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) { 6539 FormatStyle Style = getLLVMStyle(); 6540 Style.Standard = FormatStyle::LS_Cpp03; 6541 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);", 6542 format("#define x(_a) printf(\"foo\"_a);", Style)); 6543 } 6544 6545 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); } 6546 6547 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) { 6548 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n" 6549 " \"ddeeefff\");", 6550 format("someFunction(\"aaabbbcccdddeeefff\");", 6551 getLLVMStyleWithColumns(25))); 6552 EXPECT_EQ("someFunction1234567890(\n" 6553 " \"aaabbbcccdddeeefff\");", 6554 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 6555 getLLVMStyleWithColumns(26))); 6556 EXPECT_EQ("someFunction1234567890(\n" 6557 " \"aaabbbcccdddeeeff\"\n" 6558 " \"f\");", 6559 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 6560 getLLVMStyleWithColumns(25))); 6561 EXPECT_EQ("someFunction1234567890(\n" 6562 " \"aaabbbcccdddeeeff\"\n" 6563 " \"f\");", 6564 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 6565 getLLVMStyleWithColumns(24))); 6566 EXPECT_EQ("someFunction(\"aaabbbcc \"\n" 6567 " \"ddde \"\n" 6568 " \"efff\");", 6569 format("someFunction(\"aaabbbcc ddde efff\");", 6570 getLLVMStyleWithColumns(25))); 6571 EXPECT_EQ("someFunction(\"aaabbbccc \"\n" 6572 " \"ddeeefff\");", 6573 format("someFunction(\"aaabbbccc ddeeefff\");", 6574 getLLVMStyleWithColumns(25))); 6575 EXPECT_EQ("someFunction1234567890(\n" 6576 " \"aaabb \"\n" 6577 " \"cccdddeeefff\");", 6578 format("someFunction1234567890(\"aaabb cccdddeeefff\");", 6579 getLLVMStyleWithColumns(25))); 6580 EXPECT_EQ("#define A \\\n" 6581 " string s = \\\n" 6582 " \"123456789\" \\\n" 6583 " \"0\"; \\\n" 6584 " int i;", 6585 format("#define A string s = \"1234567890\"; int i;", 6586 getLLVMStyleWithColumns(20))); 6587 // FIXME: Put additional penalties on breaking at non-whitespace locations. 6588 EXPECT_EQ("someFunction(\"aaabbbcc \"\n" 6589 " \"dddeeeff\"\n" 6590 " \"f\");", 6591 format("someFunction(\"aaabbbcc dddeeefff\");", 6592 getLLVMStyleWithColumns(25))); 6593 } 6594 6595 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) { 6596 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3))); 6597 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2))); 6598 EXPECT_EQ("\"test\"\n" 6599 "\"\\n\"", 6600 format("\"test\\n\"", getLLVMStyleWithColumns(7))); 6601 EXPECT_EQ("\"tes\\\\\"\n" 6602 "\"n\"", 6603 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7))); 6604 EXPECT_EQ("\"\\\\\\\\\"\n" 6605 "\"\\n\"", 6606 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7))); 6607 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7))); 6608 EXPECT_EQ("\"\\uff01\"\n" 6609 "\"test\"", 6610 format("\"\\uff01test\"", getLLVMStyleWithColumns(8))); 6611 EXPECT_EQ("\"\\Uff01ff02\"", 6612 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11))); 6613 EXPECT_EQ("\"\\x000000000001\"\n" 6614 "\"next\"", 6615 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16))); 6616 EXPECT_EQ("\"\\x000000000001next\"", 6617 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15))); 6618 EXPECT_EQ("\"\\x000000000001\"", 6619 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7))); 6620 EXPECT_EQ("\"test\"\n" 6621 "\"\\000000\"\n" 6622 "\"000001\"", 6623 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9))); 6624 EXPECT_EQ("\"test\\000\"\n" 6625 "\"00000000\"\n" 6626 "\"1\"", 6627 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10))); 6628 } 6629 6630 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) { 6631 verifyFormat("void f() {\n" 6632 " return g() {}\n" 6633 " void h() {}"); 6634 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n" 6635 "g();\n" 6636 "}"); 6637 } 6638 6639 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) { 6640 verifyFormat( 6641 "void f() { return C{param1, param2}.SomeCall(param1, param2); }"); 6642 } 6643 6644 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) { 6645 verifyFormat("class X {\n" 6646 " void f() {\n" 6647 " }\n" 6648 "};", 6649 getLLVMStyleWithColumns(12)); 6650 } 6651 6652 TEST_F(FormatTest, ConfigurableIndentWidth) { 6653 FormatStyle EightIndent = getLLVMStyleWithColumns(18); 6654 EightIndent.IndentWidth = 8; 6655 EightIndent.ContinuationIndentWidth = 8; 6656 verifyFormat("void f() {\n" 6657 " someFunction();\n" 6658 " if (true) {\n" 6659 " f();\n" 6660 " }\n" 6661 "}", 6662 EightIndent); 6663 verifyFormat("class X {\n" 6664 " void f() {\n" 6665 " }\n" 6666 "};", 6667 EightIndent); 6668 verifyFormat("int x[] = {\n" 6669 " call(),\n" 6670 " call()};", 6671 EightIndent); 6672 } 6673 6674 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) { 6675 verifyFormat("double\n" 6676 "f();", 6677 getLLVMStyleWithColumns(8)); 6678 } 6679 6680 TEST_F(FormatTest, ConfigurableUseOfTab) { 6681 FormatStyle Tab = getLLVMStyleWithColumns(42); 6682 Tab.IndentWidth = 8; 6683 Tab.UseTab = FormatStyle::UT_Always; 6684 Tab.AlignEscapedNewlinesLeft = true; 6685 6686 EXPECT_EQ("if (aaaaaaaa && // q\n" 6687 " bb)\t\t// w\n" 6688 "\t;", 6689 format("if (aaaaaaaa &&// q\n" 6690 "bb)// w\n" 6691 ";", 6692 Tab)); 6693 EXPECT_EQ("if (aaa && bbb) // w\n" 6694 "\t;", 6695 format("if(aaa&&bbb)// w\n" 6696 ";", 6697 Tab)); 6698 6699 verifyFormat("class X {\n" 6700 "\tvoid f() {\n" 6701 "\t\tsomeFunction(parameter1,\n" 6702 "\t\t\t parameter2);\n" 6703 "\t}\n" 6704 "};", 6705 Tab); 6706 verifyFormat("#define A \\\n" 6707 "\tvoid f() { \\\n" 6708 "\t\tsomeFunction( \\\n" 6709 "\t\t parameter1, \\\n" 6710 "\t\t parameter2); \\\n" 6711 "\t}", 6712 Tab); 6713 6714 Tab.TabWidth = 4; 6715 Tab.IndentWidth = 8; 6716 verifyFormat("class TabWidth4Indent8 {\n" 6717 "\t\tvoid f() {\n" 6718 "\t\t\t\tsomeFunction(parameter1,\n" 6719 "\t\t\t\t\t\t\t parameter2);\n" 6720 "\t\t}\n" 6721 "};", 6722 Tab); 6723 6724 Tab.TabWidth = 4; 6725 Tab.IndentWidth = 4; 6726 verifyFormat("class TabWidth4Indent4 {\n" 6727 "\tvoid f() {\n" 6728 "\t\tsomeFunction(parameter1,\n" 6729 "\t\t\t\t\t parameter2);\n" 6730 "\t}\n" 6731 "};", 6732 Tab); 6733 6734 Tab.TabWidth = 8; 6735 Tab.IndentWidth = 4; 6736 verifyFormat("class TabWidth8Indent4 {\n" 6737 " void f() {\n" 6738 "\tsomeFunction(parameter1,\n" 6739 "\t\t parameter2);\n" 6740 " }\n" 6741 "};", 6742 Tab); 6743 6744 Tab.TabWidth = 8; 6745 Tab.IndentWidth = 8; 6746 EXPECT_EQ("/*\n" 6747 "\t a\t\tcomment\n" 6748 "\t in multiple lines\n" 6749 " */", 6750 format(" /*\t \t \n" 6751 " \t \t a\t\tcomment\t \t\n" 6752 " \t \t in multiple lines\t\n" 6753 " \t */", 6754 Tab)); 6755 6756 Tab.UseTab = FormatStyle::UT_ForIndentation; 6757 verifyFormat("{\n" 6758 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 6759 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 6760 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 6761 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 6762 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 6763 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 6764 "};", 6765 Tab); 6766 verifyFormat("enum AA {\n" 6767 "\ta1, // Force multiple lines\n" 6768 "\ta2,\n" 6769 "\ta3\n" 6770 "};", 6771 Tab); 6772 EXPECT_EQ("if (aaaaaaaa && // q\n" 6773 " bb) // w\n" 6774 "\t;", 6775 format("if (aaaaaaaa &&// q\n" 6776 "bb)// w\n" 6777 ";", 6778 Tab)); 6779 verifyFormat("class X {\n" 6780 "\tvoid f() {\n" 6781 "\t\tsomeFunction(parameter1,\n" 6782 "\t\t parameter2);\n" 6783 "\t}\n" 6784 "};", 6785 Tab); 6786 verifyFormat("{\n" 6787 "\tQ(\n" 6788 "\t {\n" 6789 "\t\t int a;\n" 6790 "\t\t someFunction(aaaaaaaa,\n" 6791 "\t\t bbbbbbb);\n" 6792 "\t },\n" 6793 "\t p);\n" 6794 "}", 6795 Tab); 6796 EXPECT_EQ("{\n" 6797 "\t/* aaaa\n" 6798 "\t bbbb */\n" 6799 "}", 6800 format("{\n" 6801 "/* aaaa\n" 6802 " bbbb */\n" 6803 "}", 6804 Tab)); 6805 EXPECT_EQ("{\n" 6806 "\t/*\n" 6807 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6808 "\t bbbbbbbbbbbbb\n" 6809 "\t*/\n" 6810 "}", 6811 format("{\n" 6812 "/*\n" 6813 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 6814 "*/\n" 6815 "}", 6816 Tab)); 6817 EXPECT_EQ("{\n" 6818 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6819 "\t// bbbbbbbbbbbbb\n" 6820 "}", 6821 format("{\n" 6822 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 6823 "}", 6824 Tab)); 6825 EXPECT_EQ("{\n" 6826 "\t/*\n" 6827 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6828 "\t bbbbbbbbbbbbb\n" 6829 "\t*/\n" 6830 "}", 6831 format("{\n" 6832 "\t/*\n" 6833 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 6834 "\t*/\n" 6835 "}", 6836 Tab)); 6837 EXPECT_EQ("{\n" 6838 "\t/*\n" 6839 "\n" 6840 "\t*/\n" 6841 "}", 6842 format("{\n" 6843 "\t/*\n" 6844 "\n" 6845 "\t*/\n" 6846 "}", 6847 Tab)); 6848 EXPECT_EQ("{\n" 6849 "\t/*\n" 6850 " asdf\n" 6851 "\t*/\n" 6852 "}", 6853 format("{\n" 6854 "\t/*\n" 6855 " asdf\n" 6856 "\t*/\n" 6857 "}", 6858 Tab)); 6859 6860 Tab.UseTab = FormatStyle::UT_Never; 6861 EXPECT_EQ("/*\n" 6862 " a\t\tcomment\n" 6863 " in multiple lines\n" 6864 " */", 6865 format(" /*\t \t \n" 6866 " \t \t a\t\tcomment\t \t\n" 6867 " \t \t in multiple lines\t\n" 6868 " \t */", 6869 Tab)); 6870 EXPECT_EQ("/* some\n" 6871 " comment */", 6872 format(" \t \t /* some\n" 6873 " \t \t comment */", 6874 Tab)); 6875 EXPECT_EQ("int a; /* some\n" 6876 " comment */", 6877 format(" \t \t int a; /* some\n" 6878 " \t \t comment */", 6879 Tab)); 6880 6881 EXPECT_EQ("int a; /* some\n" 6882 "comment */", 6883 format(" \t \t int\ta; /* some\n" 6884 " \t \t comment */", 6885 Tab)); 6886 EXPECT_EQ("f(\"\t\t\"); /* some\n" 6887 " comment */", 6888 format(" \t \t f(\"\t\t\"); /* some\n" 6889 " \t \t comment */", 6890 Tab)); 6891 EXPECT_EQ("{\n" 6892 " /*\n" 6893 " * Comment\n" 6894 " */\n" 6895 " int i;\n" 6896 "}", 6897 format("{\n" 6898 "\t/*\n" 6899 "\t * Comment\n" 6900 "\t */\n" 6901 "\t int i;\n" 6902 "}")); 6903 6904 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 6905 Tab.TabWidth = 8; 6906 Tab.IndentWidth = 8; 6907 EXPECT_EQ("if (aaaaaaaa && // q\n" 6908 " bb) // w\n" 6909 "\t;", 6910 format("if (aaaaaaaa &&// q\n" 6911 "bb)// w\n" 6912 ";", 6913 Tab)); 6914 EXPECT_EQ("if (aaa && bbb) // w\n" 6915 "\t;", 6916 format("if(aaa&&bbb)// w\n" 6917 ";", 6918 Tab)); 6919 verifyFormat("class X {\n" 6920 "\tvoid f() {\n" 6921 "\t\tsomeFunction(parameter1,\n" 6922 "\t\t\t parameter2);\n" 6923 "\t}\n" 6924 "};", 6925 Tab); 6926 verifyFormat("#define A \\\n" 6927 "\tvoid f() { \\\n" 6928 "\t\tsomeFunction( \\\n" 6929 "\t\t parameter1, \\\n" 6930 "\t\t parameter2); \\\n" 6931 "\t}", 6932 Tab); 6933 Tab.TabWidth = 4; 6934 Tab.IndentWidth = 8; 6935 verifyFormat("class TabWidth4Indent8 {\n" 6936 "\t\tvoid f() {\n" 6937 "\t\t\t\tsomeFunction(parameter1,\n" 6938 "\t\t\t\t\t\t\t parameter2);\n" 6939 "\t\t}\n" 6940 "};", 6941 Tab); 6942 Tab.TabWidth = 4; 6943 Tab.IndentWidth = 4; 6944 verifyFormat("class TabWidth4Indent4 {\n" 6945 "\tvoid f() {\n" 6946 "\t\tsomeFunction(parameter1,\n" 6947 "\t\t\t\t\t parameter2);\n" 6948 "\t}\n" 6949 "};", 6950 Tab); 6951 Tab.TabWidth = 8; 6952 Tab.IndentWidth = 4; 6953 verifyFormat("class TabWidth8Indent4 {\n" 6954 " void f() {\n" 6955 "\tsomeFunction(parameter1,\n" 6956 "\t\t parameter2);\n" 6957 " }\n" 6958 "};", 6959 Tab); 6960 Tab.TabWidth = 8; 6961 Tab.IndentWidth = 8; 6962 EXPECT_EQ("/*\n" 6963 "\t a\t\tcomment\n" 6964 "\t in multiple lines\n" 6965 " */", 6966 format(" /*\t \t \n" 6967 " \t \t a\t\tcomment\t \t\n" 6968 " \t \t in multiple lines\t\n" 6969 " \t */", 6970 Tab)); 6971 verifyFormat("{\n" 6972 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 6973 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 6974 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 6975 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 6976 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 6977 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 6978 "};", 6979 Tab); 6980 verifyFormat("enum AA {\n" 6981 "\ta1, // Force multiple lines\n" 6982 "\ta2,\n" 6983 "\ta3\n" 6984 "};", 6985 Tab); 6986 EXPECT_EQ("if (aaaaaaaa && // q\n" 6987 " bb) // w\n" 6988 "\t;", 6989 format("if (aaaaaaaa &&// q\n" 6990 "bb)// w\n" 6991 ";", 6992 Tab)); 6993 verifyFormat("class X {\n" 6994 "\tvoid f() {\n" 6995 "\t\tsomeFunction(parameter1,\n" 6996 "\t\t\t parameter2);\n" 6997 "\t}\n" 6998 "};", 6999 Tab); 7000 verifyFormat("{\n" 7001 "\tQ(\n" 7002 "\t {\n" 7003 "\t\t int a;\n" 7004 "\t\t someFunction(aaaaaaaa,\n" 7005 "\t\t\t\t bbbbbbb);\n" 7006 "\t },\n" 7007 "\t p);\n" 7008 "}", 7009 Tab); 7010 EXPECT_EQ("{\n" 7011 "\t/* aaaa\n" 7012 "\t bbbb */\n" 7013 "}", 7014 format("{\n" 7015 "/* aaaa\n" 7016 " bbbb */\n" 7017 "}", 7018 Tab)); 7019 EXPECT_EQ("{\n" 7020 "\t/*\n" 7021 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7022 "\t bbbbbbbbbbbbb\n" 7023 "\t*/\n" 7024 "}", 7025 format("{\n" 7026 "/*\n" 7027 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 7028 "*/\n" 7029 "}", 7030 Tab)); 7031 EXPECT_EQ("{\n" 7032 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7033 "\t// bbbbbbbbbbbbb\n" 7034 "}", 7035 format("{\n" 7036 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 7037 "}", 7038 Tab)); 7039 EXPECT_EQ("{\n" 7040 "\t/*\n" 7041 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7042 "\t bbbbbbbbbbbbb\n" 7043 "\t*/\n" 7044 "}", 7045 format("{\n" 7046 "\t/*\n" 7047 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 7048 "\t*/\n" 7049 "}", 7050 Tab)); 7051 EXPECT_EQ("{\n" 7052 "\t/*\n" 7053 "\n" 7054 "\t*/\n" 7055 "}", 7056 format("{\n" 7057 "\t/*\n" 7058 "\n" 7059 "\t*/\n" 7060 "}", 7061 Tab)); 7062 EXPECT_EQ("{\n" 7063 "\t/*\n" 7064 " asdf\n" 7065 "\t*/\n" 7066 "}", 7067 format("{\n" 7068 "\t/*\n" 7069 " asdf\n" 7070 "\t*/\n" 7071 "}", 7072 Tab)); 7073 EXPECT_EQ("/*\n" 7074 "\t a\t\tcomment\n" 7075 "\t in multiple lines\n" 7076 " */", 7077 format(" /*\t \t \n" 7078 " \t \t a\t\tcomment\t \t\n" 7079 " \t \t in multiple lines\t\n" 7080 " \t */", 7081 Tab)); 7082 EXPECT_EQ("/* some\n" 7083 " comment */", 7084 format(" \t \t /* some\n" 7085 " \t \t comment */", 7086 Tab)); 7087 EXPECT_EQ("int a; /* some\n" 7088 " comment */", 7089 format(" \t \t int a; /* some\n" 7090 " \t \t comment */", 7091 Tab)); 7092 EXPECT_EQ("int a; /* some\n" 7093 "comment */", 7094 format(" \t \t int\ta; /* some\n" 7095 " \t \t comment */", 7096 Tab)); 7097 EXPECT_EQ("f(\"\t\t\"); /* some\n" 7098 " comment */", 7099 format(" \t \t f(\"\t\t\"); /* some\n" 7100 " \t \t comment */", 7101 Tab)); 7102 EXPECT_EQ("{\n" 7103 " /*\n" 7104 " * Comment\n" 7105 " */\n" 7106 " int i;\n" 7107 "}", 7108 format("{\n" 7109 "\t/*\n" 7110 "\t * Comment\n" 7111 "\t */\n" 7112 "\t int i;\n" 7113 "}")); 7114 Tab.AlignConsecutiveAssignments = true; 7115 Tab.AlignConsecutiveDeclarations = true; 7116 Tab.TabWidth = 4; 7117 Tab.IndentWidth = 4; 7118 verifyFormat("class Assign {\n" 7119 "\tvoid f() {\n" 7120 "\t\tint x = 123;\n" 7121 "\t\tint random = 4;\n" 7122 "\t\tstd::string alphabet =\n" 7123 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 7124 "\t}\n" 7125 "};", 7126 Tab); 7127 } 7128 7129 TEST_F(FormatTest, CalculatesOriginalColumn) { 7130 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 7131 "q\"; /* some\n" 7132 " comment */", 7133 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 7134 "q\"; /* some\n" 7135 " comment */", 7136 getLLVMStyle())); 7137 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 7138 "/* some\n" 7139 " comment */", 7140 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 7141 " /* some\n" 7142 " comment */", 7143 getLLVMStyle())); 7144 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 7145 "qqq\n" 7146 "/* some\n" 7147 " comment */", 7148 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 7149 "qqq\n" 7150 " /* some\n" 7151 " comment */", 7152 getLLVMStyle())); 7153 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 7154 "wwww; /* some\n" 7155 " comment */", 7156 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 7157 "wwww; /* some\n" 7158 " comment */", 7159 getLLVMStyle())); 7160 } 7161 7162 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { 7163 FormatStyle NoSpace = getLLVMStyle(); 7164 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never; 7165 7166 verifyFormat("while(true)\n" 7167 " continue;", 7168 NoSpace); 7169 verifyFormat("for(;;)\n" 7170 " continue;", 7171 NoSpace); 7172 verifyFormat("if(true)\n" 7173 " f();\n" 7174 "else if(true)\n" 7175 " f();", 7176 NoSpace); 7177 verifyFormat("do {\n" 7178 " do_something();\n" 7179 "} while(something());", 7180 NoSpace); 7181 verifyFormat("switch(x) {\n" 7182 "default:\n" 7183 " break;\n" 7184 "}", 7185 NoSpace); 7186 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace); 7187 verifyFormat("size_t x = sizeof(x);", NoSpace); 7188 verifyFormat("auto f(int x) -> decltype(x);", NoSpace); 7189 verifyFormat("int f(T x) noexcept(x.create());", NoSpace); 7190 verifyFormat("alignas(128) char a[128];", NoSpace); 7191 verifyFormat("size_t x = alignof(MyType);", NoSpace); 7192 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace); 7193 verifyFormat("int f() throw(Deprecated);", NoSpace); 7194 verifyFormat("typedef void (*cb)(int);", NoSpace); 7195 verifyFormat("T A::operator()();", NoSpace); 7196 verifyFormat("X A::operator++(T);", NoSpace); 7197 7198 FormatStyle Space = getLLVMStyle(); 7199 Space.SpaceBeforeParens = FormatStyle::SBPO_Always; 7200 7201 verifyFormat("int f ();", Space); 7202 verifyFormat("void f (int a, T b) {\n" 7203 " while (true)\n" 7204 " continue;\n" 7205 "}", 7206 Space); 7207 verifyFormat("if (true)\n" 7208 " f ();\n" 7209 "else if (true)\n" 7210 " f ();", 7211 Space); 7212 verifyFormat("do {\n" 7213 " do_something ();\n" 7214 "} while (something ());", 7215 Space); 7216 verifyFormat("switch (x) {\n" 7217 "default:\n" 7218 " break;\n" 7219 "}", 7220 Space); 7221 verifyFormat("A::A () : a (1) {}", Space); 7222 verifyFormat("void f () __attribute__ ((asdf));", Space); 7223 verifyFormat("*(&a + 1);\n" 7224 "&((&a)[1]);\n" 7225 "a[(b + c) * d];\n" 7226 "(((a + 1) * 2) + 3) * 4;", 7227 Space); 7228 verifyFormat("#define A(x) x", Space); 7229 verifyFormat("#define A (x) x", Space); 7230 verifyFormat("#if defined(x)\n" 7231 "#endif", 7232 Space); 7233 verifyFormat("auto i = std::make_unique<int> (5);", Space); 7234 verifyFormat("size_t x = sizeof (x);", Space); 7235 verifyFormat("auto f (int x) -> decltype (x);", Space); 7236 verifyFormat("int f (T x) noexcept (x.create ());", Space); 7237 verifyFormat("alignas (128) char a[128];", Space); 7238 verifyFormat("size_t x = alignof (MyType);", Space); 7239 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space); 7240 verifyFormat("int f () throw (Deprecated);", Space); 7241 verifyFormat("typedef void (*cb) (int);", Space); 7242 verifyFormat("T A::operator() ();", Space); 7243 verifyFormat("X A::operator++ (T);", Space); 7244 } 7245 7246 TEST_F(FormatTest, ConfigurableSpacesInParentheses) { 7247 FormatStyle Spaces = getLLVMStyle(); 7248 7249 Spaces.SpacesInParentheses = true; 7250 verifyFormat("call( x, y, z );", Spaces); 7251 verifyFormat("call();", Spaces); 7252 verifyFormat("std::function<void( int, int )> callback;", Spaces); 7253 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }", 7254 Spaces); 7255 verifyFormat("while ( (bool)1 )\n" 7256 " continue;", 7257 Spaces); 7258 verifyFormat("for ( ;; )\n" 7259 " continue;", 7260 Spaces); 7261 verifyFormat("if ( true )\n" 7262 " f();\n" 7263 "else if ( true )\n" 7264 " f();", 7265 Spaces); 7266 verifyFormat("do {\n" 7267 " do_something( (int)i );\n" 7268 "} while ( something() );", 7269 Spaces); 7270 verifyFormat("switch ( x ) {\n" 7271 "default:\n" 7272 " break;\n" 7273 "}", 7274 Spaces); 7275 7276 Spaces.SpacesInParentheses = false; 7277 Spaces.SpacesInCStyleCastParentheses = true; 7278 verifyFormat("Type *A = ( Type * )P;", Spaces); 7279 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces); 7280 verifyFormat("x = ( int32 )y;", Spaces); 7281 verifyFormat("int a = ( int )(2.0f);", Spaces); 7282 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces); 7283 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces); 7284 verifyFormat("#define x (( int )-1)", Spaces); 7285 7286 // Run the first set of tests again with: 7287 Spaces.SpacesInParentheses = false; 7288 Spaces.SpaceInEmptyParentheses = true; 7289 Spaces.SpacesInCStyleCastParentheses = true; 7290 verifyFormat("call(x, y, z);", Spaces); 7291 verifyFormat("call( );", Spaces); 7292 verifyFormat("std::function<void(int, int)> callback;", Spaces); 7293 verifyFormat("while (( bool )1)\n" 7294 " continue;", 7295 Spaces); 7296 verifyFormat("for (;;)\n" 7297 " continue;", 7298 Spaces); 7299 verifyFormat("if (true)\n" 7300 " f( );\n" 7301 "else if (true)\n" 7302 " f( );", 7303 Spaces); 7304 verifyFormat("do {\n" 7305 " do_something(( int )i);\n" 7306 "} while (something( ));", 7307 Spaces); 7308 verifyFormat("switch (x) {\n" 7309 "default:\n" 7310 " break;\n" 7311 "}", 7312 Spaces); 7313 7314 // Run the first set of tests again with: 7315 Spaces.SpaceAfterCStyleCast = true; 7316 verifyFormat("call(x, y, z);", Spaces); 7317 verifyFormat("call( );", Spaces); 7318 verifyFormat("std::function<void(int, int)> callback;", Spaces); 7319 verifyFormat("while (( bool ) 1)\n" 7320 " continue;", 7321 Spaces); 7322 verifyFormat("for (;;)\n" 7323 " continue;", 7324 Spaces); 7325 verifyFormat("if (true)\n" 7326 " f( );\n" 7327 "else if (true)\n" 7328 " f( );", 7329 Spaces); 7330 verifyFormat("do {\n" 7331 " do_something(( int ) i);\n" 7332 "} while (something( ));", 7333 Spaces); 7334 verifyFormat("switch (x) {\n" 7335 "default:\n" 7336 " break;\n" 7337 "}", 7338 Spaces); 7339 7340 // Run subset of tests again with: 7341 Spaces.SpacesInCStyleCastParentheses = false; 7342 Spaces.SpaceAfterCStyleCast = true; 7343 verifyFormat("while ((bool) 1)\n" 7344 " continue;", 7345 Spaces); 7346 verifyFormat("do {\n" 7347 " do_something((int) i);\n" 7348 "} while (something( ));", 7349 Spaces); 7350 } 7351 7352 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) { 7353 verifyFormat("int a[5];"); 7354 verifyFormat("a[3] += 42;"); 7355 7356 FormatStyle Spaces = getLLVMStyle(); 7357 Spaces.SpacesInSquareBrackets = true; 7358 // Lambdas unchanged. 7359 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces); 7360 verifyFormat("return [i, args...] {};", Spaces); 7361 7362 // Not lambdas. 7363 verifyFormat("int a[ 5 ];", Spaces); 7364 verifyFormat("a[ 3 ] += 42;", Spaces); 7365 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces); 7366 verifyFormat("double &operator[](int i) { return 0; }\n" 7367 "int i;", 7368 Spaces); 7369 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces); 7370 verifyFormat("int i = a[ a ][ a ]->f();", Spaces); 7371 verifyFormat("int i = (*b)[ a ]->f();", Spaces); 7372 } 7373 7374 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) { 7375 verifyFormat("int a = 5;"); 7376 verifyFormat("a += 42;"); 7377 verifyFormat("a or_eq 8;"); 7378 7379 FormatStyle Spaces = getLLVMStyle(); 7380 Spaces.SpaceBeforeAssignmentOperators = false; 7381 verifyFormat("int a= 5;", Spaces); 7382 verifyFormat("a+= 42;", Spaces); 7383 verifyFormat("a or_eq 8;", Spaces); 7384 } 7385 7386 TEST_F(FormatTest, AlignConsecutiveAssignments) { 7387 FormatStyle Alignment = getLLVMStyle(); 7388 Alignment.AlignConsecutiveAssignments = false; 7389 verifyFormat("int a = 5;\n" 7390 "int oneTwoThree = 123;", 7391 Alignment); 7392 verifyFormat("int a = 5;\n" 7393 "int oneTwoThree = 123;", 7394 Alignment); 7395 7396 Alignment.AlignConsecutiveAssignments = true; 7397 verifyFormat("int a = 5;\n" 7398 "int oneTwoThree = 123;", 7399 Alignment); 7400 verifyFormat("int a = method();\n" 7401 "int oneTwoThree = 133;", 7402 Alignment); 7403 verifyFormat("a &= 5;\n" 7404 "bcd *= 5;\n" 7405 "ghtyf += 5;\n" 7406 "dvfvdb -= 5;\n" 7407 "a /= 5;\n" 7408 "vdsvsv %= 5;\n" 7409 "sfdbddfbdfbb ^= 5;\n" 7410 "dvsdsv |= 5;\n" 7411 "int dsvvdvsdvvv = 123;", 7412 Alignment); 7413 verifyFormat("int i = 1, j = 10;\n" 7414 "something = 2000;", 7415 Alignment); 7416 verifyFormat("something = 2000;\n" 7417 "int i = 1, j = 10;\n", 7418 Alignment); 7419 verifyFormat("something = 2000;\n" 7420 "another = 911;\n" 7421 "int i = 1, j = 10;\n" 7422 "oneMore = 1;\n" 7423 "i = 2;", 7424 Alignment); 7425 verifyFormat("int a = 5;\n" 7426 "int one = 1;\n" 7427 "method();\n" 7428 "int oneTwoThree = 123;\n" 7429 "int oneTwo = 12;", 7430 Alignment); 7431 verifyFormat("int oneTwoThree = 123;\n" 7432 "int oneTwo = 12;\n" 7433 "method();\n", 7434 Alignment); 7435 verifyFormat("int oneTwoThree = 123; // comment\n" 7436 "int oneTwo = 12; // comment", 7437 Alignment); 7438 EXPECT_EQ("int a = 5;\n" 7439 "\n" 7440 "int oneTwoThree = 123;", 7441 format("int a = 5;\n" 7442 "\n" 7443 "int oneTwoThree= 123;", 7444 Alignment)); 7445 EXPECT_EQ("int a = 5;\n" 7446 "int one = 1;\n" 7447 "\n" 7448 "int oneTwoThree = 123;", 7449 format("int a = 5;\n" 7450 "int one = 1;\n" 7451 "\n" 7452 "int oneTwoThree = 123;", 7453 Alignment)); 7454 EXPECT_EQ("int a = 5;\n" 7455 "int one = 1;\n" 7456 "\n" 7457 "int oneTwoThree = 123;\n" 7458 "int oneTwo = 12;", 7459 format("int a = 5;\n" 7460 "int one = 1;\n" 7461 "\n" 7462 "int oneTwoThree = 123;\n" 7463 "int oneTwo = 12;", 7464 Alignment)); 7465 Alignment.AlignEscapedNewlinesLeft = true; 7466 verifyFormat("#define A \\\n" 7467 " int aaaa = 12; \\\n" 7468 " int b = 23; \\\n" 7469 " int ccc = 234; \\\n" 7470 " int dddddddddd = 2345;", 7471 Alignment); 7472 Alignment.AlignEscapedNewlinesLeft = false; 7473 verifyFormat("#define A " 7474 " \\\n" 7475 " int aaaa = 12; " 7476 " \\\n" 7477 " int b = 23; " 7478 " \\\n" 7479 " int ccc = 234; " 7480 " \\\n" 7481 " int dddddddddd = 2345;", 7482 Alignment); 7483 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 7484 "k = 4, int l = 5,\n" 7485 " int m = 6) {\n" 7486 " int j = 10;\n" 7487 " otherThing = 1;\n" 7488 "}", 7489 Alignment); 7490 verifyFormat("void SomeFunction(int parameter = 0) {\n" 7491 " int i = 1;\n" 7492 " int j = 2;\n" 7493 " int big = 10000;\n" 7494 "}", 7495 Alignment); 7496 verifyFormat("class C {\n" 7497 "public:\n" 7498 " int i = 1;\n" 7499 " virtual void f() = 0;\n" 7500 "};", 7501 Alignment); 7502 verifyFormat("int i = 1;\n" 7503 "if (SomeType t = getSomething()) {\n" 7504 "}\n" 7505 "int j = 2;\n" 7506 "int big = 10000;", 7507 Alignment); 7508 verifyFormat("int j = 7;\n" 7509 "for (int k = 0; k < N; ++k) {\n" 7510 "}\n" 7511 "int j = 2;\n" 7512 "int big = 10000;\n" 7513 "}", 7514 Alignment); 7515 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 7516 verifyFormat("int i = 1;\n" 7517 "LooooooooooongType loooooooooooooooooooooongVariable\n" 7518 " = someLooooooooooooooooongFunction();\n" 7519 "int j = 2;", 7520 Alignment); 7521 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 7522 verifyFormat("int i = 1;\n" 7523 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 7524 " someLooooooooooooooooongFunction();\n" 7525 "int j = 2;", 7526 Alignment); 7527 7528 verifyFormat("auto lambda = []() {\n" 7529 " auto i = 0;\n" 7530 " return 0;\n" 7531 "};\n" 7532 "int i = 0;\n" 7533 "auto v = type{\n" 7534 " i = 1, //\n" 7535 " (i = 2), //\n" 7536 " i = 3 //\n" 7537 "};", 7538 Alignment); 7539 7540 // FIXME: Should align all three assignments 7541 verifyFormat( 7542 "int i = 1;\n" 7543 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 7544 " loooooooooooooooooooooongParameterB);\n" 7545 "int j = 2;", 7546 Alignment); 7547 7548 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n" 7549 " typename B = very_long_type_name_1,\n" 7550 " typename T_2 = very_long_type_name_2>\n" 7551 "auto foo() {}\n", 7552 Alignment); 7553 verifyFormat("int a, b = 1;\n" 7554 "int c = 2;\n" 7555 "int dd = 3;\n", 7556 Alignment); 7557 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 7558 "float b[1][] = {{3.f}};\n", 7559 Alignment); 7560 } 7561 7562 TEST_F(FormatTest, AlignConsecutiveDeclarations) { 7563 FormatStyle Alignment = getLLVMStyle(); 7564 Alignment.AlignConsecutiveDeclarations = false; 7565 verifyFormat("float const a = 5;\n" 7566 "int oneTwoThree = 123;", 7567 Alignment); 7568 verifyFormat("int a = 5;\n" 7569 "float const oneTwoThree = 123;", 7570 Alignment); 7571 7572 Alignment.AlignConsecutiveDeclarations = true; 7573 verifyFormat("float const a = 5;\n" 7574 "int oneTwoThree = 123;", 7575 Alignment); 7576 verifyFormat("int a = method();\n" 7577 "float const oneTwoThree = 133;", 7578 Alignment); 7579 verifyFormat("int i = 1, j = 10;\n" 7580 "something = 2000;", 7581 Alignment); 7582 verifyFormat("something = 2000;\n" 7583 "int i = 1, j = 10;\n", 7584 Alignment); 7585 verifyFormat("float something = 2000;\n" 7586 "double another = 911;\n" 7587 "int i = 1, j = 10;\n" 7588 "const int *oneMore = 1;\n" 7589 "unsigned i = 2;", 7590 Alignment); 7591 verifyFormat("float a = 5;\n" 7592 "int one = 1;\n" 7593 "method();\n" 7594 "const double oneTwoThree = 123;\n" 7595 "const unsigned int oneTwo = 12;", 7596 Alignment); 7597 verifyFormat("int oneTwoThree{0}; // comment\n" 7598 "unsigned oneTwo; // comment", 7599 Alignment); 7600 EXPECT_EQ("float const a = 5;\n" 7601 "\n" 7602 "int oneTwoThree = 123;", 7603 format("float const a = 5;\n" 7604 "\n" 7605 "int oneTwoThree= 123;", 7606 Alignment)); 7607 EXPECT_EQ("float a = 5;\n" 7608 "int one = 1;\n" 7609 "\n" 7610 "unsigned oneTwoThree = 123;", 7611 format("float a = 5;\n" 7612 "int one = 1;\n" 7613 "\n" 7614 "unsigned oneTwoThree = 123;", 7615 Alignment)); 7616 EXPECT_EQ("float a = 5;\n" 7617 "int one = 1;\n" 7618 "\n" 7619 "unsigned oneTwoThree = 123;\n" 7620 "int oneTwo = 12;", 7621 format("float a = 5;\n" 7622 "int one = 1;\n" 7623 "\n" 7624 "unsigned oneTwoThree = 123;\n" 7625 "int oneTwo = 12;", 7626 Alignment)); 7627 Alignment.AlignConsecutiveAssignments = true; 7628 verifyFormat("float something = 2000;\n" 7629 "double another = 911;\n" 7630 "int i = 1, j = 10;\n" 7631 "const int *oneMore = 1;\n" 7632 "unsigned i = 2;", 7633 Alignment); 7634 verifyFormat("int oneTwoThree = {0}; // comment\n" 7635 "unsigned oneTwo = 0; // comment", 7636 Alignment); 7637 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n" 7638 " int const i = 1;\n" 7639 " int * j = 2;\n" 7640 " int big = 10000;\n" 7641 "\n" 7642 " unsigned oneTwoThree = 123;\n" 7643 " int oneTwo = 12;\n" 7644 " method();\n" 7645 " float k = 2;\n" 7646 " int ll = 10000;\n" 7647 "}", 7648 format("void SomeFunction(int parameter= 0) {\n" 7649 " int const i= 1;\n" 7650 " int *j=2;\n" 7651 " int big = 10000;\n" 7652 "\n" 7653 "unsigned oneTwoThree =123;\n" 7654 "int oneTwo = 12;\n" 7655 " method();\n" 7656 "float k= 2;\n" 7657 "int ll=10000;\n" 7658 "}", 7659 Alignment)); 7660 Alignment.AlignConsecutiveAssignments = false; 7661 Alignment.AlignEscapedNewlinesLeft = true; 7662 verifyFormat("#define A \\\n" 7663 " int aaaa = 12; \\\n" 7664 " float b = 23; \\\n" 7665 " const int ccc = 234; \\\n" 7666 " unsigned dddddddddd = 2345;", 7667 Alignment); 7668 Alignment.AlignEscapedNewlinesLeft = false; 7669 Alignment.ColumnLimit = 30; 7670 verifyFormat("#define A \\\n" 7671 " int aaaa = 12; \\\n" 7672 " float b = 23; \\\n" 7673 " const int ccc = 234; \\\n" 7674 " int dddddddddd = 2345;", 7675 Alignment); 7676 Alignment.ColumnLimit = 80; 7677 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 7678 "k = 4, int l = 5,\n" 7679 " int m = 6) {\n" 7680 " const int j = 10;\n" 7681 " otherThing = 1;\n" 7682 "}", 7683 Alignment); 7684 verifyFormat("void SomeFunction(int parameter = 0) {\n" 7685 " int const i = 1;\n" 7686 " int * j = 2;\n" 7687 " int big = 10000;\n" 7688 "}", 7689 Alignment); 7690 verifyFormat("class C {\n" 7691 "public:\n" 7692 " int i = 1;\n" 7693 " virtual void f() = 0;\n" 7694 "};", 7695 Alignment); 7696 verifyFormat("float i = 1;\n" 7697 "if (SomeType t = getSomething()) {\n" 7698 "}\n" 7699 "const unsigned j = 2;\n" 7700 "int big = 10000;", 7701 Alignment); 7702 verifyFormat("float j = 7;\n" 7703 "for (int k = 0; k < N; ++k) {\n" 7704 "}\n" 7705 "unsigned j = 2;\n" 7706 "int big = 10000;\n" 7707 "}", 7708 Alignment); 7709 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 7710 verifyFormat("float i = 1;\n" 7711 "LooooooooooongType loooooooooooooooooooooongVariable\n" 7712 " = someLooooooooooooooooongFunction();\n" 7713 "int j = 2;", 7714 Alignment); 7715 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 7716 verifyFormat("int i = 1;\n" 7717 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 7718 " someLooooooooooooooooongFunction();\n" 7719 "int j = 2;", 7720 Alignment); 7721 7722 Alignment.AlignConsecutiveAssignments = true; 7723 verifyFormat("auto lambda = []() {\n" 7724 " auto ii = 0;\n" 7725 " float j = 0;\n" 7726 " return 0;\n" 7727 "};\n" 7728 "int i = 0;\n" 7729 "float i2 = 0;\n" 7730 "auto v = type{\n" 7731 " i = 1, //\n" 7732 " (i = 2), //\n" 7733 " i = 3 //\n" 7734 "};", 7735 Alignment); 7736 Alignment.AlignConsecutiveAssignments = false; 7737 7738 // FIXME: Should align all three declarations 7739 verifyFormat( 7740 "int i = 1;\n" 7741 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 7742 " loooooooooooooooooooooongParameterB);\n" 7743 "int j = 2;", 7744 Alignment); 7745 7746 // Test interactions with ColumnLimit and AlignConsecutiveAssignments: 7747 // We expect declarations and assignments to align, as long as it doesn't 7748 // exceed the column limit, starting a new alignemnt sequence whenever it 7749 // happens. 7750 Alignment.AlignConsecutiveAssignments = true; 7751 Alignment.ColumnLimit = 30; 7752 verifyFormat("float ii = 1;\n" 7753 "unsigned j = 2;\n" 7754 "int someVerylongVariable = 1;\n" 7755 "AnotherLongType ll = 123456;\n" 7756 "VeryVeryLongType k = 2;\n" 7757 "int myvar = 1;", 7758 Alignment); 7759 Alignment.ColumnLimit = 80; 7760 Alignment.AlignConsecutiveAssignments = false; 7761 7762 verifyFormat( 7763 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n" 7764 " typename LongType, typename B>\n" 7765 "auto foo() {}\n", 7766 Alignment); 7767 verifyFormat("float a, b = 1;\n" 7768 "int c = 2;\n" 7769 "int dd = 3;\n", 7770 Alignment); 7771 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 7772 "float b[1][] = {{3.f}};\n", 7773 Alignment); 7774 Alignment.AlignConsecutiveAssignments = true; 7775 verifyFormat("float a, b = 1;\n" 7776 "int c = 2;\n" 7777 "int dd = 3;\n", 7778 Alignment); 7779 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 7780 "float b[1][] = {{3.f}};\n", 7781 Alignment); 7782 Alignment.AlignConsecutiveAssignments = false; 7783 7784 Alignment.ColumnLimit = 30; 7785 Alignment.BinPackParameters = false; 7786 verifyFormat("void foo(float a,\n" 7787 " float b,\n" 7788 " int c,\n" 7789 " uint32_t *d) {\n" 7790 " int * e = 0;\n" 7791 " float f = 0;\n" 7792 " double g = 0;\n" 7793 "}\n" 7794 "void bar(ino_t a,\n" 7795 " int b,\n" 7796 " uint32_t *c,\n" 7797 " bool d) {}\n", 7798 Alignment); 7799 Alignment.BinPackParameters = true; 7800 Alignment.ColumnLimit = 80; 7801 } 7802 7803 TEST_F(FormatTest, LinuxBraceBreaking) { 7804 FormatStyle LinuxBraceStyle = getLLVMStyle(); 7805 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux; 7806 verifyFormat("namespace a\n" 7807 "{\n" 7808 "class A\n" 7809 "{\n" 7810 " void f()\n" 7811 " {\n" 7812 " if (true) {\n" 7813 " a();\n" 7814 " b();\n" 7815 " } else {\n" 7816 " a();\n" 7817 " }\n" 7818 " }\n" 7819 " void g() { return; }\n" 7820 "};\n" 7821 "struct B {\n" 7822 " int x;\n" 7823 "};\n" 7824 "}\n", 7825 LinuxBraceStyle); 7826 verifyFormat("enum X {\n" 7827 " Y = 0,\n" 7828 "}\n", 7829 LinuxBraceStyle); 7830 verifyFormat("struct S {\n" 7831 " int Type;\n" 7832 " union {\n" 7833 " int x;\n" 7834 " double y;\n" 7835 " } Value;\n" 7836 " class C\n" 7837 " {\n" 7838 " MyFavoriteType Value;\n" 7839 " } Class;\n" 7840 "}\n", 7841 LinuxBraceStyle); 7842 } 7843 7844 TEST_F(FormatTest, MozillaBraceBreaking) { 7845 FormatStyle MozillaBraceStyle = getLLVMStyle(); 7846 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla; 7847 verifyFormat("namespace a {\n" 7848 "class A\n" 7849 "{\n" 7850 " void f()\n" 7851 " {\n" 7852 " if (true) {\n" 7853 " a();\n" 7854 " b();\n" 7855 " }\n" 7856 " }\n" 7857 " void g() { return; }\n" 7858 "};\n" 7859 "enum E\n" 7860 "{\n" 7861 " A,\n" 7862 " // foo\n" 7863 " B,\n" 7864 " C\n" 7865 "};\n" 7866 "struct B\n" 7867 "{\n" 7868 " int x;\n" 7869 "};\n" 7870 "}\n", 7871 MozillaBraceStyle); 7872 verifyFormat("struct S\n" 7873 "{\n" 7874 " int Type;\n" 7875 " union\n" 7876 " {\n" 7877 " int x;\n" 7878 " double y;\n" 7879 " } Value;\n" 7880 " class C\n" 7881 " {\n" 7882 " MyFavoriteType Value;\n" 7883 " } Class;\n" 7884 "}\n", 7885 MozillaBraceStyle); 7886 } 7887 7888 TEST_F(FormatTest, StroustrupBraceBreaking) { 7889 FormatStyle StroustrupBraceStyle = getLLVMStyle(); 7890 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 7891 verifyFormat("namespace a {\n" 7892 "class A {\n" 7893 " void f()\n" 7894 " {\n" 7895 " if (true) {\n" 7896 " a();\n" 7897 " b();\n" 7898 " }\n" 7899 " }\n" 7900 " void g() { return; }\n" 7901 "};\n" 7902 "struct B {\n" 7903 " int x;\n" 7904 "};\n" 7905 "}\n", 7906 StroustrupBraceStyle); 7907 7908 verifyFormat("void foo()\n" 7909 "{\n" 7910 " if (a) {\n" 7911 " a();\n" 7912 " }\n" 7913 " else {\n" 7914 " b();\n" 7915 " }\n" 7916 "}\n", 7917 StroustrupBraceStyle); 7918 7919 verifyFormat("#ifdef _DEBUG\n" 7920 "int foo(int i = 0)\n" 7921 "#else\n" 7922 "int foo(int i = 5)\n" 7923 "#endif\n" 7924 "{\n" 7925 " return i;\n" 7926 "}", 7927 StroustrupBraceStyle); 7928 7929 verifyFormat("void foo() {}\n" 7930 "void bar()\n" 7931 "#ifdef _DEBUG\n" 7932 "{\n" 7933 " foo();\n" 7934 "}\n" 7935 "#else\n" 7936 "{\n" 7937 "}\n" 7938 "#endif", 7939 StroustrupBraceStyle); 7940 7941 verifyFormat("void foobar() { int i = 5; }\n" 7942 "#ifdef _DEBUG\n" 7943 "void bar() {}\n" 7944 "#else\n" 7945 "void bar() { foobar(); }\n" 7946 "#endif", 7947 StroustrupBraceStyle); 7948 } 7949 7950 TEST_F(FormatTest, AllmanBraceBreaking) { 7951 FormatStyle AllmanBraceStyle = getLLVMStyle(); 7952 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman; 7953 verifyFormat("namespace a\n" 7954 "{\n" 7955 "class A\n" 7956 "{\n" 7957 " void f()\n" 7958 " {\n" 7959 " if (true)\n" 7960 " {\n" 7961 " a();\n" 7962 " b();\n" 7963 " }\n" 7964 " }\n" 7965 " void g() { return; }\n" 7966 "};\n" 7967 "struct B\n" 7968 "{\n" 7969 " int x;\n" 7970 "};\n" 7971 "}", 7972 AllmanBraceStyle); 7973 7974 verifyFormat("void f()\n" 7975 "{\n" 7976 " if (true)\n" 7977 " {\n" 7978 " a();\n" 7979 " }\n" 7980 " else if (false)\n" 7981 " {\n" 7982 " b();\n" 7983 " }\n" 7984 " else\n" 7985 " {\n" 7986 " c();\n" 7987 " }\n" 7988 "}\n", 7989 AllmanBraceStyle); 7990 7991 verifyFormat("void f()\n" 7992 "{\n" 7993 " for (int i = 0; i < 10; ++i)\n" 7994 " {\n" 7995 " a();\n" 7996 " }\n" 7997 " while (false)\n" 7998 " {\n" 7999 " b();\n" 8000 " }\n" 8001 " do\n" 8002 " {\n" 8003 " c();\n" 8004 " } while (false)\n" 8005 "}\n", 8006 AllmanBraceStyle); 8007 8008 verifyFormat("void f(int a)\n" 8009 "{\n" 8010 " switch (a)\n" 8011 " {\n" 8012 " case 0:\n" 8013 " break;\n" 8014 " case 1:\n" 8015 " {\n" 8016 " break;\n" 8017 " }\n" 8018 " case 2:\n" 8019 " {\n" 8020 " }\n" 8021 " break;\n" 8022 " default:\n" 8023 " break;\n" 8024 " }\n" 8025 "}\n", 8026 AllmanBraceStyle); 8027 8028 verifyFormat("enum X\n" 8029 "{\n" 8030 " Y = 0,\n" 8031 "}\n", 8032 AllmanBraceStyle); 8033 verifyFormat("enum X\n" 8034 "{\n" 8035 " Y = 0\n" 8036 "}\n", 8037 AllmanBraceStyle); 8038 8039 verifyFormat("@interface BSApplicationController ()\n" 8040 "{\n" 8041 "@private\n" 8042 " id _extraIvar;\n" 8043 "}\n" 8044 "@end\n", 8045 AllmanBraceStyle); 8046 8047 verifyFormat("#ifdef _DEBUG\n" 8048 "int foo(int i = 0)\n" 8049 "#else\n" 8050 "int foo(int i = 5)\n" 8051 "#endif\n" 8052 "{\n" 8053 " return i;\n" 8054 "}", 8055 AllmanBraceStyle); 8056 8057 verifyFormat("void foo() {}\n" 8058 "void bar()\n" 8059 "#ifdef _DEBUG\n" 8060 "{\n" 8061 " foo();\n" 8062 "}\n" 8063 "#else\n" 8064 "{\n" 8065 "}\n" 8066 "#endif", 8067 AllmanBraceStyle); 8068 8069 verifyFormat("void foobar() { int i = 5; }\n" 8070 "#ifdef _DEBUG\n" 8071 "void bar() {}\n" 8072 "#else\n" 8073 "void bar() { foobar(); }\n" 8074 "#endif", 8075 AllmanBraceStyle); 8076 8077 // This shouldn't affect ObjC blocks.. 8078 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 8079 " // ...\n" 8080 " int i;\n" 8081 "}];", 8082 AllmanBraceStyle); 8083 verifyFormat("void (^block)(void) = ^{\n" 8084 " // ...\n" 8085 " int i;\n" 8086 "};", 8087 AllmanBraceStyle); 8088 // .. or dict literals. 8089 verifyFormat("void f()\n" 8090 "{\n" 8091 " [object someMethod:@{ @\"a\" : @\"b\" }];\n" 8092 "}", 8093 AllmanBraceStyle); 8094 verifyFormat("int f()\n" 8095 "{ // comment\n" 8096 " return 42;\n" 8097 "}", 8098 AllmanBraceStyle); 8099 8100 AllmanBraceStyle.ColumnLimit = 19; 8101 verifyFormat("void f() { int i; }", AllmanBraceStyle); 8102 AllmanBraceStyle.ColumnLimit = 18; 8103 verifyFormat("void f()\n" 8104 "{\n" 8105 " int i;\n" 8106 "}", 8107 AllmanBraceStyle); 8108 AllmanBraceStyle.ColumnLimit = 80; 8109 8110 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle; 8111 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true; 8112 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 8113 verifyFormat("void f(bool b)\n" 8114 "{\n" 8115 " if (b)\n" 8116 " {\n" 8117 " return;\n" 8118 " }\n" 8119 "}\n", 8120 BreakBeforeBraceShortIfs); 8121 verifyFormat("void f(bool b)\n" 8122 "{\n" 8123 " if (b) return;\n" 8124 "}\n", 8125 BreakBeforeBraceShortIfs); 8126 verifyFormat("void f(bool b)\n" 8127 "{\n" 8128 " while (b)\n" 8129 " {\n" 8130 " return;\n" 8131 " }\n" 8132 "}\n", 8133 BreakBeforeBraceShortIfs); 8134 } 8135 8136 TEST_F(FormatTest, GNUBraceBreaking) { 8137 FormatStyle GNUBraceStyle = getLLVMStyle(); 8138 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU; 8139 verifyFormat("namespace a\n" 8140 "{\n" 8141 "class A\n" 8142 "{\n" 8143 " void f()\n" 8144 " {\n" 8145 " int a;\n" 8146 " {\n" 8147 " int b;\n" 8148 " }\n" 8149 " if (true)\n" 8150 " {\n" 8151 " a();\n" 8152 " b();\n" 8153 " }\n" 8154 " }\n" 8155 " void g() { return; }\n" 8156 "}\n" 8157 "}", 8158 GNUBraceStyle); 8159 8160 verifyFormat("void f()\n" 8161 "{\n" 8162 " if (true)\n" 8163 " {\n" 8164 " a();\n" 8165 " }\n" 8166 " else if (false)\n" 8167 " {\n" 8168 " b();\n" 8169 " }\n" 8170 " else\n" 8171 " {\n" 8172 " c();\n" 8173 " }\n" 8174 "}\n", 8175 GNUBraceStyle); 8176 8177 verifyFormat("void f()\n" 8178 "{\n" 8179 " for (int i = 0; i < 10; ++i)\n" 8180 " {\n" 8181 " a();\n" 8182 " }\n" 8183 " while (false)\n" 8184 " {\n" 8185 " b();\n" 8186 " }\n" 8187 " do\n" 8188 " {\n" 8189 " c();\n" 8190 " }\n" 8191 " while (false);\n" 8192 "}\n", 8193 GNUBraceStyle); 8194 8195 verifyFormat("void f(int a)\n" 8196 "{\n" 8197 " switch (a)\n" 8198 " {\n" 8199 " case 0:\n" 8200 " break;\n" 8201 " case 1:\n" 8202 " {\n" 8203 " break;\n" 8204 " }\n" 8205 " case 2:\n" 8206 " {\n" 8207 " }\n" 8208 " break;\n" 8209 " default:\n" 8210 " break;\n" 8211 " }\n" 8212 "}\n", 8213 GNUBraceStyle); 8214 8215 verifyFormat("enum X\n" 8216 "{\n" 8217 " Y = 0,\n" 8218 "}\n", 8219 GNUBraceStyle); 8220 8221 verifyFormat("@interface BSApplicationController ()\n" 8222 "{\n" 8223 "@private\n" 8224 " id _extraIvar;\n" 8225 "}\n" 8226 "@end\n", 8227 GNUBraceStyle); 8228 8229 verifyFormat("#ifdef _DEBUG\n" 8230 "int foo(int i = 0)\n" 8231 "#else\n" 8232 "int foo(int i = 5)\n" 8233 "#endif\n" 8234 "{\n" 8235 " return i;\n" 8236 "}", 8237 GNUBraceStyle); 8238 8239 verifyFormat("void foo() {}\n" 8240 "void bar()\n" 8241 "#ifdef _DEBUG\n" 8242 "{\n" 8243 " foo();\n" 8244 "}\n" 8245 "#else\n" 8246 "{\n" 8247 "}\n" 8248 "#endif", 8249 GNUBraceStyle); 8250 8251 verifyFormat("void foobar() { int i = 5; }\n" 8252 "#ifdef _DEBUG\n" 8253 "void bar() {}\n" 8254 "#else\n" 8255 "void bar() { foobar(); }\n" 8256 "#endif", 8257 GNUBraceStyle); 8258 } 8259 8260 TEST_F(FormatTest, WebKitBraceBreaking) { 8261 FormatStyle WebKitBraceStyle = getLLVMStyle(); 8262 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit; 8263 verifyFormat("namespace a {\n" 8264 "class A {\n" 8265 " void f()\n" 8266 " {\n" 8267 " if (true) {\n" 8268 " a();\n" 8269 " b();\n" 8270 " }\n" 8271 " }\n" 8272 " void g() { return; }\n" 8273 "};\n" 8274 "enum E {\n" 8275 " A,\n" 8276 " // foo\n" 8277 " B,\n" 8278 " C\n" 8279 "};\n" 8280 "struct B {\n" 8281 " int x;\n" 8282 "};\n" 8283 "}\n", 8284 WebKitBraceStyle); 8285 verifyFormat("struct S {\n" 8286 " int Type;\n" 8287 " union {\n" 8288 " int x;\n" 8289 " double y;\n" 8290 " } Value;\n" 8291 " class C {\n" 8292 " MyFavoriteType Value;\n" 8293 " } Class;\n" 8294 "};\n", 8295 WebKitBraceStyle); 8296 } 8297 8298 TEST_F(FormatTest, CatchExceptionReferenceBinding) { 8299 verifyFormat("void f() {\n" 8300 " try {\n" 8301 " } catch (const Exception &e) {\n" 8302 " }\n" 8303 "}\n", 8304 getLLVMStyle()); 8305 } 8306 8307 TEST_F(FormatTest, UnderstandsPragmas) { 8308 verifyFormat("#pragma omp reduction(| : var)"); 8309 verifyFormat("#pragma omp reduction(+ : var)"); 8310 8311 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string " 8312 "(including parentheses).", 8313 format("#pragma mark Any non-hyphenated or hyphenated string " 8314 "(including parentheses).")); 8315 } 8316 8317 TEST_F(FormatTest, UnderstandPragmaOption) { 8318 verifyFormat("#pragma option -C -A"); 8319 8320 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A")); 8321 } 8322 8323 #define EXPECT_ALL_STYLES_EQUAL(Styles) \ 8324 for (size_t i = 1; i < Styles.size(); ++i) \ 8325 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \ 8326 << " differs from Style #0" 8327 8328 TEST_F(FormatTest, GetsPredefinedStyleByName) { 8329 SmallVector<FormatStyle, 3> Styles; 8330 Styles.resize(3); 8331 8332 Styles[0] = getLLVMStyle(); 8333 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1])); 8334 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2])); 8335 EXPECT_ALL_STYLES_EQUAL(Styles); 8336 8337 Styles[0] = getGoogleStyle(); 8338 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1])); 8339 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2])); 8340 EXPECT_ALL_STYLES_EQUAL(Styles); 8341 8342 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 8343 EXPECT_TRUE( 8344 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1])); 8345 EXPECT_TRUE( 8346 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2])); 8347 EXPECT_ALL_STYLES_EQUAL(Styles); 8348 8349 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp); 8350 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1])); 8351 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2])); 8352 EXPECT_ALL_STYLES_EQUAL(Styles); 8353 8354 Styles[0] = getMozillaStyle(); 8355 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1])); 8356 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2])); 8357 EXPECT_ALL_STYLES_EQUAL(Styles); 8358 8359 Styles[0] = getWebKitStyle(); 8360 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1])); 8361 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2])); 8362 EXPECT_ALL_STYLES_EQUAL(Styles); 8363 8364 Styles[0] = getGNUStyle(); 8365 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1])); 8366 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2])); 8367 EXPECT_ALL_STYLES_EQUAL(Styles); 8368 8369 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0])); 8370 } 8371 8372 TEST_F(FormatTest, GetsCorrectBasedOnStyle) { 8373 SmallVector<FormatStyle, 8> Styles; 8374 Styles.resize(2); 8375 8376 Styles[0] = getGoogleStyle(); 8377 Styles[1] = getLLVMStyle(); 8378 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 8379 EXPECT_ALL_STYLES_EQUAL(Styles); 8380 8381 Styles.resize(5); 8382 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 8383 Styles[1] = getLLVMStyle(); 8384 Styles[1].Language = FormatStyle::LK_JavaScript; 8385 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 8386 8387 Styles[2] = getLLVMStyle(); 8388 Styles[2].Language = FormatStyle::LK_JavaScript; 8389 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n" 8390 "BasedOnStyle: Google", 8391 &Styles[2]) 8392 .value()); 8393 8394 Styles[3] = getLLVMStyle(); 8395 Styles[3].Language = FormatStyle::LK_JavaScript; 8396 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n" 8397 "Language: JavaScript", 8398 &Styles[3]) 8399 .value()); 8400 8401 Styles[4] = getLLVMStyle(); 8402 Styles[4].Language = FormatStyle::LK_JavaScript; 8403 EXPECT_EQ(0, parseConfiguration("---\n" 8404 "BasedOnStyle: LLVM\n" 8405 "IndentWidth: 123\n" 8406 "---\n" 8407 "BasedOnStyle: Google\n" 8408 "Language: JavaScript", 8409 &Styles[4]) 8410 .value()); 8411 EXPECT_ALL_STYLES_EQUAL(Styles); 8412 } 8413 8414 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \ 8415 Style.FIELD = false; \ 8416 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \ 8417 EXPECT_TRUE(Style.FIELD); \ 8418 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \ 8419 EXPECT_FALSE(Style.FIELD); 8420 8421 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD) 8422 8423 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \ 8424 Style.STRUCT.FIELD = false; \ 8425 EXPECT_EQ(0, \ 8426 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \ 8427 .value()); \ 8428 EXPECT_TRUE(Style.STRUCT.FIELD); \ 8429 EXPECT_EQ(0, \ 8430 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \ 8431 .value()); \ 8432 EXPECT_FALSE(Style.STRUCT.FIELD); 8433 8434 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \ 8435 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD) 8436 8437 #define CHECK_PARSE(TEXT, FIELD, VALUE) \ 8438 EXPECT_NE(VALUE, Style.FIELD); \ 8439 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \ 8440 EXPECT_EQ(VALUE, Style.FIELD) 8441 8442 TEST_F(FormatTest, ParsesConfigurationBools) { 8443 FormatStyle Style = {}; 8444 Style.Language = FormatStyle::LK_Cpp; 8445 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft); 8446 CHECK_PARSE_BOOL(AlignOperands); 8447 CHECK_PARSE_BOOL(AlignTrailingComments); 8448 CHECK_PARSE_BOOL(AlignConsecutiveAssignments); 8449 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations); 8450 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine); 8451 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine); 8452 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine); 8453 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine); 8454 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine); 8455 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations); 8456 CHECK_PARSE_BOOL(BinPackArguments); 8457 CHECK_PARSE_BOOL(BinPackParameters); 8458 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations); 8459 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators); 8460 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma); 8461 CHECK_PARSE_BOOL(BreakStringLiterals); 8462 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine); 8463 CHECK_PARSE_BOOL(DerivePointerAlignment); 8464 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding"); 8465 CHECK_PARSE_BOOL(DisableFormat); 8466 CHECK_PARSE_BOOL(IndentCaseLabels); 8467 CHECK_PARSE_BOOL(IndentWrappedFunctionNames); 8468 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks); 8469 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty); 8470 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList); 8471 CHECK_PARSE_BOOL(Cpp11BracedListStyle); 8472 CHECK_PARSE_BOOL(ReflowComments); 8473 CHECK_PARSE_BOOL(SortIncludes); 8474 CHECK_PARSE_BOOL(SpacesInParentheses); 8475 CHECK_PARSE_BOOL(SpacesInSquareBrackets); 8476 CHECK_PARSE_BOOL(SpacesInAngles); 8477 CHECK_PARSE_BOOL(SpaceInEmptyParentheses); 8478 CHECK_PARSE_BOOL(SpacesInContainerLiterals); 8479 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses); 8480 CHECK_PARSE_BOOL(SpaceAfterCStyleCast); 8481 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword); 8482 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators); 8483 8484 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass); 8485 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement); 8486 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum); 8487 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction); 8488 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace); 8489 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration); 8490 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct); 8491 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion); 8492 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch); 8493 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse); 8494 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces); 8495 } 8496 8497 #undef CHECK_PARSE_BOOL 8498 8499 TEST_F(FormatTest, ParsesConfiguration) { 8500 FormatStyle Style = {}; 8501 Style.Language = FormatStyle::LK_Cpp; 8502 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234); 8503 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234", 8504 ConstructorInitializerIndentWidth, 1234u); 8505 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u); 8506 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u); 8507 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u); 8508 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234", 8509 PenaltyBreakBeforeFirstCallParameter, 1234u); 8510 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u); 8511 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234", 8512 PenaltyReturnTypeOnItsOwnLine, 1234u); 8513 CHECK_PARSE("SpacesBeforeTrailingComments: 1234", 8514 SpacesBeforeTrailingComments, 1234u); 8515 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u); 8516 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u); 8517 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$"); 8518 8519 Style.PointerAlignment = FormatStyle::PAS_Middle; 8520 CHECK_PARSE("PointerAlignment: Left", PointerAlignment, 8521 FormatStyle::PAS_Left); 8522 CHECK_PARSE("PointerAlignment: Right", PointerAlignment, 8523 FormatStyle::PAS_Right); 8524 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment, 8525 FormatStyle::PAS_Middle); 8526 // For backward compatibility: 8527 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment, 8528 FormatStyle::PAS_Left); 8529 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment, 8530 FormatStyle::PAS_Right); 8531 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment, 8532 FormatStyle::PAS_Middle); 8533 8534 Style.Standard = FormatStyle::LS_Auto; 8535 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03); 8536 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11); 8537 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03); 8538 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11); 8539 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto); 8540 8541 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 8542 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment", 8543 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment); 8544 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators, 8545 FormatStyle::BOS_None); 8546 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators, 8547 FormatStyle::BOS_All); 8548 // For backward compatibility: 8549 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators, 8550 FormatStyle::BOS_None); 8551 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators, 8552 FormatStyle::BOS_All); 8553 8554 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 8555 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket, 8556 FormatStyle::BAS_Align); 8557 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket, 8558 FormatStyle::BAS_DontAlign); 8559 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket, 8560 FormatStyle::BAS_AlwaysBreak); 8561 // For backward compatibility: 8562 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket, 8563 FormatStyle::BAS_DontAlign); 8564 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket, 8565 FormatStyle::BAS_Align); 8566 8567 Style.UseTab = FormatStyle::UT_ForIndentation; 8568 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never); 8569 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation); 8570 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always); 8571 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab, 8572 FormatStyle::UT_ForContinuationAndIndentation); 8573 // For backward compatibility: 8574 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never); 8575 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always); 8576 8577 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 8578 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None", 8579 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 8580 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline", 8581 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline); 8582 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty", 8583 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty); 8584 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All", 8585 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 8586 // For backward compatibility: 8587 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false", 8588 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 8589 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true", 8590 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 8591 8592 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 8593 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens, 8594 FormatStyle::SBPO_Never); 8595 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens, 8596 FormatStyle::SBPO_Always); 8597 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens, 8598 FormatStyle::SBPO_ControlStatements); 8599 // For backward compatibility: 8600 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, 8601 FormatStyle::SBPO_Never); 8602 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens, 8603 FormatStyle::SBPO_ControlStatements); 8604 8605 Style.ColumnLimit = 123; 8606 FormatStyle BaseStyle = getLLVMStyle(); 8607 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit); 8608 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u); 8609 8610 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 8611 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces, 8612 FormatStyle::BS_Attach); 8613 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces, 8614 FormatStyle::BS_Linux); 8615 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces, 8616 FormatStyle::BS_Mozilla); 8617 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces, 8618 FormatStyle::BS_Stroustrup); 8619 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces, 8620 FormatStyle::BS_Allman); 8621 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU); 8622 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces, 8623 FormatStyle::BS_WebKit); 8624 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces, 8625 FormatStyle::BS_Custom); 8626 8627 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 8628 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType, 8629 FormatStyle::RTBS_None); 8630 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType, 8631 FormatStyle::RTBS_All); 8632 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel", 8633 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel); 8634 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions", 8635 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions); 8636 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions", 8637 AlwaysBreakAfterReturnType, 8638 FormatStyle::RTBS_TopLevelDefinitions); 8639 8640 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All; 8641 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None", 8642 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None); 8643 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All", 8644 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All); 8645 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel", 8646 AlwaysBreakAfterDefinitionReturnType, 8647 FormatStyle::DRTBS_TopLevel); 8648 8649 Style.NamespaceIndentation = FormatStyle::NI_All; 8650 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation, 8651 FormatStyle::NI_None); 8652 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation, 8653 FormatStyle::NI_Inner); 8654 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation, 8655 FormatStyle::NI_All); 8656 8657 // FIXME: This is required because parsing a configuration simply overwrites 8658 // the first N elements of the list instead of resetting it. 8659 Style.ForEachMacros.clear(); 8660 std::vector<std::string> BoostForeach; 8661 BoostForeach.push_back("BOOST_FOREACH"); 8662 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach); 8663 std::vector<std::string> BoostAndQForeach; 8664 BoostAndQForeach.push_back("BOOST_FOREACH"); 8665 BoostAndQForeach.push_back("Q_FOREACH"); 8666 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros, 8667 BoostAndQForeach); 8668 8669 Style.IncludeCategories.clear(); 8670 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2}, 8671 {".*", 1}}; 8672 CHECK_PARSE("IncludeCategories:\n" 8673 " - Regex: abc/.*\n" 8674 " Priority: 2\n" 8675 " - Regex: .*\n" 8676 " Priority: 1", 8677 IncludeCategories, ExpectedCategories); 8678 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$"); 8679 } 8680 8681 TEST_F(FormatTest, ParsesConfigurationWithLanguages) { 8682 FormatStyle Style = {}; 8683 Style.Language = FormatStyle::LK_Cpp; 8684 CHECK_PARSE("Language: Cpp\n" 8685 "IndentWidth: 12", 8686 IndentWidth, 12u); 8687 EXPECT_EQ(parseConfiguration("Language: JavaScript\n" 8688 "IndentWidth: 34", 8689 &Style), 8690 ParseError::Unsuitable); 8691 EXPECT_EQ(12u, Style.IndentWidth); 8692 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 8693 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 8694 8695 Style.Language = FormatStyle::LK_JavaScript; 8696 CHECK_PARSE("Language: JavaScript\n" 8697 "IndentWidth: 12", 8698 IndentWidth, 12u); 8699 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u); 8700 EXPECT_EQ(parseConfiguration("Language: Cpp\n" 8701 "IndentWidth: 34", 8702 &Style), 8703 ParseError::Unsuitable); 8704 EXPECT_EQ(23u, Style.IndentWidth); 8705 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 8706 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 8707 8708 CHECK_PARSE("BasedOnStyle: LLVM\n" 8709 "IndentWidth: 67", 8710 IndentWidth, 67u); 8711 8712 CHECK_PARSE("---\n" 8713 "Language: JavaScript\n" 8714 "IndentWidth: 12\n" 8715 "---\n" 8716 "Language: Cpp\n" 8717 "IndentWidth: 34\n" 8718 "...\n", 8719 IndentWidth, 12u); 8720 8721 Style.Language = FormatStyle::LK_Cpp; 8722 CHECK_PARSE("---\n" 8723 "Language: JavaScript\n" 8724 "IndentWidth: 12\n" 8725 "---\n" 8726 "Language: Cpp\n" 8727 "IndentWidth: 34\n" 8728 "...\n", 8729 IndentWidth, 34u); 8730 CHECK_PARSE("---\n" 8731 "IndentWidth: 78\n" 8732 "---\n" 8733 "Language: JavaScript\n" 8734 "IndentWidth: 56\n" 8735 "...\n", 8736 IndentWidth, 78u); 8737 8738 Style.ColumnLimit = 123; 8739 Style.IndentWidth = 234; 8740 Style.BreakBeforeBraces = FormatStyle::BS_Linux; 8741 Style.TabWidth = 345; 8742 EXPECT_FALSE(parseConfiguration("---\n" 8743 "IndentWidth: 456\n" 8744 "BreakBeforeBraces: Allman\n" 8745 "---\n" 8746 "Language: JavaScript\n" 8747 "IndentWidth: 111\n" 8748 "TabWidth: 111\n" 8749 "---\n" 8750 "Language: Cpp\n" 8751 "BreakBeforeBraces: Stroustrup\n" 8752 "TabWidth: 789\n" 8753 "...\n", 8754 &Style)); 8755 EXPECT_EQ(123u, Style.ColumnLimit); 8756 EXPECT_EQ(456u, Style.IndentWidth); 8757 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces); 8758 EXPECT_EQ(789u, Style.TabWidth); 8759 8760 EXPECT_EQ(parseConfiguration("---\n" 8761 "Language: JavaScript\n" 8762 "IndentWidth: 56\n" 8763 "---\n" 8764 "IndentWidth: 78\n" 8765 "...\n", 8766 &Style), 8767 ParseError::Error); 8768 EXPECT_EQ(parseConfiguration("---\n" 8769 "Language: JavaScript\n" 8770 "IndentWidth: 56\n" 8771 "---\n" 8772 "Language: JavaScript\n" 8773 "IndentWidth: 78\n" 8774 "...\n", 8775 &Style), 8776 ParseError::Error); 8777 8778 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 8779 } 8780 8781 #undef CHECK_PARSE 8782 8783 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) { 8784 FormatStyle Style = {}; 8785 Style.Language = FormatStyle::LK_JavaScript; 8786 Style.BreakBeforeTernaryOperators = true; 8787 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value()); 8788 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 8789 8790 Style.BreakBeforeTernaryOperators = true; 8791 EXPECT_EQ(0, parseConfiguration("---\n" 8792 "BasedOnStyle: Google\n" 8793 "---\n" 8794 "Language: JavaScript\n" 8795 "IndentWidth: 76\n" 8796 "...\n", 8797 &Style) 8798 .value()); 8799 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 8800 EXPECT_EQ(76u, Style.IndentWidth); 8801 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 8802 } 8803 8804 TEST_F(FormatTest, ConfigurationRoundTripTest) { 8805 FormatStyle Style = getLLVMStyle(); 8806 std::string YAML = configurationAsText(Style); 8807 FormatStyle ParsedStyle = {}; 8808 ParsedStyle.Language = FormatStyle::LK_Cpp; 8809 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value()); 8810 EXPECT_EQ(Style, ParsedStyle); 8811 } 8812 8813 TEST_F(FormatTest, WorksFor8bitEncodings) { 8814 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n" 8815 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n" 8816 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n" 8817 "\"\xef\xee\xf0\xf3...\"", 8818 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 " 8819 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe " 8820 "\xef\xee\xf0\xf3...\"", 8821 getLLVMStyleWithColumns(12))); 8822 } 8823 8824 TEST_F(FormatTest, HandlesUTF8BOM) { 8825 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf")); 8826 EXPECT_EQ("\xef\xbb\xbf#include <iostream>", 8827 format("\xef\xbb\xbf#include <iostream>")); 8828 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>", 8829 format("\xef\xbb\xbf\n#include <iostream>")); 8830 } 8831 8832 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers. 8833 #if !defined(_MSC_VER) 8834 8835 TEST_F(FormatTest, CountsUTF8CharactersProperly) { 8836 verifyFormat("\"Однажды в студёную зимнюю пору...\"", 8837 getLLVMStyleWithColumns(35)); 8838 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"", 8839 getLLVMStyleWithColumns(31)); 8840 verifyFormat("// Однажды в студёную зимнюю пору...", 8841 getLLVMStyleWithColumns(36)); 8842 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32)); 8843 verifyFormat("/* Однажды в студёную зимнюю пору... */", 8844 getLLVMStyleWithColumns(39)); 8845 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */", 8846 getLLVMStyleWithColumns(35)); 8847 } 8848 8849 TEST_F(FormatTest, SplitsUTF8Strings) { 8850 // Non-printable characters' width is currently considered to be the length in 8851 // bytes in UTF8. The characters can be displayed in very different manner 8852 // (zero-width, single width with a substitution glyph, expanded to their code 8853 // (e.g. "<8d>"), so there's no single correct way to handle them. 8854 EXPECT_EQ("\"aaaaÄ\"\n" 8855 "\"\xc2\x8d\";", 8856 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 8857 EXPECT_EQ("\"aaaaaaaÄ\"\n" 8858 "\"\xc2\x8d\";", 8859 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 8860 EXPECT_EQ("\"Однажды, в \"\n" 8861 "\"студёную \"\n" 8862 "\"зимнюю \"\n" 8863 "\"пору,\"", 8864 format("\"Однажды, в студёную зимнюю пору,\"", 8865 getLLVMStyleWithColumns(13))); 8866 EXPECT_EQ( 8867 "\"一 二 三 \"\n" 8868 "\"四 五六 \"\n" 8869 "\"七 八 九 \"\n" 8870 "\"十\"", 8871 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11))); 8872 EXPECT_EQ("\"一\t二 \"\n" 8873 "\"\t三 \"\n" 8874 "\"四 五\t六 \"\n" 8875 "\"\t七 \"\n" 8876 "\"八九十\tqq\"", 8877 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"", 8878 getLLVMStyleWithColumns(11))); 8879 8880 // UTF8 character in an escape sequence. 8881 EXPECT_EQ("\"aaaaaa\"\n" 8882 "\"\\\xC2\x8D\"", 8883 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10))); 8884 } 8885 8886 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) { 8887 EXPECT_EQ("const char *sssss =\n" 8888 " \"一二三四五六七八\\\n" 8889 " 九 十\";", 8890 format("const char *sssss = \"一二三四五六七八\\\n" 8891 " 九 十\";", 8892 getLLVMStyleWithColumns(30))); 8893 } 8894 8895 TEST_F(FormatTest, SplitsUTF8LineComments) { 8896 EXPECT_EQ("// aaaaÄ\xc2\x8d", 8897 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10))); 8898 EXPECT_EQ("// Я из лесу\n" 8899 "// вышел; был\n" 8900 "// сильный\n" 8901 "// мороз.", 8902 format("// Я из лесу вышел; был сильный мороз.", 8903 getLLVMStyleWithColumns(13))); 8904 EXPECT_EQ("// 一二三\n" 8905 "// 四五六七\n" 8906 "// 八 九\n" 8907 "// 十", 8908 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9))); 8909 } 8910 8911 TEST_F(FormatTest, SplitsUTF8BlockComments) { 8912 EXPECT_EQ("/* Гляжу,\n" 8913 " * поднимается\n" 8914 " * медленно в\n" 8915 " * гору\n" 8916 " * Лошадка,\n" 8917 " * везущая\n" 8918 " * хворосту\n" 8919 " * воз. */", 8920 format("/* Гляжу, поднимается медленно в гору\n" 8921 " * Лошадка, везущая хворосту воз. */", 8922 getLLVMStyleWithColumns(13))); 8923 EXPECT_EQ( 8924 "/* 一二三\n" 8925 " * 四五六七\n" 8926 " * 八 九\n" 8927 " * 十 */", 8928 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9))); 8929 EXPECT_EQ("/* \n" 8930 " * \n" 8931 " * - */", 8932 format("/* - */", getLLVMStyleWithColumns(12))); 8933 } 8934 8935 #endif // _MSC_VER 8936 8937 TEST_F(FormatTest, ConstructorInitializerIndentWidth) { 8938 FormatStyle Style = getLLVMStyle(); 8939 8940 Style.ConstructorInitializerIndentWidth = 4; 8941 verifyFormat( 8942 "SomeClass::Constructor()\n" 8943 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 8944 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 8945 Style); 8946 8947 Style.ConstructorInitializerIndentWidth = 2; 8948 verifyFormat( 8949 "SomeClass::Constructor()\n" 8950 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 8951 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 8952 Style); 8953 8954 Style.ConstructorInitializerIndentWidth = 0; 8955 verifyFormat( 8956 "SomeClass::Constructor()\n" 8957 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 8958 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 8959 Style); 8960 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 8961 verifyFormat( 8962 "SomeLongTemplateVariableName<\n" 8963 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>", 8964 Style); 8965 verifyFormat( 8966 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 8967 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 8968 Style); 8969 } 8970 8971 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) { 8972 FormatStyle Style = getLLVMStyle(); 8973 Style.BreakConstructorInitializersBeforeComma = true; 8974 Style.ConstructorInitializerIndentWidth = 4; 8975 verifyFormat("SomeClass::Constructor()\n" 8976 " : a(a)\n" 8977 " , b(b)\n" 8978 " , c(c) {}", 8979 Style); 8980 verifyFormat("SomeClass::Constructor()\n" 8981 " : a(a) {}", 8982 Style); 8983 8984 Style.ColumnLimit = 0; 8985 verifyFormat("SomeClass::Constructor()\n" 8986 " : a(a) {}", 8987 Style); 8988 verifyFormat("SomeClass::Constructor() noexcept\n" 8989 " : a(a) {}", 8990 Style); 8991 verifyFormat("SomeClass::Constructor()\n" 8992 " : a(a)\n" 8993 " , b(b)\n" 8994 " , c(c) {}", 8995 Style); 8996 verifyFormat("SomeClass::Constructor()\n" 8997 " : a(a) {\n" 8998 " foo();\n" 8999 " bar();\n" 9000 "}", 9001 Style); 9002 9003 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 9004 verifyFormat("SomeClass::Constructor()\n" 9005 " : a(a)\n" 9006 " , b(b)\n" 9007 " , c(c) {\n}", 9008 Style); 9009 verifyFormat("SomeClass::Constructor()\n" 9010 " : a(a) {\n}", 9011 Style); 9012 9013 Style.ColumnLimit = 80; 9014 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 9015 Style.ConstructorInitializerIndentWidth = 2; 9016 verifyFormat("SomeClass::Constructor()\n" 9017 " : a(a)\n" 9018 " , b(b)\n" 9019 " , c(c) {}", 9020 Style); 9021 9022 Style.ConstructorInitializerIndentWidth = 0; 9023 verifyFormat("SomeClass::Constructor()\n" 9024 ": a(a)\n" 9025 ", b(b)\n" 9026 ", c(c) {}", 9027 Style); 9028 9029 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 9030 Style.ConstructorInitializerIndentWidth = 4; 9031 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style); 9032 verifyFormat( 9033 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n", 9034 Style); 9035 verifyFormat( 9036 "SomeClass::Constructor()\n" 9037 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}", 9038 Style); 9039 Style.ConstructorInitializerIndentWidth = 4; 9040 Style.ColumnLimit = 60; 9041 verifyFormat("SomeClass::Constructor()\n" 9042 " : aaaaaaaa(aaaaaaaa)\n" 9043 " , aaaaaaaa(aaaaaaaa)\n" 9044 " , aaaaaaaa(aaaaaaaa) {}", 9045 Style); 9046 } 9047 9048 TEST_F(FormatTest, Destructors) { 9049 verifyFormat("void F(int &i) { i.~int(); }"); 9050 verifyFormat("void F(int &i) { i->~int(); }"); 9051 } 9052 9053 TEST_F(FormatTest, FormatsWithWebKitStyle) { 9054 FormatStyle Style = getWebKitStyle(); 9055 9056 // Don't indent in outer namespaces. 9057 verifyFormat("namespace outer {\n" 9058 "int i;\n" 9059 "namespace inner {\n" 9060 " int i;\n" 9061 "} // namespace inner\n" 9062 "} // namespace outer\n" 9063 "namespace other_outer {\n" 9064 "int i;\n" 9065 "}", 9066 Style); 9067 9068 // Don't indent case labels. 9069 verifyFormat("switch (variable) {\n" 9070 "case 1:\n" 9071 "case 2:\n" 9072 " doSomething();\n" 9073 " break;\n" 9074 "default:\n" 9075 " ++variable;\n" 9076 "}", 9077 Style); 9078 9079 // Wrap before binary operators. 9080 EXPECT_EQ("void f()\n" 9081 "{\n" 9082 " if (aaaaaaaaaaaaaaaa\n" 9083 " && bbbbbbbbbbbbbbbbbbbbbbbb\n" 9084 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 9085 " return;\n" 9086 "}", 9087 format("void f() {\n" 9088 "if (aaaaaaaaaaaaaaaa\n" 9089 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n" 9090 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 9091 "return;\n" 9092 "}", 9093 Style)); 9094 9095 // Allow functions on a single line. 9096 verifyFormat("void f() { return; }", Style); 9097 9098 // Constructor initializers are formatted one per line with the "," on the 9099 // new line. 9100 verifyFormat("Constructor()\n" 9101 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 9102 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" 9103 " aaaaaaaaaaaaaa)\n" 9104 " , aaaaaaaaaaaaaaaaaaaaaaa()\n" 9105 "{\n" 9106 "}", 9107 Style); 9108 verifyFormat("SomeClass::Constructor()\n" 9109 " : a(a)\n" 9110 "{\n" 9111 "}", 9112 Style); 9113 EXPECT_EQ("SomeClass::Constructor()\n" 9114 " : a(a)\n" 9115 "{\n" 9116 "}", 9117 format("SomeClass::Constructor():a(a){}", Style)); 9118 verifyFormat("SomeClass::Constructor()\n" 9119 " : a(a)\n" 9120 " , b(b)\n" 9121 " , c(c)\n" 9122 "{\n" 9123 "}", 9124 Style); 9125 verifyFormat("SomeClass::Constructor()\n" 9126 " : a(a)\n" 9127 "{\n" 9128 " foo();\n" 9129 " bar();\n" 9130 "}", 9131 Style); 9132 9133 // Access specifiers should be aligned left. 9134 verifyFormat("class C {\n" 9135 "public:\n" 9136 " int i;\n" 9137 "};", 9138 Style); 9139 9140 // Do not align comments. 9141 verifyFormat("int a; // Do not\n" 9142 "double b; // align comments.", 9143 Style); 9144 9145 // Do not align operands. 9146 EXPECT_EQ("ASSERT(aaaa\n" 9147 " || bbbb);", 9148 format("ASSERT ( aaaa\n||bbbb);", Style)); 9149 9150 // Accept input's line breaks. 9151 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n" 9152 " || bbbbbbbbbbbbbbb) {\n" 9153 " i++;\n" 9154 "}", 9155 format("if (aaaaaaaaaaaaaaa\n" 9156 "|| bbbbbbbbbbbbbbb) { i++; }", 9157 Style)); 9158 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n" 9159 " i++;\n" 9160 "}", 9161 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style)); 9162 9163 // Don't automatically break all macro definitions (llvm.org/PR17842). 9164 verifyFormat("#define aNumber 10", Style); 9165 // However, generally keep the line breaks that the user authored. 9166 EXPECT_EQ("#define aNumber \\\n" 9167 " 10", 9168 format("#define aNumber \\\n" 9169 " 10", 9170 Style)); 9171 9172 // Keep empty and one-element array literals on a single line. 9173 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n" 9174 " copyItems:YES];", 9175 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n" 9176 "copyItems:YES];", 9177 Style)); 9178 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n" 9179 " copyItems:YES];", 9180 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n" 9181 " copyItems:YES];", 9182 Style)); 9183 // FIXME: This does not seem right, there should be more indentation before 9184 // the array literal's entries. Nested blocks have the same problem. 9185 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 9186 " @\"a\",\n" 9187 " @\"a\"\n" 9188 "]\n" 9189 " copyItems:YES];", 9190 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 9191 " @\"a\",\n" 9192 " @\"a\"\n" 9193 " ]\n" 9194 " copyItems:YES];", 9195 Style)); 9196 EXPECT_EQ( 9197 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 9198 " copyItems:YES];", 9199 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 9200 " copyItems:YES];", 9201 Style)); 9202 9203 verifyFormat("[self.a b:c c:d];", Style); 9204 EXPECT_EQ("[self.a b:c\n" 9205 " c:d];", 9206 format("[self.a b:c\n" 9207 "c:d];", 9208 Style)); 9209 } 9210 9211 TEST_F(FormatTest, FormatsLambdas) { 9212 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n"); 9213 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n"); 9214 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n"); 9215 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n"); 9216 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n"); 9217 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n"); 9218 verifyFormat("int x = f(*+[] {});"); 9219 verifyFormat("void f() {\n" 9220 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n" 9221 "}\n"); 9222 verifyFormat("void f() {\n" 9223 " other(x.begin(), //\n" 9224 " x.end(), //\n" 9225 " [&](int, int) { return 1; });\n" 9226 "}\n"); 9227 verifyFormat("SomeFunction([]() { // A cool function...\n" 9228 " return 43;\n" 9229 "});"); 9230 EXPECT_EQ("SomeFunction([]() {\n" 9231 "#define A a\n" 9232 " return 43;\n" 9233 "});", 9234 format("SomeFunction([](){\n" 9235 "#define A a\n" 9236 "return 43;\n" 9237 "});")); 9238 verifyFormat("void f() {\n" 9239 " SomeFunction([](decltype(x), A *a) {});\n" 9240 "}"); 9241 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 9242 " [](const aaaaaaaaaa &a) { return a; });"); 9243 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n" 9244 " SomeOtherFunctioooooooooooooooooooooooooon();\n" 9245 "});"); 9246 verifyFormat("Constructor()\n" 9247 " : Field([] { // comment\n" 9248 " int i;\n" 9249 " }) {}"); 9250 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n" 9251 " return some_parameter.size();\n" 9252 "};"); 9253 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n" 9254 " [](const string &s) { return s; };"); 9255 verifyFormat("int i = aaaaaa ? 1 //\n" 9256 " : [] {\n" 9257 " return 2; //\n" 9258 " }();"); 9259 verifyFormat("llvm::errs() << \"number of twos is \"\n" 9260 " << std::count_if(v.begin(), v.end(), [](int x) {\n" 9261 " return x == 2; // force break\n" 9262 " });"); 9263 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa([=](\n" 9264 " int iiiiiiiiiiii) {\n" 9265 " return aaaaaaaaaaaaaaaaaaaaaaa != aaaaaaaaaaaaaaaaaaaaaaa;\n" 9266 "});", 9267 getLLVMStyleWithColumns(60)); 9268 verifyFormat("SomeFunction({[&] {\n" 9269 " // comment\n" 9270 " },\n" 9271 " [&] {\n" 9272 " // comment\n" 9273 " }});"); 9274 verifyFormat("SomeFunction({[&] {\n" 9275 " // comment\n" 9276 "}});"); 9277 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n" 9278 " [&]() { return true; },\n" 9279 " aaaaa aaaaaaaaa);"); 9280 9281 // Lambdas with return types. 9282 verifyFormat("int c = []() -> int { return 2; }();\n"); 9283 verifyFormat("int c = []() -> int * { return 2; }();\n"); 9284 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n"); 9285 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());"); 9286 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};"); 9287 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};"); 9288 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};"); 9289 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};"); 9290 verifyFormat("[a, a]() -> a<1> {};"); 9291 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n" 9292 " int j) -> int {\n" 9293 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n" 9294 "};"); 9295 verifyFormat( 9296 "aaaaaaaaaaaaaaaaaaaaaa(\n" 9297 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n" 9298 " return aaaaaaaaaaaaaaaaa;\n" 9299 " });", 9300 getLLVMStyleWithColumns(70)); 9301 verifyFormat("[]() //\n" 9302 " -> int {\n" 9303 " return 1; //\n" 9304 "};"); 9305 9306 // Multiple lambdas in the same parentheses change indentation rules. 9307 verifyFormat("SomeFunction(\n" 9308 " []() {\n" 9309 " int i = 42;\n" 9310 " return i;\n" 9311 " },\n" 9312 " []() {\n" 9313 " int j = 43;\n" 9314 " return j;\n" 9315 " });"); 9316 9317 // More complex introducers. 9318 verifyFormat("return [i, args...] {};"); 9319 9320 // Not lambdas. 9321 verifyFormat("constexpr char hello[]{\"hello\"};"); 9322 verifyFormat("double &operator[](int i) { return 0; }\n" 9323 "int i;"); 9324 verifyFormat("std::unique_ptr<int[]> foo() {}"); 9325 verifyFormat("int i = a[a][a]->f();"); 9326 verifyFormat("int i = (*b)[a]->f();"); 9327 9328 // Other corner cases. 9329 verifyFormat("void f() {\n" 9330 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n" 9331 " );\n" 9332 "}"); 9333 9334 // Lambdas created through weird macros. 9335 verifyFormat("void f() {\n" 9336 " MACRO((const AA &a) { return 1; });\n" 9337 " MACRO((AA &a) { return 1; });\n" 9338 "}"); 9339 9340 verifyFormat("if (blah_blah(whatever, whatever, [] {\n" 9341 " doo_dah();\n" 9342 " doo_dah();\n" 9343 " })) {\n" 9344 "}"); 9345 verifyFormat("auto lambda = []() {\n" 9346 " int a = 2\n" 9347 "#if A\n" 9348 " + 2\n" 9349 "#endif\n" 9350 " ;\n" 9351 "};"); 9352 } 9353 9354 TEST_F(FormatTest, FormatsBlocks) { 9355 FormatStyle ShortBlocks = getLLVMStyle(); 9356 ShortBlocks.AllowShortBlocksOnASingleLine = true; 9357 verifyFormat("int (^Block)(int, int);", ShortBlocks); 9358 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks); 9359 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks); 9360 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks); 9361 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks); 9362 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks); 9363 9364 verifyFormat("foo(^{ bar(); });", ShortBlocks); 9365 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks); 9366 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks); 9367 9368 verifyFormat("[operation setCompletionBlock:^{\n" 9369 " [self onOperationDone];\n" 9370 "}];"); 9371 verifyFormat("int i = {[operation setCompletionBlock:^{\n" 9372 " [self onOperationDone];\n" 9373 "}]};"); 9374 verifyFormat("[operation setCompletionBlock:^(int *i) {\n" 9375 " f();\n" 9376 "}];"); 9377 verifyFormat("int a = [operation block:^int(int *i) {\n" 9378 " return 1;\n" 9379 "}];"); 9380 verifyFormat("[myObject doSomethingWith:arg1\n" 9381 " aaa:^int(int *a) {\n" 9382 " return 1;\n" 9383 " }\n" 9384 " bbb:f(a * bbbbbbbb)];"); 9385 9386 verifyFormat("[operation setCompletionBlock:^{\n" 9387 " [self.delegate newDataAvailable];\n" 9388 "}];", 9389 getLLVMStyleWithColumns(60)); 9390 verifyFormat("dispatch_async(_fileIOQueue, ^{\n" 9391 " NSString *path = [self sessionFilePath];\n" 9392 " if (path) {\n" 9393 " // ...\n" 9394 " }\n" 9395 "});"); 9396 verifyFormat("[[SessionService sharedService]\n" 9397 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 9398 " if (window) {\n" 9399 " [self windowDidLoad:window];\n" 9400 " } else {\n" 9401 " [self errorLoadingWindow];\n" 9402 " }\n" 9403 " }];"); 9404 verifyFormat("void (^largeBlock)(void) = ^{\n" 9405 " // ...\n" 9406 "};\n", 9407 getLLVMStyleWithColumns(40)); 9408 verifyFormat("[[SessionService sharedService]\n" 9409 " loadWindowWithCompletionBlock: //\n" 9410 " ^(SessionWindow *window) {\n" 9411 " if (window) {\n" 9412 " [self windowDidLoad:window];\n" 9413 " } else {\n" 9414 " [self errorLoadingWindow];\n" 9415 " }\n" 9416 " }];", 9417 getLLVMStyleWithColumns(60)); 9418 verifyFormat("[myObject doSomethingWith:arg1\n" 9419 " firstBlock:^(Foo *a) {\n" 9420 " // ...\n" 9421 " int i;\n" 9422 " }\n" 9423 " secondBlock:^(Bar *b) {\n" 9424 " // ...\n" 9425 " int i;\n" 9426 " }\n" 9427 " thirdBlock:^Foo(Bar *b) {\n" 9428 " // ...\n" 9429 " int i;\n" 9430 " }];"); 9431 verifyFormat("[myObject doSomethingWith:arg1\n" 9432 " firstBlock:-1\n" 9433 " secondBlock:^(Bar *b) {\n" 9434 " // ...\n" 9435 " int i;\n" 9436 " }];"); 9437 9438 verifyFormat("f(^{\n" 9439 " @autoreleasepool {\n" 9440 " if (a) {\n" 9441 " g();\n" 9442 " }\n" 9443 " }\n" 9444 "});"); 9445 verifyFormat("Block b = ^int *(A *a, B *b) {}"); 9446 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n" 9447 "};"); 9448 9449 FormatStyle FourIndent = getLLVMStyle(); 9450 FourIndent.ObjCBlockIndentWidth = 4; 9451 verifyFormat("[operation setCompletionBlock:^{\n" 9452 " [self onOperationDone];\n" 9453 "}];", 9454 FourIndent); 9455 } 9456 9457 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) { 9458 FormatStyle ZeroColumn = getLLVMStyle(); 9459 ZeroColumn.ColumnLimit = 0; 9460 9461 verifyFormat("[[SessionService sharedService] " 9462 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 9463 " if (window) {\n" 9464 " [self windowDidLoad:window];\n" 9465 " } else {\n" 9466 " [self errorLoadingWindow];\n" 9467 " }\n" 9468 "}];", 9469 ZeroColumn); 9470 EXPECT_EQ("[[SessionService sharedService]\n" 9471 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 9472 " if (window) {\n" 9473 " [self windowDidLoad:window];\n" 9474 " } else {\n" 9475 " [self errorLoadingWindow];\n" 9476 " }\n" 9477 " }];", 9478 format("[[SessionService sharedService]\n" 9479 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 9480 " if (window) {\n" 9481 " [self windowDidLoad:window];\n" 9482 " } else {\n" 9483 " [self errorLoadingWindow];\n" 9484 " }\n" 9485 "}];", 9486 ZeroColumn)); 9487 verifyFormat("[myObject doSomethingWith:arg1\n" 9488 " firstBlock:^(Foo *a) {\n" 9489 " // ...\n" 9490 " int i;\n" 9491 " }\n" 9492 " secondBlock:^(Bar *b) {\n" 9493 " // ...\n" 9494 " int i;\n" 9495 " }\n" 9496 " thirdBlock:^Foo(Bar *b) {\n" 9497 " // ...\n" 9498 " int i;\n" 9499 " }];", 9500 ZeroColumn); 9501 verifyFormat("f(^{\n" 9502 " @autoreleasepool {\n" 9503 " if (a) {\n" 9504 " g();\n" 9505 " }\n" 9506 " }\n" 9507 "});", 9508 ZeroColumn); 9509 verifyFormat("void (^largeBlock)(void) = ^{\n" 9510 " // ...\n" 9511 "};", 9512 ZeroColumn); 9513 9514 ZeroColumn.AllowShortBlocksOnASingleLine = true; 9515 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };", 9516 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 9517 ZeroColumn.AllowShortBlocksOnASingleLine = false; 9518 EXPECT_EQ("void (^largeBlock)(void) = ^{\n" 9519 " int i;\n" 9520 "};", 9521 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 9522 } 9523 9524 TEST_F(FormatTest, SupportsCRLF) { 9525 EXPECT_EQ("int a;\r\n" 9526 "int b;\r\n" 9527 "int c;\r\n", 9528 format("int a;\r\n" 9529 " int b;\r\n" 9530 " int c;\r\n", 9531 getLLVMStyle())); 9532 EXPECT_EQ("int a;\r\n" 9533 "int b;\r\n" 9534 "int c;\r\n", 9535 format("int a;\r\n" 9536 " int b;\n" 9537 " int c;\r\n", 9538 getLLVMStyle())); 9539 EXPECT_EQ("int a;\n" 9540 "int b;\n" 9541 "int c;\n", 9542 format("int a;\r\n" 9543 " int b;\n" 9544 " int c;\n", 9545 getLLVMStyle())); 9546 EXPECT_EQ("\"aaaaaaa \"\r\n" 9547 "\"bbbbbbb\";\r\n", 9548 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10))); 9549 EXPECT_EQ("#define A \\\r\n" 9550 " b; \\\r\n" 9551 " c; \\\r\n" 9552 " d;\r\n", 9553 format("#define A \\\r\n" 9554 " b; \\\r\n" 9555 " c; d; \r\n", 9556 getGoogleStyle())); 9557 9558 EXPECT_EQ("/*\r\n" 9559 "multi line block comments\r\n" 9560 "should not introduce\r\n" 9561 "an extra carriage return\r\n" 9562 "*/\r\n", 9563 format("/*\r\n" 9564 "multi line block comments\r\n" 9565 "should not introduce\r\n" 9566 "an extra carriage return\r\n" 9567 "*/\r\n")); 9568 } 9569 9570 TEST_F(FormatTest, MunchSemicolonAfterBlocks) { 9571 verifyFormat("MY_CLASS(C) {\n" 9572 " int i;\n" 9573 " int j;\n" 9574 "};"); 9575 } 9576 9577 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) { 9578 FormatStyle TwoIndent = getLLVMStyleWithColumns(15); 9579 TwoIndent.ContinuationIndentWidth = 2; 9580 9581 EXPECT_EQ("int i =\n" 9582 " longFunction(\n" 9583 " arg);", 9584 format("int i = longFunction(arg);", TwoIndent)); 9585 9586 FormatStyle SixIndent = getLLVMStyleWithColumns(20); 9587 SixIndent.ContinuationIndentWidth = 6; 9588 9589 EXPECT_EQ("int i =\n" 9590 " longFunction(\n" 9591 " arg);", 9592 format("int i = longFunction(arg);", SixIndent)); 9593 } 9594 9595 TEST_F(FormatTest, SpacesInAngles) { 9596 FormatStyle Spaces = getLLVMStyle(); 9597 Spaces.SpacesInAngles = true; 9598 9599 verifyFormat("static_cast< int >(arg);", Spaces); 9600 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces); 9601 verifyFormat("f< int, float >();", Spaces); 9602 verifyFormat("template <> g() {}", Spaces); 9603 verifyFormat("template < std::vector< int > > f() {}", Spaces); 9604 verifyFormat("std::function< void(int, int) > fct;", Spaces); 9605 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }", 9606 Spaces); 9607 9608 Spaces.Standard = FormatStyle::LS_Cpp03; 9609 Spaces.SpacesInAngles = true; 9610 verifyFormat("A< A< int > >();", Spaces); 9611 9612 Spaces.SpacesInAngles = false; 9613 verifyFormat("A<A<int> >();", Spaces); 9614 9615 Spaces.Standard = FormatStyle::LS_Cpp11; 9616 Spaces.SpacesInAngles = true; 9617 verifyFormat("A< A< int > >();", Spaces); 9618 9619 Spaces.SpacesInAngles = false; 9620 verifyFormat("A<A<int>>();", Spaces); 9621 } 9622 9623 TEST_F(FormatTest, SpaceAfterTemplateKeyword) { 9624 FormatStyle Style = getLLVMStyle(); 9625 Style.SpaceAfterTemplateKeyword = false; 9626 verifyFormat("template<int> void foo();", Style); 9627 } 9628 9629 TEST_F(FormatTest, TripleAngleBrackets) { 9630 verifyFormat("f<<<1, 1>>>();"); 9631 verifyFormat("f<<<1, 1, 1, s>>>();"); 9632 verifyFormat("f<<<a, b, c, d>>>();"); 9633 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();")); 9634 verifyFormat("f<param><<<1, 1>>>();"); 9635 verifyFormat("f<1><<<1, 1>>>();"); 9636 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();")); 9637 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 9638 "aaaaaaaaaaa<<<\n 1, 1>>>();"); 9639 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n" 9640 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();"); 9641 } 9642 9643 TEST_F(FormatTest, MergeLessLessAtEnd) { 9644 verifyFormat("<<"); 9645 EXPECT_EQ("< < <", format("\\\n<<<")); 9646 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 9647 "aaallvm::outs() <<"); 9648 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 9649 "aaaallvm::outs()\n <<"); 9650 } 9651 9652 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) { 9653 std::string code = "#if A\n" 9654 "#if B\n" 9655 "a.\n" 9656 "#endif\n" 9657 " a = 1;\n" 9658 "#else\n" 9659 "#endif\n" 9660 "#if C\n" 9661 "#else\n" 9662 "#endif\n"; 9663 EXPECT_EQ(code, format(code)); 9664 } 9665 9666 TEST_F(FormatTest, HandleConflictMarkers) { 9667 // Git/SVN conflict markers. 9668 EXPECT_EQ("int a;\n" 9669 "void f() {\n" 9670 " callme(some(parameter1,\n" 9671 "<<<<<<< text by the vcs\n" 9672 " parameter2),\n" 9673 "||||||| text by the vcs\n" 9674 " parameter2),\n" 9675 " parameter3,\n" 9676 "======= text by the vcs\n" 9677 " parameter2, parameter3),\n" 9678 ">>>>>>> text by the vcs\n" 9679 " otherparameter);\n", 9680 format("int a;\n" 9681 "void f() {\n" 9682 " callme(some(parameter1,\n" 9683 "<<<<<<< text by the vcs\n" 9684 " parameter2),\n" 9685 "||||||| text by the vcs\n" 9686 " parameter2),\n" 9687 " parameter3,\n" 9688 "======= text by the vcs\n" 9689 " parameter2,\n" 9690 " parameter3),\n" 9691 ">>>>>>> text by the vcs\n" 9692 " otherparameter);\n")); 9693 9694 // Perforce markers. 9695 EXPECT_EQ("void f() {\n" 9696 " function(\n" 9697 ">>>> text by the vcs\n" 9698 " parameter,\n" 9699 "==== text by the vcs\n" 9700 " parameter,\n" 9701 "==== text by the vcs\n" 9702 " parameter,\n" 9703 "<<<< text by the vcs\n" 9704 " parameter);\n", 9705 format("void f() {\n" 9706 " function(\n" 9707 ">>>> text by the vcs\n" 9708 " parameter,\n" 9709 "==== text by the vcs\n" 9710 " parameter,\n" 9711 "==== text by the vcs\n" 9712 " parameter,\n" 9713 "<<<< text by the vcs\n" 9714 " parameter);\n")); 9715 9716 EXPECT_EQ("<<<<<<<\n" 9717 "|||||||\n" 9718 "=======\n" 9719 ">>>>>>>", 9720 format("<<<<<<<\n" 9721 "|||||||\n" 9722 "=======\n" 9723 ">>>>>>>")); 9724 9725 EXPECT_EQ("<<<<<<<\n" 9726 "|||||||\n" 9727 "int i;\n" 9728 "=======\n" 9729 ">>>>>>>", 9730 format("<<<<<<<\n" 9731 "|||||||\n" 9732 "int i;\n" 9733 "=======\n" 9734 ">>>>>>>")); 9735 9736 // FIXME: Handle parsing of macros around conflict markers correctly: 9737 EXPECT_EQ("#define Macro \\\n" 9738 "<<<<<<<\n" 9739 "Something \\\n" 9740 "|||||||\n" 9741 "Else \\\n" 9742 "=======\n" 9743 "Other \\\n" 9744 ">>>>>>>\n" 9745 " End int i;\n", 9746 format("#define Macro \\\n" 9747 "<<<<<<<\n" 9748 " Something \\\n" 9749 "|||||||\n" 9750 " Else \\\n" 9751 "=======\n" 9752 " Other \\\n" 9753 ">>>>>>>\n" 9754 " End\n" 9755 "int i;\n")); 9756 } 9757 9758 TEST_F(FormatTest, DisableRegions) { 9759 EXPECT_EQ("int i;\n" 9760 "// clang-format off\n" 9761 " int j;\n" 9762 "// clang-format on\n" 9763 "int k;", 9764 format(" int i;\n" 9765 " // clang-format off\n" 9766 " int j;\n" 9767 " // clang-format on\n" 9768 " int k;")); 9769 EXPECT_EQ("int i;\n" 9770 "/* clang-format off */\n" 9771 " int j;\n" 9772 "/* clang-format on */\n" 9773 "int k;", 9774 format(" int i;\n" 9775 " /* clang-format off */\n" 9776 " int j;\n" 9777 " /* clang-format on */\n" 9778 " int k;")); 9779 9780 // Don't reflow comments within disabled regions. 9781 EXPECT_EQ( 9782 "// clang-format off\n" 9783 "// long long long long long long line\n" 9784 "/* clang-format on */\n" 9785 "/* long long long\n" 9786 " * long long long\n" 9787 " * line */\n" 9788 "int i;\n" 9789 "/* clang-format off */\n" 9790 "/* long long long long long long line */\n", 9791 format("// clang-format off\n" 9792 "// long long long long long long line\n" 9793 "/* clang-format on */\n" 9794 "/* long long long long long long line */\n" 9795 "int i;\n" 9796 "/* clang-format off */\n" 9797 "/* long long long long long long line */\n", 9798 getLLVMStyleWithColumns(20))); 9799 } 9800 9801 TEST_F(FormatTest, DoNotCrashOnInvalidInput) { 9802 format("? ) ="); 9803 verifyNoCrash("#define a\\\n /**/}"); 9804 } 9805 9806 TEST_F(FormatTest, FormatsTableGenCode) { 9807 FormatStyle Style = getLLVMStyle(); 9808 Style.Language = FormatStyle::LK_TableGen; 9809 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style); 9810 } 9811 9812 TEST_F(FormatTest, ArrayOfTemplates) { 9813 EXPECT_EQ("auto a = new unique_ptr<int>[10];", 9814 format("auto a = new unique_ptr<int > [ 10];")); 9815 9816 FormatStyle Spaces = getLLVMStyle(); 9817 Spaces.SpacesInSquareBrackets = true; 9818 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];", 9819 format("auto a = new unique_ptr<int > [10];", Spaces)); 9820 } 9821 9822 TEST_F(FormatTest, ArrayAsTemplateType) { 9823 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;", 9824 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;")); 9825 9826 FormatStyle Spaces = getLLVMStyle(); 9827 Spaces.SpacesInSquareBrackets = true; 9828 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;", 9829 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces)); 9830 } 9831 9832 TEST(FormatStyle, GetStyleOfFile) { 9833 vfs::InMemoryFileSystem FS; 9834 // Test 1: format file in the same directory. 9835 ASSERT_TRUE( 9836 FS.addFile("/a/.clang-format", 0, 9837 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM"))); 9838 ASSERT_TRUE( 9839 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 9840 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS); 9841 ASSERT_TRUE((bool)Style1); 9842 ASSERT_EQ(*Style1, getLLVMStyle()); 9843 9844 // Test 2.1: fallback to default. 9845 ASSERT_TRUE( 9846 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 9847 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS); 9848 ASSERT_TRUE((bool)Style2); 9849 ASSERT_EQ(*Style2, getMozillaStyle()); 9850 9851 // Test 2.2: no format on 'none' fallback style. 9852 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 9853 ASSERT_TRUE((bool)Style2); 9854 ASSERT_EQ(*Style2, getNoStyle()); 9855 9856 // Test 2.3: format if config is found with no based style while fallback is 9857 // 'none'. 9858 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0, 9859 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2"))); 9860 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 9861 ASSERT_TRUE((bool)Style2); 9862 ASSERT_EQ(*Style2, getLLVMStyle()); 9863 9864 // Test 2.4: format if yaml with no based style, while fallback is 'none'. 9865 Style2 = getStyle("{}", "a.h", "none", "", &FS); 9866 ASSERT_TRUE((bool)Style2); 9867 ASSERT_EQ(*Style2, getLLVMStyle()); 9868 9869 // Test 3: format file in parent directory. 9870 ASSERT_TRUE( 9871 FS.addFile("/c/.clang-format", 0, 9872 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google"))); 9873 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0, 9874 llvm::MemoryBuffer::getMemBuffer("int i;"))); 9875 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS); 9876 ASSERT_TRUE((bool)Style3); 9877 ASSERT_EQ(*Style3, getGoogleStyle()); 9878 9879 // Test 4: error on invalid fallback style 9880 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS); 9881 ASSERT_FALSE((bool)Style4); 9882 llvm::consumeError(Style4.takeError()); 9883 9884 // Test 5: error on invalid yaml on command line 9885 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS); 9886 ASSERT_FALSE((bool)Style5); 9887 llvm::consumeError(Style5.takeError()); 9888 9889 // Test 6: error on invalid style 9890 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS); 9891 ASSERT_FALSE((bool)Style6); 9892 llvm::consumeError(Style6.takeError()); 9893 9894 // Test 7: found config file, error on parsing it 9895 ASSERT_TRUE( 9896 FS.addFile("/d/.clang-format", 0, 9897 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n" 9898 "InvalidKey: InvalidValue"))); 9899 ASSERT_TRUE( 9900 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 9901 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS); 9902 ASSERT_FALSE((bool)Style7); 9903 llvm::consumeError(Style7.takeError()); 9904 } 9905 9906 TEST_F(ReplacementTest, FormatCodeAfterReplacements) { 9907 // Column limit is 20. 9908 std::string Code = "Type *a =\n" 9909 " new Type();\n" 9910 "g(iiiii, 0, jjjjj,\n" 9911 " 0, kkkkk, 0, mm);\n" 9912 "int bad = format ;"; 9913 std::string Expected = "auto a = new Type();\n" 9914 "g(iiiii, nullptr,\n" 9915 " jjjjj, nullptr,\n" 9916 " kkkkk, nullptr,\n" 9917 " mm);\n" 9918 "int bad = format ;"; 9919 FileID ID = Context.createInMemoryFile("format.cpp", Code); 9920 tooling::Replacements Replaces = toReplacements( 9921 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6, 9922 "auto "), 9923 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1, 9924 "nullptr"), 9925 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1, 9926 "nullptr"), 9927 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1, 9928 "nullptr")}); 9929 9930 format::FormatStyle Style = format::getLLVMStyle(); 9931 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility. 9932 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 9933 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 9934 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 9935 auto Result = applyAllReplacements(Code, *FormattedReplaces); 9936 EXPECT_TRUE(static_cast<bool>(Result)); 9937 EXPECT_EQ(Expected, *Result); 9938 } 9939 9940 TEST_F(ReplacementTest, SortIncludesAfterReplacement) { 9941 std::string Code = "#include \"a.h\"\n" 9942 "#include \"c.h\"\n" 9943 "\n" 9944 "int main() {\n" 9945 " return 0;\n" 9946 "}"; 9947 std::string Expected = "#include \"a.h\"\n" 9948 "#include \"b.h\"\n" 9949 "#include \"c.h\"\n" 9950 "\n" 9951 "int main() {\n" 9952 " return 0;\n" 9953 "}"; 9954 FileID ID = Context.createInMemoryFile("fix.cpp", Code); 9955 tooling::Replacements Replaces = toReplacements( 9956 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0, 9957 "#include \"b.h\"\n")}); 9958 9959 format::FormatStyle Style = format::getLLVMStyle(); 9960 Style.SortIncludes = true; 9961 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 9962 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 9963 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 9964 auto Result = applyAllReplacements(Code, *FormattedReplaces); 9965 EXPECT_TRUE(static_cast<bool>(Result)); 9966 EXPECT_EQ(Expected, *Result); 9967 } 9968 9969 } // end namespace 9970 } // end namespace format 9971 } // end namespace clang 9972