1 //===- NamespaceEndCommentsFixerTest.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 "clang/Frontend/TextDiagnosticPrinter.h" 13 #include "llvm/Support/Debug.h" 14 #include "gtest/gtest.h" 15 16 #define DEBUG_TYPE "namespace-end-comments-fixer-test" 17 18 namespace clang { 19 namespace format { 20 namespace { 21 22 class NamespaceEndCommentsFixerTest : public ::testing::Test { 23 protected: 24 std::string 25 fixNamespaceEndComments(llvm::StringRef Code, 26 const std::vector<tooling::Range> &Ranges, 27 const FormatStyle &Style = getLLVMStyle()) { 28 DEBUG(llvm::errs() << "---\n"); 29 DEBUG(llvm::errs() << Code << "\n\n"); 30 tooling::Replacements Replaces = 31 clang::format::fixNamespaceEndComments(Style, Code, Ranges, "<stdin>"); 32 auto Result = applyAllReplacements(Code, Replaces); 33 EXPECT_TRUE(static_cast<bool>(Result)); 34 DEBUG(llvm::errs() << "\n" << *Result << "\n\n"); 35 return *Result; 36 } 37 38 std::string 39 fixNamespaceEndComments(llvm::StringRef Code, 40 const FormatStyle &Style = getLLVMStyle()) { 41 return fixNamespaceEndComments( 42 Code, 43 /*Ranges=*/{1, tooling::Range(0, Code.size())}, Style); 44 } 45 }; 46 47 TEST_F(NamespaceEndCommentsFixerTest, AddsEndComment) { 48 EXPECT_EQ("namespace {\n" 49 " int i;\n" 50 " int j;\n" 51 "}// namespace", 52 fixNamespaceEndComments("namespace {\n" 53 " int i;\n" 54 " int j;\n" 55 "}")); 56 EXPECT_EQ("namespace {\n" 57 " int i;\n" 58 " int j;\n" 59 "}// namespace\n", 60 fixNamespaceEndComments("namespace {\n" 61 " int i;\n" 62 " int j;\n" 63 "}\n")); 64 EXPECT_EQ("namespace A {\n" 65 " int i;\n" 66 " int j;\n" 67 "}// namespace A", 68 fixNamespaceEndComments("namespace A {\n" 69 " int i;\n" 70 " int j;\n" 71 "}")); 72 EXPECT_EQ("inline namespace A {\n" 73 " int i;\n" 74 " int j;\n" 75 "}// namespace A", 76 fixNamespaceEndComments("inline namespace A {\n" 77 " int i;\n" 78 " int j;\n" 79 "}")); 80 EXPECT_EQ("namespace ::A {\n" 81 " int i;\n" 82 " int j;\n" 83 "}// namespace ::A", 84 fixNamespaceEndComments("namespace ::A {\n" 85 " int i;\n" 86 " int j;\n" 87 "}")); 88 EXPECT_EQ("namespace ::A::B {\n" 89 " int i;\n" 90 " int j;\n" 91 "}// namespace ::A::B", 92 fixNamespaceEndComments("namespace ::A::B {\n" 93 " int i;\n" 94 " int j;\n" 95 "}")); 96 EXPECT_EQ("namespace /**/::/**/A/**/::/**/B/**/ {\n" 97 " int i;\n" 98 " int j;\n" 99 "}// namespace ::A::B", 100 fixNamespaceEndComments("namespace /**/::/**/A/**/::/**/B/**/ {\n" 101 " int i;\n" 102 " int j;\n" 103 "}")); 104 EXPECT_EQ("namespace A {\n" 105 "namespace B {\n" 106 " int i;\n" 107 "}\n" 108 "}// namespace A", 109 fixNamespaceEndComments("namespace A {\n" 110 "namespace B {\n" 111 " int i;\n" 112 "}\n" 113 "}")); 114 EXPECT_EQ("namespace A {\n" 115 "namespace B {\n" 116 " int i;\n" 117 " int j;\n" 118 "}// namespace B\n" 119 "}// namespace A", 120 fixNamespaceEndComments("namespace A {\n" 121 "namespace B {\n" 122 " int i;\n" 123 " int j;\n" 124 "}\n" 125 "}")); 126 EXPECT_EQ("namespace A {\n" 127 " int a;\n" 128 " int b;\n" 129 "}// namespace A\n" 130 "namespace B {\n" 131 " int b;\n" 132 " int a;\n" 133 "}// namespace B", 134 fixNamespaceEndComments("namespace A {\n" 135 " int a;\n" 136 " int b;\n" 137 "}\n" 138 "namespace B {\n" 139 " int b;\n" 140 " int a;\n" 141 "}")); 142 EXPECT_EQ("namespace A {\n" 143 " int a1;\n" 144 " int a2;\n" 145 "}// namespace A\n" 146 "namespace A {\n" 147 " int a2;\n" 148 " int a1;\n" 149 "}// namespace A", 150 fixNamespaceEndComments("namespace A {\n" 151 " int a1;\n" 152 " int a2;\n" 153 "}\n" 154 "namespace A {\n" 155 " int a2;\n" 156 " int a1;\n" 157 "}")); 158 EXPECT_EQ("namespace A {\n" 159 " int a;\n" 160 " int b;\n" 161 "}// namespace A\n" 162 "// comment about b\n" 163 "int b;", 164 fixNamespaceEndComments("namespace A {\n" 165 " int a;\n" 166 " int b;\n" 167 "}\n" 168 "// comment about b\n" 169 "int b;")); 170 171 EXPECT_EQ("namespace A {\n" 172 "namespace B {\n" 173 "namespace C {\n" 174 "namespace D {\n" 175 "}\n" 176 "}// namespace C\n" 177 "}// namespace B\n" 178 "}// namespace A", 179 fixNamespaceEndComments("namespace A {\n" 180 "namespace B {\n" 181 "namespace C {\n" 182 "namespace D {\n" 183 "}\n" 184 "}\n" 185 "}\n" 186 "}")); 187 188 // Add comment for namespaces which will be 'compacted' 189 FormatStyle CompactNamespacesStyle = getLLVMStyle(); 190 CompactNamespacesStyle.CompactNamespaces = true; 191 EXPECT_EQ("namespace out { namespace in {\n" 192 "int i;\n" 193 "int j;\n" 194 "}}// namespace out::in", 195 fixNamespaceEndComments("namespace out { namespace in {\n" 196 "int i;\n" 197 "int j;\n" 198 "}}", 199 CompactNamespacesStyle)); 200 EXPECT_EQ("namespace out {\n" 201 "namespace in {\n" 202 "int i;\n" 203 "int j;\n" 204 "}\n" 205 "}// namespace out::in", 206 fixNamespaceEndComments("namespace out {\n" 207 "namespace in {\n" 208 "int i;\n" 209 "int j;\n" 210 "}\n" 211 "}", 212 CompactNamespacesStyle)); 213 EXPECT_EQ("namespace out { namespace in {\n" 214 "int i;\n" 215 "int j;\n" 216 "};}// namespace out::in", 217 fixNamespaceEndComments("namespace out { namespace in {\n" 218 "int i;\n" 219 "int j;\n" 220 "};}", 221 CompactNamespacesStyle)); 222 223 // Adds an end comment after a semicolon. 224 EXPECT_EQ("namespace {\n" 225 " int i;\n" 226 " int j;\n" 227 "};// namespace", 228 fixNamespaceEndComments("namespace {\n" 229 " int i;\n" 230 " int j;\n" 231 "};")); 232 EXPECT_EQ("namespace A {\n" 233 " int i;\n" 234 " int j;\n" 235 "};// namespace A", 236 fixNamespaceEndComments("namespace A {\n" 237 " int i;\n" 238 " int j;\n" 239 "};")); 240 EXPECT_EQ("namespace A {\n" 241 " int i;\n" 242 " int j;\n" 243 "};// namespace A\n" 244 "// unrelated", 245 fixNamespaceEndComments("namespace A {\n" 246 " int i;\n" 247 " int j;\n" 248 "};\n" 249 "// unrelated")); 250 } 251 252 TEST_F(NamespaceEndCommentsFixerTest, AddsNewlineIfNeeded) { 253 EXPECT_EQ("namespace A {\n" 254 " int i;\n" 255 " int j;\n" 256 "}// namespace A\n" 257 " int k;", 258 fixNamespaceEndComments("namespace A {\n" 259 " int i;\n" 260 " int j;\n" 261 "} int k;")); 262 EXPECT_EQ("namespace {\n" 263 " int i;\n" 264 " int j;\n" 265 "}// namespace\n" 266 " int k;", 267 fixNamespaceEndComments("namespace {\n" 268 " int i;\n" 269 " int j;\n" 270 "} int k;")); 271 EXPECT_EQ("namespace A {\n" 272 " int i;\n" 273 " int j;\n" 274 "}// namespace A\n" 275 " namespace B {\n" 276 " int j;\n" 277 " int k;\n" 278 "}// namespace B", 279 fixNamespaceEndComments("namespace A {\n" 280 " int i;\n" 281 " int j;\n" 282 "} namespace B {\n" 283 " int j;\n" 284 " int k;\n" 285 "}")); 286 EXPECT_EQ("namespace {\n" 287 " int i;\n" 288 " int j;\n" 289 "};// namespace\n" 290 "int k;", 291 fixNamespaceEndComments("namespace {\n" 292 " int i;\n" 293 " int j;\n" 294 "};int k;")); 295 EXPECT_EQ("namespace {\n" 296 " int i;\n" 297 " int j;\n" 298 "};// namespace\n" 299 ";", 300 fixNamespaceEndComments("namespace {\n" 301 " int i;\n" 302 " int j;\n" 303 "};;")); 304 } 305 306 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddEndCommentForShortNamespace) { 307 EXPECT_EQ("namespace {}", fixNamespaceEndComments("namespace {}")); 308 EXPECT_EQ("namespace A {}", fixNamespaceEndComments("namespace A {}")); 309 EXPECT_EQ("namespace A { a }", 310 fixNamespaceEndComments("namespace A { a }")); 311 EXPECT_EQ("namespace A { a };", 312 fixNamespaceEndComments("namespace A { a };")); 313 } 314 315 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterUnaffectedRBrace) { 316 EXPECT_EQ("namespace A {\n" 317 " int i;\n" 318 "}", 319 fixNamespaceEndComments("namespace A {\n" 320 " int i;\n" 321 "}", 322 // The range (16, 3) spans the 'int' above. 323 /*Ranges=*/{1, tooling::Range(16, 3)})); 324 EXPECT_EQ("namespace A {\n" 325 " int i;\n" 326 "};", 327 fixNamespaceEndComments("namespace A {\n" 328 " int i;\n" 329 "};", 330 // The range (16, 3) spans the 'int' above. 331 /*Ranges=*/{1, tooling::Range(16, 3)})); 332 } 333 334 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterRBraceInPPDirective) { 335 EXPECT_EQ("#define SAD \\\n" 336 "namespace A { \\\n" 337 " int i; \\\n" 338 "}", 339 fixNamespaceEndComments("#define SAD \\\n" 340 "namespace A { \\\n" 341 " int i; \\\n" 342 "}")); 343 } 344 345 TEST_F(NamespaceEndCommentsFixerTest, KeepsValidEndComment) { 346 EXPECT_EQ("namespace {\n" 347 " int i;\n" 348 "} // end anonymous namespace", 349 fixNamespaceEndComments("namespace {\n" 350 " int i;\n" 351 "} // end anonymous namespace")); 352 EXPECT_EQ("namespace A {\n" 353 " int i;\n" 354 "} /* end of namespace A */", 355 fixNamespaceEndComments("namespace A {\n" 356 " int i;\n" 357 "} /* end of namespace A */")); 358 EXPECT_EQ("namespace A {\n" 359 " int i;\n" 360 "} // namespace A", 361 fixNamespaceEndComments("namespace A {\n" 362 " int i;\n" 363 "} // namespace A")); 364 EXPECT_EQ("namespace A::B {\n" 365 " int i;\n" 366 "} // end namespace A::B", 367 fixNamespaceEndComments("namespace A::B {\n" 368 " int i;\n" 369 "} // end namespace A::B")); 370 EXPECT_EQ("namespace A {\n" 371 " int i;\n" 372 "}; // end namespace A", 373 fixNamespaceEndComments("namespace A {\n" 374 " int i;\n" 375 "}; // end namespace A")); 376 EXPECT_EQ("namespace {\n" 377 " int i;\n" 378 "}; /* unnamed namespace */", 379 fixNamespaceEndComments("namespace {\n" 380 " int i;\n" 381 "}; /* unnamed namespace */")); 382 } 383 384 TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndLineComment) { 385 EXPECT_EQ("namespace {\n" 386 " int i;\n" 387 "} // namespace", 388 fixNamespaceEndComments("namespace {\n" 389 " int i;\n" 390 "} // namespace A")); 391 EXPECT_EQ("namespace A {\n" 392 " int i;\n" 393 "} // namespace A", 394 fixNamespaceEndComments("namespace A {\n" 395 " int i;\n" 396 "} // namespace")); 397 EXPECT_EQ("namespace A {\n" 398 " int i;\n" 399 "} // namespace A", 400 fixNamespaceEndComments("namespace A {\n" 401 " int i;\n" 402 "} //")); 403 EXPECT_EQ("namespace A {\n" 404 " int i;\n" 405 "} // namespace A", 406 fixNamespaceEndComments("namespace A {\n" 407 " int i;\n" 408 "} //")); 409 EXPECT_EQ("namespace A {\n" 410 " int i;\n" 411 "} // namespace A", 412 fixNamespaceEndComments("namespace A {\n" 413 " int i;\n" 414 "} // banamespace A")); 415 EXPECT_EQ("namespace A {\n" 416 " int i;\n" 417 "}; // namespace A", 418 fixNamespaceEndComments("namespace A {\n" 419 " int i;\n" 420 "}; // banamespace A")); 421 // Updates invalid line comments even for short namespaces. 422 EXPECT_EQ("namespace A {} // namespace A", 423 fixNamespaceEndComments("namespace A {} // namespace")); 424 EXPECT_EQ("namespace A {}; // namespace A", 425 fixNamespaceEndComments("namespace A {}; // namespace")); 426 427 // Update invalid comments for compacted namespaces. 428 FormatStyle CompactNamespacesStyle = getLLVMStyle(); 429 CompactNamespacesStyle.CompactNamespaces = true; 430 EXPECT_EQ("namespace out { namespace in {\n" 431 "}} // namespace out::in", 432 fixNamespaceEndComments("namespace out { namespace in {\n" 433 "}} // namespace out", 434 CompactNamespacesStyle)); 435 EXPECT_EQ("namespace out { namespace in {\n" 436 "}} // namespace out::in", 437 fixNamespaceEndComments("namespace out { namespace in {\n" 438 "}} // namespace in", 439 CompactNamespacesStyle)); 440 EXPECT_EQ("namespace out { namespace in {\n" 441 "}\n" 442 "} // namespace out::in", 443 fixNamespaceEndComments("namespace out { namespace in {\n" 444 "}// banamespace in\n" 445 "} // namespace out", 446 CompactNamespacesStyle)); 447 } 448 449 TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndBlockComment) { 450 EXPECT_EQ("namespace {\n" 451 " int i;\n" 452 "} // namespace", 453 fixNamespaceEndComments("namespace {\n" 454 " int i;\n" 455 "} /* namespace A */")); 456 EXPECT_EQ("namespace A {\n" 457 " int i;\n" 458 "} // namespace A", 459 fixNamespaceEndComments("namespace A {\n" 460 " int i;\n" 461 "} /* end namespace */")); 462 EXPECT_EQ("namespace A {\n" 463 " int i;\n" 464 "} // namespace A", 465 fixNamespaceEndComments("namespace A {\n" 466 " int i;\n" 467 "} /**/")); 468 EXPECT_EQ("namespace A {\n" 469 " int i;\n" 470 "} // namespace A", 471 fixNamespaceEndComments("namespace A {\n" 472 " int i;\n" 473 "} /* end unnamed namespace */")); 474 EXPECT_EQ("namespace A {\n" 475 " int i;\n" 476 "} // namespace A", 477 fixNamespaceEndComments("namespace A {\n" 478 " int i;\n" 479 "} /* banamespace A */")); 480 EXPECT_EQ("namespace A {\n" 481 " int i;\n" 482 "}; // namespace A", 483 fixNamespaceEndComments("namespace A {\n" 484 " int i;\n" 485 "}; /* banamespace A */")); 486 EXPECT_EQ("namespace A {} // namespace A", 487 fixNamespaceEndComments("namespace A {} /**/")); 488 EXPECT_EQ("namespace A {}; // namespace A", 489 fixNamespaceEndComments("namespace A {}; /**/")); 490 } 491 492 TEST_F(NamespaceEndCommentsFixerTest, 493 DoesNotAddEndCommentForNamespacesControlledByMacros) { 494 EXPECT_EQ("#ifdef 1\n" 495 "namespace A {\n" 496 "#elseif\n" 497 "namespace B {\n" 498 "#endif\n" 499 " int i;\n" 500 "}\n" 501 "}\n", 502 fixNamespaceEndComments("#ifdef 1\n" 503 "namespace A {\n" 504 "#elseif\n" 505 "namespace B {\n" 506 "#endif\n" 507 " int i;\n" 508 "}\n" 509 "}\n")); 510 } 511 512 TEST_F(NamespaceEndCommentsFixerTest, 513 DoesNotAddEndCommentForNamespacesInMacroDeclarations) { 514 EXPECT_EQ("#ifdef 1\n" 515 "namespace A {\n" 516 "#elseif\n" 517 "namespace B {\n" 518 "#endif\n" 519 " int i;\n" 520 "}\n" 521 "}\n", 522 fixNamespaceEndComments("#ifdef 1\n" 523 "namespace A {\n" 524 "#elseif\n" 525 "namespace B {\n" 526 "#endif\n" 527 " int i;\n" 528 "}\n" 529 "}\n")); 530 EXPECT_EQ("namespace {\n" 531 " int i;\n" 532 " int j;\n" 533 "}// namespace\n" 534 "#if A\n" 535 " int i;\n" 536 "#else\n" 537 " int j;\n" 538 "#endif", 539 fixNamespaceEndComments("namespace {\n" 540 " int i;\n" 541 " int j;\n" 542 "}\n" 543 "#if A\n" 544 " int i;\n" 545 "#else\n" 546 " int j;\n" 547 "#endif")); 548 EXPECT_EQ("#if A\n" 549 "namespace A {\n" 550 "#else\n" 551 "namespace B {\n" 552 "#endif\n" 553 "int i;\n" 554 "int j;\n" 555 "}", 556 fixNamespaceEndComments("#if A\n" 557 "namespace A {\n" 558 "#else\n" 559 "namespace B {\n" 560 "#endif\n" 561 "int i;\n" 562 "int j;\n" 563 "}")); 564 EXPECT_EQ("#if A\n" 565 "namespace A {\n" 566 "#else\n" 567 "namespace B {\n" 568 "#endif\n" 569 "int i;\n" 570 "int j;\n" 571 "} // namespace A", 572 fixNamespaceEndComments("#if A\n" 573 "namespace A {\n" 574 "#else\n" 575 "namespace B {\n" 576 "#endif\n" 577 "int i;\n" 578 "int j;\n" 579 "} // namespace A")); 580 EXPECT_EQ("#if A\n" 581 "namespace A {\n" 582 "#else\n" 583 "namespace B {\n" 584 "#endif\n" 585 "int i;\n" 586 "int j;\n" 587 "} // namespace B", 588 fixNamespaceEndComments("#if A\n" 589 "namespace A {\n" 590 "#else\n" 591 "namespace B {\n" 592 "#endif\n" 593 "int i;\n" 594 "int j;\n" 595 "} // namespace B")); 596 EXPECT_EQ("namespace A\n" 597 "int i;\n" 598 "int j;\n" 599 "#if A\n" 600 "}\n" 601 "#else\n" 602 "}\n" 603 "#endif", 604 fixNamespaceEndComments("namespace A\n" 605 "int i;\n" 606 "int j;\n" 607 "#if A\n" 608 "}\n" 609 "#else\n" 610 "}\n" 611 "#endif")); 612 EXPECT_EQ("namespace A\n" 613 "int i;\n" 614 "int j;\n" 615 "#if A\n" 616 "} // namespace A\n" 617 "#else\n" 618 "} // namespace A\n" 619 "#endif", 620 fixNamespaceEndComments("namespace A\n" 621 "int i;\n" 622 "int j;\n" 623 "#if A\n" 624 "} // namespace A\n" 625 "#else\n" 626 "} // namespace A\n" 627 "#endif")); 628 } 629 630 TEST_F(NamespaceEndCommentsFixerTest, 631 DoesNotAddEndCommentForUnbalancedRBracesAfterNamespaceEnd) { 632 EXPECT_EQ("namespace {\n" 633 " int i;\n" 634 "} // namespace\n" 635 "}", 636 fixNamespaceEndComments("namespace {\n" 637 " int i;\n" 638 "} // namespace\n" 639 "}")); 640 } 641 642 TEST_F(NamespaceEndCommentsFixerTest, HandlesInlineAtEndOfLine_PR32438) { 643 EXPECT_EQ("template <int> struct a {};\n" 644 "struct a<bool{}> b() {\n" 645 "}\n" 646 "#define c inline\n" 647 "void d() {\n" 648 "}\n", 649 fixNamespaceEndComments("template <int> struct a {};\n" 650 "struct a<bool{}> b() {\n" 651 "}\n" 652 "#define c inline\n" 653 "void d() {\n" 654 "}\n")); 655 } 656 } // end namespace 657 } // end namespace format 658 } // end namespace clang 659