1 //===- NamespaceEndCommentsFixerTest.cpp - Formatting unit tests ----------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "clang/Format/Format.h"
12 #include "clang/Frontend/TextDiagnosticPrinter.h"
13 #include "llvm/Support/Debug.h"
14 #include "gtest/gtest.h"
16 #define DEBUG_TYPE "namespace-end-comments-fixer-test"
22 class NamespaceEndCommentsFixerTest : public ::testing::Test {
25 fixNamespaceEndComments(llvm::StringRef Code,
26 const std::vector<tooling::Range> &Ranges,
27 const FormatStyle &Style = getLLVMStyle()) {
28 LLVM_DEBUG(llvm::errs() << "---\n");
29 LLVM_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 LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
39 fixNamespaceEndComments(llvm::StringRef Code,
40 const FormatStyle &Style = getLLVMStyle()) {
41 return fixNamespaceEndComments(
43 /*Ranges=*/{1, tooling::Range(0, Code.size())}, Style);
47 TEST_F(NamespaceEndCommentsFixerTest, AddsEndComment) {
48 EXPECT_EQ("namespace {\n"
52 fixNamespaceEndComments("namespace {\n"
56 EXPECT_EQ("namespace {\n"
60 fixNamespaceEndComments("namespace {\n"
64 EXPECT_EQ("namespace A {\n"
68 fixNamespaceEndComments("namespace A {\n"
72 EXPECT_EQ("inline namespace A {\n"
76 fixNamespaceEndComments("inline namespace A {\n"
80 EXPECT_EQ("namespace ::A {\n"
84 fixNamespaceEndComments("namespace ::A {\n"
88 EXPECT_EQ("namespace ::A::B {\n"
91 "}// namespace ::A::B",
92 fixNamespaceEndComments("namespace ::A::B {\n"
96 EXPECT_EQ("namespace /**/::/**/A/**/::/**/B/**/ {\n"
99 "}// namespace ::A::B",
100 fixNamespaceEndComments("namespace /**/::/**/A/**/::/**/B/**/ {\n"
104 EXPECT_EQ("namespace A {\n"
109 fixNamespaceEndComments("namespace A {\n"
114 EXPECT_EQ("namespace A {\n"
120 fixNamespaceEndComments("namespace A {\n"
126 EXPECT_EQ("namespace A {\n"
134 fixNamespaceEndComments("namespace A {\n"
142 EXPECT_EQ("namespace A {\n"
150 fixNamespaceEndComments("namespace A {\n"
158 EXPECT_EQ("namespace A {\n"
162 "// comment about b\n"
164 fixNamespaceEndComments("namespace A {\n"
168 "// comment about b\n"
171 EXPECT_EQ("namespace A {\n"
179 fixNamespaceEndComments("namespace A {\n"
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"
194 "}}// namespace out::in",
195 fixNamespaceEndComments("namespace out { namespace in {\n"
199 CompactNamespacesStyle));
200 EXPECT_EQ("namespace out {\n"
205 "}// namespace out::in",
206 fixNamespaceEndComments("namespace out {\n"
212 CompactNamespacesStyle));
213 EXPECT_EQ("namespace out { namespace in {\n"
216 "};}// namespace out::in",
217 fixNamespaceEndComments("namespace out { namespace in {\n"
221 CompactNamespacesStyle));
223 // Adds an end comment after a semicolon.
224 EXPECT_EQ("namespace {\n"
228 fixNamespaceEndComments("namespace {\n"
232 EXPECT_EQ("namespace A {\n"
236 fixNamespaceEndComments("namespace A {\n"
240 EXPECT_EQ("namespace A {\n"
245 fixNamespaceEndComments("namespace A {\n"
252 TEST_F(NamespaceEndCommentsFixerTest, AddsNewlineIfNeeded) {
253 EXPECT_EQ("namespace A {\n"
258 fixNamespaceEndComments("namespace A {\n"
262 EXPECT_EQ("namespace {\n"
267 fixNamespaceEndComments("namespace {\n"
271 EXPECT_EQ("namespace A {\n"
279 fixNamespaceEndComments("namespace A {\n"
286 EXPECT_EQ("namespace {\n"
291 fixNamespaceEndComments("namespace {\n"
295 EXPECT_EQ("namespace {\n"
300 fixNamespaceEndComments("namespace {\n"
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 };"));
315 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterUnaffectedRBrace) {
316 EXPECT_EQ("namespace A {\n"
319 fixNamespaceEndComments("namespace A {\n"
322 // The range (16, 3) spans the 'int' above.
323 /*Ranges=*/{1, tooling::Range(16, 3)}));
324 EXPECT_EQ("namespace A {\n"
327 fixNamespaceEndComments("namespace A {\n"
330 // The range (16, 3) spans the 'int' above.
331 /*Ranges=*/{1, tooling::Range(16, 3)}));
334 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterRBraceInPPDirective) {
335 EXPECT_EQ("#define SAD \\\n"
339 fixNamespaceEndComments("#define SAD \\\n"
345 TEST_F(NamespaceEndCommentsFixerTest, KeepsValidEndComment) {
346 EXPECT_EQ("namespace {\n"
348 "} // end anonymous namespace",
349 fixNamespaceEndComments("namespace {\n"
351 "} // end anonymous namespace"));
352 EXPECT_EQ("namespace A {\n"
354 "} /* end of namespace A */",
355 fixNamespaceEndComments("namespace A {\n"
357 "} /* end of namespace A */"));
358 EXPECT_EQ("namespace A {\n"
361 fixNamespaceEndComments("namespace A {\n"
363 "} // namespace A"));
364 EXPECT_EQ("namespace A::B {\n"
366 "} // end namespace A::B",
367 fixNamespaceEndComments("namespace A::B {\n"
369 "} // end namespace A::B"));
370 EXPECT_EQ("namespace A {\n"
372 "}; // end namespace A",
373 fixNamespaceEndComments("namespace A {\n"
375 "}; // end namespace A"));
376 EXPECT_EQ("namespace {\n"
378 "}; /* unnamed namespace */",
379 fixNamespaceEndComments("namespace {\n"
381 "}; /* unnamed namespace */"));
384 TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndLineComment) {
385 EXPECT_EQ("namespace {\n"
388 fixNamespaceEndComments("namespace {\n"
390 "} // namespace A"));
391 EXPECT_EQ("namespace A {\n"
394 fixNamespaceEndComments("namespace A {\n"
397 EXPECT_EQ("namespace A {\n"
400 fixNamespaceEndComments("namespace A {\n"
403 EXPECT_EQ("namespace A {\n"
406 fixNamespaceEndComments("namespace A {\n"
409 EXPECT_EQ("namespace A {\n"
412 fixNamespaceEndComments("namespace A {\n"
414 "} // banamespace A"));
415 EXPECT_EQ("namespace A {\n"
418 fixNamespaceEndComments("namespace A {\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"));
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"
442 "} // namespace out::in",
443 fixNamespaceEndComments("namespace out { namespace in {\n"
444 "}// banamespace in\n"
445 "} // namespace out",
446 CompactNamespacesStyle));
449 TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndBlockComment) {
450 EXPECT_EQ("namespace {\n"
453 fixNamespaceEndComments("namespace {\n"
455 "} /* namespace A */"));
456 EXPECT_EQ("namespace A {\n"
459 fixNamespaceEndComments("namespace A {\n"
461 "} /* end namespace */"));
462 EXPECT_EQ("namespace A {\n"
465 fixNamespaceEndComments("namespace A {\n"
468 EXPECT_EQ("namespace A {\n"
471 fixNamespaceEndComments("namespace A {\n"
473 "} /* end unnamed namespace */"));
474 EXPECT_EQ("namespace A {\n"
477 fixNamespaceEndComments("namespace A {\n"
479 "} /* banamespace A */"));
480 EXPECT_EQ("namespace A {\n"
483 fixNamespaceEndComments("namespace A {\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 {}; /**/"));
492 TEST_F(NamespaceEndCommentsFixerTest,
493 DoesNotAddEndCommentForNamespacesControlledByMacros) {
494 EXPECT_EQ("#ifdef 1\n"
502 fixNamespaceEndComments("#ifdef 1\n"
512 TEST_F(NamespaceEndCommentsFixerTest, AddEndCommentForNamespacesAroundMacros) {
513 // Conditional blocks around are fine
514 EXPECT_EQ("namespace A {\n"
519 fixNamespaceEndComments("namespace A {\n"
530 fixNamespaceEndComments("#if 1\n"
536 EXPECT_EQ("namespace A {\n"
542 fixNamespaceEndComments("namespace A {\n"
554 fixNamespaceEndComments("#if 1\n"
561 // Macro definition has no impact
562 EXPECT_EQ("namespace A {\n"
566 fixNamespaceEndComments("namespace A {\n"
570 EXPECT_EQ("#define FOO\n"
575 fixNamespaceEndComments("#define FOO\n"
580 EXPECT_EQ("namespace A {\n"
585 fixNamespaceEndComments("namespace A {\n"
591 // No replacement if open & close in different conditional blocks
600 fixNamespaceEndComments("#if 1\n"
608 EXPECT_EQ("#ifdef A\n"
616 fixNamespaceEndComments("#ifdef A\n"
625 // No replacement inside unreachable conditional block
632 fixNamespaceEndComments("#if 0\n"
640 TEST_F(NamespaceEndCommentsFixerTest,
641 DoesNotAddEndCommentForNamespacesInMacroDeclarations) {
642 EXPECT_EQ("#ifdef 1\n"
650 fixNamespaceEndComments("#ifdef 1\n"
658 EXPECT_EQ("namespace {\n"
667 fixNamespaceEndComments("namespace {\n"
684 fixNamespaceEndComments("#if A\n"
700 fixNamespaceEndComments("#if A\n"
707 "} // namespace A"));
716 fixNamespaceEndComments("#if A\n"
723 "} // namespace B"));
724 EXPECT_EQ("namespace A\n"
732 fixNamespaceEndComments("namespace A\n"
740 EXPECT_EQ("namespace A\n"
748 fixNamespaceEndComments("namespace A\n"
758 TEST_F(NamespaceEndCommentsFixerTest,
759 DoesNotAddEndCommentForUnbalancedRBracesAfterNamespaceEnd) {
760 EXPECT_EQ("namespace {\n"
764 fixNamespaceEndComments("namespace {\n"
770 TEST_F(NamespaceEndCommentsFixerTest, HandlesInlineAtEndOfLine_PR32438) {
771 EXPECT_EQ("template <int> struct a {};\n"
772 "struct a<bool{}> b() {\n"
777 fixNamespaceEndComments("template <int> struct a {};\n"
778 "struct a<bool{}> b() {\n"
785 } // end namespace format
786 } // end namespace clang