1 //===- unittest/Format/FormatTestRawStrings.cpp - Formatting unit tests ---===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "clang/Format/Format.h" 10 11 #include "../Tooling/ReplacementTest.h" 12 #include "FormatTestUtils.h" 13 14 #include "llvm/Support/Debug.h" 15 #include "llvm/Support/MemoryBuffer.h" 16 #include "gtest/gtest.h" 17 18 #define DEBUG_TYPE "format-test" 19 20 namespace clang { 21 namespace format { 22 namespace { 23 24 class FormatTestRawStrings : public ::testing::Test { 25 protected: 26 enum StatusCheck { SC_ExpectComplete, SC_ExpectIncomplete, SC_DoNotCheck }; 27 28 std::string format(llvm::StringRef Code, 29 const FormatStyle &Style = getLLVMStyle(), 30 StatusCheck CheckComplete = SC_ExpectComplete) { 31 LLVM_DEBUG(llvm::errs() << "---\n"); 32 LLVM_DEBUG(llvm::errs() << Code << "\n\n"); 33 std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size())); 34 FormattingAttemptStatus Status; 35 tooling::Replacements Replaces = 36 reformat(Style, Code, Ranges, "<stdin>", &Status); 37 if (CheckComplete != SC_DoNotCheck) { 38 bool ExpectedCompleteFormat = CheckComplete == SC_ExpectComplete; 39 EXPECT_EQ(ExpectedCompleteFormat, Status.FormatComplete) 40 << Code << "\n\n"; 41 } 42 ReplacementCount = Replaces.size(); 43 auto Result = applyAllReplacements(Code, Replaces); 44 EXPECT_TRUE(static_cast<bool>(Result)); 45 LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n"); 46 return *Result; 47 } 48 49 FormatStyle getStyleWithColumns(FormatStyle Style, unsigned ColumnLimit) { 50 Style.ColumnLimit = ColumnLimit; 51 return Style; 52 } 53 54 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) { 55 return getStyleWithColumns(getLLVMStyle(), ColumnLimit); 56 } 57 58 int ReplacementCount; 59 60 FormatStyle getRawStringPbStyleWithColumns(unsigned ColumnLimit) { 61 FormatStyle Style = getLLVMStyle(); 62 Style.ColumnLimit = ColumnLimit; 63 Style.RawStringFormats = { 64 { 65 /*Language=*/FormatStyle::LK_TextProto, 66 /*Delimiters=*/{"pb"}, 67 /*EnclosingFunctions=*/{}, 68 /*CanonicalDelimiter=*/"", 69 /*BasedOnStyle=*/"google", 70 }, 71 }; 72 return Style; 73 } 74 75 FormatStyle getRawStringLLVMCppStyleBasedOn(std::string BasedOnStyle) { 76 FormatStyle Style = getLLVMStyle(); 77 Style.RawStringFormats = { 78 { 79 /*Language=*/FormatStyle::LK_Cpp, 80 /*Delimiters=*/{"cpp"}, 81 /*EnclosingFunctions=*/{}, 82 /*CanonicalDelimiter=*/"", 83 BasedOnStyle, 84 }, 85 }; 86 return Style; 87 } 88 89 FormatStyle getRawStringGoogleCppStyleBasedOn(std::string BasedOnStyle) { 90 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 91 Style.RawStringFormats = { 92 { 93 /*Language=*/FormatStyle::LK_Cpp, 94 /*Delimiters=*/{"cpp"}, 95 /*EnclosingFunctions=*/{}, 96 /*CanonicalDelimiter=*/"", 97 BasedOnStyle, 98 }, 99 }; 100 return Style; 101 } 102 103 // Gcc 4.8 doesn't support raw string literals in macros, which breaks some 104 // build bots. We use this function instead. 105 void expect_eq(const std::string Expected, const std::string Actual) { 106 EXPECT_EQ(Expected, Actual); 107 } 108 }; 109 110 TEST_F(FormatTestRawStrings, ReformatsAccordingToBaseStyle) { 111 // llvm style puts '*' on the right. 112 // google style puts '*' on the left. 113 114 // Use the llvm style if the raw string style has no BasedOnStyle. 115 expect_eq(R"test(int *i = R"cpp(int *p = nullptr;)cpp")test", 116 format(R"test(int * i = R"cpp(int * p = nullptr;)cpp")test", 117 getRawStringLLVMCppStyleBasedOn(""))); 118 119 // Use the google style if the raw string style has BasedOnStyle=google. 120 expect_eq(R"test(int *i = R"cpp(int* p = nullptr;)cpp")test", 121 format(R"test(int * i = R"cpp(int * p = nullptr;)cpp")test", 122 getRawStringLLVMCppStyleBasedOn("google"))); 123 124 // Use the llvm style if the raw string style has no BasedOnStyle=llvm. 125 expect_eq(R"test(int* i = R"cpp(int *p = nullptr;)cpp")test", 126 format(R"test(int * i = R"cpp(int * p = nullptr;)cpp")test", 127 getRawStringGoogleCppStyleBasedOn("llvm"))); 128 } 129 130 TEST_F(FormatTestRawStrings, UsesConfigurationOverBaseStyle) { 131 // llvm style puts '*' on the right. 132 // google style puts '*' on the left. 133 134 // Uses the configured google style inside raw strings even if BasedOnStyle in 135 // the raw string format is llvm. 136 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 137 EXPECT_EQ(0, parseConfiguration("---\n" 138 "Language: Cpp\n" 139 "BasedOnStyle: Google", 140 &Style) 141 .value()); 142 Style.RawStringFormats = {{ 143 FormatStyle::LK_Cpp, 144 {"cpp"}, 145 {}, 146 /*CanonicalDelimiter=*/"", 147 /*BasedOnStyle=*/"llvm", 148 }}; 149 expect_eq(R"test(int* i = R"cpp(int* j = 0;)cpp";)test", 150 format(R"test(int * i = R"cpp(int * j = 0;)cpp";)test", Style)); 151 } 152 153 TEST_F(FormatTestRawStrings, MatchesDelimitersCaseSensitively) { 154 // Don't touch the 'PB' raw string, format the 'pb' raw string. 155 expect_eq(R"test( 156 s = R"PB(item:1)PB"; 157 t = R"pb(item: 1)pb";)test", 158 format(R"test( 159 s = R"PB(item:1)PB"; 160 t = R"pb(item:1)pb";)test", 161 getRawStringPbStyleWithColumns(40))); 162 } 163 164 TEST_F(FormatTestRawStrings, RespectsClangFormatOff) { 165 expect_eq(R"test( 166 // clang-format off 167 s = R"pb(item: 1)pb"; 168 // clang-format on 169 t = R"pb(item: 1)pb";)test", 170 format(R"test( 171 // clang-format off 172 s = R"pb(item: 1)pb"; 173 // clang-format on 174 t = R"pb(item: 1)pb";)test", 175 getRawStringPbStyleWithColumns(40))); 176 } 177 178 TEST_F(FormatTestRawStrings, ReformatsShortRawStringsOnSingleLine) { 179 expect_eq(R"test(P p = TP(R"pb()pb");)test", 180 format(R"test(P p = TP(R"pb( )pb");)test", 181 getRawStringPbStyleWithColumns(40))); 182 expect_eq(R"test(P p = TP(R"pb(item_1: 1)pb");)test", 183 format(R"test(P p = TP(R"pb(item_1:1)pb");)test", 184 getRawStringPbStyleWithColumns(40))); 185 expect_eq(R"test(P p = TP(R"pb(item_1: 1)pb");)test", 186 format(R"test(P p = TP(R"pb( item_1 : 1 )pb");)test", 187 getRawStringPbStyleWithColumns(40))); 188 expect_eq(R"test(P p = TP(R"pb(item_1: 1 item_2: 2)pb");)test", 189 format(R"test(P p = TP(R"pb(item_1:1 item_2:2)pb");)test", 190 getRawStringPbStyleWithColumns(40))); 191 // Merge two short lines into one. 192 expect_eq(R"test( 193 std::string s = R"pb( 194 item_1: 1 item_2: 2 195 )pb"; 196 )test", 197 format(R"test( 198 std::string s = R"pb( 199 item_1:1 200 item_2:2 201 )pb"; 202 )test", 203 getRawStringPbStyleWithColumns(40))); 204 } 205 206 TEST_F(FormatTestRawStrings, BreaksShortRawStringsWhenNeeded) { 207 // The raw string contains multiple submessage entries, so break for 208 // readability. 209 expect_eq(R"test( 210 P p = TP(R"pb(item_1 < 1 > 211 item_2: { 2 })pb");)test", 212 format( 213 R"test( 214 P p = TP(R"pb(item_1<1> item_2:{2})pb");)test", 215 getRawStringPbStyleWithColumns(40))); 216 } 217 218 TEST_F(FormatTestRawStrings, BreaksRawStringsExceedingColumnLimit) { 219 expect_eq(R"test( 220 P p = TPPPPPPPPPPPPPPP( 221 R"pb(item_1: 1, item_2: 2)pb");)test", 222 format(R"test( 223 P p = TPPPPPPPPPPPPPPP(R"pb(item_1: 1, item_2: 2)pb");)test", 224 getRawStringPbStyleWithColumns(40))); 225 226 expect_eq(R"test( 227 P p = 228 TPPPPPPPPPPPPPPP( 229 R"pb(item_1: 1, 230 item_2: 2, 231 item_3: 3)pb");)test", 232 format(R"test( 233 P p = TPPPPPPPPPPPPPPP(R"pb(item_1: 1, item_2: 2, item_3: 3)pb");)test", 234 getRawStringPbStyleWithColumns(40))); 235 236 expect_eq(R"test( 237 P p = TP(R"pb(item_1 < 1 > 238 item_2: < 2 > 239 item_3 {})pb");)test", 240 format(R"test( 241 P p = TP(R"pb(item_1<1> item_2:<2> item_3{ })pb");)test", 242 getRawStringPbStyleWithColumns(40))); 243 244 expect_eq( 245 R"test( 246 P p = TP(R"pb(item_1: 1, 247 item_2: 2, 248 item_3: 3, 249 item_4: 4)pb");)test", 250 format( 251 R"test( 252 P p = TP(R"pb(item_1: 1, item_2: 2, item_3: 3, item_4: 4)pb");)test", 253 getRawStringPbStyleWithColumns(40))); 254 255 expect_eq(R"test( 256 P p = TPPPPPPPPPPPPPPP( 257 R"pb(item_1 < 1 >, 258 item_2: { 2 }, 259 item_3: < 3 >, 260 item_4: { 4 })pb");)test", 261 format(R"test( 262 P p = TPPPPPPPPPPPPPPP(R"pb(item_1<1>, item_2: {2}, item_3: <3>, item_4:{4})pb");)test", 263 getRawStringPbStyleWithColumns(40))); 264 265 // Breaks before a short raw string exceeding the column limit. 266 expect_eq(R"test( 267 FFFFFFFFFFFFFFFFFFFFFFFFFFF( 268 R"pb(key: 1)pb"); 269 P p = TPPPPPPPPPPPPPPPPPPPP( 270 R"pb(key: 2)pb"); 271 auto TPPPPPPPPPPPPPPPPPPPP = 272 R"pb(key: 3)pb"; 273 P p = TPPPPPPPPPPPPPPPPPPPP( 274 R"pb(i: 1, j: 2)pb"); 275 276 int f(string s) { 277 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF( 278 R"pb(key: 1)pb"); 279 P p = TPPPPPPPPPPPPPPPPPPPP( 280 R"pb(key: 2)pb"); 281 auto TPPPPPPPPPPPPPPPPPPPP = 282 R"pb(key: 3)pb"; 283 if (s.empty()) 284 P p = TPPPPPPPPPPPPPPPPPPPP( 285 R"pb(i: 1, j: 2)pb"); 286 } 287 )test", 288 format(R"test( 289 FFFFFFFFFFFFFFFFFFFFFFFFFFF(R"pb(key:1)pb"); 290 P p = TPPPPPPPPPPPPPPPPPPPP(R"pb(key:2)pb"); 291 auto TPPPPPPPPPPPPPPPPPPPP = R"pb(key:3)pb"; 292 P p = TPPPPPPPPPPPPPPPPPPPP(R"pb(i: 1, j:2)pb"); 293 294 int f(string s) { 295 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF(R"pb(key:1)pb"); 296 P p = TPPPPPPPPPPPPPPPPPPPP(R"pb(key:2)pb"); 297 auto TPPPPPPPPPPPPPPPPPPPP = R"pb(key:3)pb"; 298 if (s.empty()) 299 P p = TPPPPPPPPPPPPPPPPPPPP(R"pb(i: 1, j:2)pb"); 300 } 301 )test", 302 getRawStringPbStyleWithColumns(40))); 303 } 304 305 TEST_F(FormatTestRawStrings, FormatsRawStringArguments) { 306 expect_eq(R"test( 307 P p = TP(R"pb(key { 1 })pb", param_2);)test", 308 format(R"test( 309 P p = TP(R"pb(key{1})pb",param_2);)test", 310 getRawStringPbStyleWithColumns(40))); 311 312 expect_eq(R"test( 313 PPPPPPPPPPPPP(R"pb(keykeyk)pb", 314 param_2);)test", 315 format(R"test( 316 PPPPPPPPPPPPP(R"pb(keykeyk)pb", param_2);)test", 317 getRawStringPbStyleWithColumns(40))); 318 319 expect_eq(R"test( 320 P p = TP( 321 R"pb(item: { i: 1, s: 's' } 322 item: { i: 2, s: 't' })pb");)test", 323 format(R"test( 324 P p = TP(R"pb(item: {i: 1, s: 's'} item: {i: 2, s: 't'})pb");)test", 325 getRawStringPbStyleWithColumns(40))); 326 expect_eq(R"test( 327 FFFFFFFFFFFFFFFFFFF( 328 R"pb(key: "value")pb", 329 R"pb(key2: "value")pb");)test", 330 format(R"test( 331 FFFFFFFFFFFFFFFFFFF(R"pb(key: "value")pb", R"pb(key2: "value")pb");)test", 332 getRawStringPbStyleWithColumns(40))); 333 334 // Formats the first out of two arguments. 335 expect_eq(R"test( 336 FFFFFFFF(R"pb(key: 1)pb", argument2); 337 struct S { 338 const s = 339 f(R"pb(key: 1)pb", argument2); 340 void f() { 341 if (gol) 342 return g(R"pb(key: 1)pb", 343 132789237); 344 return g(R"pb(key: 1)pb", "172893"); 345 } 346 };)test", 347 format(R"test( 348 FFFFFFFF(R"pb(key:1)pb", argument2); 349 struct S { 350 const s = f(R"pb(key:1)pb", argument2); 351 void f() { 352 if (gol) 353 return g(R"pb(key:1)pb", 132789237); 354 return g(R"pb(key:1)pb", "172893"); 355 } 356 };)test", 357 getRawStringPbStyleWithColumns(40))); 358 359 // Formats the second out of two arguments. 360 expect_eq(R"test( 361 FFFFFFFF(argument1, R"pb(key: 2)pb"); 362 struct S { 363 const s = 364 f(argument1, R"pb(key: 2)pb"); 365 void f() { 366 if (gol) 367 return g(12784137, 368 R"pb(key: 2)pb"); 369 return g(17283122, R"pb(key: 2)pb"); 370 } 371 };)test", 372 format(R"test( 373 FFFFFFFF(argument1, R"pb(key:2)pb"); 374 struct S { 375 const s = f(argument1, R"pb(key:2)pb"); 376 void f() { 377 if (gol) 378 return g(12784137, R"pb(key:2)pb"); 379 return g(17283122, R"pb(key:2)pb"); 380 } 381 };)test", 382 getRawStringPbStyleWithColumns(40))); 383 384 // Formats two short raw string arguments. 385 expect_eq(R"test( 386 FFFFF(R"pb(key: 1)pb", R"pb(key: 2)pb");)test", 387 format(R"test( 388 FFFFF(R"pb(key:1)pb", R"pb(key:2)pb");)test", 389 getRawStringPbStyleWithColumns(40))); 390 // TODO(krasimir): The original source code fits on one line, so the 391 // non-optimizing formatter is chosen. But after the formatting in protos is 392 // made, the code doesn't fit on one line anymore and further formatting 393 // splits it. 394 // 395 // Should we disable raw string formatting for the non-optimizing formatter? 396 expect_eq(R"test( 397 FFFFFFF(R"pb(key: 1)pb", R"pb(key: 2)pb");)test", 398 format(R"test( 399 FFFFFFF(R"pb(key:1)pb", R"pb(key:2)pb");)test", 400 getRawStringPbStyleWithColumns(40))); 401 402 // Formats two short raw string arguments, puts second on newline. 403 expect_eq(R"test( 404 FFFFFFFF(R"pb(key: 1)pb", 405 R"pb(key: 2)pb");)test", 406 format(R"test( 407 FFFFFFFF(R"pb(key:1)pb", R"pb(key:2)pb");)test", 408 getRawStringPbStyleWithColumns(40))); 409 410 // Formats both arguments. 411 expect_eq(R"test( 412 FFFFFFFF(R"pb(key: 1)pb", 413 R"pb(key: 2)pb"); 414 struct S { 415 const s = f(R"pb(key: 1)pb", 416 R"pb(key: 2)pb"); 417 void f() { 418 if (gol) 419 return g(R"pb(key: 1)pb", 420 R"pb(key: 2)pb"); 421 return g(R"pb(k1)pb", R"pb(k2)pb"); 422 } 423 };)test", 424 format(R"test( 425 FFFFFFFF(R"pb(key:1)pb", R"pb(key:2)pb"); 426 struct S { 427 const s = f(R"pb(key:1)pb", R"pb(key:2)pb"); 428 void f() { 429 if (gol) 430 return g(R"pb(key:1)pb", R"pb(key:2)pb"); 431 return g(R"pb( k1 )pb", R"pb( k2 )pb"); 432 } 433 };)test", 434 getRawStringPbStyleWithColumns(40))); 435 } 436 437 TEST_F(FormatTestRawStrings, RawStringStartingWithNewlines) { 438 expect_eq(R"test( 439 std::string s = R"pb( 440 item_1: 1 441 )pb"; 442 )test", 443 format(R"test( 444 std::string s = R"pb( 445 item_1:1 446 )pb"; 447 )test", 448 getRawStringPbStyleWithColumns(40))); 449 450 expect_eq(R"test( 451 std::string s = R"pb( 452 453 item_1: 1 454 )pb"; 455 )test", 456 format(R"test( 457 std::string s = R"pb( 458 459 item_1:1 460 )pb"; 461 )test", 462 getRawStringPbStyleWithColumns(40))); 463 464 expect_eq(R"test( 465 std::string s = R"pb( 466 item_1: 1 467 )pb"; 468 )test", 469 format(R"test( 470 std::string s = R"pb( 471 item_1:1 472 473 )pb"; 474 )test", 475 getRawStringPbStyleWithColumns(40))); 476 477 expect_eq(R"test( 478 std::string s = R"pb( 479 item_1: 1, 480 item_2: 2 481 )pb"; 482 )test", 483 format(R"test( 484 std::string s = R"pb( 485 item_1:1, item_2:2 486 )pb"; 487 )test", 488 getRawStringPbStyleWithColumns(40))); 489 490 expect_eq(R"test( 491 std::string s = R"pb( 492 book { 493 title: "Alice's Adventures" 494 author: "Lewis Caroll" 495 } 496 book { 497 title: "Peter Pan" 498 author: "J. M. Barrie" 499 } 500 )pb"; 501 )test", 502 format(R"test( 503 std::string s = R"pb( 504 book { title: "Alice's Adventures" author: "Lewis Caroll" } 505 book { title: "Peter Pan" author: "J. M. Barrie" } 506 )pb"; 507 )test", 508 getRawStringPbStyleWithColumns(40))); 509 } 510 511 TEST_F(FormatTestRawStrings, BreaksBeforeRawStrings) { 512 expect_eq(R"test( 513 ASSERT_TRUE( 514 ParseFromString(R"pb(item_1: 1)pb"), 515 ptr);)test", 516 format(R"test( 517 ASSERT_TRUE(ParseFromString(R"pb(item_1: 1)pb"), ptr);)test", 518 getRawStringPbStyleWithColumns(40))); 519 520 expect_eq(R"test( 521 ASSERT_TRUE(toolong::ParseFromString( 522 R"pb(item_1: 1)pb"), 523 ptr);)test", 524 format(R"test( 525 ASSERT_TRUE(toolong::ParseFromString(R"pb(item_1: 1)pb"), ptr);)test", 526 getRawStringPbStyleWithColumns(40))); 527 528 expect_eq(R"test( 529 ASSERT_TRUE(ParseFromString( 530 R"pb(item_1: 1, 531 item_2: 2)pb"), 532 ptr);)test", 533 format(R"test( 534 ASSERT_TRUE(ParseFromString(R"pb(item_1: 1, item_2: 2)pb"), ptr);)test", 535 getRawStringPbStyleWithColumns(40))); 536 537 expect_eq(R"test( 538 ASSERT_TRUE( 539 ParseFromString( 540 R"pb(item_1: 1 item_2: 2)pb"), 541 ptr);)test", 542 format(R"test( 543 ASSERT_TRUE(ParseFromString(R"pb(item_1: 1 item_2: 2)pb"), ptr);)test", 544 getRawStringPbStyleWithColumns(40))); 545 } 546 547 TEST_F(FormatTestRawStrings, RawStringsInOperands) { 548 // Formats the raw string first operand of a binary operator expression. 549 expect_eq(R"test(auto S = R"pb(item_1: 1)pb" + rest;)test", 550 format(R"test(auto S = R"pb(item_1:1)pb" + rest;)test", 551 getRawStringPbStyleWithColumns(40))); 552 553 expect_eq(R"test( 554 auto S = R"pb(item_1: 1, item_2: 2)pb" + 555 rest;)test", 556 format(R"test( 557 auto S = R"pb(item_1:1,item_2:2)pb"+rest;)test", 558 getRawStringPbStyleWithColumns(40))); 559 560 expect_eq(R"test( 561 auto S = 562 R"pb(item_1: 1 item_2: 2)pb" + rest;)test", 563 format(R"test( 564 auto S = R"pb(item_1:1 item_2:2)pb"+rest;)test", 565 getRawStringPbStyleWithColumns(40))); 566 567 // `rest` fits on the line after )pb", but forced on newline since the raw 568 // string literal is multiline. 569 expect_eq(R"test( 570 auto S = R"pb(item_1: 1, 571 item_2: 2, 572 item_3: 3)pb" + 573 rest;)test", 574 format(R"test( 575 auto S = R"pb(item_1:1,item_2:2,item_3:3)pb"+rest;)test", 576 getRawStringPbStyleWithColumns(40))); 577 578 expect_eq(R"test( 579 auto S = R"pb(item_1: 1, 580 item_2: 2, 581 item_3: 3)pb" + 582 longlongrest;)test", 583 format(R"test( 584 auto S = R"pb(item_1:1,item_2:2,item_3:3)pb"+longlongrest;)test", 585 getRawStringPbStyleWithColumns(40))); 586 587 // Formats the raw string second operand of a binary operator expression. 588 expect_eq(R"test(auto S = first + R"pb(item_1: 1)pb";)test", 589 format(R"test(auto S = first + R"pb(item_1:1)pb";)test", 590 getRawStringPbStyleWithColumns(40))); 591 592 expect_eq(R"test( 593 auto S = first + R"pb(item_1: 1, 594 item_2: 2)pb";)test", 595 format(R"test( 596 auto S = first+R"pb(item_1:1,item_2:2)pb";)test", 597 getRawStringPbStyleWithColumns(40))); 598 599 expect_eq(R"test( 600 auto S = first + R"pb(item_1: 1 601 item_2: 2)pb";)test", 602 format(R"test( 603 auto S = first+R"pb(item_1:1 item_2:2)pb";)test", 604 getRawStringPbStyleWithColumns(40))); 605 606 expect_eq(R"test( 607 auto S = R"pb(item_1: 1, 608 item_2: 2, 609 item_3: 3)pb" + 610 rest;)test", 611 format(R"test( 612 auto S = R"pb(item_1:1,item_2:2,item_3:3)pb"+rest;)test", 613 getRawStringPbStyleWithColumns(40))); 614 615 expect_eq(R"test( 616 auto S = R"pb(item_1: 1, 617 item_2: 2, 618 item_3: 3)pb" + 619 longlongrest;)test", 620 format(R"test( 621 auto S = R"pb(item_1:1,item_2:2,item_3:3)pb"+longlongrest;)test", 622 getRawStringPbStyleWithColumns(40))); 623 624 // Formats the raw string operands in expressions. 625 expect_eq(R"test( 626 auto S = R"pb(item_1: 1)pb" + 627 R"pb(item_2: 2)pb"; 628 )test", 629 format(R"test( 630 auto S=R"pb(item_1:1)pb"+R"pb(item_2:2)pb"; 631 )test", 632 getRawStringPbStyleWithColumns(40))); 633 634 expect_eq(R"test( 635 auto S = R"pb(item_1: 1)pb" + 636 R"pb(item_2: 2)pb" + 637 R"pb(item_3: 3)pb"; 638 )test", 639 format(R"test( 640 auto S=R"pb(item_1:1)pb"+R"pb(item_2:2)pb"+R"pb(item_3:3)pb"; 641 )test", 642 getRawStringPbStyleWithColumns(40))); 643 644 expect_eq(R"test( 645 auto S = (count < 3) 646 ? R"pb(item_1: 1)pb" 647 : R"pb(item_2: 2)pb"; 648 )test", 649 format(R"test( 650 auto S=(count<3)?R"pb(item_1:1)pb":R"pb(item_2:2)pb"; 651 )test", 652 getRawStringPbStyleWithColumns(40))); 653 654 expect_eq(R"test( 655 auto S = 656 (count < 3) 657 ? R"pb(item_1: 1, item_2: 2)pb" 658 : R"pb(item_3: 3)pb"; 659 )test", 660 format(R"test( 661 auto S=(count<3)?R"pb(item_1:1,item_2:2)pb":R"pb(item_3:3)pb"; 662 )test", 663 getRawStringPbStyleWithColumns(40))); 664 665 expect_eq(R"test( 666 auto S = 667 (count < 3) 668 ? R"pb(item_1: 1)pb" 669 : R"pb(item_2: 2, item_3: 3)pb"; 670 )test", 671 format(R"test( 672 auto S=(count<3)?R"pb(item_1:1)pb":R"pb(item_2:2,item_3:3)pb"; 673 )test", 674 getRawStringPbStyleWithColumns(40))); 675 } 676 677 TEST_F(FormatTestRawStrings, PrefixAndSuffixAlignment) { 678 // Keep the suffix at the end of line if not on newline. 679 expect_eq(R"test( 680 int s() { 681 auto S = PTP( 682 R"pb( 683 item_1: 1, 684 item_2: 2)pb"); 685 })test", 686 format(R"test( 687 int s() { 688 auto S = PTP( 689 R"pb( 690 item_1: 1, 691 item_2: 2)pb"); 692 })test", 693 getRawStringPbStyleWithColumns(20))); 694 695 // Align the suffix with the surrounding indent if the prefix is not on 696 // a line of its own. 697 expect_eq(R"test( 698 int s() { 699 auto S = PTP(R"pb( 700 item_1: 1, 701 item_2: 2 702 )pb"); 703 })test", 704 format(R"test( 705 int s() { 706 auto S = PTP(R"pb( 707 item_1: 1, 708 item_2: 2 709 )pb"); 710 })test", 711 getRawStringPbStyleWithColumns(20))); 712 713 // Align the prefix with the suffix if both the prefix and suffix are on a 714 // line of their own. 715 expect_eq(R"test( 716 int s() { 717 auto S = PTP( 718 R"pb( 719 item_1: 1, 720 item_2: 2, 721 )pb"); 722 })test", 723 format(R"test( 724 int s() { 725 auto S = PTP( 726 R"pb( 727 item_1: 1, 728 item_2: 2, 729 )pb"); 730 })test", 731 getRawStringPbStyleWithColumns(20))); 732 } 733 734 TEST_F(FormatTestRawStrings, EstimatesPenalty) { 735 // The penalty for characters exceeding the column limit in the raw string 736 // forces 'hh' to be put on a newline. 737 expect_eq(R"test( 738 ff(gggggg, 739 hh(R"pb(key { 740 i1: k1 741 i2: k2 742 })pb")); 743 )test", 744 format(R"test( 745 ff(gggggg, hh(R"pb(key { 746 i1: k1 747 i2: k2 748 })pb")); 749 )test", 750 getRawStringPbStyleWithColumns(20))); 751 } 752 753 TEST_F(FormatTestRawStrings, DontFormatNonRawStrings) { 754 expect_eq(R"test(a = R"pb(key:value)";)test", 755 format(R"test(a = R"pb(key:value)";)test", 756 getRawStringPbStyleWithColumns(20))); 757 } 758 759 TEST_F(FormatTestRawStrings, FormatsRawStringsWithEnclosingFunctionName) { 760 FormatStyle Style = getRawStringPbStyleWithColumns(40); 761 Style.RawStringFormats[0].EnclosingFunctions.push_back("PARSE_TEXT_PROTO"); 762 Style.RawStringFormats[0].EnclosingFunctions.push_back("ParseTextProto"); 763 expect_eq(R"test(a = PARSE_TEXT_PROTO(R"(key: value)");)test", 764 format(R"test(a = PARSE_TEXT_PROTO(R"(key:value)");)test", Style)); 765 766 expect_eq(R"test( 767 a = PARSE_TEXT_PROTO /**/ ( 768 /**/ R"(key: value)");)test", 769 format(R"test( 770 a = PARSE_TEXT_PROTO/**/(/**/R"(key:value)");)test", 771 Style)); 772 773 expect_eq(R"test( 774 a = ParseTextProto<ProtoType>( 775 R"(key: value)");)test", 776 format(R"test( 777 a = ParseTextProto<ProtoType>(R"(key:value)");)test", 778 Style)); 779 } 780 781 TEST_F(FormatTestRawStrings, UpdatesToCanonicalDelimiters) { 782 FormatStyle Style = getRawStringPbStyleWithColumns(35); 783 Style.RawStringFormats[0].CanonicalDelimiter = "proto"; 784 Style.RawStringFormats[0].EnclosingFunctions.push_back("PARSE_TEXT_PROTO"); 785 786 expect_eq(R"test(a = R"proto(key: value)proto";)test", 787 format(R"test(a = R"pb(key:value)pb";)test", Style)); 788 789 expect_eq(R"test(PARSE_TEXT_PROTO(R"proto(key: value)proto");)test", 790 format(R"test(PARSE_TEXT_PROTO(R"(key:value)");)test", Style)); 791 792 // Don't update to canonical delimiter if it occurs as a raw string suffix in 793 // the raw string content. 794 expect_eq(R"test(a = R"pb(key: ")proto")pb";)test", 795 format(R"test(a = R"pb(key:")proto")pb";)test", Style)); 796 } 797 798 TEST_F(FormatTestRawStrings, PenalizesPrefixExcessChars) { 799 FormatStyle Style = getRawStringPbStyleWithColumns(60); 800 801 // The '(' in R"pb is at column 60, no break. 802 expect_eq(R"test( 803 xxxxxxxaaaaax wwwwwww = _Verxrrrrrrrr(PARSE_TEXT_PROTO(R"pb( 804 Category: aaaaaaaaaaaaaaaaaaaaaaaaaa 805 )pb")); 806 )test", 807 format(R"test( 808 xxxxxxxaaaaax wwwwwww = _Verxrrrrrrrr(PARSE_TEXT_PROTO(R"pb( 809 Category: aaaaaaaaaaaaaaaaaaaaaaaaaa 810 )pb")); 811 )test", 812 Style)); 813 // The '(' in R"pb is at column 61, break. 814 expect_eq(R"test( 815 xxxxxxxaaaaax wwwwwww = 816 _Verxrrrrrrrrr(PARSE_TEXT_PROTO(R"pb( 817 Category: aaaaaaaaaaaaaaaaaaaaaaaaaa 818 )pb")); 819 )test", 820 format(R"test( 821 xxxxxxxaaaaax wwwwwww = _Verxrrrrrrrrr(PARSE_TEXT_PROTO(R"pb( 822 Category: aaaaaaaaaaaaaaaaaaaaaaaaaa 823 )pb")); 824 )test", 825 Style)); 826 } 827 828 TEST_F(FormatTestRawStrings, KeepsRBraceFolloedByMoreLBracesOnSameLine) { 829 FormatStyle Style = getRawStringPbStyleWithColumns(80); 830 831 expect_eq( 832 R"test( 833 int f() { 834 if (1) { 835 TTTTTTTTTTTTTTTTTTTTT s = PARSE_TEXT_PROTO(R"pb( 836 ttttttttt { 837 ppppppppppppp { 838 [cccccccccc.pppppppppppppp.TTTTTTTTTTTTTTTTTTTT] { field_1: "123_1" } 839 [cccccccccc.pppppppppppppp.TTTTTTTTTTTTTTTTTTTT] { field_2: "123_2" } 840 } 841 } 842 )pb"); 843 } 844 } 845 )test", 846 format( 847 R"test( 848 int f() { 849 if (1) { 850 TTTTTTTTTTTTTTTTTTTTT s = PARSE_TEXT_PROTO(R"pb( 851 ttttttttt { 852 ppppppppppppp { 853 [cccccccccc.pppppppppppppp.TTTTTTTTTTTTTTTTTTTT] { field_1: "123_1" } 854 [cccccccccc.pppppppppppppp.TTTTTTTTTTTTTTTTTTTT] { field_2: "123_2" }}} 855 )pb"); 856 } 857 } 858 )test", 859 Style)); 860 } 861 862 TEST_F(FormatTestRawStrings, 863 DoNotFormatUnrecognizedDelimitersInRecognizedFunctions) { 864 FormatStyle Style = getRawStringPbStyleWithColumns(60); 865 Style.RawStringFormats[0].EnclosingFunctions.push_back("EqualsProto"); 866 // EqualsProto is a recognized function, but the Raw delimiter is 867 // unrecognized. Do not touch the string in this case, since it might be 868 // special. 869 expect_eq(R"test( 870 void f() { 871 aaaaaaaaa(bbbbbbbbb, EqualsProto(R"Raw( 872 item { 873 key: value 874 } 875 )Raw")); 876 })test", 877 format(R"test( 878 void f() { 879 aaaaaaaaa(bbbbbbbbb, EqualsProto(R"Raw( 880 item { 881 key: value 882 } 883 )Raw")); 884 })test", 885 Style)); 886 } 887 888 TEST_F(FormatTestRawStrings, 889 BreaksBeforeNextParamAfterMultilineRawStringParam) { 890 FormatStyle Style = getRawStringPbStyleWithColumns(60); 891 expect_eq(R"test( 892 int f() { 893 int a = g(x, R"pb( 894 key: 1 # 895 key: 2 896 )pb", 897 3, 4); 898 } 899 )test", 900 format(R"test( 901 int f() { 902 int a = g(x, R"pb( 903 key: 1 # 904 key: 2 905 )pb", 3, 4); 906 } 907 )test", 908 Style)); 909 910 // Breaks after a parent of a multiline param. 911 expect_eq(R"test( 912 int f() { 913 int a = g(x, h(R"pb( 914 key: 1 # 915 key: 2 916 )pb"), 917 3, 4); 918 } 919 )test", 920 format(R"test( 921 int f() { 922 int a = g(x, h(R"pb( 923 key: 1 # 924 key: 2 925 )pb"), 3, 4); 926 } 927 )test", 928 Style)); 929 930 expect_eq(R"test( 931 int f() { 932 int a = g(x, 933 h(R"pb( 934 key: 1 # 935 key: 2 936 )pb", 937 2), 938 3, 4); 939 } 940 )test", 941 format(R"test( 942 int f() { 943 int a = g(x, h(R"pb( 944 key: 1 # 945 key: 2 946 )pb", 2), 3, 4); 947 } 948 )test", 949 Style)); 950 // Breaks if formatting introduces a multiline raw string. 951 expect_eq(R"test( 952 int f() { 953 int a = g(x, R"pb(key1: value111111111 954 key2: value2222222222)pb", 955 3, 4); 956 } 957 )test", 958 format(R"test( 959 int f() { 960 int a = g(x, R"pb(key1: value111111111 key2: value2222222222)pb", 3, 4); 961 } 962 )test", 963 Style)); 964 // Does not force a break after an original multiline param that is 965 // reformatterd as on single line. 966 expect_eq(R"test( 967 int f() { 968 int a = g(R"pb(key: 1)pb", 2); 969 })test", 970 format(R"test( 971 int f() { 972 int a = g(R"pb(key: 973 1)pb", 2); 974 })test", 975 Style)); 976 } 977 978 TEST_F(FormatTestRawStrings, IndentsLastParamAfterNewline) { 979 FormatStyle Style = getRawStringPbStyleWithColumns(60); 980 expect_eq(R"test( 981 fffffffffffffffffffff("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 982 R"pb( 983 b: c 984 )pb");)test", 985 format(R"test( 986 fffffffffffffffffffff("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 987 R"pb( 988 b: c 989 )pb");)test", 990 Style)); 991 } 992 } // end namespace 993 } // end namespace format 994 } // end namespace clang 995