15f5a7458SNico Weber //===-- ChangeNamespaceTests.cpp - Change namespace unit tests ---*- C++ -*-===//
25f5a7458SNico Weber //
35f5a7458SNico Weber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45f5a7458SNico Weber // See https://llvm.org/LICENSE.txt for license information.
55f5a7458SNico Weber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65f5a7458SNico Weber //
75f5a7458SNico Weber //===----------------------------------------------------------------------===//
85f5a7458SNico Weber
95f5a7458SNico Weber #include "ChangeNamespace.h"
105f5a7458SNico Weber #include "unittests/Tooling/RewriterTestContext.h"
115f5a7458SNico Weber #include "clang/ASTMatchers/ASTMatchFinder.h"
125f5a7458SNico Weber #include "clang/Basic/FileManager.h"
135f5a7458SNico Weber #include "clang/Basic/FileSystemOptions.h"
145f5a7458SNico Weber #include "clang/Format/Format.h"
155f5a7458SNico Weber #include "clang/Frontend/CompilerInstance.h"
165f5a7458SNico Weber #include "clang/Frontend/PCHContainerOperations.h"
175f5a7458SNico Weber #include "clang/Tooling/Refactoring.h"
185f5a7458SNico Weber #include "clang/Tooling/Tooling.h"
195f5a7458SNico Weber #include "llvm/ADT/IntrusiveRefCntPtr.h"
205f5a7458SNico Weber #include "llvm/ADT/StringRef.h"
215f5a7458SNico Weber #include "llvm/Support/MemoryBuffer.h"
225f5a7458SNico Weber #include "llvm/Support/VirtualFileSystem.h"
235f5a7458SNico Weber #include "gtest/gtest.h"
245f5a7458SNico Weber #include <memory>
255f5a7458SNico Weber #include <string>
265f5a7458SNico Weber #include <vector>
275f5a7458SNico Weber
285f5a7458SNico Weber namespace clang {
295f5a7458SNico Weber namespace change_namespace {
305f5a7458SNico Weber namespace {
315f5a7458SNico Weber
325f5a7458SNico Weber class ChangeNamespaceTest : public ::testing::Test {
335f5a7458SNico Weber public:
runChangeNamespaceOnCode(llvm::StringRef Code)345f5a7458SNico Weber std::string runChangeNamespaceOnCode(llvm::StringRef Code) {
355f5a7458SNico Weber clang::RewriterTestContext Context;
365f5a7458SNico Weber clang::FileID ID = Context.createInMemoryFile(FileName, Code);
375f5a7458SNico Weber
385f5a7458SNico Weber std::map<std::string, tooling::Replacements> FileToReplacements;
395f5a7458SNico Weber change_namespace::ChangeNamespaceTool NamespaceTool(
405f5a7458SNico Weber OldNamespace, NewNamespace, FilePattern,
4125ed42f0SEric Christopher /*AllowedSymbolPatterns*/ {}, &FileToReplacements);
425f5a7458SNico Weber ast_matchers::MatchFinder Finder;
435f5a7458SNico Weber NamespaceTool.registerMatchers(&Finder);
445f5a7458SNico Weber std::unique_ptr<tooling::FrontendActionFactory> Factory =
455f5a7458SNico Weber tooling::newFrontendActionFactory(&Finder);
465f5a7458SNico Weber if (!tooling::runToolOnCodeWithArgs(Factory->create(), Code, {"-std=c++11"},
475f5a7458SNico Weber FileName))
485f5a7458SNico Weber return "";
495f5a7458SNico Weber formatAndApplyAllReplacements(FileToReplacements, Context.Rewrite);
505f5a7458SNico Weber return format(Context.getRewrittenText(ID));
515f5a7458SNico Weber }
525f5a7458SNico Weber
format(llvm::StringRef Code)535f5a7458SNico Weber std::string format(llvm::StringRef Code) {
545f5a7458SNico Weber tooling::Replacements Replaces = format::reformat(
555f5a7458SNico Weber format::getLLVMStyle(), Code, {tooling::Range(0, Code.size())});
565f5a7458SNico Weber auto ChangedCode = tooling::applyAllReplacements(Code, Replaces);
575f5a7458SNico Weber EXPECT_TRUE(static_cast<bool>(ChangedCode));
585f5a7458SNico Weber if (!ChangedCode) {
595f5a7458SNico Weber llvm::errs() << llvm::toString(ChangedCode.takeError());
605f5a7458SNico Weber return "";
615f5a7458SNico Weber }
625f5a7458SNico Weber return *ChangedCode;
635f5a7458SNico Weber }
645f5a7458SNico Weber
655f5a7458SNico Weber protected:
665f5a7458SNico Weber std::string FileName = "input.cc";
675f5a7458SNico Weber std::string OldNamespace = "na::nb";
685f5a7458SNico Weber std::string NewNamespace = "x::y";
695f5a7458SNico Weber std::string FilePattern = "input.cc";
705f5a7458SNico Weber };
715f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,NoMatchingNamespace)725f5a7458SNico Weber TEST_F(ChangeNamespaceTest, NoMatchingNamespace) {
735f5a7458SNico Weber std::string Code = "namespace na {\n"
745f5a7458SNico Weber "namespace nx {\n"
755f5a7458SNico Weber "class A {};\n"
765f5a7458SNico Weber "} // namespace nx\n"
775f5a7458SNico Weber "} // namespace na\n";
785f5a7458SNico Weber std::string Expected = "namespace na {\n"
795f5a7458SNico Weber "namespace nx {\n"
805f5a7458SNico Weber "class A {};\n"
815f5a7458SNico Weber "} // namespace nx\n"
825f5a7458SNico Weber "} // namespace na\n";
835f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
845f5a7458SNico Weber }
855f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,SimpleMoveWithoutTypeRefs)865f5a7458SNico Weber TEST_F(ChangeNamespaceTest, SimpleMoveWithoutTypeRefs) {
875f5a7458SNico Weber std::string Code = "namespace na {\n"
885f5a7458SNico Weber "namespace nb {\n"
895f5a7458SNico Weber "class A {};\n"
905f5a7458SNico Weber "} // namespace nb\n"
915f5a7458SNico Weber "} // namespace na\n";
925f5a7458SNico Weber std::string Expected = "\n\n"
935f5a7458SNico Weber "namespace x {\n"
945f5a7458SNico Weber "namespace y {\n"
955f5a7458SNico Weber "class A {};\n"
965f5a7458SNico Weber "} // namespace y\n"
975f5a7458SNico Weber "} // namespace x\n";
985f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
995f5a7458SNico Weber }
1005f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,NewNsNestedInOldNs)1015f5a7458SNico Weber TEST_F(ChangeNamespaceTest, NewNsNestedInOldNs) {
1025f5a7458SNico Weber NewNamespace = "na::nb::nc";
1035f5a7458SNico Weber std::string Code = "namespace na {\n"
1045f5a7458SNico Weber "namespace nb {\n"
1055f5a7458SNico Weber "class A {};\n"
1065f5a7458SNico Weber "} // namespace nb\n"
1075f5a7458SNico Weber "} // namespace na\n";
1085f5a7458SNico Weber std::string Expected = "namespace na {\n"
1095f5a7458SNico Weber "namespace nb {\n"
1105f5a7458SNico Weber "namespace nc {\n"
1115f5a7458SNico Weber "class A {};\n"
1125f5a7458SNico Weber "} // namespace nc\n"
1135f5a7458SNico Weber "} // namespace nb\n"
1145f5a7458SNico Weber "} // namespace na\n";
1155f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
1165f5a7458SNico Weber }
1175f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,NewNsNestedInOldNsWithSurroundingNewLines)1185f5a7458SNico Weber TEST_F(ChangeNamespaceTest, NewNsNestedInOldNsWithSurroundingNewLines) {
1195f5a7458SNico Weber NewNamespace = "na::nb::nc";
1205f5a7458SNico Weber std::string Code = "namespace na {\n"
1215f5a7458SNico Weber "namespace nb {\n"
1225f5a7458SNico Weber "\n"
1235f5a7458SNico Weber "class A {};\n"
1245f5a7458SNico Weber "\n"
1255f5a7458SNico Weber "} // namespace nb\n"
1265f5a7458SNico Weber "} // namespace na\n";
1275f5a7458SNico Weber std::string Expected = "namespace na {\n"
1285f5a7458SNico Weber "namespace nb {\n"
1295f5a7458SNico Weber "namespace nc {\n"
1305f5a7458SNico Weber "\n"
1315f5a7458SNico Weber "class A {};\n"
1325f5a7458SNico Weber "\n"
1335f5a7458SNico Weber "} // namespace nc\n"
1345f5a7458SNico Weber "} // namespace nb\n"
1355f5a7458SNico Weber "} // namespace na\n";
1365f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
1375f5a7458SNico Weber }
1385f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,MoveOldNsWithSurroundingNewLines)1395f5a7458SNico Weber TEST_F(ChangeNamespaceTest, MoveOldNsWithSurroundingNewLines) {
1405f5a7458SNico Weber NewNamespace = "nx::ny";
1415f5a7458SNico Weber std::string Code = "namespace na {\n"
1425f5a7458SNico Weber "namespace nb {\n"
1435f5a7458SNico Weber "\n"
1445f5a7458SNico Weber "class A {};\n"
1455f5a7458SNico Weber "\n"
1465f5a7458SNico Weber "} // namespace nb\n"
1475f5a7458SNico Weber "} // namespace na\n";
1485f5a7458SNico Weber std::string Expected = "\n\n"
1495f5a7458SNico Weber "namespace nx {\n"
1505f5a7458SNico Weber "namespace ny {\n"
1515f5a7458SNico Weber "\n"
1525f5a7458SNico Weber "class A {};\n"
1535f5a7458SNico Weber "\n"
1545f5a7458SNico Weber "} // namespace ny\n"
1555f5a7458SNico Weber "} // namespace nx\n";
1565f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
1575f5a7458SNico Weber }
1585f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,NewNsNestedInOldNsWithRefs)1595f5a7458SNico Weber TEST_F(ChangeNamespaceTest, NewNsNestedInOldNsWithRefs) {
1605f5a7458SNico Weber NewNamespace = "na::nb::nc";
1615f5a7458SNico Weber std::string Code = "namespace na {\n"
1625f5a7458SNico Weber "class A {};\n"
1635f5a7458SNico Weber "namespace nb {\n"
1645f5a7458SNico Weber "class B {};\n"
1655f5a7458SNico Weber "class C {};\n"
1665f5a7458SNico Weber "void f() { A a; B b; }\n"
1675f5a7458SNico Weber "} // namespace nb\n"
1685f5a7458SNico Weber "} // namespace na\n";
1695f5a7458SNico Weber std::string Expected = "namespace na {\n"
1705f5a7458SNico Weber "class A {};\n"
1715f5a7458SNico Weber "namespace nb {\n"
1725f5a7458SNico Weber "namespace nc {\n"
1735f5a7458SNico Weber "class B {};\n"
1745f5a7458SNico Weber "class C {};\n"
1755f5a7458SNico Weber "void f() { A a; B b; }\n"
1765f5a7458SNico Weber "} // namespace nc\n"
1775f5a7458SNico Weber "} // namespace nb\n"
1785f5a7458SNico Weber "} // namespace na\n";
1795f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
1805f5a7458SNico Weber }
1815f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,SimpleMoveIntoAnotherNestedNamespace)1825f5a7458SNico Weber TEST_F(ChangeNamespaceTest, SimpleMoveIntoAnotherNestedNamespace) {
1835f5a7458SNico Weber NewNamespace = "na::nc";
1845f5a7458SNico Weber std::string Code = "namespace na {\n"
1855f5a7458SNico Weber "namespace nb {\n"
1865f5a7458SNico Weber "class A {};\n"
1875f5a7458SNico Weber "} // namespace nb\n"
1885f5a7458SNico Weber "} // namespace na\n";
1895f5a7458SNico Weber std::string Expected = "namespace na {\n"
1905f5a7458SNico Weber "\n"
1915f5a7458SNico Weber "namespace nc {\n"
1925f5a7458SNico Weber "class A {};\n"
1935f5a7458SNico Weber "} // namespace nc\n"
1945f5a7458SNico Weber "} // namespace na\n";
1955f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
1965f5a7458SNico Weber }
1975f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,MoveIntoAnotherNestedNamespaceWithRef)1985f5a7458SNico Weber TEST_F(ChangeNamespaceTest, MoveIntoAnotherNestedNamespaceWithRef) {
1995f5a7458SNico Weber NewNamespace = "na::nc";
2005f5a7458SNico Weber std::string Code = "namespace na {\n"
2015f5a7458SNico Weber "class A {};\n"
2025f5a7458SNico Weber "namespace nb {\n"
2035f5a7458SNico Weber "class X { A a; };\n"
2045f5a7458SNico Weber "} // namespace nb\n"
2055f5a7458SNico Weber "} // namespace na\n";
2065f5a7458SNico Weber std::string Expected = "namespace na {\n"
2075f5a7458SNico Weber "class A {};\n"
2085f5a7458SNico Weber "\n"
2095f5a7458SNico Weber "namespace nc {\n"
2105f5a7458SNico Weber "class X { A a; };\n"
2115f5a7458SNico Weber "} // namespace nc\n"
2125f5a7458SNico Weber "} // namespace na\n";
2135f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
2145f5a7458SNico Weber }
2155f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,MoveIntoExistingNamespaceAndShortenRefs)2165f5a7458SNico Weber TEST_F(ChangeNamespaceTest, MoveIntoExistingNamespaceAndShortenRefs) {
2175f5a7458SNico Weber std::string Code = "namespace x {\n"
2185f5a7458SNico Weber "namespace z {\n"
2195f5a7458SNico Weber "class Z {};\n"
2205f5a7458SNico Weber "} // namespace z\n"
2215f5a7458SNico Weber "namespace y {\n"
2225f5a7458SNico Weber "class T {};\n"
2235f5a7458SNico Weber "} // namespace y\n"
2245f5a7458SNico Weber "} // namespace x\n"
2255f5a7458SNico Weber "namespace na {\n"
2265f5a7458SNico Weber "class A{};\n"
2275f5a7458SNico Weber "namespace nb {\n"
2285f5a7458SNico Weber "class X { A a; x::z::Z zz; x::y::T t; };\n"
2295f5a7458SNico Weber "} // namespace nb\n"
2305f5a7458SNico Weber "} // namespace na\n";
2315f5a7458SNico Weber std::string Expected = "namespace x {\n"
2325f5a7458SNico Weber "namespace z {\n"
2335f5a7458SNico Weber "class Z {};\n"
2345f5a7458SNico Weber "} // namespace z\n"
2355f5a7458SNico Weber "namespace y {\n"
2365f5a7458SNico Weber "class T {};\n"
2375f5a7458SNico Weber "} // namespace y\n"
2385f5a7458SNico Weber "} // namespace x\n"
2395f5a7458SNico Weber "namespace na {\n"
2405f5a7458SNico Weber "class A {};\n\n"
2415f5a7458SNico Weber "} // namespace na\n"
2425f5a7458SNico Weber "namespace x {\n"
2435f5a7458SNico Weber "namespace y {\n"
2445f5a7458SNico Weber "class X { na::A a; z::Z zz; T t; };\n"
2455f5a7458SNico Weber "} // namespace y\n"
2465f5a7458SNico Weber "} // namespace x\n";
2475f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
2485f5a7458SNico Weber }
2495f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,SimpleMoveNestedNamespace)2505f5a7458SNico Weber TEST_F(ChangeNamespaceTest, SimpleMoveNestedNamespace) {
2515f5a7458SNico Weber NewNamespace = "na::x::y";
2525f5a7458SNico Weber std::string Code = "namespace na {\n"
2535f5a7458SNico Weber "class A {};\n"
2545f5a7458SNico Weber "namespace nb {\n"
2555f5a7458SNico Weber "class B {};\n"
2565f5a7458SNico Weber "} // namespace nb\n"
2575f5a7458SNico Weber "} // namespace na\n";
2585f5a7458SNico Weber std::string Expected = "namespace na {\n"
2595f5a7458SNico Weber "class A {};\n"
2605f5a7458SNico Weber "\n"
2615f5a7458SNico Weber "namespace x {\n"
2625f5a7458SNico Weber "namespace y {\n"
2635f5a7458SNico Weber "class B {};\n"
2645f5a7458SNico Weber "} // namespace y\n"
2655f5a7458SNico Weber "} // namespace x\n"
2665f5a7458SNico Weber "} // namespace na\n";
2675f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
2685f5a7458SNico Weber }
2695f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,SimpleMoveWithTypeRefs)2705f5a7458SNico Weber TEST_F(ChangeNamespaceTest, SimpleMoveWithTypeRefs) {
2715f5a7458SNico Weber std::string Code = "namespace na {\n"
2725f5a7458SNico Weber "class C_A {};\n"
2735f5a7458SNico Weber "namespace nc {\n"
2745f5a7458SNico Weber "class C_C {};"
2755f5a7458SNico Weber "} // namespace nc\n"
2765f5a7458SNico Weber "namespace nb {\n"
2775f5a7458SNico Weber "class C_X {\n"
2785f5a7458SNico Weber "public:\n"
2795f5a7458SNico Weber " C_A a;\n"
2805f5a7458SNico Weber " nc::C_C c;\n"
2815f5a7458SNico Weber "};\n"
2825f5a7458SNico Weber "class C_Y {\n"
2835f5a7458SNico Weber " C_X x;\n"
2845f5a7458SNico Weber "};\n"
2855f5a7458SNico Weber "} // namespace nb\n"
2865f5a7458SNico Weber "} // namespace na\n";
2875f5a7458SNico Weber std::string Expected = "namespace na {\n"
2885f5a7458SNico Weber "class C_A {};\n"
2895f5a7458SNico Weber "namespace nc {\n"
2905f5a7458SNico Weber "class C_C {};"
2915f5a7458SNico Weber "} // namespace nc\n"
2925f5a7458SNico Weber "\n"
2935f5a7458SNico Weber "} // namespace na\n"
2945f5a7458SNico Weber "namespace x {\n"
2955f5a7458SNico Weber "namespace y {\n"
2965f5a7458SNico Weber "class C_X {\n"
2975f5a7458SNico Weber "public:\n"
2985f5a7458SNico Weber " na::C_A a;\n"
2995f5a7458SNico Weber " na::nc::C_C c;\n"
3005f5a7458SNico Weber "};\n"
3015f5a7458SNico Weber "class C_Y {\n"
3025f5a7458SNico Weber " C_X x;\n"
3035f5a7458SNico Weber "};\n"
3045f5a7458SNico Weber "} // namespace y\n"
3055f5a7458SNico Weber "} // namespace x\n";
3065f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
3075f5a7458SNico Weber }
3085f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,TypeLocInTemplateSpecialization)3095f5a7458SNico Weber TEST_F(ChangeNamespaceTest, TypeLocInTemplateSpecialization) {
3105f5a7458SNico Weber std::string Code = "namespace na {\n"
3115f5a7458SNico Weber "class A {};\n"
3125f5a7458SNico Weber "template <typename T>\n"
3135f5a7458SNico Weber "class B {};\n"
3145f5a7458SNico Weber "template <typename T1, typename T2>\n"
3155f5a7458SNico Weber "class Two {};\n"
3165f5a7458SNico Weber "namespace nc { class C {}; }\n"
3175f5a7458SNico Weber "} // na\n"
3185f5a7458SNico Weber "\n"
3195f5a7458SNico Weber "namespace na {\n"
3205f5a7458SNico Weber "namespace nb {\n"
3215f5a7458SNico Weber "void f() {\n"
3225f5a7458SNico Weber " B<A> b;\n"
3235f5a7458SNico Weber " B<nc::C> b_c;\n"
3245f5a7458SNico Weber " Two<A, nc::C> two;\n"
3255f5a7458SNico Weber "}\n"
3265f5a7458SNico Weber "} // nb\n"
3275f5a7458SNico Weber "} // na\n";
3285f5a7458SNico Weber std::string Expected = "namespace na {\n"
3295f5a7458SNico Weber "class A {};\n"
3305f5a7458SNico Weber "template <typename T>\n"
3315f5a7458SNico Weber "class B {};\n"
3325f5a7458SNico Weber "template <typename T1, typename T2>\n"
3335f5a7458SNico Weber "class Two {};\n"
3345f5a7458SNico Weber "namespace nc { class C {}; }\n"
3355f5a7458SNico Weber "} // na\n"
3365f5a7458SNico Weber "\n"
3375f5a7458SNico Weber "\n"
3385f5a7458SNico Weber "namespace x {\n"
3395f5a7458SNico Weber "namespace y {\n"
3405f5a7458SNico Weber "void f() {\n"
3415f5a7458SNico Weber " na::B<na::A> b;\n"
3425f5a7458SNico Weber " na::B<na::nc::C> b_c;\n"
3435f5a7458SNico Weber " na::Two<na::A, na::nc::C> two;\n"
3445f5a7458SNico Weber "}\n"
3455f5a7458SNico Weber "} // namespace y\n"
3465f5a7458SNico Weber "} // namespace x\n";
3475f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
3485f5a7458SNico Weber }
3495f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,LeaveForwardDeclarationBehind)3505f5a7458SNico Weber TEST_F(ChangeNamespaceTest, LeaveForwardDeclarationBehind) {
3515f5a7458SNico Weber std::string Code = "namespace na {\n"
3525f5a7458SNico Weber "namespace nb {\n"
3535f5a7458SNico Weber "class FWD;\n"
3545f5a7458SNico Weber "class FWD2;\n"
3555f5a7458SNico Weber "class A {\n"
3565f5a7458SNico Weber " FWD *fwd;\n"
3575f5a7458SNico Weber "};\n"
3585f5a7458SNico Weber "} // namespace nb\n"
3595f5a7458SNico Weber "} // namespace na\n";
3605f5a7458SNico Weber std::string Expected = "namespace na {\n"
3615f5a7458SNico Weber "namespace nb {\n"
3625f5a7458SNico Weber "class FWD;\n"
3635f5a7458SNico Weber "class FWD2;\n"
3645f5a7458SNico Weber "} // namespace nb\n"
3655f5a7458SNico Weber "} // namespace na\n"
3665f5a7458SNico Weber "namespace x {\n"
3675f5a7458SNico Weber "namespace y {\n"
3685f5a7458SNico Weber "\n"
3695f5a7458SNico Weber "class A {\n"
3705f5a7458SNico Weber " na::nb::FWD *fwd;\n"
3715f5a7458SNico Weber "};\n"
3725f5a7458SNico Weber "} // namespace y\n"
3735f5a7458SNico Weber "} // namespace x\n";
3745f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
3755f5a7458SNico Weber }
3765f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,InsertForwardDeclsProperly)3775f5a7458SNico Weber TEST_F(ChangeNamespaceTest, InsertForwardDeclsProperly) {
3785f5a7458SNico Weber std::string Code = "namespace na {\n"
3795f5a7458SNico Weber "namespace nb {\n"
3805f5a7458SNico Weber "\n"
3815f5a7458SNico Weber "class FWD;\n"
3825f5a7458SNico Weber "class FWD2;\n"
3835f5a7458SNico Weber "class A {\n"
3845f5a7458SNico Weber " FWD *fwd;\n"
3855f5a7458SNico Weber "};\n"
3865f5a7458SNico Weber "\n"
3875f5a7458SNico Weber "} // namespace nb\n"
3885f5a7458SNico Weber "} // namespace na\n";
3895f5a7458SNico Weber std::string Expected = "namespace na {\n"
3905f5a7458SNico Weber "namespace nb {\n"
3915f5a7458SNico Weber "class FWD;\n"
3925f5a7458SNico Weber "class FWD2;\n"
3935f5a7458SNico Weber "} // namespace nb\n"
3945f5a7458SNico Weber "} // namespace na\n"
3955f5a7458SNico Weber "namespace x {\n"
3965f5a7458SNico Weber "namespace y {\n"
3975f5a7458SNico Weber "\n"
3985f5a7458SNico Weber "class A {\n"
3995f5a7458SNico Weber " na::nb::FWD *fwd;\n"
4005f5a7458SNico Weber "};\n"
4015f5a7458SNico Weber "\n"
4025f5a7458SNico Weber "} // namespace y\n"
4035f5a7458SNico Weber "} // namespace x\n";
4045f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
4055f5a7458SNico Weber }
4065f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,TemplateClassForwardDeclaration)4075f5a7458SNico Weber TEST_F(ChangeNamespaceTest, TemplateClassForwardDeclaration) {
4085f5a7458SNico Weber std::string Code = "namespace na {\n"
4095f5a7458SNico Weber "namespace nb {\n"
4105f5a7458SNico Weber "class FWD;\n"
4115f5a7458SNico Weber "template<typename T> class FWD_TEMP;\n"
4125f5a7458SNico Weber "class A {\n"
4135f5a7458SNico Weber " FWD *fwd;\n"
4145f5a7458SNico Weber "};\n"
4155f5a7458SNico Weber "template<typename T> class TEMP {};\n"
4165f5a7458SNico Weber "} // namespace nb\n"
4175f5a7458SNico Weber "} // namespace na\n";
4185f5a7458SNico Weber std::string Expected = "namespace na {\n"
4195f5a7458SNico Weber "namespace nb {\n"
4205f5a7458SNico Weber "class FWD;\n"
4215f5a7458SNico Weber "template<typename T> class FWD_TEMP;\n"
4225f5a7458SNico Weber "} // namespace nb\n"
4235f5a7458SNico Weber "} // namespace na\n"
4245f5a7458SNico Weber "namespace x {\n"
4255f5a7458SNico Weber "namespace y {\n"
4265f5a7458SNico Weber "\n"
4275f5a7458SNico Weber "class A {\n"
4285f5a7458SNico Weber " na::nb::FWD *fwd;\n"
4295f5a7458SNico Weber "};\n"
4305f5a7458SNico Weber "template<typename T> class TEMP {};\n"
4315f5a7458SNico Weber "} // namespace y\n"
4325f5a7458SNico Weber "} // namespace x\n";
4335f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
4345f5a7458SNico Weber }
4355f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,DontMoveForwardDeclarationInClass)4365f5a7458SNico Weber TEST_F(ChangeNamespaceTest, DontMoveForwardDeclarationInClass) {
4375f5a7458SNico Weber std::string Code = "namespace na {\n"
4385f5a7458SNico Weber "namespace nb {\n"
4395f5a7458SNico Weber "class A {\n"
4405f5a7458SNico Weber " class FWD;\n"
4415f5a7458SNico Weber " FWD *fwd;\n"
4425f5a7458SNico Weber " template<typename T> class FWD_TEMP;\n"
4435f5a7458SNico Weber "};\n"
4445f5a7458SNico Weber "} // namespace nb\n"
4455f5a7458SNico Weber "} // namespace na\n";
4465f5a7458SNico Weber std::string Expected = "\n\n"
4475f5a7458SNico Weber "namespace x {\n"
4485f5a7458SNico Weber "namespace y {\n"
4495f5a7458SNico Weber "class A {\n"
4505f5a7458SNico Weber " class FWD;\n"
4515f5a7458SNico Weber " FWD *fwd;\n"
4525f5a7458SNico Weber " template<typename T> class FWD_TEMP;\n"
4535f5a7458SNico Weber "};\n"
4545f5a7458SNico Weber "} // namespace y\n"
4555f5a7458SNico Weber "} // namespace x\n";
4565f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
4575f5a7458SNico Weber }
4585f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,MoveFunctions)4595f5a7458SNico Weber TEST_F(ChangeNamespaceTest, MoveFunctions) {
4605f5a7458SNico Weber std::string Code = "namespace na {\n"
4615f5a7458SNico Weber "class C_A {};\n"
4625f5a7458SNico Weber "namespace nc {\n"
4635f5a7458SNico Weber "class C_C {};"
4645f5a7458SNico Weber "} // namespace nc\n"
4655f5a7458SNico Weber "namespace nb {\n"
4665f5a7458SNico Weber "void fwd();\n"
4675f5a7458SNico Weber "void f(C_A ca, nc::C_C cc) {\n"
4685f5a7458SNico Weber " C_A ca_1 = ca;\n"
4695f5a7458SNico Weber "}\n"
4705f5a7458SNico Weber "} // namespace nb\n"
4715f5a7458SNico Weber "} // namespace na\n";
4725f5a7458SNico Weber
4735f5a7458SNico Weber std::string Expected = "namespace na {\n"
4745f5a7458SNico Weber "class C_A {};\n"
4755f5a7458SNico Weber "namespace nc {\n"
4765f5a7458SNico Weber "class C_C {};"
4775f5a7458SNico Weber "} // namespace nc\n"
4785f5a7458SNico Weber "\n"
4795f5a7458SNico Weber "} // namespace na\n"
4805f5a7458SNico Weber "namespace x {\n"
4815f5a7458SNico Weber "namespace y {\n"
4825f5a7458SNico Weber "void fwd();\n"
4835f5a7458SNico Weber "void f(na::C_A ca, na::nc::C_C cc) {\n"
4845f5a7458SNico Weber " na::C_A ca_1 = ca;\n"
4855f5a7458SNico Weber "}\n"
4865f5a7458SNico Weber "} // namespace y\n"
4875f5a7458SNico Weber "} // namespace x\n";
4885f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
4895f5a7458SNico Weber }
4905f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,FixUsingShadowDecl)4915f5a7458SNico Weber TEST_F(ChangeNamespaceTest, FixUsingShadowDecl) {
4925f5a7458SNico Weber std::string Code = "class GLOB {};\n"
4935f5a7458SNico Weber "using BLOG = GLOB;\n"
4945f5a7458SNico Weber "namespace na {\n"
4955f5a7458SNico Weber "namespace nc {\n"
4965f5a7458SNico Weber "class SAME {};\n"
4975f5a7458SNico Weber "}\n"
4985f5a7458SNico Weber "namespace nd {\n"
4995f5a7458SNico Weber "class SAME {};\n"
5005f5a7458SNico Weber "}\n"
5015f5a7458SNico Weber "namespace nb {\n"
5025f5a7458SNico Weber "using nc::SAME;\n"
5035f5a7458SNico Weber "using YO = nd::SAME;\n"
5045f5a7458SNico Weber "typedef nd::SAME IDENTICAL;\n"
5055f5a7458SNico Weber "void f(nd::SAME Same) {}\n"
5065f5a7458SNico Weber "} // namespace nb\n"
5075f5a7458SNico Weber "} // namespace na\n";
5085f5a7458SNico Weber
5095f5a7458SNico Weber std::string Expected = "class GLOB {};\n"
5105f5a7458SNico Weber "using BLOG = GLOB;\n"
5115f5a7458SNico Weber "namespace na {\n"
5125f5a7458SNico Weber "namespace nc {\n"
5135f5a7458SNico Weber "class SAME {};\n"
5145f5a7458SNico Weber "}\n"
5155f5a7458SNico Weber "namespace nd {\n"
5165f5a7458SNico Weber "class SAME {};\n"
5175f5a7458SNico Weber "}\n"
5185f5a7458SNico Weber "\n"
5195f5a7458SNico Weber "} // namespace na\n"
5205f5a7458SNico Weber "namespace x {\n"
5215f5a7458SNico Weber "namespace y {\n"
5225f5a7458SNico Weber "using ::na::nc::SAME;\n"
5235f5a7458SNico Weber "using YO = na::nd::SAME;\n"
5245f5a7458SNico Weber "typedef na::nd::SAME IDENTICAL;\n"
5255f5a7458SNico Weber "void f(na::nd::SAME Same) {}\n"
5265f5a7458SNico Weber "} // namespace y\n"
5275f5a7458SNico Weber "} // namespace x\n";
5285f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
5295f5a7458SNico Weber }
5305f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,DontFixUsingShadowDeclInClasses)5315f5a7458SNico Weber TEST_F(ChangeNamespaceTest, DontFixUsingShadowDeclInClasses) {
5325f5a7458SNico Weber std::string Code = "namespace na {\n"
5335f5a7458SNico Weber "class A {};\n"
5345f5a7458SNico Weber "class Base { public: Base() {} void m() {} };\n"
5355f5a7458SNico Weber "namespace nb {\n"
5365f5a7458SNico Weber "class D : public Base {\n"
5375f5a7458SNico Weber "public:\n"
5385f5a7458SNico Weber " using AA = A; using B = Base;\n"
5395f5a7458SNico Weber " using Base::m; using Base::Base;\n"
5405f5a7458SNico Weber "};"
5415f5a7458SNico Weber "} // namespace nb\n"
5425f5a7458SNico Weber "} // namespace na\n";
5435f5a7458SNico Weber
5445f5a7458SNico Weber std::string Expected = "namespace na {\n"
5455f5a7458SNico Weber "class A {};\n"
5465f5a7458SNico Weber "class Base { public: Base() {} void m() {} };\n"
5475f5a7458SNico Weber "\n"
5485f5a7458SNico Weber "} // namespace na\n"
5495f5a7458SNico Weber "namespace x {\n"
5505f5a7458SNico Weber "namespace y {\n"
5515f5a7458SNico Weber "class D : public na::Base {\n"
5525f5a7458SNico Weber "public:\n"
5535f5a7458SNico Weber " using AA = na::A; using B = na::Base;\n"
5545f5a7458SNico Weber " using Base::m; using Base::Base;\n"
5555f5a7458SNico Weber "};"
5565f5a7458SNico Weber "} // namespace y\n"
5575f5a7458SNico Weber "} // namespace x\n";
5585f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
5595f5a7458SNico Weber }
5605f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,TypeInNestedNameSpecifier)5615f5a7458SNico Weber TEST_F(ChangeNamespaceTest, TypeInNestedNameSpecifier) {
5625f5a7458SNico Weber std::string Code =
5635f5a7458SNico Weber "namespace na {\n"
5645f5a7458SNico Weber "class C_A {\n"
5655f5a7458SNico Weber "public:\n"
5665f5a7458SNico Weber " class Nested {\n"
5675f5a7458SNico Weber " public:\n"
5685f5a7458SNico Weber " static int NestedX;\n"
5695f5a7458SNico Weber " static void nestedFunc() {}\n"
5705f5a7458SNico Weber " };\n"
5715f5a7458SNico Weber "};\n"
5725f5a7458SNico Weber "namespace nb {\n"
5735f5a7458SNico Weber "class C_X {\n"
5745f5a7458SNico Weber " C_A na;\n"
5755f5a7458SNico Weber " C_A::Nested nested;\n"
5765f5a7458SNico Weber " void f() {\n"
5775f5a7458SNico Weber " C_A::Nested::nestedFunc();\n"
5785f5a7458SNico Weber " int X = C_A::Nested::NestedX;\n"
5795f5a7458SNico Weber " }\n"
5805f5a7458SNico Weber "};\n"
5815f5a7458SNico Weber "} // namespace nb\n"
5825f5a7458SNico Weber "} // namespace na\n";
5835f5a7458SNico Weber std::string Expected =
5845f5a7458SNico Weber "namespace na {\n"
5855f5a7458SNico Weber "class C_A {\n"
5865f5a7458SNico Weber "public:\n"
5875f5a7458SNico Weber " class Nested {\n"
5885f5a7458SNico Weber " public:\n"
5895f5a7458SNico Weber " static int NestedX;\n"
5905f5a7458SNico Weber " static void nestedFunc() {}\n"
5915f5a7458SNico Weber " };\n"
5925f5a7458SNico Weber "};\n"
5935f5a7458SNico Weber "\n"
5945f5a7458SNico Weber "} // namespace na\n"
5955f5a7458SNico Weber "namespace x {\n"
5965f5a7458SNico Weber "namespace y {\n"
5975f5a7458SNico Weber "class C_X {\n"
5985f5a7458SNico Weber " na::C_A na;\n"
5995f5a7458SNico Weber " na::C_A::Nested nested;\n"
6005f5a7458SNico Weber " void f() {\n"
6015f5a7458SNico Weber " na::C_A::Nested::nestedFunc();\n"
6025f5a7458SNico Weber " int X = na::C_A::Nested::NestedX;\n"
6035f5a7458SNico Weber " }\n"
6045f5a7458SNico Weber "};\n"
6055f5a7458SNico Weber "} // namespace y\n"
6065f5a7458SNico Weber "} // namespace x\n";
6075f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
6085f5a7458SNico Weber }
6095f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,FixFunctionNameSpecifiers)6105f5a7458SNico Weber TEST_F(ChangeNamespaceTest, FixFunctionNameSpecifiers) {
6115f5a7458SNico Weber std::string Code =
6125f5a7458SNico Weber "namespace na {\n"
6135f5a7458SNico Weber "class A {\n"
6145f5a7458SNico Weber "public:\n"
6155f5a7458SNico Weber " static void f() {}\n"
6165f5a7458SNico Weber " static void g();\n"
6175f5a7458SNico Weber "};\n"
6185f5a7458SNico Weber "void A::g() {}"
6195f5a7458SNico Weber "void a_f() {}\n"
6205f5a7458SNico Weber "static void static_f() {}\n"
6215f5a7458SNico Weber "namespace nb {\n"
6225f5a7458SNico Weber "void f() { a_f(); static_f(); A::f(); }\n"
6235f5a7458SNico Weber "void g() { f(); A::g(); }\n"
6245f5a7458SNico Weber "} // namespace nb\n"
6255f5a7458SNico Weber "} // namespace na\n";
6265f5a7458SNico Weber std::string Expected =
6275f5a7458SNico Weber "namespace na {\n"
6285f5a7458SNico Weber "class A {\n"
6295f5a7458SNico Weber "public:\n"
6305f5a7458SNico Weber " static void f() {}\n"
6315f5a7458SNico Weber " static void g();\n"
6325f5a7458SNico Weber "};\n"
6335f5a7458SNico Weber "void A::g() {}"
6345f5a7458SNico Weber "void a_f() {}\n"
6355f5a7458SNico Weber "static void static_f() {}\n"
6365f5a7458SNico Weber "\n"
6375f5a7458SNico Weber "} // namespace na\n"
6385f5a7458SNico Weber "namespace x {\n"
6395f5a7458SNico Weber "namespace y {\n"
6405f5a7458SNico Weber "void f() { na::a_f(); na::static_f(); na::A::f(); }\n"
6415f5a7458SNico Weber "void g() { f(); na::A::g(); }\n"
6425f5a7458SNico Weber "} // namespace y\n"
6435f5a7458SNico Weber "} // namespace x\n";
6445f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
6455f5a7458SNico Weber }
6465f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,FixOverloadedOperatorFunctionNameSpecifiers)6475f5a7458SNico Weber TEST_F(ChangeNamespaceTest, FixOverloadedOperatorFunctionNameSpecifiers) {
6485f5a7458SNico Weber std::string Code =
6495f5a7458SNico Weber "namespace na {\n"
6505f5a7458SNico Weber "class A {\n"
6515f5a7458SNico Weber "public:\n"
6525f5a7458SNico Weber " int x;\n"
6535f5a7458SNico Weber " bool operator==(const A &RHS) const { return x == RHS.x; }\n"
6545f5a7458SNico Weber "};\n"
6555f5a7458SNico Weber "bool operator<(const A &LHS, const A &RHS) { return LHS.x == RHS.x; }\n"
6565f5a7458SNico Weber "namespace nb {\n"
6575f5a7458SNico Weber "bool f() {\n"
6585f5a7458SNico Weber " A x, y;\n"
6595f5a7458SNico Weber " auto f = operator<;\n"
6605f5a7458SNico Weber " return (x == y) && (x < y) && (operator<(x, y));\n"
6615f5a7458SNico Weber "}\n"
6625f5a7458SNico Weber "} // namespace nb\n"
6635f5a7458SNico Weber "} // namespace na\n";
6645f5a7458SNico Weber std::string Expected =
6655f5a7458SNico Weber "namespace na {\n"
6665f5a7458SNico Weber "class A {\n"
6675f5a7458SNico Weber "public:\n"
6685f5a7458SNico Weber " int x;\n"
6695f5a7458SNico Weber " bool operator==(const A &RHS) const { return x == RHS.x; }\n"
6705f5a7458SNico Weber "};\n"
6715f5a7458SNico Weber "bool operator<(const A &LHS, const A &RHS) { return LHS.x == RHS.x; }\n"
6725f5a7458SNico Weber "\n"
6735f5a7458SNico Weber "} // namespace na\n"
6745f5a7458SNico Weber "namespace x {\n"
6755f5a7458SNico Weber "namespace y {\n"
6765f5a7458SNico Weber "bool f() {\n"
6775f5a7458SNico Weber " na::A x, y;\n"
6785f5a7458SNico Weber " auto f = na::operator<;\n"
6795f5a7458SNico Weber // FIXME: function calls to overloaded operators are not fixed now even if
6805f5a7458SNico Weber // they are referenced by qualified names.
6815f5a7458SNico Weber " return (x == y) && (x < y) && (operator<(x,y));\n"
6825f5a7458SNico Weber "}\n"
6835f5a7458SNico Weber "} // namespace y\n"
6845f5a7458SNico Weber "} // namespace x\n";
6855f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
6865f5a7458SNico Weber }
6875f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,FixNonCallingFunctionReferences)6885f5a7458SNico Weber TEST_F(ChangeNamespaceTest, FixNonCallingFunctionReferences) {
6895f5a7458SNico Weber std::string Code = "namespace na {\n"
6905f5a7458SNico Weber "class A {\n"
6915f5a7458SNico Weber "public:\n"
6925f5a7458SNico Weber " static void f() {}\n"
6935f5a7458SNico Weber "};\n"
6945f5a7458SNico Weber "void a_f() {}\n"
6955f5a7458SNico Weber "static void s_f() {}\n"
6965f5a7458SNico Weber "namespace nb {\n"
6975f5a7458SNico Weber "void f() {\n"
6985f5a7458SNico Weber " auto *ref1 = A::f;\n"
6995f5a7458SNico Weber " auto *ref2 = a_f;\n"
7005f5a7458SNico Weber " auto *ref3 = s_f;\n"
7015f5a7458SNico Weber "}\n"
7025f5a7458SNico Weber "} // namespace nb\n"
7035f5a7458SNico Weber "} // namespace na\n";
7045f5a7458SNico Weber std::string Expected =
7055f5a7458SNico Weber "namespace na {\n"
7065f5a7458SNico Weber "class A {\n"
7075f5a7458SNico Weber "public:\n"
7085f5a7458SNico Weber " static void f() {}\n"
7095f5a7458SNico Weber "};\n"
7105f5a7458SNico Weber "void a_f() {}\n"
7115f5a7458SNico Weber "static void s_f() {}\n"
7125f5a7458SNico Weber "\n"
7135f5a7458SNico Weber "} // namespace na\n"
7145f5a7458SNico Weber "namespace x {\n"
7155f5a7458SNico Weber "namespace y {\n"
7165f5a7458SNico Weber "void f() {\n"
7175f5a7458SNico Weber " auto *ref1 = na::A::f;\n"
7185f5a7458SNico Weber " auto *ref2 = na::a_f;\n"
7195f5a7458SNico Weber " auto *ref3 = na::s_f;\n"
7205f5a7458SNico Weber "}\n"
7215f5a7458SNico Weber "} // namespace y\n"
7225f5a7458SNico Weber "} // namespace x\n";
7235f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
7245f5a7458SNico Weber }
7255f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,MoveAndFixGlobalVariables)7265f5a7458SNico Weber TEST_F(ChangeNamespaceTest, MoveAndFixGlobalVariables) {
7275f5a7458SNico Weber std::string Code = "namespace na {\n"
7285f5a7458SNico Weber "int GlobA;\n"
7295f5a7458SNico Weber "static int GlobAStatic = 0;\n"
7305f5a7458SNico Weber "namespace nc { int GlobC; }\n"
7315f5a7458SNico Weber "namespace nb {\n"
7325f5a7458SNico Weber "int GlobB;\n"
7335f5a7458SNico Weber "void f() {\n"
7345f5a7458SNico Weber " int a = GlobA;\n"
7355f5a7458SNico Weber " int b = GlobAStatic;\n"
7365f5a7458SNico Weber " int c = nc::GlobC;\n"
7375f5a7458SNico Weber "}\n"
7385f5a7458SNico Weber "} // namespace nb\n"
7395f5a7458SNico Weber "} // namespace na\n";
7405f5a7458SNico Weber
7415f5a7458SNico Weber std::string Expected = "namespace na {\n"
7425f5a7458SNico Weber "int GlobA;\n"
7435f5a7458SNico Weber "static int GlobAStatic = 0;\n"
7445f5a7458SNico Weber "namespace nc { int GlobC; }\n"
7455f5a7458SNico Weber "\n"
7465f5a7458SNico Weber "} // namespace na\n"
7475f5a7458SNico Weber "namespace x {\n"
7485f5a7458SNico Weber "namespace y {\n"
7495f5a7458SNico Weber "int GlobB;\n"
7505f5a7458SNico Weber "void f() {\n"
7515f5a7458SNico Weber " int a = na::GlobA;\n"
7525f5a7458SNico Weber " int b = na::GlobAStatic;\n"
7535f5a7458SNico Weber " int c = na::nc::GlobC;\n"
7545f5a7458SNico Weber "}\n"
7555f5a7458SNico Weber "} // namespace y\n"
7565f5a7458SNico Weber "} // namespace x\n";
7575f5a7458SNico Weber
7585f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
7595f5a7458SNico Weber }
7605f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,DoNotFixStaticVariableOfClass)7615f5a7458SNico Weber TEST_F(ChangeNamespaceTest, DoNotFixStaticVariableOfClass) {
7625f5a7458SNico Weber std::string Code = "namespace na {\n"
7635f5a7458SNico Weber "class A {\n"
7645f5a7458SNico Weber "public:\n"
7655f5a7458SNico Weber "static int A1;\n"
7665f5a7458SNico Weber "static int A2;\n"
7675f5a7458SNico Weber "};\n"
7685f5a7458SNico Weber "int A::A1 = 0;\n"
7695f5a7458SNico Weber "namespace nb {\n"
7705f5a7458SNico Weber "void f() {\n"
7715f5a7458SNico Weber " int a = A::A1; int b = A::A2;\n"
7725f5a7458SNico Weber "}\n"
7735f5a7458SNico Weber "} // namespace nb\n"
7745f5a7458SNico Weber "} // namespace na\n";
7755f5a7458SNico Weber
7765f5a7458SNico Weber std::string Expected = "namespace na {\n"
7775f5a7458SNico Weber "class A {\n"
7785f5a7458SNico Weber "public:\n"
7795f5a7458SNico Weber "static int A1;\n"
7805f5a7458SNico Weber "static int A2;\n"
7815f5a7458SNico Weber "};\n"
7825f5a7458SNico Weber "int A::A1 = 0;\n"
7835f5a7458SNico Weber "\n"
7845f5a7458SNico Weber "} // namespace na\n"
7855f5a7458SNico Weber "namespace x {\n"
7865f5a7458SNico Weber "namespace y {\n"
7875f5a7458SNico Weber "void f() {\n"
7885f5a7458SNico Weber " int a = na::A::A1; int b = na::A::A2;\n"
7895f5a7458SNico Weber "}\n"
7905f5a7458SNico Weber "} // namespace y\n"
7915f5a7458SNico Weber "} // namespace x\n";
7925f5a7458SNico Weber
7935f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
7945f5a7458SNico Weber }
7955f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,NoMisplaceAtEOF)7965f5a7458SNico Weber TEST_F(ChangeNamespaceTest, NoMisplaceAtEOF) {
7975f5a7458SNico Weber std::string Code = "namespace na {\n"
7985f5a7458SNico Weber "namespace nb {\n"
7995f5a7458SNico Weber "class A;\n"
8005f5a7458SNico Weber "class B {};\n"
8015f5a7458SNico Weber "}"
8025f5a7458SNico Weber "}";
8035f5a7458SNico Weber std::string Expected = "namespace na {\n"
8045f5a7458SNico Weber "namespace nb {\n"
8055f5a7458SNico Weber "class A;\n"
8065f5a7458SNico Weber "}\n"
8075f5a7458SNico Weber "}\n"
8085f5a7458SNico Weber "namespace x {\n"
8095f5a7458SNico Weber "namespace y {\n"
8105f5a7458SNico Weber "\n"
8115f5a7458SNico Weber "class B {};\n"
8125f5a7458SNico Weber "} // namespace y\n"
8135f5a7458SNico Weber "} // namespace x\n";
8145f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
8155f5a7458SNico Weber }
8165f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,CommentsBeforeMovedClass)8175f5a7458SNico Weber TEST_F(ChangeNamespaceTest, CommentsBeforeMovedClass) {
8185f5a7458SNico Weber std::string Code = "namespace na {\n"
8195f5a7458SNico Weber "namespace nb {\n"
8205f5a7458SNico Weber "\n\n"
8215f5a7458SNico Weber "// Wild comments.\n"
8225f5a7458SNico Weber "\n"
8235f5a7458SNico Weber "// Comments.\n"
8245f5a7458SNico Weber "// More comments.\n"
8255f5a7458SNico Weber "class B {\n"
8265f5a7458SNico Weber " // Private comments.\n"
8275f5a7458SNico Weber " int a;\n"
8285f5a7458SNico Weber "};\n"
8295f5a7458SNico Weber "}\n"
8305f5a7458SNico Weber "}";
8315f5a7458SNico Weber std::string Expected = "\n"
8325f5a7458SNico Weber "\n"
8335f5a7458SNico Weber "namespace x {\n"
8345f5a7458SNico Weber "namespace y {\n"
8355f5a7458SNico Weber "\n\n"
8365f5a7458SNico Weber "// Wild comments.\n"
8375f5a7458SNico Weber "\n"
8385f5a7458SNico Weber "// Comments.\n"
8395f5a7458SNico Weber "// More comments.\n"
8405f5a7458SNico Weber "class B {\n"
8415f5a7458SNico Weber " // Private comments.\n"
8425f5a7458SNico Weber " int a;\n"
8435f5a7458SNico Weber "};\n"
8445f5a7458SNico Weber "} // namespace y\n"
8455f5a7458SNico Weber "} // namespace x\n";
8465f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
8475f5a7458SNico Weber }
8485f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,UsingShadowDeclInGlobal)8495f5a7458SNico Weber TEST_F(ChangeNamespaceTest, UsingShadowDeclInGlobal) {
8505f5a7458SNico Weber std::string Code = "namespace glob {\n"
8515f5a7458SNico Weber "class Glob {};\n"
8525f5a7458SNico Weber "void GFunc() {}\n"
8535f5a7458SNico Weber "}\n"
8545f5a7458SNico Weber "using glob::Glob;\n"
8555f5a7458SNico Weber "using glob::GFunc;\n"
8565f5a7458SNico Weber "namespace na {\n"
8575f5a7458SNico Weber "namespace nb {\n"
8585f5a7458SNico Weber "void f() { Glob g; GFunc(); }\n"
8595f5a7458SNico Weber "} // namespace nb\n"
8605f5a7458SNico Weber "} // namespace na\n";
8615f5a7458SNico Weber
8625f5a7458SNico Weber std::string Expected = "namespace glob {\n"
8635f5a7458SNico Weber "class Glob {};\n"
8645f5a7458SNico Weber "void GFunc() {}\n"
8655f5a7458SNico Weber "}\n"
8665f5a7458SNico Weber "using glob::Glob;\n"
8675f5a7458SNico Weber "using glob::GFunc;\n"
8685f5a7458SNico Weber "\n"
8695f5a7458SNico Weber "namespace x {\n"
8705f5a7458SNico Weber "namespace y {\n"
8715f5a7458SNico Weber "void f() { Glob g; GFunc(); }\n"
8725f5a7458SNico Weber "} // namespace y\n"
8735f5a7458SNico Weber "} // namespace x\n";
8745f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
8755f5a7458SNico Weber }
8765f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,UsingShadowDeclsInAnonymousNamespaces)8775f5a7458SNico Weber TEST_F(ChangeNamespaceTest, UsingShadowDeclsInAnonymousNamespaces) {
8785f5a7458SNico Weber std::string Code = "namespace util {\n"
8795f5a7458SNico Weber "class Util {};\n"
8805f5a7458SNico Weber "void func() {}\n"
8815f5a7458SNico Weber "}\n"
8825f5a7458SNico Weber "namespace na {\n"
8835f5a7458SNico Weber "namespace nb {\n"
8845f5a7458SNico Weber "namespace {\n"
8855f5a7458SNico Weber "using ::util::Util;\n"
8865f5a7458SNico Weber "using ::util::func;\n"
8875f5a7458SNico Weber "void f() { Util u; func(); }\n"
8885f5a7458SNico Weber "}\n"
8895f5a7458SNico Weber "} // namespace nb\n"
8905f5a7458SNico Weber "} // namespace na\n";
8915f5a7458SNico Weber
8925f5a7458SNico Weber std::string Expected = "namespace util {\n"
8935f5a7458SNico Weber "class Util {};\n"
8945f5a7458SNico Weber "void func() {}\n"
8955f5a7458SNico Weber "} // namespace util\n"
8965f5a7458SNico Weber "\n"
8975f5a7458SNico Weber "namespace x {\n"
8985f5a7458SNico Weber "namespace y {\n"
8995f5a7458SNico Weber "namespace {\n"
9005f5a7458SNico Weber "using ::util::Util;\n"
9015f5a7458SNico Weber "using ::util::func;\n"
9025f5a7458SNico Weber "void f() { Util u; func(); }\n"
9035f5a7458SNico Weber "}\n"
9045f5a7458SNico Weber "} // namespace y\n"
9055f5a7458SNico Weber "} // namespace x\n";
9065f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
9075f5a7458SNico Weber }
9085f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,UsingNamespaceInGlobal)9095f5a7458SNico Weber TEST_F(ChangeNamespaceTest, UsingNamespaceInGlobal) {
9105f5a7458SNico Weber std::string Code = "namespace glob {\n"
9115f5a7458SNico Weber "class Glob {};\n"
9125f5a7458SNico Weber "}\n"
9135f5a7458SNico Weber "using namespace glob;\n"
9145f5a7458SNico Weber "namespace na {\n"
9155f5a7458SNico Weber "namespace nb {\n"
9165f5a7458SNico Weber "void f() { Glob g; }\n"
9175f5a7458SNico Weber "} // namespace nb\n"
9185f5a7458SNico Weber "} // namespace na\n";
9195f5a7458SNico Weber
9205f5a7458SNico Weber std::string Expected = "namespace glob {\n"
9215f5a7458SNico Weber "class Glob {};\n"
9225f5a7458SNico Weber "}\n"
9235f5a7458SNico Weber "using namespace glob;\n"
9245f5a7458SNico Weber "\n"
9255f5a7458SNico Weber "namespace x {\n"
9265f5a7458SNico Weber "namespace y {\n"
9275f5a7458SNico Weber "void f() { Glob g; }\n"
9285f5a7458SNico Weber "} // namespace y\n"
9295f5a7458SNico Weber "} // namespace x\n";
9305f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
9315f5a7458SNico Weber }
9325f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,NamespaceAliasInGlobal)9335f5a7458SNico Weber TEST_F(ChangeNamespaceTest, NamespaceAliasInGlobal) {
9345f5a7458SNico Weber std::string Code = "namespace glob {\n"
9355f5a7458SNico Weber "class Glob {};\n"
9365f5a7458SNico Weber "}\n"
9375f5a7458SNico Weber "namespace glob2 { class Glob2 {}; }\n"
9385f5a7458SNico Weber "namespace gl = glob;\n"
9395f5a7458SNico Weber "namespace gl2 = glob2;\n"
9405f5a7458SNico Weber "namespace na {\n"
9415f5a7458SNico Weber "namespace nb {\n"
9425f5a7458SNico Weber "void f() { gl::Glob g; gl2::Glob2 g2; }\n"
9435f5a7458SNico Weber "} // namespace nb\n"
9445f5a7458SNico Weber "} // namespace na\n";
9455f5a7458SNico Weber
9465f5a7458SNico Weber std::string Expected =
9475f5a7458SNico Weber "namespace glob {\n"
9485f5a7458SNico Weber "class Glob {};\n"
9495f5a7458SNico Weber "}\n"
9505f5a7458SNico Weber "namespace glob2 { class Glob2 {}; }\n"
9515f5a7458SNico Weber "namespace gl = glob;\n"
9525f5a7458SNico Weber "namespace gl2 = glob2;\n"
9535f5a7458SNico Weber "\n"
9545f5a7458SNico Weber "namespace x {\n"
9555f5a7458SNico Weber "namespace y {\n"
9565f5a7458SNico Weber "void f() { gl::Glob g; gl2::Glob2 g2; }\n"
9575f5a7458SNico Weber "} // namespace y\n"
9585f5a7458SNico Weber "} // namespace x\n";
9595f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
9605f5a7458SNico Weber }
9615f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,NamespaceAliasInNamespace)9625f5a7458SNico Weber TEST_F(ChangeNamespaceTest, NamespaceAliasInNamespace) {
9635f5a7458SNico Weber std::string Code = "namespace glob {\n"
9645f5a7458SNico Weber "class Glob {};\n"
9655f5a7458SNico Weber "}\n"
9665f5a7458SNico Weber "namespace na {\n"
9675f5a7458SNico Weber "namespace nb {\n"
9685f5a7458SNico Weber "namespace gl = glob;\n"
9695f5a7458SNico Weber "void f() { gl::Glob g; }\n"
9705f5a7458SNico Weber "} // namespace nb\n"
9715f5a7458SNico Weber "} // namespace na\n";
9725f5a7458SNico Weber
9735f5a7458SNico Weber std::string Expected = "namespace glob {\n"
9745f5a7458SNico Weber "class Glob {};\n"
9755f5a7458SNico Weber "}\n"
9765f5a7458SNico Weber "\n"
9775f5a7458SNico Weber "namespace x {\n"
9785f5a7458SNico Weber "namespace y {\n"
9795f5a7458SNico Weber "namespace gl = glob;\n"
9805f5a7458SNico Weber "void f() { gl::Glob g; }\n"
9815f5a7458SNico Weber "} // namespace y\n"
9825f5a7458SNico Weber "} // namespace x\n";
9835f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
9845f5a7458SNico Weber }
9855f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,NamespaceAliasInAncestorNamespace)9865f5a7458SNico Weber TEST_F(ChangeNamespaceTest, NamespaceAliasInAncestorNamespace) {
9875f5a7458SNico Weber NewNamespace = "na::nx";
9885f5a7458SNico Weber std::string Code = "namespace glob {\n"
9895f5a7458SNico Weber "class Glob {};\n"
9905f5a7458SNico Weber "}\n"
9915f5a7458SNico Weber "namespace other { namespace gl = glob; }\n"
9925f5a7458SNico Weber "namespace na {\n"
9935f5a7458SNico Weber "namespace ga = glob;\n"
9945f5a7458SNico Weber "namespace nb {\n"
9955f5a7458SNico Weber "void f() { ga::Glob g; }\n"
9965f5a7458SNico Weber "} // namespace nb\n"
9975f5a7458SNico Weber "} // namespace na\n";
9985f5a7458SNico Weber
9995f5a7458SNico Weber std::string Expected = "namespace glob {\n"
10005f5a7458SNico Weber "class Glob {};\n"
10015f5a7458SNico Weber "}\n"
10025f5a7458SNico Weber "namespace other { namespace gl = glob; }\n"
10035f5a7458SNico Weber "namespace na {\n"
10045f5a7458SNico Weber "namespace ga = glob;\n"
10055f5a7458SNico Weber "\n"
10065f5a7458SNico Weber "namespace nx {\n"
10075f5a7458SNico Weber "void f() { ga::Glob g; }\n"
10085f5a7458SNico Weber "} // namespace nx\n"
10095f5a7458SNico Weber "} // namespace na\n";
10105f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
10115f5a7458SNico Weber }
10125f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,NamespaceAliasInOtherNamespace)10135f5a7458SNico Weber TEST_F(ChangeNamespaceTest, NamespaceAliasInOtherNamespace) {
10145f5a7458SNico Weber std::string Code = "namespace glob {\n"
10155f5a7458SNico Weber "class Glob {};\n"
10165f5a7458SNico Weber "}\n"
10175f5a7458SNico Weber "namespace other { namespace gl = glob; }\n"
10185f5a7458SNico Weber "namespace na {\n"
10195f5a7458SNico Weber "namespace ga = glob;\n"
10205f5a7458SNico Weber "namespace nb {\n"
10215f5a7458SNico Weber "void f() { glob::Glob g; }\n"
10225f5a7458SNico Weber "} // namespace nb\n"
10235f5a7458SNico Weber "} // namespace na\n";
10245f5a7458SNico Weber
10255f5a7458SNico Weber std::string Expected = "namespace glob {\n"
10265f5a7458SNico Weber "class Glob {};\n"
10275f5a7458SNico Weber "}\n"
10285f5a7458SNico Weber "namespace other { namespace gl = glob; }\n"
10295f5a7458SNico Weber "namespace na {\n"
10305f5a7458SNico Weber "namespace ga = glob;\n"
10315f5a7458SNico Weber "\n"
10325f5a7458SNico Weber "} // namespace na\n"
10335f5a7458SNico Weber "namespace x {\n"
10345f5a7458SNico Weber "namespace y {\n"
10355f5a7458SNico Weber "void f() { glob::Glob g; }\n"
10365f5a7458SNico Weber "} // namespace y\n"
10375f5a7458SNico Weber "} // namespace x\n";
10385f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
10395f5a7458SNico Weber }
10405f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,UsingDeclAfterReference)10415f5a7458SNico Weber TEST_F(ChangeNamespaceTest, UsingDeclAfterReference) {
10425f5a7458SNico Weber std::string Code = "namespace glob {\n"
10435f5a7458SNico Weber "class Glob {};\n"
10445f5a7458SNico Weber "}\n"
10455f5a7458SNico Weber "namespace na {\n"
10465f5a7458SNico Weber "namespace nb {\n"
10475f5a7458SNico Weber "void f() { glob::Glob g; }\n"
10485f5a7458SNico Weber "} // namespace nb\n"
10495f5a7458SNico Weber "} // namespace na\n"
10505f5a7458SNico Weber "using glob::Glob;\n"
10515f5a7458SNico Weber "using namespace glob;\n";
10525f5a7458SNico Weber
10535f5a7458SNico Weber std::string Expected = "namespace glob {\n"
10545f5a7458SNico Weber "class Glob {};\n"
10555f5a7458SNico Weber "}\n"
10565f5a7458SNico Weber "\n"
10575f5a7458SNico Weber "namespace x {\n"
10585f5a7458SNico Weber "namespace y {\n"
10595f5a7458SNico Weber "void f() { glob::Glob g; }\n"
10605f5a7458SNico Weber "} // namespace y\n"
10615f5a7458SNico Weber "} // namespace x\n"
10625f5a7458SNico Weber "using glob::Glob;\n"
10635f5a7458SNico Weber "using namespace glob;\n";
10645f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
10655f5a7458SNico Weber }
10665f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,UsingNamespaceAfterReference)10675f5a7458SNico Weber TEST_F(ChangeNamespaceTest, UsingNamespaceAfterReference) {
10685f5a7458SNico Weber NewNamespace = "na::nc";
10695f5a7458SNico Weber std::string Code = "namespace glob {\n"
10705f5a7458SNico Weber "class Glob {};\n"
10715f5a7458SNico Weber "}\n"
10725f5a7458SNico Weber "namespace na {\n"
10735f5a7458SNico Weber "namespace nb {\n"
10745f5a7458SNico Weber "void f() { glob::Glob g; }\n"
10755f5a7458SNico Weber "} // namespace nb\n"
10765f5a7458SNico Weber "using namespace glob;\n"
10775f5a7458SNico Weber "} // namespace na\n";
10785f5a7458SNico Weber
10795f5a7458SNico Weber std::string Expected = "namespace glob {\n"
10805f5a7458SNico Weber "class Glob {};\n"
10815f5a7458SNico Weber "}\n"
10825f5a7458SNico Weber "namespace na {\n"
10835f5a7458SNico Weber "\n"
10845f5a7458SNico Weber "namespace nc {\n"
10855f5a7458SNico Weber "void f() { glob::Glob g; }\n"
10865f5a7458SNico Weber "} // namespace nc\n"
10875f5a7458SNico Weber "using namespace glob;\n"
10885f5a7458SNico Weber "} // namespace na\n";
10895f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
10905f5a7458SNico Weber }
10915f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,UsingNamespaceAndUsingShadowInGlobal)10925f5a7458SNico Weber TEST_F(ChangeNamespaceTest, UsingNamespaceAndUsingShadowInGlobal) {
10935f5a7458SNico Weber std::string Code = "namespace glob1 {\n"
10945f5a7458SNico Weber "namespace glob2 {\n"
10955f5a7458SNico Weber "class Glob {};\n"
10965f5a7458SNico Weber "}\n"
10975f5a7458SNico Weber "}\n"
10985f5a7458SNico Weber "using glob1::glob2::Glob;\n"
10995f5a7458SNico Weber "using namespace glob1;\n"
11005f5a7458SNico Weber "namespace na {\n"
11015f5a7458SNico Weber "namespace nb {\n"
11025f5a7458SNico Weber "void f() { Glob g; }\n"
11035f5a7458SNico Weber "} // namespace nb\n"
11045f5a7458SNico Weber "} // namespace na\n";
11055f5a7458SNico Weber
11065f5a7458SNico Weber std::string Expected = "namespace glob1 {\n"
11075f5a7458SNico Weber "namespace glob2 {\n"
11085f5a7458SNico Weber "class Glob {};\n"
11095f5a7458SNico Weber "}\n"
11105f5a7458SNico Weber "}\n"
11115f5a7458SNico Weber "using glob1::glob2::Glob;\n"
11125f5a7458SNico Weber "using namespace glob1;\n"
11135f5a7458SNico Weber "\n"
11145f5a7458SNico Weber "namespace x {\n"
11155f5a7458SNico Weber "namespace y {\n"
11165f5a7458SNico Weber "void f() { Glob g; }\n"
11175f5a7458SNico Weber "} // namespace y\n"
11185f5a7458SNico Weber "} // namespace x\n";
11195f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
11205f5a7458SNico Weber }
11215f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,UsingAliasInGlobal)11225f5a7458SNico Weber TEST_F(ChangeNamespaceTest, UsingAliasInGlobal) {
11235f5a7458SNico Weber std::string Code = "namespace glob {\n"
11245f5a7458SNico Weber "class Glob {};\n"
11255f5a7458SNico Weber "}\n"
11265f5a7458SNico Weber "using GLB = glob::Glob;\n"
11275f5a7458SNico Weber "using BLG = glob::Glob;\n"
11285f5a7458SNico Weber "namespace na {\n"
11295f5a7458SNico Weber "namespace nb {\n"
11305f5a7458SNico Weber "void f() { GLB g; BLG blg; }\n"
11315f5a7458SNico Weber "} // namespace nb\n"
11325f5a7458SNico Weber "} // namespace na\n";
11335f5a7458SNico Weber
11345f5a7458SNico Weber std::string Expected = "namespace glob {\n"
11355f5a7458SNico Weber "class Glob {};\n"
11365f5a7458SNico Weber "}\n"
11375f5a7458SNico Weber "using GLB = glob::Glob;\n"
11385f5a7458SNico Weber "using BLG = glob::Glob;\n"
11395f5a7458SNico Weber "\n"
11405f5a7458SNico Weber "namespace x {\n"
11415f5a7458SNico Weber "namespace y {\n"
11425f5a7458SNico Weber "void f() { GLB g; BLG blg; }\n"
11435f5a7458SNico Weber "} // namespace y\n"
11445f5a7458SNico Weber "} // namespace x\n";
11455f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
11465f5a7458SNico Weber }
11475f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,UsingShadowDeclAndMovedNamespace)11485f5a7458SNico Weber TEST_F(ChangeNamespaceTest, UsingShadowDeclAndMovedNamespace) {
11495f5a7458SNico Weber std::string Code = "namespace na { class C_A {};\n }\n"
11505f5a7458SNico Weber "using na::C_A;\n"
11515f5a7458SNico Weber "namespace na {\n"
11525f5a7458SNico Weber "namespace nb {\n"
11535f5a7458SNico Weber "class C_X {\n"
11545f5a7458SNico Weber "public:\n"
11555f5a7458SNico Weber " C_A a;\n"
11565f5a7458SNico Weber "};\n"
11575f5a7458SNico Weber "} // namespace nb\n"
11585f5a7458SNico Weber "} // namespace na\n";
11595f5a7458SNico Weber std::string Expected = "namespace na { class C_A {};\n }\n"
11605f5a7458SNico Weber "using na::C_A;\n"
11615f5a7458SNico Weber "\n"
11625f5a7458SNico Weber "namespace x {\n"
11635f5a7458SNico Weber "namespace y {\n"
11645f5a7458SNico Weber "class C_X {\n"
11655f5a7458SNico Weber "public:\n"
11665f5a7458SNico Weber " C_A a;\n"
11675f5a7458SNico Weber "};\n"
11685f5a7458SNico Weber "} // namespace y\n"
11695f5a7458SNico Weber "} // namespace x\n";
11705f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
11715f5a7458SNico Weber }
11725f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,UsingNamespaceDeclAndMovedNamespace)11735f5a7458SNico Weber TEST_F(ChangeNamespaceTest, UsingNamespaceDeclAndMovedNamespace) {
11745f5a7458SNico Weber std::string Code = "namespace na { class C_A {};\n }\n"
11755f5a7458SNico Weber "using namespace na;\n"
11765f5a7458SNico Weber "namespace na {\n"
11775f5a7458SNico Weber "namespace nb {\n"
11785f5a7458SNico Weber "class C_X {\n"
11795f5a7458SNico Weber "public:\n"
11805f5a7458SNico Weber " C_A ca;\n"
11815f5a7458SNico Weber "};\n"
11825f5a7458SNico Weber "} // namespace nb\n"
11835f5a7458SNico Weber "} // namespace na\n";
11845f5a7458SNico Weber std::string Expected = "namespace na { class C_A {};\n }\n"
11855f5a7458SNico Weber "using namespace na;\n"
11865f5a7458SNico Weber "\n"
11875f5a7458SNico Weber "namespace x {\n"
11885f5a7458SNico Weber "namespace y {\n"
11895f5a7458SNico Weber "class C_X {\n"
11905f5a7458SNico Weber "public:\n"
11915f5a7458SNico Weber " C_A ca;\n"
11925f5a7458SNico Weber "};\n"
11935f5a7458SNico Weber "} // namespace y\n"
11945f5a7458SNico Weber "} // namespace x\n";
11955f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
11965f5a7458SNico Weber }
11975f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,UsingShadowDeclInFunction)11985f5a7458SNico Weber TEST_F(ChangeNamespaceTest, UsingShadowDeclInFunction) {
11995f5a7458SNico Weber std::string Code = "namespace glob {\n"
12005f5a7458SNico Weber "class Glob {};\n"
12015f5a7458SNico Weber "}\n"
12025f5a7458SNico Weber "namespace na {\n"
12035f5a7458SNico Weber "namespace nb {\n"
12045f5a7458SNico Weber "void f() {\n"
12055f5a7458SNico Weber " using glob::Glob;\n"
12065f5a7458SNico Weber " Glob g;\n"
12075f5a7458SNico Weber "}\n"
12085f5a7458SNico Weber "} // namespace nb\n"
12095f5a7458SNico Weber "} // namespace na\n";
12105f5a7458SNico Weber
12115f5a7458SNico Weber std::string Expected = "namespace glob {\n"
12125f5a7458SNico Weber "class Glob {};\n"
12135f5a7458SNico Weber "}\n"
12145f5a7458SNico Weber "\n"
12155f5a7458SNico Weber "namespace x {\n"
12165f5a7458SNico Weber "namespace y {\n"
12175f5a7458SNico Weber "void f() {\n"
12185f5a7458SNico Weber " using ::glob::Glob;\n"
12195f5a7458SNico Weber " Glob g;\n"
12205f5a7458SNico Weber "}\n"
12215f5a7458SNico Weber "} // namespace y\n"
12225f5a7458SNico Weber "} // namespace x\n";
12235f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
12245f5a7458SNico Weber }
12255f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,UsingShadowDeclInClass)12265f5a7458SNico Weber TEST_F(ChangeNamespaceTest, UsingShadowDeclInClass) {
12275f5a7458SNico Weber std::string Code = "namespace na { class C_A {}; }\n"
12285f5a7458SNico Weber "namespace na {\n"
12295f5a7458SNico Weber "namespace nb {\n"
12305f5a7458SNico Weber "void f() {\n"
12315f5a7458SNico Weber " using ::na::C_A;\n"
12325f5a7458SNico Weber " C_A ca;\n"
12335f5a7458SNico Weber "}\n"
12345f5a7458SNico Weber "} // namespace nb\n"
12355f5a7458SNico Weber "} // namespace na\n";
12365f5a7458SNico Weber std::string Expected = "namespace na { class C_A {}; }\n"
12375f5a7458SNico Weber "\n"
12385f5a7458SNico Weber "namespace x {\n"
12395f5a7458SNico Weber "namespace y {\n"
12405f5a7458SNico Weber "void f() {\n"
12415f5a7458SNico Weber " using ::na::C_A;\n"
12425f5a7458SNico Weber " C_A ca;\n"
12435f5a7458SNico Weber "}\n"
12445f5a7458SNico Weber "} // namespace y\n"
12455f5a7458SNico Weber "} // namespace x\n";
12465f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
12475f5a7458SNico Weber }
12485f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,UsingDeclInMovedNamespace)12495f5a7458SNico Weber TEST_F(ChangeNamespaceTest, UsingDeclInMovedNamespace) {
12505f5a7458SNico Weber std::string Code = "namespace nx { void f(); }\n"
12515f5a7458SNico Weber "namespace na {\n"
12525f5a7458SNico Weber "using nx::f;\n"
12535f5a7458SNico Weber "namespace nb {\n"
12545f5a7458SNico Weber "void d() { f(); }\n"
12555f5a7458SNico Weber "} // nb\n"
12565f5a7458SNico Weber "} // na\n";
12575f5a7458SNico Weber
12585f5a7458SNico Weber std::string Expected = "namespace nx { void f(); }\n"
12595f5a7458SNico Weber "namespace na {\n"
12605f5a7458SNico Weber "using nx::f;\n"
12615f5a7458SNico Weber "\n"
12625f5a7458SNico Weber "} // na\n"
12635f5a7458SNico Weber "namespace x {\n"
12645f5a7458SNico Weber "namespace y {\n"
12655f5a7458SNico Weber "void d() { nx::f(); }\n"
12665f5a7458SNico Weber "} // namespace y\n"
12675f5a7458SNico Weber "} // namespace x\n";
12685f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
12695f5a7458SNico Weber }
12705f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,UsingDeclInMovedNamespaceNotNested)12715f5a7458SNico Weber TEST_F(ChangeNamespaceTest, UsingDeclInMovedNamespaceNotNested) {
12725f5a7458SNico Weber OldNamespace = "na";
12735f5a7458SNico Weber std::string Code = "namespace nx { void f(); }\n"
12745f5a7458SNico Weber "namespace na {\n"
12755f5a7458SNico Weber "using ::nx::f;\n"
12765f5a7458SNico Weber "void d() { f(); }\n"
12775f5a7458SNico Weber "} // na\n";
12785f5a7458SNico Weber
12795f5a7458SNico Weber std::string Expected = "namespace nx { void f(); }\n"
12805f5a7458SNico Weber "\n"
12815f5a7458SNico Weber "namespace x {\n"
12825f5a7458SNico Weber "namespace y {\n"
12835f5a7458SNico Weber "using ::nx::f;\n"
12845f5a7458SNico Weber "void d() { f(); }\n"
12855f5a7458SNico Weber "} // namespace y\n"
12865f5a7458SNico Weber "} // namespace x\n";
12875f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
12885f5a7458SNico Weber }
12895f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,UsingDeclInMovedNamespaceMultiNested)12905f5a7458SNico Weber TEST_F(ChangeNamespaceTest, UsingDeclInMovedNamespaceMultiNested) {
12915f5a7458SNico Weber OldNamespace = "a::b::c::d";
12925f5a7458SNico Weber NewNamespace = "a::b::x::y";
12935f5a7458SNico Weber std::string Code = "namespace nx { void f(); void g(); }\n"
12945f5a7458SNico Weber "namespace a {\n"
12955f5a7458SNico Weber "namespace b {\n"
12965f5a7458SNico Weber "using ::nx::f;\n"
12975f5a7458SNico Weber "namespace c {\n"
12985f5a7458SNico Weber "using ::nx::g;\n"
12995f5a7458SNico Weber "namespace d {\n"
13005f5a7458SNico Weber "void d() { f(); g(); }\n"
13015f5a7458SNico Weber "} // d\n"
13025f5a7458SNico Weber "} // c\n"
13035f5a7458SNico Weber "} // b\n"
13045f5a7458SNico Weber "} // a\n";
13055f5a7458SNico Weber
13065f5a7458SNico Weber std::string Expected = "namespace nx { void f(); void g(); }\n"
13075f5a7458SNico Weber "namespace a {\n"
13085f5a7458SNico Weber "namespace b {\n"
13095f5a7458SNico Weber "using ::nx::f;\n"
13105f5a7458SNico Weber "namespace c {\n"
13115f5a7458SNico Weber "using ::nx::g;\n"
13125f5a7458SNico Weber "\n"
13135f5a7458SNico Weber "} // c\n"
13145f5a7458SNico Weber "namespace x {\n"
13155f5a7458SNico Weber "namespace y {\n"
13165f5a7458SNico Weber "void d() { f(); nx::g(); }\n"
13175f5a7458SNico Weber "} // namespace y\n"
13185f5a7458SNico Weber "} // namespace x\n"
13195f5a7458SNico Weber "} // b\n"
13205f5a7458SNico Weber "} // a\n";
13215f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
13225f5a7458SNico Weber }
13235f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,UsingShadowDeclInTheParentOfOldNamespace)13245f5a7458SNico Weber TEST_F(ChangeNamespaceTest, UsingShadowDeclInTheParentOfOldNamespace) {
13255f5a7458SNico Weber OldNamespace = "nb::nc";
13265f5a7458SNico Weber NewNamespace = "nb::nd";
13275f5a7458SNico Weber std::string Code = "namespace na { class A {}; }\n"
13285f5a7458SNico Weber "namespace nb {\n"
13295f5a7458SNico Weber "using na::A;\n"
13305f5a7458SNico Weber "namespace nc {\n"
13315f5a7458SNico Weber "void d() { A a; }\n"
13325f5a7458SNico Weber "} // nc\n"
13335f5a7458SNico Weber "} // nb\n";
13345f5a7458SNico Weber
13355f5a7458SNico Weber std::string Expected = "namespace na { class A {}; }\n"
13365f5a7458SNico Weber "namespace nb {\n"
13375f5a7458SNico Weber "using na::A;\n"
13385f5a7458SNico Weber "\n"
13395f5a7458SNico Weber "namespace nd {\n"
13405f5a7458SNico Weber "void d() { A a; }\n"
13415f5a7458SNico Weber "} // namespace nd\n"
13425f5a7458SNico Weber "} // nb\n";
13435f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
13445f5a7458SNico Weber }
13455f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,UsingShadowDeclInOldNamespace)13465f5a7458SNico Weber TEST_F(ChangeNamespaceTest, UsingShadowDeclInOldNamespace) {
13475f5a7458SNico Weber OldNamespace = "nb";
13485f5a7458SNico Weber NewNamespace = "nc";
13495f5a7458SNico Weber std::string Code = "namespace na { class A {}; }\n"
13505f5a7458SNico Weber "namespace nb {\n"
13515f5a7458SNico Weber "using na::A;\n"
13525f5a7458SNico Weber "void d() { A a; }\n"
13535f5a7458SNico Weber "struct X { A a; };\n"
13545f5a7458SNico Weber "} // nb\n";
13555f5a7458SNico Weber
13565f5a7458SNico Weber std::string Expected = "namespace na { class A {}; }\n"
13575f5a7458SNico Weber "\n"
13585f5a7458SNico Weber "namespace nc {\n"
13595f5a7458SNico Weber "using ::na::A;\n"
13605f5a7458SNico Weber "void d() { A a; }\n"
13615f5a7458SNico Weber "struct X { A a; };\n"
13625f5a7458SNico Weber "} // namespace nc\n";
13635f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
13645f5a7458SNico Weber }
13655f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,UsingShadowDeclOfTemplateClass)13665f5a7458SNico Weber TEST_F(ChangeNamespaceTest, UsingShadowDeclOfTemplateClass) {
13675f5a7458SNico Weber OldNamespace = "nb";
13685f5a7458SNico Weber NewNamespace = "nc";
13695f5a7458SNico Weber std::string Code = "namespace na {\n"
13705f5a7458SNico Weber "template <typename T>\n"
13715f5a7458SNico Weber "class A { T t; };\n"
13725f5a7458SNico Weber "} // namespace na\n"
13735f5a7458SNico Weber "namespace nb {\n"
13745f5a7458SNico Weber "using na::A;\n"
13755f5a7458SNico Weber "void d() { A<int> a; }\n"
13765f5a7458SNico Weber "} // nb\n";
13775f5a7458SNico Weber
13785f5a7458SNico Weber std::string Expected = "namespace na {\n"
13795f5a7458SNico Weber "template <typename T>\n"
13805f5a7458SNico Weber "class A { T t; };\n"
13815f5a7458SNico Weber "} // namespace na\n"
13825f5a7458SNico Weber "\n"
13835f5a7458SNico Weber "namespace nc {\n"
13845f5a7458SNico Weber "using ::na::A;\n"
13855f5a7458SNico Weber "void d() { A<int> a; }\n"
13865f5a7458SNico Weber "} // namespace nc\n";
13875f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
13885f5a7458SNico Weber }
13895f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,UsingShadowDeclOfTemplateFunction)13905f5a7458SNico Weber TEST_F(ChangeNamespaceTest, UsingShadowDeclOfTemplateFunction) {
13915f5a7458SNico Weber OldNamespace = "nb";
13925f5a7458SNico Weber NewNamespace = "nc";
13935f5a7458SNico Weber std::string Code = "namespace na {\n"
13945f5a7458SNico Weber "template <typename T>\n"
13955f5a7458SNico Weber "void f() { T t; };\n"
13965f5a7458SNico Weber "} // namespace na\n"
13975f5a7458SNico Weber "namespace nb {\n"
13985f5a7458SNico Weber "using na::f;\n"
13995f5a7458SNico Weber "void d() { f<int>(); }\n"
14005f5a7458SNico Weber "} // nb\n";
14015f5a7458SNico Weber
14025f5a7458SNico Weber std::string Expected = "namespace na {\n"
14035f5a7458SNico Weber "template <typename T>\n"
14045f5a7458SNico Weber "void f() { T t; };\n"
14055f5a7458SNico Weber "} // namespace na\n"
14065f5a7458SNico Weber "\n"
14075f5a7458SNico Weber "namespace nc {\n"
14085f5a7458SNico Weber "using ::na::f;\n"
14095f5a7458SNico Weber "void d() { f<int>(); }\n"
14105f5a7458SNico Weber "} // namespace nc\n";
14115f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
14125f5a7458SNico Weber }
14135f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,UsingAliasDecl)14145f5a7458SNico Weber TEST_F(ChangeNamespaceTest, UsingAliasDecl) {
14155f5a7458SNico Weber std::string Code =
14165f5a7458SNico Weber "namespace nx { namespace ny { class X {}; } }\n"
14175f5a7458SNico Weber "namespace na {\n"
14185f5a7458SNico Weber "namespace nb {\n"
14195f5a7458SNico Weber "using Y = nx::ny::X;\n"
14205f5a7458SNico Weber "void f() { Y y; }\n"
14215f5a7458SNico Weber "} // namespace nb\n"
14225f5a7458SNico Weber "} // namespace na\n";
14235f5a7458SNico Weber
14245f5a7458SNico Weber std::string Expected = "namespace nx { namespace ny { class X {}; } }\n"
14255f5a7458SNico Weber "\n"
14265f5a7458SNico Weber "namespace x {\n"
14275f5a7458SNico Weber "namespace y {\n"
14285f5a7458SNico Weber "using Y = nx::ny::X;\n"
14295f5a7458SNico Weber "void f() { Y y; }\n"
14305f5a7458SNico Weber "} // namespace y\n"
14315f5a7458SNico Weber "} // namespace x\n";
14325f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
14335f5a7458SNico Weber }
14345f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,UsingAliasDeclInGlobal)14355f5a7458SNico Weber TEST_F(ChangeNamespaceTest, UsingAliasDeclInGlobal) {
14365f5a7458SNico Weber std::string Code =
14375f5a7458SNico Weber "namespace nx { namespace ny { class X {}; } }\n"
14385f5a7458SNico Weber "using Y = nx::ny::X;\n"
14395f5a7458SNico Weber "namespace na {\n"
14405f5a7458SNico Weber "namespace nb {\n"
14415f5a7458SNico Weber "void f() { Y y; }\n"
14425f5a7458SNico Weber "} // namespace nb\n"
14435f5a7458SNico Weber "} // namespace na\n";
14445f5a7458SNico Weber
14455f5a7458SNico Weber std::string Expected = "namespace nx { namespace ny { class X {}; } }\n"
14465f5a7458SNico Weber "using Y = nx::ny::X;\n"
14475f5a7458SNico Weber "\n"
14485f5a7458SNico Weber "namespace x {\n"
14495f5a7458SNico Weber "namespace y {\n"
14505f5a7458SNico Weber "void f() { Y y; }\n"
14515f5a7458SNico Weber "} // namespace y\n"
14525f5a7458SNico Weber "} // namespace x\n";
14535f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
14545f5a7458SNico Weber }
14555f5a7458SNico Weber
14565f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,TypedefAliasDecl)14575f5a7458SNico Weber TEST_F(ChangeNamespaceTest, TypedefAliasDecl) {
14585f5a7458SNico Weber std::string Code =
14595f5a7458SNico Weber "namespace nx { namespace ny { class X {}; } }\n"
14605f5a7458SNico Weber "namespace na {\n"
14615f5a7458SNico Weber "namespace nb {\n"
14625f5a7458SNico Weber "typedef nx::ny::X Y;\n"
14635f5a7458SNico Weber "void f() { Y y; }\n"
14645f5a7458SNico Weber "} // namespace nb\n"
14655f5a7458SNico Weber "} // namespace na\n";
14665f5a7458SNico Weber
14675f5a7458SNico Weber std::string Expected = "namespace nx { namespace ny { class X {}; } }\n"
14685f5a7458SNico Weber "\n"
14695f5a7458SNico Weber "namespace x {\n"
14705f5a7458SNico Weber "namespace y {\n"
14715f5a7458SNico Weber "typedef nx::ny::X Y;\n"
14725f5a7458SNico Weber "void f() { Y y; }\n"
14735f5a7458SNico Weber "} // namespace y\n"
14745f5a7458SNico Weber "} // namespace x\n";
14755f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
14765f5a7458SNico Weber }
14775f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,DerivedClassWithConstructors)14785f5a7458SNico Weber TEST_F(ChangeNamespaceTest, DerivedClassWithConstructors) {
14795f5a7458SNico Weber std::string Code =
14805f5a7458SNico Weber "namespace nx { namespace ny { class X { public: X(int i) {} }; } }\n"
14815f5a7458SNico Weber "namespace na {\n"
14825f5a7458SNico Weber "namespace nb {\n"
14835f5a7458SNico Weber "class A : public nx::ny::X {\n"
14845f5a7458SNico Weber "public:\n"
14855f5a7458SNico Weber " A() : X(0) {}\n"
14865f5a7458SNico Weber " A(int i);\n"
14875f5a7458SNico Weber "};\n"
14885f5a7458SNico Weber "A::A(int i) : X(i) {}\n"
14895f5a7458SNico Weber "} // namespace nb\n"
14905f5a7458SNico Weber "} // namespace na\n";
14915f5a7458SNico Weber std::string Expected =
14925f5a7458SNico Weber "namespace nx { namespace ny { class X { public: X(int i) {} }; } }\n"
14935f5a7458SNico Weber "\n\n"
14945f5a7458SNico Weber "namespace x {\n"
14955f5a7458SNico Weber "namespace y {\n"
14965f5a7458SNico Weber "class A : public nx::ny::X {\n"
14975f5a7458SNico Weber "public:\n"
14985f5a7458SNico Weber " A() : X(0) {}\n"
14995f5a7458SNico Weber " A(int i);\n"
15005f5a7458SNico Weber "};\n"
15015f5a7458SNico Weber "A::A(int i) : X(i) {}\n"
15025f5a7458SNico Weber "} // namespace y\n"
15035f5a7458SNico Weber "} // namespace x\n";
15045f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
15055f5a7458SNico Weber }
15065f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,DerivedClassWithQualifiedConstructors)15075f5a7458SNico Weber TEST_F(ChangeNamespaceTest, DerivedClassWithQualifiedConstructors) {
15085f5a7458SNico Weber std::string Code =
15095f5a7458SNico Weber "namespace nx { namespace ny { class X { public: X(int i) {} }; } }\n"
15105f5a7458SNico Weber "namespace na {\n"
15115f5a7458SNico Weber "namespace nb {\n"
15125f5a7458SNico Weber "class A : public nx::ny::X {\n"
15135f5a7458SNico Weber "public:\n"
15145f5a7458SNico Weber " A() : X::X(0) {}\n"
15155f5a7458SNico Weber " A(int i);\n"
15165f5a7458SNico Weber "};\n"
15175f5a7458SNico Weber "A::A(int i) : X::X(i) {}\n"
15185f5a7458SNico Weber "} // namespace nb\n"
15195f5a7458SNico Weber "} // namespace na\n";
15205f5a7458SNico Weber std::string Expected =
15215f5a7458SNico Weber "namespace nx { namespace ny { class X { public: X(int i) {} }; } }\n"
15225f5a7458SNico Weber "\n\n"
15235f5a7458SNico Weber "namespace x {\n"
15245f5a7458SNico Weber "namespace y {\n"
15255f5a7458SNico Weber "class A : public nx::ny::X {\n"
15265f5a7458SNico Weber "public:\n"
15275f5a7458SNico Weber " A() : X::X(0) {}\n"
15285f5a7458SNico Weber " A(int i);\n"
15295f5a7458SNico Weber "};\n"
15305f5a7458SNico Weber "A::A(int i) : X::X(i) {}\n"
15315f5a7458SNico Weber "} // namespace y\n"
15325f5a7458SNico Weber "} // namespace x\n";
15335f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
15345f5a7458SNico Weber }
15355f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,DerivedClassWithConstructorsAndTypeRefs)15365f5a7458SNico Weber TEST_F(ChangeNamespaceTest, DerivedClassWithConstructorsAndTypeRefs) {
15375f5a7458SNico Weber std::string Code =
15385f5a7458SNico Weber "namespace nx { namespace ny { class X { public: X(int i) {} }; } }\n"
15395f5a7458SNico Weber "namespace na {\n"
15405f5a7458SNico Weber "namespace nb {\n"
15415f5a7458SNico Weber "class A : public nx::ny::X {\n"
15425f5a7458SNico Weber "public:\n"
15435f5a7458SNico Weber " A() : X(0) {}\n"
15445f5a7458SNico Weber " A(int i);\n"
15455f5a7458SNico Weber "};\n"
15465f5a7458SNico Weber "A::A(int i) : X(i) { X x(1);}\n"
15475f5a7458SNico Weber "} // namespace nb\n"
15485f5a7458SNico Weber "} // namespace na\n";
15495f5a7458SNico Weber std::string Expected =
15505f5a7458SNico Weber "namespace nx { namespace ny { class X { public: X(int i) {} }; } }\n"
15515f5a7458SNico Weber "\n\n"
15525f5a7458SNico Weber "namespace x {\n"
15535f5a7458SNico Weber "namespace y {\n"
15545f5a7458SNico Weber "class A : public nx::ny::X {\n"
15555f5a7458SNico Weber "public:\n"
15565f5a7458SNico Weber " A() : X(0) {}\n"
15575f5a7458SNico Weber " A(int i);\n"
15585f5a7458SNico Weber "};\n"
15595f5a7458SNico Weber "A::A(int i) : X(i) { nx::ny::X x(1);}\n"
15605f5a7458SNico Weber "} // namespace y\n"
15615f5a7458SNico Weber "} // namespace x\n";
15625f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
15635f5a7458SNico Weber }
15645f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,MoveToGlobalNamespace)15655f5a7458SNico Weber TEST_F(ChangeNamespaceTest, MoveToGlobalNamespace) {
15665f5a7458SNico Weber NewNamespace = "";
15675f5a7458SNico Weber std::string Code = "namespace na {\n"
15685f5a7458SNico Weber "class C_A {};\n"
15695f5a7458SNico Weber "namespace nc {\n"
15705f5a7458SNico Weber "class C_C {};"
15715f5a7458SNico Weber "} // namespace nc\n"
15725f5a7458SNico Weber "namespace nb {\n"
15735f5a7458SNico Weber "class C_X {\n"
15745f5a7458SNico Weber "public:\n"
15755f5a7458SNico Weber " C_A a;\n"
15765f5a7458SNico Weber " nc::C_C c;\n"
15775f5a7458SNico Weber "};\n"
15785f5a7458SNico Weber "class C_Y {\n"
15795f5a7458SNico Weber " C_X x;\n"
15805f5a7458SNico Weber "};\n"
15815f5a7458SNico Weber "} // namespace nb\n"
15825f5a7458SNico Weber "} // namespace na\n";
15835f5a7458SNico Weber std::string Expected = "namespace na {\n"
15845f5a7458SNico Weber "class C_A {};\n"
15855f5a7458SNico Weber "namespace nc {\n"
15865f5a7458SNico Weber "class C_C {};"
15875f5a7458SNico Weber "} // namespace nc\n"
15885f5a7458SNico Weber "\n"
15895f5a7458SNico Weber "} // namespace na\n"
15905f5a7458SNico Weber "class C_X {\n"
15915f5a7458SNico Weber "public:\n"
15925f5a7458SNico Weber " na::C_A a;\n"
15935f5a7458SNico Weber " na::nc::C_C c;\n"
15945f5a7458SNico Weber "};\n"
15955f5a7458SNico Weber "class C_Y {\n"
15965f5a7458SNico Weber " C_X x;\n"
15975f5a7458SNico Weber "};\n";
15985f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
15995f5a7458SNico Weber }
16005f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,KeepGlobalSpecifier)16015f5a7458SNico Weber TEST_F(ChangeNamespaceTest, KeepGlobalSpecifier) {
16025f5a7458SNico Weber std::string Code = "class Glob {};\n"
16035f5a7458SNico Weber "namespace na {\n"
16045f5a7458SNico Weber "class C_A {};\n"
16055f5a7458SNico Weber "namespace nc {\n"
16065f5a7458SNico Weber "class C_C {};"
16075f5a7458SNico Weber "} // namespace nc\n"
16085f5a7458SNico Weber "namespace nb {\n"
16095f5a7458SNico Weber "class C_X {\n"
16105f5a7458SNico Weber "public:\n"
16115f5a7458SNico Weber " ::Glob glob_1;\n"
16125f5a7458SNico Weber " Glob glob_2;\n"
16135f5a7458SNico Weber " C_A a_1;\n"
16145f5a7458SNico Weber " ::na::C_A a_2;\n"
16155f5a7458SNico Weber " nc::C_C c;\n"
16165f5a7458SNico Weber "};\n"
16175f5a7458SNico Weber "} // namespace nb\n"
16185f5a7458SNico Weber "} // namespace na\n";
16195f5a7458SNico Weber std::string Expected = "class Glob {};\n"
16205f5a7458SNico Weber "namespace na {\n"
16215f5a7458SNico Weber "class C_A {};\n"
16225f5a7458SNico Weber "namespace nc {\n"
16235f5a7458SNico Weber "class C_C {};"
16245f5a7458SNico Weber "} // namespace nc\n"
16255f5a7458SNico Weber "\n"
16265f5a7458SNico Weber "} // namespace na\n"
16275f5a7458SNico Weber "namespace x {\n"
16285f5a7458SNico Weber "namespace y {\n"
16295f5a7458SNico Weber "class C_X {\n"
16305f5a7458SNico Weber "public:\n"
16315f5a7458SNico Weber " ::Glob glob_1;\n"
16325f5a7458SNico Weber " Glob glob_2;\n"
16335f5a7458SNico Weber " na::C_A a_1;\n"
16345f5a7458SNico Weber " ::na::C_A a_2;\n"
16355f5a7458SNico Weber " na::nc::C_C c;\n"
16365f5a7458SNico Weber "};\n"
16375f5a7458SNico Weber "} // namespace y\n"
16385f5a7458SNico Weber "} // namespace x\n";
16395f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
16405f5a7458SNico Weber }
16415f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,UsingAliasInTemplate)16425f5a7458SNico Weber TEST_F(ChangeNamespaceTest, UsingAliasInTemplate) {
16435f5a7458SNico Weber NewNamespace = "na::nb::nc";
16445f5a7458SNico Weber std::string Code = "namespace some_ns {\n"
16455f5a7458SNico Weber "template <typename T, typename S>\n"
16465f5a7458SNico Weber "class G {};\n"
16475f5a7458SNico Weber "} // namespace some_ns\n"
16485f5a7458SNico Weber "namespace na {\n"
16495f5a7458SNico Weber "template<typename P>\n"
16505f5a7458SNico Weber "using GG = some_ns::G<int, P>;\n"
16515f5a7458SNico Weber "} // namespace na\n"
16525f5a7458SNico Weber "namespace na {\n"
16535f5a7458SNico Weber "namespace nb {\n"
16545f5a7458SNico Weber "void f() {\n"
16555f5a7458SNico Weber " GG<float> g;\n"
16565f5a7458SNico Weber "}\n"
16575f5a7458SNico Weber "} // namespace nb\n"
16585f5a7458SNico Weber "} // namespace na\n";
16595f5a7458SNico Weber std::string Expected = "namespace some_ns {\n"
16605f5a7458SNico Weber "template <typename T, typename S>\n"
16615f5a7458SNico Weber "class G {};\n"
16625f5a7458SNico Weber "} // namespace some_ns\n"
16635f5a7458SNico Weber "namespace na {\n"
16645f5a7458SNico Weber "template<typename P>\n"
16655f5a7458SNico Weber "using GG = some_ns::G<int, P>;\n"
16665f5a7458SNico Weber "} // namespace na\n"
16675f5a7458SNico Weber "namespace na {\n"
16685f5a7458SNico Weber "namespace nb {\n"
16695f5a7458SNico Weber "namespace nc {\n"
16705f5a7458SNico Weber "void f() {\n"
16715f5a7458SNico Weber " GG<float> g;\n"
16725f5a7458SNico Weber "}\n"
16735f5a7458SNico Weber "} // namespace nc\n"
16745f5a7458SNico Weber "} // namespace nb\n"
16755f5a7458SNico Weber "} // namespace na\n";
16765f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
16775f5a7458SNico Weber }
16785f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,TemplateUsingAliasInBaseClass)16795f5a7458SNico Weber TEST_F(ChangeNamespaceTest, TemplateUsingAliasInBaseClass) {
16805f5a7458SNico Weber NewNamespace = "na::nb::nc";
16815f5a7458SNico Weber std::string Code = "namespace some_ns {\n"
16825f5a7458SNico Weber "template <typename T, typename S>\n"
16835f5a7458SNico Weber "class G {};\n"
16845f5a7458SNico Weber "} // namespace some_ns\n"
16855f5a7458SNico Weber "namespace na {\n"
16865f5a7458SNico Weber "class Base {\n"
16875f5a7458SNico Weber "public:\n"
16885f5a7458SNico Weber " template<typename P>\n"
16895f5a7458SNico Weber " using GG = some_ns::G<int, P>;\n"
16905f5a7458SNico Weber "\n"
16915f5a7458SNico Weber " struct Nested {};\n"
16925f5a7458SNico Weber "};\n"
16935f5a7458SNico Weber "class Derived : public Base {};\n"
16945f5a7458SNico Weber "} // namespace na\n"
16955f5a7458SNico Weber "namespace na {\n"
16965f5a7458SNico Weber "namespace nb {\n"
16975f5a7458SNico Weber "void f() {\n"
16985f5a7458SNico Weber " Derived::GG<float> g;\n"
16995f5a7458SNico Weber " const Derived::GG<int> gg;\n"
17005f5a7458SNico Weber " const Derived::GG<int>* gg_ptr;\n"
17015f5a7458SNico Weber " struct Derived::Nested nested;\n"
17025f5a7458SNico Weber " const struct Derived::Nested *nested_ptr;\n"
17035f5a7458SNico Weber "}\n"
17045f5a7458SNico Weber "} // namespace nb\n"
17055f5a7458SNico Weber "} // namespace na\n";
17065f5a7458SNico Weber std::string Expected = "namespace some_ns {\n"
17075f5a7458SNico Weber "template <typename T, typename S>\n"
17085f5a7458SNico Weber "class G {};\n"
17095f5a7458SNico Weber "} // namespace some_ns\n"
17105f5a7458SNico Weber "namespace na {\n"
17115f5a7458SNico Weber "class Base {\n"
17125f5a7458SNico Weber "public:\n"
17135f5a7458SNico Weber " template<typename P>\n"
17145f5a7458SNico Weber " using GG = some_ns::G<int, P>;\n"
17155f5a7458SNico Weber "\n"
17165f5a7458SNico Weber " struct Nested {};\n"
17175f5a7458SNico Weber "};\n"
17185f5a7458SNico Weber "class Derived : public Base {};\n"
17195f5a7458SNico Weber "} // namespace na\n"
17205f5a7458SNico Weber "namespace na {\n"
17215f5a7458SNico Weber "namespace nb {\n"
17225f5a7458SNico Weber "namespace nc {\n"
17235f5a7458SNico Weber "void f() {\n"
17245f5a7458SNico Weber " Derived::GG<float> g;\n"
17255f5a7458SNico Weber " const Derived::GG<int> gg;\n"
17265f5a7458SNico Weber " const Derived::GG<int>* gg_ptr;\n"
17275f5a7458SNico Weber " struct Derived::Nested nested;\n"
17285f5a7458SNico Weber " const struct Derived::Nested *nested_ptr;\n"
17295f5a7458SNico Weber "}\n"
17305f5a7458SNico Weber "} // namespace nc\n"
17315f5a7458SNico Weber "} // namespace nb\n"
17325f5a7458SNico Weber "} // namespace na\n";
17335f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
17345f5a7458SNico Weber }
17355f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,ExistingNamespaceConflictWithNewNamespace)17365f5a7458SNico Weber TEST_F(ChangeNamespaceTest, ExistingNamespaceConflictWithNewNamespace) {
17375f5a7458SNico Weber OldNamespace = "nx";
17385f5a7458SNico Weber NewNamespace = "ny::na::nc";
17395f5a7458SNico Weber std::string Code = "namespace na {\n"
17405f5a7458SNico Weber "class A {};\n"
17415f5a7458SNico Weber "} // namespace na\n"
17425f5a7458SNico Weber "namespace nb {\n"
17435f5a7458SNico Weber "class B {};\n"
17445f5a7458SNico Weber "} // namespace nb\n"
17455f5a7458SNico Weber "namespace nx {\n"
17465f5a7458SNico Weber "class X {\n"
17475f5a7458SNico Weber " na::A a; nb::B b;\n"
17485f5a7458SNico Weber "};\n"
17495f5a7458SNico Weber "} // namespace nx\n";
17505f5a7458SNico Weber std::string Expected = "namespace na {\n"
17515f5a7458SNico Weber "class A {};\n"
17525f5a7458SNico Weber "} // namespace na\n"
17535f5a7458SNico Weber "namespace nb {\n"
17545f5a7458SNico Weber "class B {};\n"
17555f5a7458SNico Weber "} // namespace nb\n"
17565f5a7458SNico Weber "\n"
17575f5a7458SNico Weber "namespace ny {\n"
17585f5a7458SNico Weber "namespace na {\n"
17595f5a7458SNico Weber "namespace nc {\n"
17605f5a7458SNico Weber "class X {\n"
17615f5a7458SNico Weber " ::na::A a; nb::B b;\n"
17625f5a7458SNico Weber "};\n"
17635f5a7458SNico Weber "} // namespace nc\n"
17645f5a7458SNico Weber "} // namespace na\n"
17655f5a7458SNico Weber "} // namespace ny\n";
17665f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
17675f5a7458SNico Weber }
17685f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,SymbolConflictWithNewNamespace)17695f5a7458SNico Weber TEST_F(ChangeNamespaceTest, SymbolConflictWithNewNamespace) {
17705f5a7458SNico Weber OldNamespace = "nx";
17715f5a7458SNico Weber NewNamespace = "ny::na::nc";
17725f5a7458SNico Weber std::string Code = "namespace na {\n"
17735f5a7458SNico Weber "class A {};\n"
17745f5a7458SNico Weber "namespace nb {\n"
17755f5a7458SNico Weber "class B {};\n"
17765f5a7458SNico Weber "} // namespace nb\n"
17775f5a7458SNico Weber "} // namespace na\n"
17785f5a7458SNico Weber "namespace ny {\n"
17795f5a7458SNico Weber "class Y {};\n"
17805f5a7458SNico Weber "}\n"
17815f5a7458SNico Weber "namespace nx {\n"
17825f5a7458SNico Weber "class X {\n"
17835f5a7458SNico Weber " na::A a; na::nb::B b;\n"
17845f5a7458SNico Weber " ny::Y y;"
17855f5a7458SNico Weber "};\n"
17865f5a7458SNico Weber "} // namespace nx\n";
17875f5a7458SNico Weber std::string Expected = "namespace na {\n"
17885f5a7458SNico Weber "class A {};\n"
17895f5a7458SNico Weber "namespace nb {\n"
17905f5a7458SNico Weber "class B {};\n"
17915f5a7458SNico Weber "} // namespace nb\n"
17925f5a7458SNico Weber "} // namespace na\n"
17935f5a7458SNico Weber "namespace ny {\n"
17945f5a7458SNico Weber "class Y {};\n"
17955f5a7458SNico Weber "}\n"
17965f5a7458SNico Weber "\n"
17975f5a7458SNico Weber "namespace ny {\n"
17985f5a7458SNico Weber "namespace na {\n"
17995f5a7458SNico Weber "namespace nc {\n"
18005f5a7458SNico Weber "class X {\n"
18015f5a7458SNico Weber " ::na::A a; ::na::nb::B b;\n"
18025f5a7458SNico Weber " Y y;\n"
18035f5a7458SNico Weber "};\n"
18045f5a7458SNico Weber "} // namespace nc\n"
18055f5a7458SNico Weber "} // namespace na\n"
18065f5a7458SNico Weber "} // namespace ny\n";
18075f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
18085f5a7458SNico Weber }
18095f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,ShortenNamespaceSpecifier)18105f5a7458SNico Weber TEST_F(ChangeNamespaceTest, ShortenNamespaceSpecifier) {
18115f5a7458SNico Weber OldNamespace = "nx";
18125f5a7458SNico Weber NewNamespace = "ny::na";
18135f5a7458SNico Weber std::string Code = "class G {};\n"
18145f5a7458SNico Weber "namespace ny {\n"
18155f5a7458SNico Weber "class Y {};\n"
18165f5a7458SNico Weber "namespace na {\n"
18175f5a7458SNico Weber "class A {};\n"
18185f5a7458SNico Weber "namespace nc { class C {}; } // namespace nc\n"
18195f5a7458SNico Weber "}\n // namespace na\n"
18205f5a7458SNico Weber "}\n // namespace ny\n"
18215f5a7458SNico Weber "namespace nx {\n"
18225f5a7458SNico Weber "class X {\n"
18235f5a7458SNico Weber " G g; ny::Y y; ny::na::A a; ny::na::nc::C c;\n"
18245f5a7458SNico Weber "};\n"
18255f5a7458SNico Weber "} // namespace nx\n";
18265f5a7458SNico Weber std::string Expected = "class G {};\n"
18275f5a7458SNico Weber "namespace ny {\n"
18285f5a7458SNico Weber "class Y {};\n"
18295f5a7458SNico Weber "namespace na {\n"
18305f5a7458SNico Weber "class A {};\n"
18315f5a7458SNico Weber "namespace nc { class C {}; } // namespace nc\n"
18325f5a7458SNico Weber "}\n // namespace na\n"
18335f5a7458SNico Weber "}\n // namespace ny\n"
18345f5a7458SNico Weber "\n"
18355f5a7458SNico Weber "namespace ny {\n"
18365f5a7458SNico Weber "namespace na {\n"
18375f5a7458SNico Weber "class X {\n"
18385f5a7458SNico Weber " G g; Y y; A a; nc::C c;\n"
18395f5a7458SNico Weber "};\n"
18405f5a7458SNico Weber "} // namespace na\n"
18415f5a7458SNico Weber "} // namespace ny\n";
18425f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
18435f5a7458SNico Weber }
18445f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,ShortenNamespaceSpecifierInAnonymousNamespace)18455f5a7458SNico Weber TEST_F(ChangeNamespaceTest, ShortenNamespaceSpecifierInAnonymousNamespace) {
18465f5a7458SNico Weber OldNamespace = "nx";
18475f5a7458SNico Weber NewNamespace = "ny::na";
18485f5a7458SNico Weber std::string Code = "class G {};\n"
18495f5a7458SNico Weber "namespace ny {\n"
18505f5a7458SNico Weber "class Y {};\n"
18515f5a7458SNico Weber "namespace na {\n"
18525f5a7458SNico Weber "class A {};\n"
18535f5a7458SNico Weber "namespace nc { class C {}; } // namespace nc\n"
18545f5a7458SNico Weber "}\n // namespace na\n"
18555f5a7458SNico Weber "}\n // namespace ny\n"
18565f5a7458SNico Weber "namespace nx {\n"
18575f5a7458SNico Weber "namespace {\n"
18585f5a7458SNico Weber "class X {\n"
18595f5a7458SNico Weber " G g; ::ny::Y y; ::ny::na::A a; ::ny::na::nc::C c;\n"
18605f5a7458SNico Weber "};\n"
18615f5a7458SNico Weber "} // namespace\n"
18625f5a7458SNico Weber "} // namespace nx\n";
18635f5a7458SNico Weber std::string Expected = "class G {};\n"
18645f5a7458SNico Weber "namespace ny {\n"
18655f5a7458SNico Weber "class Y {};\n"
18665f5a7458SNico Weber "namespace na {\n"
18675f5a7458SNico Weber "class A {};\n"
18685f5a7458SNico Weber "namespace nc { class C {}; } // namespace nc\n"
18695f5a7458SNico Weber "}\n // namespace na\n"
18705f5a7458SNico Weber "}\n // namespace ny\n"
18715f5a7458SNico Weber "\n"
18725f5a7458SNico Weber "namespace ny {\n"
18735f5a7458SNico Weber "namespace na {\n"
18745f5a7458SNico Weber "namespace {\n"
18755f5a7458SNico Weber "class X {\n"
18765f5a7458SNico Weber " G g; Y y; A a; nc::C c;\n"
18775f5a7458SNico Weber "};\n"
18785f5a7458SNico Weber "} // namespace\n"
18795f5a7458SNico Weber "} // namespace na\n"
18805f5a7458SNico Weber "} // namespace ny\n";
18815f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
18825f5a7458SNico Weber }
18835f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,SimpleMoveEnum)18845f5a7458SNico Weber TEST_F(ChangeNamespaceTest, SimpleMoveEnum) {
18855f5a7458SNico Weber std::string Code = "namespace na {\n"
18865f5a7458SNico Weber "namespace nb {\n"
18875f5a7458SNico Weber "enum class X { X1, X2 };\n"
18885f5a7458SNico Weber "enum Y { Y1, Y2 };\n"
18895f5a7458SNico Weber "} // namespace nb\n"
18905f5a7458SNico Weber "} // namespace na\n";
18915f5a7458SNico Weber std::string Expected = "\n\nnamespace x {\n"
18925f5a7458SNico Weber "namespace y {\n"
18935f5a7458SNico Weber "enum class X { X1, X2 };\n"
18945f5a7458SNico Weber "enum Y { Y1, Y2 };\n"
18955f5a7458SNico Weber "} // namespace y\n"
18965f5a7458SNico Weber "} // namespace x\n";
18975f5a7458SNico Weber
18985f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
18995f5a7458SNico Weber }
19005f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,ReferencesToEnums)19015f5a7458SNico Weber TEST_F(ChangeNamespaceTest, ReferencesToEnums) {
19025f5a7458SNico Weber std::string Code = "enum Glob { G1, G2 };\n"
19035f5a7458SNico Weber "namespace na {\n"
19045f5a7458SNico Weber "enum class X { X1 };\n"
19055f5a7458SNico Weber "enum Y { Y1, Y2 };\n"
19065f5a7458SNico Weber "namespace nb {\n"
19075f5a7458SNico Weber "void f() {\n"
19085f5a7458SNico Weber " Glob g1 = Glob::G1;\n"
19095f5a7458SNico Weber " Glob g2 = G2;\n"
19105f5a7458SNico Weber " X x1 = X::X1;\n"
19115f5a7458SNico Weber " Y y1 = Y::Y1;\n"
19125f5a7458SNico Weber " Y y2 = Y2;\n"
19135f5a7458SNico Weber "}\n"
19145f5a7458SNico Weber "} // namespace nb\n"
19155f5a7458SNico Weber "} // namespace na\n";
19165f5a7458SNico Weber std::string Expected = "enum Glob { G1, G2 };\n"
19175f5a7458SNico Weber "namespace na {\n"
19185f5a7458SNico Weber "enum class X { X1 };\n"
19195f5a7458SNico Weber "enum Y { Y1, Y2 };\n"
19205f5a7458SNico Weber "\n"
19215f5a7458SNico Weber "} // namespace na\n"
19225f5a7458SNico Weber "namespace x {\n"
19235f5a7458SNico Weber "namespace y {\n"
19245f5a7458SNico Weber "void f() {\n"
19255f5a7458SNico Weber " Glob g1 = Glob::G1;\n"
19265f5a7458SNico Weber " Glob g2 = G2;\n"
19275f5a7458SNico Weber " na::X x1 = na::X::X1;\n"
19285f5a7458SNico Weber " na::Y y1 = na::Y::Y1;\n"
19295f5a7458SNico Weber " na::Y y2 = na::Y2;\n"
19305f5a7458SNico Weber "}\n"
19315f5a7458SNico Weber "} // namespace y\n"
19325f5a7458SNico Weber "} // namespace x\n";
19335f5a7458SNico Weber
19345f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
19355f5a7458SNico Weber }
19365f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,NoRedundantEnumUpdate)19375f5a7458SNico Weber TEST_F(ChangeNamespaceTest, NoRedundantEnumUpdate) {
19385f5a7458SNico Weber std::string Code = "namespace ns {\n"
19395f5a7458SNico Weber "enum class X { X1 };\n"
19405f5a7458SNico Weber "enum Y { Y1, Y2 };\n"
19415f5a7458SNico Weber "} // namespace ns\n"
19425f5a7458SNico Weber "namespace na {\n"
19435f5a7458SNico Weber "namespace nb {\n"
19445f5a7458SNico Weber "void f() {\n"
19455f5a7458SNico Weber " ns::X x1 = ns::X::X1;\n"
19465f5a7458SNico Weber " ns::Y y1 = ns::Y::Y1;\n"
19475f5a7458SNico Weber " ns::Y y2 = ns::Y2;\n"
19485f5a7458SNico Weber "}\n"
19495f5a7458SNico Weber "} // namespace nb\n"
19505f5a7458SNico Weber "} // namespace na\n";
19515f5a7458SNico Weber std::string Expected = "namespace ns {\n"
19525f5a7458SNico Weber "enum class X { X1 };\n"
19535f5a7458SNico Weber "enum Y { Y1, Y2 };\n"
19545f5a7458SNico Weber "} // namespace ns\n"
19555f5a7458SNico Weber "\n"
19565f5a7458SNico Weber "namespace x {\n"
19575f5a7458SNico Weber "namespace y {\n"
19585f5a7458SNico Weber "void f() {\n"
19595f5a7458SNico Weber " ns::X x1 = ns::X::X1;\n"
19605f5a7458SNico Weber " ns::Y y1 = ns::Y::Y1;\n"
19615f5a7458SNico Weber " ns::Y y2 = ns::Y2;\n"
19625f5a7458SNico Weber "}\n"
19635f5a7458SNico Weber "} // namespace y\n"
19645f5a7458SNico Weber "} // namespace x\n";
19655f5a7458SNico Weber ;
19665f5a7458SNico Weber
19675f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
19685f5a7458SNico Weber }
19695f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,EnumsAndUsingShadows)19705f5a7458SNico Weber TEST_F(ChangeNamespaceTest, EnumsAndUsingShadows) {
19715f5a7458SNico Weber std::string Code = "namespace ns {\n"
19725f5a7458SNico Weber "enum class X { X1 };\n"
19735f5a7458SNico Weber "enum Y { Y1, Y2, Y3 };\n"
19745f5a7458SNico Weber "} // namespace ns\n"
19755f5a7458SNico Weber "using ns::X;\n"
19765f5a7458SNico Weber "using ns::Y;\n"
19775f5a7458SNico Weber "using ns::Y::Y2;\n"
19785f5a7458SNico Weber "using ns::Y::Y3;\n"
19795f5a7458SNico Weber "namespace na {\n"
19805f5a7458SNico Weber "namespace nb {\n"
19815f5a7458SNico Weber "void f() {\n"
19825f5a7458SNico Weber " X x1 = X::X1;\n"
19835f5a7458SNico Weber " Y y1 = Y::Y1;\n"
19845f5a7458SNico Weber " Y y2 = Y2;\n"
19855f5a7458SNico Weber " Y y3 = Y3;\n"
19865f5a7458SNico Weber "}\n"
19875f5a7458SNico Weber "} // namespace nb\n"
19885f5a7458SNico Weber "} // namespace na\n";
19895f5a7458SNico Weber std::string Expected = "namespace ns {\n"
19905f5a7458SNico Weber "enum class X { X1 };\n"
19915f5a7458SNico Weber "enum Y { Y1, Y2, Y3 };\n"
19925f5a7458SNico Weber "} // namespace ns\n"
19935f5a7458SNico Weber "using ns::X;\n"
19945f5a7458SNico Weber "using ns::Y;\n"
19955f5a7458SNico Weber "using ns::Y::Y2;\n"
19965f5a7458SNico Weber "using ns::Y::Y3;\n"
19975f5a7458SNico Weber "\n"
19985f5a7458SNico Weber "namespace x {\n"
19995f5a7458SNico Weber "namespace y {\n"
20005f5a7458SNico Weber "void f() {\n"
20015f5a7458SNico Weber " X x1 = X::X1;\n"
20025f5a7458SNico Weber " Y y1 = Y::Y1;\n"
20035f5a7458SNico Weber " Y y2 = Y2;\n"
20045f5a7458SNico Weber " Y y3 = Y3;\n"
20055f5a7458SNico Weber "}\n"
20065f5a7458SNico Weber "} // namespace y\n"
20075f5a7458SNico Weber "} // namespace x\n";
20085f5a7458SNico Weber
20095f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
20105f5a7458SNico Weber }
20115f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,EnumsAndAliases)20125f5a7458SNico Weber TEST_F(ChangeNamespaceTest, EnumsAndAliases) {
20135f5a7458SNico Weber std::string Code = "namespace ns {\n"
20145f5a7458SNico Weber "enum class X { X1 };\n"
20155f5a7458SNico Weber "enum Y { Y1, Y2, Y3 };\n"
20165f5a7458SNico Weber "} // namespace ns\n"
20175f5a7458SNico Weber "typedef ns::X TX;\n"
20185f5a7458SNico Weber "typedef ns::Y TY;\n"
20195f5a7458SNico Weber "using UX = ns::X;\n"
20205f5a7458SNico Weber "using UY = ns::Y;\n"
20215f5a7458SNico Weber "namespace na {\n"
20225f5a7458SNico Weber "namespace nb {\n"
20235f5a7458SNico Weber "void f() {\n"
20245f5a7458SNico Weber " ns::X x1 = ns::X::X1;\n"
20255f5a7458SNico Weber " TX tx1 = TX::X1;\n"
20265f5a7458SNico Weber " UX ux1 = UX::X1;\n"
20275f5a7458SNico Weber " ns::Y y1 = ns::Y::Y1;\n"
20285f5a7458SNico Weber " TY ty1 = TY::Y1;\n"
20295f5a7458SNico Weber " UY uy1 = UY::Y1;\n"
20305f5a7458SNico Weber "}\n"
20315f5a7458SNico Weber "} // namespace nb\n"
20325f5a7458SNico Weber "} // namespace na\n";
20335f5a7458SNico Weber std::string Expected = "namespace ns {\n"
20345f5a7458SNico Weber "enum class X { X1 };\n"
20355f5a7458SNico Weber "enum Y { Y1, Y2, Y3 };\n"
20365f5a7458SNico Weber "} // namespace ns\n"
20375f5a7458SNico Weber "typedef ns::X TX;\n"
20385f5a7458SNico Weber "typedef ns::Y TY;\n"
20395f5a7458SNico Weber "using UX = ns::X;\n"
20405f5a7458SNico Weber "using UY = ns::Y;\n"
20415f5a7458SNico Weber "\n"
20425f5a7458SNico Weber "namespace x {\n"
20435f5a7458SNico Weber "namespace y {\n"
20445f5a7458SNico Weber "void f() {\n"
20455f5a7458SNico Weber " ns::X x1 = ns::X::X1;\n"
20465f5a7458SNico Weber " TX tx1 = TX::X1;\n"
20475f5a7458SNico Weber " UX ux1 = UX::X1;\n"
20485f5a7458SNico Weber " ns::Y y1 = ns::Y::Y1;\n"
20495f5a7458SNico Weber " TY ty1 = TY::Y1;\n"
20505f5a7458SNico Weber " UY uy1 = UY::Y1;\n"
20515f5a7458SNico Weber "}\n"
20525f5a7458SNico Weber "} // namespace y\n"
20535f5a7458SNico Weber "} // namespace x\n";
20545f5a7458SNico Weber
20555f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
20565f5a7458SNico Weber }
20575f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,EnumInClass)20585f5a7458SNico Weber TEST_F(ChangeNamespaceTest, EnumInClass) {
20595f5a7458SNico Weber std::string Code = "namespace na {\n"
20605f5a7458SNico Weber "struct X { enum E { E1 }; };\n"
20615f5a7458SNico Weber "namespace nb {\n"
20625f5a7458SNico Weber "void f() {\n"
20635f5a7458SNico Weber " X::E e = X::E1;\n"
20645f5a7458SNico Weber " X::E ee = X::E::E1;\n"
20655f5a7458SNico Weber "}\n"
20665f5a7458SNico Weber "} // namespace nb\n"
20675f5a7458SNico Weber "} // namespace na\n";
20685f5a7458SNico Weber std::string Expected = "namespace na {\n"
20695f5a7458SNico Weber "struct X { enum E { E1 }; };\n"
20705f5a7458SNico Weber "\n"
20715f5a7458SNico Weber "} // namespace na\n"
20725f5a7458SNico Weber "namespace x {\n"
20735f5a7458SNico Weber "namespace y {\n"
20745f5a7458SNico Weber "void f() {\n"
20755f5a7458SNico Weber " na::X::E e = na::X::E1;\n"
20765f5a7458SNico Weber " na::X::E ee = na::X::E::E1;\n"
20775f5a7458SNico Weber "}\n"
20785f5a7458SNico Weber "} // namespace y\n"
20795f5a7458SNico Weber "} // namespace x\n";
20805f5a7458SNico Weber
20815f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
20825f5a7458SNico Weber }
20835f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,TypeAsTemplateParameter)20845f5a7458SNico Weber TEST_F(ChangeNamespaceTest, TypeAsTemplateParameter) {
20855f5a7458SNico Weber std::string Code = "namespace na {\n"
20865f5a7458SNico Weber "struct X {};\n"
20875f5a7458SNico Weber "namespace nb {\n"
20885f5a7458SNico Weber "template <typename TT>\n"
20895f5a7458SNico Weber "void TempTemp(const TT& t) {\n"
20905f5a7458SNico Weber " TT tmp;\n"
20915f5a7458SNico Weber "}\n"
20925f5a7458SNico Weber "template <typename T>\n"
20935f5a7458SNico Weber "void Temp(const T& t) {\n"
20945f5a7458SNico Weber " T tmp = t;\n"
20955f5a7458SNico Weber " TempTemp(tmp);\n"
20965f5a7458SNico Weber " TempTemp(t);\n"
20975f5a7458SNico Weber "}\n"
20985f5a7458SNico Weber "void f() {\n"
20995f5a7458SNico Weber " X x;\n"
21005f5a7458SNico Weber " Temp(x);\n"
21015f5a7458SNico Weber "}\n"
21025f5a7458SNico Weber "} // namespace nb\n"
21035f5a7458SNico Weber "} // namespace na\n";
21045f5a7458SNico Weber std::string Expected = "namespace na {\n"
21055f5a7458SNico Weber "struct X {};\n"
21065f5a7458SNico Weber "\n"
21075f5a7458SNico Weber "} // namespace na\n"
21085f5a7458SNico Weber "namespace x {\n"
21095f5a7458SNico Weber "namespace y {\n"
21105f5a7458SNico Weber "template <typename TT>\n"
21115f5a7458SNico Weber "void TempTemp(const TT& t) {\n"
21125f5a7458SNico Weber " TT tmp;\n"
21135f5a7458SNico Weber "}\n"
21145f5a7458SNico Weber "template <typename T>\n"
21155f5a7458SNico Weber "void Temp(const T& t) {\n"
21165f5a7458SNico Weber " T tmp = t;\n"
21175f5a7458SNico Weber " TempTemp(tmp);\n"
21185f5a7458SNico Weber " TempTemp(t);\n"
21195f5a7458SNico Weber "}\n"
21205f5a7458SNico Weber "void f() {\n"
21215f5a7458SNico Weber " na::X x;\n"
21225f5a7458SNico Weber " Temp(x);\n"
21235f5a7458SNico Weber "}\n"
21245f5a7458SNico Weber "} // namespace y\n"
21255f5a7458SNico Weber "} // namespace x\n";
21265f5a7458SNico Weber
21275f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
21285f5a7458SNico Weber }
21295f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,DefaultMoveConstructors)21305f5a7458SNico Weber TEST_F(ChangeNamespaceTest, DefaultMoveConstructors) {
21315f5a7458SNico Weber std::string Code = "namespace na {\n"
21325f5a7458SNico Weber "class B {\n"
21335f5a7458SNico Weber " public:\n"
21345f5a7458SNico Weber " B() = default;\n"
21355f5a7458SNico Weber " // Allow move only.\n"
21365f5a7458SNico Weber " B(B&&) = default;\n"
21375f5a7458SNico Weber " B& operator=(B&&) = default;\n"
21385f5a7458SNico Weber " B(const B&) = delete;\n"
21395f5a7458SNico Weber " B& operator=(const B&) = delete;\n"
21405f5a7458SNico Weber " private:\n"
21415f5a7458SNico Weber " int ref_;\n"
21425f5a7458SNico Weber "};\n"
21435f5a7458SNico Weber "} // namespace na\n"
21445f5a7458SNico Weber "namespace na {\n"
21455f5a7458SNico Weber "namespace nb {\n"
21465f5a7458SNico Weber "class A {\n"
21475f5a7458SNico Weber "public:\n"
21485f5a7458SNico Weber " A() = default;\n"
21495f5a7458SNico Weber " A(A&&) = default;\n"
21505f5a7458SNico Weber " A& operator=(A&&) = default;\n"
21515f5a7458SNico Weber "private:\n"
21525f5a7458SNico Weber " B b;\n"
21535f5a7458SNico Weber " A(const A&) = delete;\n"
21545f5a7458SNico Weber " A& operator=(const A&) = delete;\n"
21555f5a7458SNico Weber "};\n"
21565f5a7458SNico Weber "void f() { A a; a = A(); A aa = A(); }\n"
21575f5a7458SNico Weber "} // namespace nb\n"
21585f5a7458SNico Weber "} // namespace na\n";
21595f5a7458SNico Weber std::string Expected = "namespace na {\n"
21605f5a7458SNico Weber "class B {\n"
21615f5a7458SNico Weber " public:\n"
21625f5a7458SNico Weber " B() = default;\n"
21635f5a7458SNico Weber " // Allow move only.\n"
21645f5a7458SNico Weber " B(B&&) = default;\n"
21655f5a7458SNico Weber " B& operator=(B&&) = default;\n"
21665f5a7458SNico Weber " B(const B&) = delete;\n"
21675f5a7458SNico Weber " B& operator=(const B&) = delete;\n"
21685f5a7458SNico Weber " private:\n"
21695f5a7458SNico Weber " int ref_;\n"
21705f5a7458SNico Weber "};\n"
21715f5a7458SNico Weber "} // namespace na\n"
21725f5a7458SNico Weber "\n"
21735f5a7458SNico Weber "namespace x {\n"
21745f5a7458SNico Weber "namespace y {\n"
21755f5a7458SNico Weber "class A {\n"
21765f5a7458SNico Weber "public:\n"
21775f5a7458SNico Weber " A() = default;\n"
21785f5a7458SNico Weber " A(A&&) = default;\n"
21795f5a7458SNico Weber " A& operator=(A&&) = default;\n"
21805f5a7458SNico Weber "private:\n"
21815f5a7458SNico Weber " na::B b;\n"
21825f5a7458SNico Weber " A(const A&) = delete;\n"
21835f5a7458SNico Weber " A& operator=(const A&) = delete;\n"
21845f5a7458SNico Weber "};\n"
21855f5a7458SNico Weber "void f() { A a; a = A(); A aa = A(); }\n"
21865f5a7458SNico Weber "} // namespace y\n"
21875f5a7458SNico Weber "} // namespace x\n";
21885f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
21895f5a7458SNico Weber }
21905f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,InjectedClassNameInFriendDecl)21915f5a7458SNico Weber TEST_F(ChangeNamespaceTest, InjectedClassNameInFriendDecl) {
21925f5a7458SNico Weber OldNamespace = "d";
21935f5a7458SNico Weber NewNamespace = "e";
21945f5a7458SNico Weber std::string Code = "namespace a{\n"
21955f5a7458SNico Weber "template <typename T>\n"
21965f5a7458SNico Weber "class Base {\n"
21975f5a7458SNico Weber " public:\n"
21985f5a7458SNico Weber " void f() {\n"
21995f5a7458SNico Weber " T t;\n"
22005f5a7458SNico Weber " t.priv();\n"
22015f5a7458SNico Weber " }\n"
22025f5a7458SNico Weber "};\n"
22035f5a7458SNico Weber "} // namespace a\n"
22045f5a7458SNico Weber "namespace d {\n"
22055f5a7458SNico Weber "class D : public a::Base<D> {\n"
22065f5a7458SNico Weber " private:\n"
22075f5a7458SNico Weber " friend class Base<D>;\n"
22085f5a7458SNico Weber " void priv() {}\n"
22095f5a7458SNico Weber " Base b;\n"
22105f5a7458SNico Weber "};\n"
22115f5a7458SNico Weber "\n"
22125f5a7458SNico Weber "void f() {\n"
22135f5a7458SNico Weber " D d;\n"
22145f5a7458SNico Weber " a:: Base<D> b;\n"
22155f5a7458SNico Weber " b.f();\n"
22165f5a7458SNico Weber "}\n"
22175f5a7458SNico Weber "} // namespace d\n";
22185f5a7458SNico Weber std::string Expected = "namespace a{\n"
22195f5a7458SNico Weber "template <typename T>\n"
22205f5a7458SNico Weber "class Base {\n"
22215f5a7458SNico Weber " public:\n"
22225f5a7458SNico Weber " void f() {\n"
22235f5a7458SNico Weber " T t;\n"
22245f5a7458SNico Weber " t.priv();\n"
22255f5a7458SNico Weber " }\n"
22265f5a7458SNico Weber "};\n"
22275f5a7458SNico Weber "} // namespace a\n"
22285f5a7458SNico Weber "\n"
22295f5a7458SNico Weber "namespace e {\n"
22305f5a7458SNico Weber "class D : public a::Base<D> {\n"
22315f5a7458SNico Weber " private:\n"
2232*15f3cd6bSMatheus Izvekov " friend class a::Base<D>;\n"
22335f5a7458SNico Weber " void priv() {}\n"
22345f5a7458SNico Weber " a::Base b;\n"
22355f5a7458SNico Weber "};\n"
22365f5a7458SNico Weber "\n"
22375f5a7458SNico Weber "void f() {\n"
22385f5a7458SNico Weber " D d;\n"
22395f5a7458SNico Weber " a::Base<D> b;\n"
22405f5a7458SNico Weber " b.f();\n"
22415f5a7458SNico Weber "}\n"
22425f5a7458SNico Weber "} // namespace e\n";
22435f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
22445f5a7458SNico Weber }
22455f5a7458SNico Weber
TEST_F(ChangeNamespaceTest,FullyQualifyConflictNamespace)22465f5a7458SNico Weber TEST_F(ChangeNamespaceTest, FullyQualifyConflictNamespace) {
22475f5a7458SNico Weber std::string Code =
22485f5a7458SNico Weber "namespace x { namespace util { class Some {}; } }\n"
22495f5a7458SNico Weber "namespace x { namespace y {namespace base { class Base {}; } } }\n"
22505f5a7458SNico Weber "namespace util { class Status {}; }\n"
22515f5a7458SNico Weber "namespace base { class Base {}; }\n"
22525f5a7458SNico Weber "namespace na {\n"
22535f5a7458SNico Weber "namespace nb {\n"
22545f5a7458SNico Weber "void f() {\n"
22555f5a7458SNico Weber " util::Status s1; x::util::Some s2;\n"
22565f5a7458SNico Weber " base::Base b1; x::y::base::Base b2;\n"
22575f5a7458SNico Weber "}\n"
22585f5a7458SNico Weber "} // namespace nb\n"
22595f5a7458SNico Weber "} // namespace na\n";
22605f5a7458SNico Weber
22615f5a7458SNico Weber std::string Expected =
22625f5a7458SNico Weber "namespace x { namespace util { class Some {}; } }\n"
22635f5a7458SNico Weber "namespace x { namespace y {namespace base { class Base {}; } } }\n"
22645f5a7458SNico Weber "namespace util { class Status {}; }\n"
22655f5a7458SNico Weber "namespace base { class Base {}; }\n"
22665f5a7458SNico Weber "\n"
22675f5a7458SNico Weber "namespace x {\n"
22685f5a7458SNico Weber "namespace y {\n"
22695f5a7458SNico Weber "void f() {\n"
22705f5a7458SNico Weber " ::util::Status s1; util::Some s2;\n"
22715f5a7458SNico Weber " ::base::Base b1; base::Base b2;\n"
22725f5a7458SNico Weber "}\n"
22735f5a7458SNico Weber "} // namespace y\n"
22745f5a7458SNico Weber "} // namespace x\n";
22755f5a7458SNico Weber
22765f5a7458SNico Weber EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
22775f5a7458SNico Weber }
22785f5a7458SNico Weber
22795f5a7458SNico Weber } // anonymous namespace
22805f5a7458SNico Weber } // namespace change_namespace
22815f5a7458SNico Weber } // namespace clang
2282