blob: 9b0301930d21f15ade42307edb9fd5e6ae665b6b [file] [log] [blame]
//===- NamespaceEndCommentsFixerTest.cpp - Formatting unit tests ----------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "clang/Format/Format.h"
#include "llvm/Support/Debug.h"
#include "gtest/gtest.h"
#define DEBUG_TYPE "namespace-end-comments-fixer-test"
namespace clang {
namespace format {
namespace {
class NamespaceEndCommentsFixerTest : public ::testing::Test {
protected:
std::string
fixNamespaceEndComments(llvm::StringRef Code,
const std::vector<tooling::Range> &Ranges,
const FormatStyle &Style = getLLVMStyle()) {
LLVM_DEBUG(llvm::errs() << "---\n");
LLVM_DEBUG(llvm::errs() << Code << "\n\n");
tooling::Replacements Replaces =
clang::format::fixNamespaceEndComments(Style, Code, Ranges, "<stdin>");
auto Result = applyAllReplacements(Code, Replaces);
EXPECT_TRUE(static_cast<bool>(Result));
LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
return *Result;
}
std::string
fixNamespaceEndComments(llvm::StringRef Code,
const FormatStyle &Style = getLLVMStyle()) {
return fixNamespaceEndComments(
Code,
/*Ranges=*/{1, tooling::Range(0, Code.size())}, Style);
}
};
TEST_F(NamespaceEndCommentsFixerTest, AddsEndComment) {
EXPECT_EQ("namespace {\n"
"int i;\n"
"int j;\n"
"}// namespace",
fixNamespaceEndComments("namespace {\n"
"int i;\n"
"int j;\n"
"}"));
EXPECT_EQ("namespace {\n"
"int i;\n"
"int j;\n"
"}// namespace\n",
fixNamespaceEndComments("namespace {\n"
"int i;\n"
"int j;\n"
"}\n"));
EXPECT_EQ("namespace A {\n"
"int i;\n"
"int j;\n"
"}// namespace A",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"int j;\n"
"}"));
EXPECT_EQ("inline namespace A {\n"
"int i;\n"
"int j;\n"
"}// namespace A",
fixNamespaceEndComments("inline namespace A {\n"
"int i;\n"
"int j;\n"
"}"));
EXPECT_EQ("namespace [[deprecated(\"foo\")]] A::B {\n"
"int i;\n"
"int j;\n"
"}// namespace A::B",
fixNamespaceEndComments("namespace [[deprecated(\"foo\")]] A::B {\n"
"int i;\n"
"int j;\n"
"}"));
EXPECT_EQ("namespace [[deprecated(\"foo\")]] A::inline B::inline C {\n"
"int i;\n"
"int j;\n"
"}// namespace A::inline B::inline C",
fixNamespaceEndComments(
"namespace [[deprecated(\"foo\")]] A::inline B::inline C {\n"
"int i;\n"
"int j;\n"
"}"));
EXPECT_EQ("namespace DEPRECATED A::B {\n"
"int i;\n"
"int j;\n"
"}// namespace A::B",
fixNamespaceEndComments("namespace DEPRECATED A::B {\n"
"int i;\n"
"int j;\n"
"}"));
EXPECT_EQ("inline namespace [[deprecated]] A {\n"
"int i;\n"
"int j;\n"
"}// namespace A",
fixNamespaceEndComments("inline namespace [[deprecated]] A {\n"
"int i;\n"
"int j;\n"
"}"));
EXPECT_EQ("namespace ::A {\n"
"int i;\n"
"int j;\n"
"}// namespace ::A",
fixNamespaceEndComments("namespace ::A {\n"
"int i;\n"
"int j;\n"
"}"));
EXPECT_EQ("namespace ::A::B {\n"
"int i;\n"
"int j;\n"
"}// namespace ::A::B",
fixNamespaceEndComments("namespace ::A::B {\n"
"int i;\n"
"int j;\n"
"}"));
EXPECT_EQ("namespace /**/::/**/A/**/::/**/B/**/ {\n"
"int i;\n"
"int j;\n"
"}// namespace ::A::B",
fixNamespaceEndComments("namespace /**/::/**/A/**/::/**/B/**/ {\n"
"int i;\n"
"int j;\n"
"}"));
EXPECT_EQ("namespace A {\n"
"namespace B {\n"
"int i;\n"
"}\n"
"}// namespace A",
fixNamespaceEndComments("namespace A {\n"
"namespace B {\n"
"int i;\n"
"}\n"
"}"));
EXPECT_EQ("namespace A {\n"
"namespace B {\n"
"int i;\n"
"int j;\n"
"}// namespace B\n"
"}// namespace A",
fixNamespaceEndComments("namespace A {\n"
"namespace B {\n"
"int i;\n"
"int j;\n"
"}\n"
"}"));
EXPECT_EQ("namespace A {\n"
"int a;\n"
"int b;\n"
"}// namespace A\n"
"namespace B {\n"
"int b;\n"
"int a;\n"
"}// namespace B",
fixNamespaceEndComments("namespace A {\n"
"int a;\n"
"int b;\n"
"}\n"
"namespace B {\n"
"int b;\n"
"int a;\n"
"}"));
EXPECT_EQ("namespace A {\n"
"int a1;\n"
"int a2;\n"
"}// namespace A\n"
"namespace A {\n"
"int a2;\n"
"int a1;\n"
"}// namespace A",
fixNamespaceEndComments("namespace A {\n"
"int a1;\n"
"int a2;\n"
"}\n"
"namespace A {\n"
"int a2;\n"
"int a1;\n"
"}"));
EXPECT_EQ("namespace A {\n"
"int a;\n"
"int b;\n"
"}// namespace A\n"
"// comment about b\n"
"int b;",
fixNamespaceEndComments("namespace A {\n"
"int a;\n"
"int b;\n"
"}\n"
"// comment about b\n"
"int b;"));
EXPECT_EQ("namespace A {\n"
"namespace B {\n"
"namespace C {\n"
"namespace D {\n"
"}\n"
"}// namespace C\n"
"}// namespace B\n"
"}// namespace A",
fixNamespaceEndComments("namespace A {\n"
"namespace B {\n"
"namespace C {\n"
"namespace D {\n"
"}\n"
"}\n"
"}\n"
"}"));
// Add comment for namespaces which will be 'compacted'
FormatStyle CompactNamespacesStyle = getLLVMStyle();
CompactNamespacesStyle.CompactNamespaces = true;
EXPECT_EQ("namespace out { namespace in {\n"
"int i;\n"
"int j;\n"
"}}// namespace out::in",
fixNamespaceEndComments("namespace out { namespace in {\n"
"int i;\n"
"int j;\n"
"}}",
CompactNamespacesStyle));
EXPECT_EQ("namespace out {\n"
"namespace in {\n"
"int i;\n"
"int j;\n"
"}\n"
"}// namespace out::in",
fixNamespaceEndComments("namespace out {\n"
"namespace in {\n"
"int i;\n"
"int j;\n"
"}\n"
"}",
CompactNamespacesStyle));
EXPECT_EQ("namespace out { namespace in {\n"
"int i;\n"
"int j;\n"
"};}// namespace out::in",
fixNamespaceEndComments("namespace out { namespace in {\n"
"int i;\n"
"int j;\n"
"};}",
CompactNamespacesStyle));
// Adds an end comment after a semicolon.
EXPECT_EQ("namespace {\n"
"int i;\n"
"int j;\n"
"};// namespace",
fixNamespaceEndComments("namespace {\n"
"int i;\n"
"int j;\n"
"};"));
EXPECT_EQ("namespace A {\n"
"int i;\n"
"int j;\n"
"};// namespace A",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"int j;\n"
"};"));
EXPECT_EQ("namespace A {\n"
"int i;\n"
"int j;\n"
"};// namespace A\n"
"// unrelated",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"int j;\n"
"};\n"
"// unrelated"));
}
TEST_F(NamespaceEndCommentsFixerTest, AddsMacroEndComment) {
FormatStyle Style = getLLVMStyle();
Style.NamespaceMacros.push_back("TESTSUITE");
EXPECT_EQ("TESTSUITE() {\n"
"int i;\n"
"int j;\n"
"}// TESTSUITE()",
fixNamespaceEndComments("TESTSUITE() {\n"
"int i;\n"
"int j;\n"
"}",
Style));
EXPECT_EQ("TESTSUITE(A) {\n"
"int i;\n"
"int j;\n"
"}// TESTSUITE(A)",
fixNamespaceEndComments("TESTSUITE(A) {\n"
"int i;\n"
"int j;\n"
"}",
Style));
EXPECT_EQ("inline TESTSUITE(A) {\n"
"int i;\n"
"int j;\n"
"}// TESTSUITE(A)",
fixNamespaceEndComments("inline TESTSUITE(A) {\n"
"int i;\n"
"int j;\n"
"}",
Style));
EXPECT_EQ("TESTSUITE(::A) {\n"
"int i;\n"
"int j;\n"
"}// TESTSUITE(::A)",
fixNamespaceEndComments("TESTSUITE(::A) {\n"
"int i;\n"
"int j;\n"
"}",
Style));
EXPECT_EQ("TESTSUITE(::A::B) {\n"
"int i;\n"
"int j;\n"
"}// TESTSUITE(::A::B)",
fixNamespaceEndComments("TESTSUITE(::A::B) {\n"
"int i;\n"
"int j;\n"
"}",
Style));
EXPECT_EQ("TESTSUITE(/**/::/**/A/**/::/**/B/**/) {\n"
"int i;\n"
"int j;\n"
"}// TESTSUITE(::A::B)",
fixNamespaceEndComments("TESTSUITE(/**/::/**/A/**/::/**/B/**/) {\n"
"int i;\n"
"int j;\n"
"}",
Style));
EXPECT_EQ("TESTSUITE(A, B) {\n"
"int i;\n"
"int j;\n"
"}// TESTSUITE(A)",
fixNamespaceEndComments("TESTSUITE(A, B) {\n"
"int i;\n"
"int j;\n"
"}",
Style));
EXPECT_EQ("TESTSUITE(\"Test1\") {\n"
"int i;\n"
"int j;\n"
"}// TESTSUITE(\"Test1\")",
fixNamespaceEndComments("TESTSUITE(\"Test1\") {\n"
"int i;\n"
"int j;\n"
"}",
Style));
}
TEST_F(NamespaceEndCommentsFixerTest, AddsNewlineIfNeeded) {
EXPECT_EQ("namespace A {\n"
"int i;\n"
"int j;\n"
"}// namespace A\n"
" int k;",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"int j;\n"
"} int k;"));
EXPECT_EQ("namespace {\n"
"int i;\n"
"int j;\n"
"}// namespace\n"
" int k;",
fixNamespaceEndComments("namespace {\n"
"int i;\n"
"int j;\n"
"} int k;"));
EXPECT_EQ("namespace A {\n"
"int i;\n"
"int j;\n"
"}// namespace A\n"
" namespace B {\n"
"int j;\n"
"int k;\n"
"}// namespace B",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"int j;\n"
"} namespace B {\n"
"int j;\n"
"int k;\n"
"}"));
EXPECT_EQ("namespace {\n"
"int i;\n"
"int j;\n"
"};// namespace\n"
"int k;",
fixNamespaceEndComments("namespace {\n"
"int i;\n"
"int j;\n"
"};int k;"));
EXPECT_EQ("namespace {\n"
"int i;\n"
"int j;\n"
"};// namespace\n"
";",
fixNamespaceEndComments("namespace {\n"
"int i;\n"
"int j;\n"
"};;"));
}
TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddEndCommentForShortNamespace) {
EXPECT_EQ("namespace {}", fixNamespaceEndComments("namespace {}"));
EXPECT_EQ("namespace A {}", fixNamespaceEndComments("namespace A {}"));
EXPECT_EQ("namespace A { a }", fixNamespaceEndComments("namespace A { a }"));
EXPECT_EQ("namespace A { a };",
fixNamespaceEndComments("namespace A { a };"));
}
TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterUnaffectedRBrace) {
EXPECT_EQ("namespace A {\n"
"int i;\n"
"}",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"}",
// The range (16, 3) spans the 'int' above.
/*Ranges=*/{1, tooling::Range(16, 3)}));
EXPECT_EQ("namespace A {\n"
"int i;\n"
"};",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"};",
// The range (16, 3) spans the 'int' above.
/*Ranges=*/{1, tooling::Range(16, 3)}));
}
TEST_F(NamespaceEndCommentsFixerTest,
DoesNotAddCommentAfterRBraceInPPDirective) {
EXPECT_EQ("#define SAD \\\n"
"namespace A { \\\n"
"int i; \\\n"
"}",
fixNamespaceEndComments("#define SAD \\\n"
"namespace A { \\\n"
"int i; \\\n"
"}"));
}
TEST_F(NamespaceEndCommentsFixerTest, KeepsValidEndComment) {
EXPECT_EQ("namespace {\n"
"int i;\n"
"} // end anonymous namespace",
fixNamespaceEndComments("namespace {\n"
"int i;\n"
"} // end anonymous namespace"));
EXPECT_EQ("namespace A {\n"
"int i;\n"
"} /* end of namespace A */",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"} /* end of namespace A */"));
EXPECT_EQ("namespace A {\n"
"int i;\n"
"} // namespace A",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"} // namespace A"));
EXPECT_EQ("namespace A::B {\n"
"int i;\n"
"} // end namespace A::B",
fixNamespaceEndComments("namespace A::B {\n"
"int i;\n"
"} // end namespace A::B"));
EXPECT_EQ("namespace A {\n"
"int i;\n"
"}; // end namespace A",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"}; // end namespace A"));
EXPECT_EQ("namespace {\n"
"int i;\n"
"}; /* unnamed namespace */",
fixNamespaceEndComments("namespace {\n"
"int i;\n"
"}; /* unnamed namespace */"));
}
TEST_F(NamespaceEndCommentsFixerTest, KeepsValidMacroEndComment) {
FormatStyle Style = getLLVMStyle();
Style.NamespaceMacros.push_back("TESTSUITE");
EXPECT_EQ("TESTSUITE() {\n"
"int i;\n"
"} // end anonymous TESTSUITE()",
fixNamespaceEndComments("TESTSUITE() {\n"
"int i;\n"
"} // end anonymous TESTSUITE()",
Style));
EXPECT_EQ("TESTSUITE(A) {\n"
"int i;\n"
"} /* end of TESTSUITE(A) */",
fixNamespaceEndComments("TESTSUITE(A) {\n"
"int i;\n"
"} /* end of TESTSUITE(A) */",
Style));
EXPECT_EQ("TESTSUITE(A) {\n"
"int i;\n"
"} // TESTSUITE(A)",
fixNamespaceEndComments("TESTSUITE(A) {\n"
"int i;\n"
"} // TESTSUITE(A)",
Style));
EXPECT_EQ("TESTSUITE(A::B) {\n"
"int i;\n"
"} // end TESTSUITE(A::B)",
fixNamespaceEndComments("TESTSUITE(A::B) {\n"
"int i;\n"
"} // end TESTSUITE(A::B)",
Style));
EXPECT_EQ("TESTSUITE(A) {\n"
"int i;\n"
"}; // end TESTSUITE(A)",
fixNamespaceEndComments("TESTSUITE(A) {\n"
"int i;\n"
"}; // end TESTSUITE(A)",
Style));
EXPECT_EQ("TESTSUITE() {\n"
"int i;\n"
"}; /* unnamed TESTSUITE() */",
fixNamespaceEndComments("TESTSUITE() {\n"
"int i;\n"
"}; /* unnamed TESTSUITE() */",
Style));
}
TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndLineComment) {
EXPECT_EQ("namespace {\n"
"int i;\n"
"} // namespace",
fixNamespaceEndComments("namespace {\n"
"int i;\n"
"} // namespace A"));
EXPECT_EQ("namespace A {\n"
"int i;\n"
"} // namespace A",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"} // namespace"));
EXPECT_EQ("namespace A {\n"
"int i;\n"
"} // namespace A",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"} //"));
EXPECT_EQ("namespace A {\n"
"int i;\n"
"}; // namespace A",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"}; //"));
EXPECT_EQ("namespace A {\n"
"int i;\n"
"} // namespace A",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"} // banamespace A"));
EXPECT_EQ("namespace A {\n"
"int i;\n"
"}; // namespace A",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"}; // banamespace A"));
// Updates invalid line comments even for short namespaces.
EXPECT_EQ("namespace A {} // namespace A",
fixNamespaceEndComments("namespace A {} // namespace"));
EXPECT_EQ("namespace A {}; // namespace A",
fixNamespaceEndComments("namespace A {}; // namespace"));
// Update invalid comments for compacted namespaces.
FormatStyle CompactNamespacesStyle = getLLVMStyle();
CompactNamespacesStyle.CompactNamespaces = true;
EXPECT_EQ("namespace out { namespace in {\n"
"}} // namespace out::in",
fixNamespaceEndComments("namespace out { namespace in {\n"
"}} // namespace out",
CompactNamespacesStyle));
EXPECT_EQ("namespace out { namespace in {\n"
"}} // namespace out::in",
fixNamespaceEndComments("namespace out { namespace in {\n"
"}} // namespace in",
CompactNamespacesStyle));
EXPECT_EQ("namespace out { namespace in {\n"
"}\n"
"} // namespace out::in",
fixNamespaceEndComments("namespace out { namespace in {\n"
"}// banamespace in\n"
"} // namespace out",
CompactNamespacesStyle));
}
TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidMacroEndLineComment) {
FormatStyle Style = getLLVMStyle();
Style.NamespaceMacros.push_back("TESTSUITE");
EXPECT_EQ("TESTSUITE() {\n"
"int i;\n"
"} // TESTSUITE()",
fixNamespaceEndComments("TESTSUITE() {\n"
"int i;\n"
"} // TESTSUITE(A)",
Style));
EXPECT_EQ("TESTSUITE(A) {\n"
"int i;\n"
"} // TESTSUITE(A)",
fixNamespaceEndComments("TESTSUITE(A) {\n"
"int i;\n"
"} // TESTSUITE()",
Style));
EXPECT_EQ("TESTSUITE(A) {\n"
"int i;\n"
"} // TESTSUITE(A)",
fixNamespaceEndComments("TESTSUITE(A) {\n"
"int i;\n"
"} //",
Style));
EXPECT_EQ("TESTSUITE(A) {\n"
"int i;\n"
"}; // TESTSUITE(A)",
fixNamespaceEndComments("TESTSUITE(A) {\n"
"int i;\n"
"}; //",
Style));
EXPECT_EQ("TESTSUITE(A) {\n"
"int i;\n"
"} // TESTSUITE(A)",
fixNamespaceEndComments("TESTSUITE(A) {\n"
"int i;\n"
"} // TESTSUITE A",
Style));
EXPECT_EQ("TESTSUITE() {\n"
"int i;\n"
"} // TESTSUITE()",
fixNamespaceEndComments("TESTSUITE() {\n"
"int i;\n"
"} // TESTSUITE",
Style));
EXPECT_EQ("TESTSUITE(A) {\n"
"int i;\n"
"} // TESTSUITE(A)",
fixNamespaceEndComments("TESTSUITE(A) {\n"
"int i;\n"
"} // TOASTSUITE(A)",
Style));
EXPECT_EQ("TESTSUITE(A) {\n"
"int i;\n"
"}; // TESTSUITE(A)",
fixNamespaceEndComments("TESTSUITE(A) {\n"
"int i;\n"
"}; // TOASTSUITE(A)",
Style));
// Updates invalid line comments even for short namespaces.
EXPECT_EQ("TESTSUITE(A) {} // TESTSUITE(A)",
fixNamespaceEndComments("TESTSUITE(A) {} // TESTSUITE()", Style));
EXPECT_EQ("TESTSUITE(A) {}; // TESTSUITE(A)",
fixNamespaceEndComments("TESTSUITE(A) {}; // TESTSUITE()", Style));
// Update invalid comments for compacted namespaces.
FormatStyle CompactNamespacesStyle = getLLVMStyle();
CompactNamespacesStyle.CompactNamespaces = true;
CompactNamespacesStyle.NamespaceMacros.push_back("TESTSUITE");
EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
"}} // TESTSUITE(out::in)",
fixNamespaceEndComments("TESTSUITE(out) { TESTSUITE(in) {\n"
"}} // TESTSUITE(out)",
CompactNamespacesStyle));
EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
"}} // TESTSUITE(out::in)",
fixNamespaceEndComments("TESTSUITE(out) { TESTSUITE(in) {\n"
"}} // TESTSUITE(in)",
CompactNamespacesStyle));
EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
"}\n"
"} // TESTSUITE(out::in)",
fixNamespaceEndComments("TESTSUITE(out) { TESTSUITE(in) {\n"
"}// TAOSTSUITE(in)\n"
"} // TESTSUITE(out)",
CompactNamespacesStyle));
}
TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndBlockComment) {
EXPECT_EQ("namespace {\n"
"int i;\n"
"} // namespace",
fixNamespaceEndComments("namespace {\n"
"int i;\n"
"} /* namespace A */"));
EXPECT_EQ("namespace A {\n"
"int i;\n"
"} // namespace A",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"} /* end namespace */"));
EXPECT_EQ("namespace A {\n"
"int i;\n"
"} // namespace A",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"} /**/"));
EXPECT_EQ("namespace A {\n"
"int i;\n"
"} // namespace A",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"} /* end unnamed namespace */"));
EXPECT_EQ("namespace A {\n"
"int i;\n"
"} // namespace A",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"} /* banamespace A */"));
EXPECT_EQ("namespace A {\n"
"int i;\n"
"}; // namespace A",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"}; /* banamespace A */"));
EXPECT_EQ("namespace A {} // namespace A",
fixNamespaceEndComments("namespace A {} /**/"));
EXPECT_EQ("namespace A {}; // namespace A",
fixNamespaceEndComments("namespace A {}; /**/"));
}
TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidMacroEndBlockComment) {
FormatStyle Style = getLLVMStyle();
Style.NamespaceMacros.push_back("TESTSUITE");
EXPECT_EQ("TESTSUITE() {\n"
"int i;\n"
"} // TESTSUITE()",
fixNamespaceEndComments("TESTSUITE() {\n"
"int i;\n"
"} /* TESTSUITE(A) */",
Style));
EXPECT_EQ("TESTSUITE(A) {\n"
"int i;\n"
"} // TESTSUITE(A)",
fixNamespaceEndComments("TESTSUITE(A) {\n"
"int i;\n"
"} /* end TESTSUITE() */",
Style));
EXPECT_EQ("TESTSUITE(A) {\n"
"int i;\n"
"} // TESTSUITE(A)",
fixNamespaceEndComments("TESTSUITE(A) {\n"
"int i;\n"
"} /**/",
Style));
EXPECT_EQ("TESTSUITE(A) {\n"
"int i;\n"
"} // TESTSUITE(A)",
fixNamespaceEndComments("TESTSUITE(A) {\n"
"int i;\n"
"} /* end unnamed TESTSUITE() */",
Style));
EXPECT_EQ("TESTSUITE(A) {\n"
"int i;\n"
"} // TESTSUITE(A)",
fixNamespaceEndComments("TESTSUITE(A) {\n"
"int i;\n"
"} /* TOASTSUITE(A) */",
Style));
EXPECT_EQ("TESTSUITE(A) {\n"
"int i;\n"
"}; // TESTSUITE(A)",
fixNamespaceEndComments("TESTSUITE(A) {\n"
"int i;\n"
"}; /* TAOSTSUITE(A) */",
Style));
EXPECT_EQ("TESTSUITE(A) {} // TESTSUITE(A)",
fixNamespaceEndComments("TESTSUITE(A) {} /**/", Style));
EXPECT_EQ("TESTSUITE(A) {}; // TESTSUITE(A)",
fixNamespaceEndComments("TESTSUITE(A) {}; /**/", Style));
}
TEST_F(NamespaceEndCommentsFixerTest,
DoesNotAddEndCommentForNamespacesControlledByMacros) {
EXPECT_EQ("#ifdef 1\n"
"namespace A {\n"
"#elseif\n"
"namespace B {\n"
"#endif\n"
"int i;\n"
"}\n"
"}\n",
fixNamespaceEndComments("#ifdef 1\n"
"namespace A {\n"
"#elseif\n"
"namespace B {\n"
"#endif\n"
"int i;\n"
"}\n"
"}\n"));
}
TEST_F(NamespaceEndCommentsFixerTest, AddsEndCommentForNamespacesAroundMacros) {
// Conditional blocks around are fine
EXPECT_EQ("namespace A {\n"
"#if 1\n"
"int i;\n"
"#endif\n"
"}// namespace A",
fixNamespaceEndComments("namespace A {\n"
"#if 1\n"
"int i;\n"
"#endif\n"
"}"));
EXPECT_EQ("#if 1\n"
"#endif\n"
"namespace A {\n"
"int i;\n"
"int j;\n"
"}// namespace A",
fixNamespaceEndComments("#if 1\n"
"#endif\n"
"namespace A {\n"
"int i;\n"
"int j;\n"
"}"));
EXPECT_EQ("namespace A {\n"
"int i;\n"
"int j;\n"
"}// namespace A\n"
"#if 1\n"
"#endif",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"int j;\n"
"}\n"
"#if 1\n"
"#endif"));
EXPECT_EQ("#if 1\n"
"namespace A {\n"
"int i;\n"
"int j;\n"
"}// namespace A\n"
"#endif",
fixNamespaceEndComments("#if 1\n"
"namespace A {\n"
"int i;\n"
"int j;\n"
"}\n"
"#endif"));
// Macro definition has no impact
EXPECT_EQ("namespace A {\n"
"#define FOO\n"
"int i;\n"
"}// namespace A",
fixNamespaceEndComments("namespace A {\n"
"#define FOO\n"
"int i;\n"
"}"));
EXPECT_EQ("#define FOO\n"
"namespace A {\n"
"int i;\n"
"int j;\n"
"}// namespace A",
fixNamespaceEndComments("#define FOO\n"
"namespace A {\n"
"int i;\n"
"int j;\n"
"}"));
EXPECT_EQ("namespace A {\n"
"int i;\n"
"int j;\n"
"}// namespace A\n"
"#define FOO\n",
fixNamespaceEndComments("namespace A {\n"
"int i;\n"
"int j;\n"
"}\n"
"#define FOO\n"));
// No replacement if open & close in different conditional blocks
EXPECT_EQ("#if 1\n"
"namespace A {\n"
"#endif\n"
"int i;\n"
"int j;\n"
"#if 1\n"
"}\n"
"#endif",
fixNamespaceEndComments("#if 1\n"
"namespace A {\n"
"#endif\n"
"int i;\n"
"int j;\n"
"#if 1\n"
"}\n"
"#endif"));
EXPECT_EQ("#ifdef A\n"
"namespace A {\n"
"#endif\n"
"int i;\n"
"int j;\n"
"#ifdef B\n"
"}\n"
"#endif",
fixNamespaceEndComments("#ifdef A\n"
"namespace A {\n"
"#endif\n"
"int i;\n"
"int j;\n"
"#ifdef B\n"
"}\n"
"#endif"));
// No replacement inside unreachable conditional block
EXPECT_EQ("#if 0\n"
"namespace A {\n"
"int i;\n"
"int j;\n"
"}\n"
"#endif",
fixNamespaceEndComments("#if 0\n"
"namespace A {\n"
"int i;\n"
"int j;\n"
"}\n"
"#endif"));
}
TEST_F(NamespaceEndCommentsFixerTest,
DoesNotAddEndCommentForNamespacesInMacroDeclarations) {
EXPECT_EQ("#ifdef 1\n"
"namespace A {\n"
"#elseif\n"
"namespace B {\n"
"#endif\n"
"int i;\n"
"}\n"
"}\n",
fixNamespaceEndComments("#ifdef 1\n"
"namespace A {\n"
"#elseif\n"
"namespace B {\n"
"#endif\n"
"int i;\n"
"}\n"
"}\n"));
EXPECT_EQ("namespace {\n"
"int i;\n"
"int j;\n"
"}// namespace\n"
"#if A\n"
"int i;\n"
"#else\n"
"int j;\n"
"#endif",
fixNamespaceEndComments("namespace {\n"
"int i;\n"
"int j;\n"
"}\n"
"#if A\n"
"int i;\n"
"#else\n"
"int j;\n"
"#endif"));
EXPECT_EQ("#if A\n"
"namespace A {\n"
"#else\n"
"namespace B {\n"
"#endif\n"
"int i;\n"
"int j;\n"
"}",
fixNamespaceEndComments("#if A\n"
"namespace A {\n"
"#else\n"
"namespace B {\n"
"#endif\n"
"int i;\n"
"int j;\n"
"}"));
EXPECT_EQ("#if A\n"
"namespace A {\n"
"#else\n"
"namespace B {\n"
"#endif\n"
"int i;\n"
"int j;\n"
"} // namespace A",
fixNamespaceEndComments("#if A\n"
"namespace A {\n"
"#else\n"
"namespace B {\n"
"#endif\n"
"int i;\n"
"int j;\n"
"} // namespace A"));
EXPECT_EQ("#if A\n"
"namespace A {\n"
"#else\n"
"namespace B {\n"
"#endif\n"
"int i;\n"
"int j;\n"
"} // namespace B",
fixNamespaceEndComments("#if A\n"
"namespace A {\n"
"#else\n"
"namespace B {\n"
"#endif\n"
"int i;\n"
"int j;\n"
"} // namespace B"));
EXPECT_EQ("namespace A\n"
"int i;\n"
"int j;\n"
"#if A\n"
"}\n"
"#else\n"
"}\n"
"#endif",
fixNamespaceEndComments("namespace A\n"
"int i;\n"
"int j;\n"
"#if A\n"
"}\n"
"#else\n"
"}\n"
"#endif"));
EXPECT_EQ("namespace A\n"
"int i;\n"
"int j;\n"
"#if A\n"
"} // namespace A\n"
"#else\n"
"} // namespace A\n"
"#endif",
fixNamespaceEndComments("namespace A\n"
"int i;\n"
"int j;\n"
"#if A\n"
"} // namespace A\n"
"#else\n"
"} // namespace A\n"
"#endif"));
}
TEST_F(NamespaceEndCommentsFixerTest,
DoesNotAddEndCommentForUnbalancedRBracesAfterNamespaceEnd) {
EXPECT_EQ("namespace {\n"
"int i;\n"
"} // namespace\n"
"}",
fixNamespaceEndComments("namespace {\n"
"int i;\n"
"} // namespace\n"
"}"));
}
TEST_F(NamespaceEndCommentsFixerTest, HandlesInlineAtEndOfLine_PR32438) {
EXPECT_EQ("template <int> struct a {};\n"
"struct a<bool{}> b() {\n"
"}\n"
"#define c inline\n"
"void d() {\n"
"}\n",
fixNamespaceEndComments("template <int> struct a {};\n"
"struct a<bool{}> b() {\n"
"}\n"
"#define c inline\n"
"void d() {\n"
"}\n"));
}
TEST_F(NamespaceEndCommentsFixerTest, IgnoreUnbalanced) {
EXPECT_EQ("namespace A {\n"
"class Foo {\n"
"}\n"
"}// namespace A\n",
fixNamespaceEndComments("namespace A {\n"
"class Foo {\n"
"}\n"
"}\n"));
EXPECT_EQ("namespace A {\n"
"class Foo {\n"
"}\n",
fixNamespaceEndComments("namespace A {\n"
"class Foo {\n"
"}\n"));
EXPECT_EQ("namespace A {\n"
"class Foo {\n"
"}\n"
"}\n"
"}\n",
fixNamespaceEndComments("namespace A {\n"
"class Foo {\n"
"}\n"
"}\n"
"}\n"));
}
using ShortNamespaceLinesTest = NamespaceEndCommentsFixerTest;
TEST_F(ShortNamespaceLinesTest, ZeroUnwrappedLines) {
auto Style = getLLVMStyle();
Style.ShortNamespaceLines = 0u;
EXPECT_EQ("namespace OneLinerNamespace {}\n",
fixNamespaceEndComments("namespace OneLinerNamespace {}\n", Style));
EXPECT_EQ("namespace ShortNamespace {\n"
"}\n",
fixNamespaceEndComments("namespace ShortNamespace {\n"
"}\n",
Style));
EXPECT_EQ("namespace LongNamespace {\n"
"int i;\n"
"}// namespace LongNamespace\n",
fixNamespaceEndComments("namespace LongNamespace {\n"
"int i;\n"
"}\n",
Style));
}
TEST_F(ShortNamespaceLinesTest, OneUnwrappedLine) {
constexpr auto DefaultUnwrappedLines = 1u;
auto const Style = getLLVMStyle();
EXPECT_EQ(DefaultUnwrappedLines, Style.ShortNamespaceLines);
EXPECT_EQ("namespace ShortNamespace {\n"
"int i;\n"
"}\n",
fixNamespaceEndComments("namespace ShortNamespace {\n"
"int i;\n"
"}\n"));
EXPECT_EQ("namespace LongNamespace {\n"
"int i;\n"
"int j;\n"
"}// namespace LongNamespace\n",
fixNamespaceEndComments("namespace LongNamespace {\n"
"int i;\n"
"int j;\n"
"}\n"));
}
TEST_F(ShortNamespaceLinesTest, MultipleUnwrappedLine) {
auto Style = getLLVMStyle();
Style.ShortNamespaceLines = 2u;
EXPECT_EQ("namespace ShortNamespace {\n"
"int i;\n"
"int j;\n"
"}\n",
fixNamespaceEndComments("namespace ShortNamespace {\n"
"int i;\n"
"int j;\n"
"}\n",
Style));
EXPECT_EQ("namespace LongNamespace {\n"
"int i;\n"
"int j;\n"
"int k;\n"
"}// namespace LongNamespace\n",
fixNamespaceEndComments("namespace LongNamespace {\n"
"int i;\n"
"int j;\n"
"int k;\n"
"}\n",
Style));
}
} // end namespace
} // end namespace format
} // end namespace clang