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 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 // Adds an end comment after a semicolon. 189 EXPECT_EQ("namespace {\n" 190 " int i;\n" 191 " int j;\n" 192 "};// namespace", 193 fixNamespaceEndComments("namespace {\n" 194 " int i;\n" 195 " int j;\n" 196 "};")); 197 EXPECT_EQ("namespace A {\n" 198 " int i;\n" 199 " int j;\n" 200 "};// namespace A", 201 fixNamespaceEndComments("namespace A {\n" 202 " int i;\n" 203 " int j;\n" 204 "};")); 205 EXPECT_EQ("namespace A {\n" 206 " int i;\n" 207 " int j;\n" 208 "};// namespace A\n" 209 "// unrelated", 210 fixNamespaceEndComments("namespace A {\n" 211 " int i;\n" 212 " int j;\n" 213 "};\n" 214 "// unrelated")); 215 } 216 217 TEST_F(NamespaceEndCommentsFixerTest, AddsNewlineIfNeeded) { 218 EXPECT_EQ("namespace A {\n" 219 " int i;\n" 220 " int j;\n" 221 "}// namespace A\n" 222 " int k;", 223 fixNamespaceEndComments("namespace A {\n" 224 " int i;\n" 225 " int j;\n" 226 "} int k;")); 227 EXPECT_EQ("namespace {\n" 228 " int i;\n" 229 " int j;\n" 230 "}// namespace\n" 231 " int k;", 232 fixNamespaceEndComments("namespace {\n" 233 " int i;\n" 234 " int j;\n" 235 "} int k;")); 236 EXPECT_EQ("namespace A {\n" 237 " int i;\n" 238 " int j;\n" 239 "}// namespace A\n" 240 " namespace B {\n" 241 " int j;\n" 242 " int k;\n" 243 "}// namespace B", 244 fixNamespaceEndComments("namespace A {\n" 245 " int i;\n" 246 " int j;\n" 247 "} namespace B {\n" 248 " int j;\n" 249 " int k;\n" 250 "}")); 251 EXPECT_EQ("namespace {\n" 252 " int i;\n" 253 " int j;\n" 254 "};// namespace\n" 255 "int k;", 256 fixNamespaceEndComments("namespace {\n" 257 " int i;\n" 258 " int j;\n" 259 "};int k;")); 260 EXPECT_EQ("namespace {\n" 261 " int i;\n" 262 " int j;\n" 263 "};// namespace\n" 264 ";", 265 fixNamespaceEndComments("namespace {\n" 266 " int i;\n" 267 " int j;\n" 268 "};;")); 269 } 270 271 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddEndCommentForShortNamespace) { 272 EXPECT_EQ("namespace {}", fixNamespaceEndComments("namespace {}")); 273 EXPECT_EQ("namespace A {}", fixNamespaceEndComments("namespace A {}")); 274 EXPECT_EQ("namespace A { a }", 275 fixNamespaceEndComments("namespace A { a }")); 276 EXPECT_EQ("namespace A { a };", 277 fixNamespaceEndComments("namespace A { a };")); 278 } 279 280 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterUnaffectedRBrace) { 281 EXPECT_EQ("namespace A {\n" 282 " int i;\n" 283 "}", 284 fixNamespaceEndComments("namespace A {\n" 285 " int i;\n" 286 "}", 287 // The range (16, 3) spans the 'int' above. 288 /*Ranges=*/{1, tooling::Range(16, 3)})); 289 EXPECT_EQ("namespace A {\n" 290 " int i;\n" 291 "};", 292 fixNamespaceEndComments("namespace A {\n" 293 " int i;\n" 294 "};", 295 // The range (16, 3) spans the 'int' above. 296 /*Ranges=*/{1, tooling::Range(16, 3)})); 297 } 298 299 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterRBraceInPPDirective) { 300 EXPECT_EQ("#define SAD \\\n" 301 "namespace A { \\\n" 302 " int i; \\\n" 303 "}", 304 fixNamespaceEndComments("#define SAD \\\n" 305 "namespace A { \\\n" 306 " int i; \\\n" 307 "}")); 308 } 309 310 TEST_F(NamespaceEndCommentsFixerTest, KeepsValidEndComment) { 311 EXPECT_EQ("namespace {\n" 312 " int i;\n" 313 "} // end anonymous namespace", 314 fixNamespaceEndComments("namespace {\n" 315 " int i;\n" 316 "} // end anonymous namespace")); 317 EXPECT_EQ("namespace A {\n" 318 " int i;\n" 319 "} /* end of namespace A */", 320 fixNamespaceEndComments("namespace A {\n" 321 " int i;\n" 322 "} /* end of namespace A */")); 323 EXPECT_EQ("namespace A {\n" 324 " int i;\n" 325 "} // namespace A", 326 fixNamespaceEndComments("namespace A {\n" 327 " int i;\n" 328 "} // namespace A")); 329 EXPECT_EQ("namespace A::B {\n" 330 " int i;\n" 331 "} // end namespace A::B", 332 fixNamespaceEndComments("namespace A::B {\n" 333 " int i;\n" 334 "} // end namespace A::B")); 335 EXPECT_EQ("namespace A {\n" 336 " int i;\n" 337 "}; // end namespace A", 338 fixNamespaceEndComments("namespace A {\n" 339 " int i;\n" 340 "}; // end namespace A")); 341 EXPECT_EQ("namespace {\n" 342 " int i;\n" 343 "}; /* unnamed namespace */", 344 fixNamespaceEndComments("namespace {\n" 345 " int i;\n" 346 "}; /* unnamed namespace */")); 347 } 348 349 TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndLineComment) { 350 EXPECT_EQ("namespace {\n" 351 " int i;\n" 352 "} // namespace", 353 fixNamespaceEndComments("namespace {\n" 354 " int i;\n" 355 "} // namespace A")); 356 EXPECT_EQ("namespace A {\n" 357 " int i;\n" 358 "} // namespace A", 359 fixNamespaceEndComments("namespace A {\n" 360 " int i;\n" 361 "} // namespace")); 362 EXPECT_EQ("namespace A {\n" 363 " int i;\n" 364 "} // namespace A", 365 fixNamespaceEndComments("namespace A {\n" 366 " int i;\n" 367 "} //")); 368 EXPECT_EQ("namespace A {\n" 369 " int i;\n" 370 "} // namespace A", 371 fixNamespaceEndComments("namespace A {\n" 372 " int i;\n" 373 "} //")); 374 EXPECT_EQ("namespace A {\n" 375 " int i;\n" 376 "} // namespace A", 377 fixNamespaceEndComments("namespace A {\n" 378 " int i;\n" 379 "} // banamespace A")); 380 EXPECT_EQ("namespace A {\n" 381 " int i;\n" 382 "}; // namespace A", 383 fixNamespaceEndComments("namespace A {\n" 384 " int i;\n" 385 "}; // banamespace A")); 386 // Updates invalid line comments even for short namespaces. 387 EXPECT_EQ("namespace A {} // namespace A", 388 fixNamespaceEndComments("namespace A {} // namespace")); 389 EXPECT_EQ("namespace A {}; // namespace A", 390 fixNamespaceEndComments("namespace A {}; // namespace")); 391 } 392 393 TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndBlockComment) { 394 EXPECT_EQ("namespace {\n" 395 " int i;\n" 396 "} // namespace", 397 fixNamespaceEndComments("namespace {\n" 398 " int i;\n" 399 "} /* namespace A */")); 400 EXPECT_EQ("namespace A {\n" 401 " int i;\n" 402 "} // namespace A", 403 fixNamespaceEndComments("namespace A {\n" 404 " int i;\n" 405 "} /* end namespace */")); 406 EXPECT_EQ("namespace A {\n" 407 " int i;\n" 408 "} // namespace A", 409 fixNamespaceEndComments("namespace A {\n" 410 " int i;\n" 411 "} /**/")); 412 EXPECT_EQ("namespace A {\n" 413 " int i;\n" 414 "} // namespace A", 415 fixNamespaceEndComments("namespace A {\n" 416 " int i;\n" 417 "} /* end unnamed namespace */")); 418 EXPECT_EQ("namespace A {\n" 419 " int i;\n" 420 "} // namespace A", 421 fixNamespaceEndComments("namespace A {\n" 422 " int i;\n" 423 "} /* banamespace A */")); 424 EXPECT_EQ("namespace A {\n" 425 " int i;\n" 426 "}; // namespace A", 427 fixNamespaceEndComments("namespace A {\n" 428 " int i;\n" 429 "}; /* banamespace A */")); 430 EXPECT_EQ("namespace A {} // namespace A", 431 fixNamespaceEndComments("namespace A {} /**/")); 432 EXPECT_EQ("namespace A {}; // namespace A", 433 fixNamespaceEndComments("namespace A {}; /**/")); 434 } 435 436 TEST_F(NamespaceEndCommentsFixerTest, 437 DoesNotAddEndCommentForNamespacesControlledByMacros) { 438 EXPECT_EQ("#ifdef 1\n" 439 "namespace A {\n" 440 "#elseif\n" 441 "namespace B {\n" 442 "#endif\n" 443 " int i;\n" 444 "}\n" 445 "}\n", 446 fixNamespaceEndComments("#ifdef 1\n" 447 "namespace A {\n" 448 "#elseif\n" 449 "namespace B {\n" 450 "#endif\n" 451 " int i;\n" 452 "}\n" 453 "}\n")); 454 } 455 456 TEST_F(NamespaceEndCommentsFixerTest, 457 DoesNotAddEndCommentForNamespacesInMacroDeclarations) { 458 EXPECT_EQ("#ifdef 1\n" 459 "namespace A {\n" 460 "#elseif\n" 461 "namespace B {\n" 462 "#endif\n" 463 " int i;\n" 464 "}\n" 465 "}\n", 466 fixNamespaceEndComments("#ifdef 1\n" 467 "namespace A {\n" 468 "#elseif\n" 469 "namespace B {\n" 470 "#endif\n" 471 " int i;\n" 472 "}\n" 473 "}\n")); 474 EXPECT_EQ("namespace {\n" 475 " int i;\n" 476 " int j;\n" 477 "}// namespace\n" 478 "#if A\n" 479 " int i;\n" 480 "#else\n" 481 " int j;\n" 482 "#endif", 483 fixNamespaceEndComments("namespace {\n" 484 " int i;\n" 485 " int j;\n" 486 "}\n" 487 "#if A\n" 488 " int i;\n" 489 "#else\n" 490 " int j;\n" 491 "#endif")); 492 EXPECT_EQ("#if A\n" 493 "namespace A {\n" 494 "#else\n" 495 "namespace B {\n" 496 "#endif\n" 497 "int i;\n" 498 "int j;\n" 499 "}", 500 fixNamespaceEndComments("#if A\n" 501 "namespace A {\n" 502 "#else\n" 503 "namespace B {\n" 504 "#endif\n" 505 "int i;\n" 506 "int j;\n" 507 "}")); 508 EXPECT_EQ("#if A\n" 509 "namespace A {\n" 510 "#else\n" 511 "namespace B {\n" 512 "#endif\n" 513 "int i;\n" 514 "int j;\n" 515 "} // namespace A", 516 fixNamespaceEndComments("#if A\n" 517 "namespace A {\n" 518 "#else\n" 519 "namespace B {\n" 520 "#endif\n" 521 "int i;\n" 522 "int j;\n" 523 "} // namespace A")); 524 EXPECT_EQ("#if A\n" 525 "namespace A {\n" 526 "#else\n" 527 "namespace B {\n" 528 "#endif\n" 529 "int i;\n" 530 "int j;\n" 531 "} // namespace B", 532 fixNamespaceEndComments("#if A\n" 533 "namespace A {\n" 534 "#else\n" 535 "namespace B {\n" 536 "#endif\n" 537 "int i;\n" 538 "int j;\n" 539 "} // namespace B")); 540 EXPECT_EQ("namespace A\n" 541 "int i;\n" 542 "int j;\n" 543 "#if A\n" 544 "}\n" 545 "#else\n" 546 "}\n" 547 "#endif", 548 fixNamespaceEndComments("namespace A\n" 549 "int i;\n" 550 "int j;\n" 551 "#if A\n" 552 "}\n" 553 "#else\n" 554 "}\n" 555 "#endif")); 556 EXPECT_EQ("namespace A\n" 557 "int i;\n" 558 "int j;\n" 559 "#if A\n" 560 "} // namespace A\n" 561 "#else\n" 562 "} // namespace A\n" 563 "#endif", 564 fixNamespaceEndComments("namespace A\n" 565 "int i;\n" 566 "int j;\n" 567 "#if A\n" 568 "} // namespace A\n" 569 "#else\n" 570 "} // namespace A\n" 571 "#endif")); 572 } 573 574 TEST_F(NamespaceEndCommentsFixerTest, 575 DoesNotAddEndCommentForUnbalancedRBracesAfterNamespaceEnd) { 576 EXPECT_EQ("namespace {\n" 577 " int i;\n" 578 "} // namespace\n" 579 "}", 580 fixNamespaceEndComments("namespace {\n" 581 " int i;\n" 582 "} // namespace\n" 583 "}")); 584 } 585 } // end namespace 586 } // end namespace format 587 } // end namespace clang 588