diff options
Diffstat (limited to 'clang-tools-extra/unittests/cpp11-migrate')
7 files changed, 154 insertions, 101 deletions
diff --git a/clang-tools-extra/unittests/cpp11-migrate/CMakeLists.txt b/clang-tools-extra/unittests/cpp11-migrate/CMakeLists.txt index fcf678d3490..228de69b5c7 100644 --- a/clang-tools-extra/unittests/cpp11-migrate/CMakeLists.txt +++ b/clang-tools-extra/unittests/cpp11-migrate/CMakeLists.txt @@ -1,26 +1,31 @@ -set(LLVM_LINK_COMPONENTS
- support
- )
-
-get_filename_component(CPP11_MIGRATE_SOURCE_DIR
- ${CMAKE_CURRENT_SOURCE_DIR}/../../cpp11-migrate REALPATH)
-include_directories(${CPP11_MIGRATE_SOURCE_DIR})
-
-add_extra_unittest(Cpp11MigrateTests
- FileOverridesTest.cpp
- ReformattingTest.cpp
- IncludeExcludeTest.cpp
- PerfSupportTest.cpp
- TransformTest.cpp
- UniqueHeaderNameTest.cpp
- IncludeDirectivesTest.cpp
- )
-
-target_link_libraries(Cpp11MigrateTests
- migrateCore
- clangFormat
- clangTooling
- clangBasic
- clangASTMatchers
- clangRewriteFrontend
- )
+set(LLVM_LINK_COMPONENTS + support + ) + +get_filename_component(CPP11_MIGRATE_SOURCE_DIR + ${CMAKE_CURRENT_SOURCE_DIR}/../../cpp11-migrate REALPATH) +get_filename_component(ClangReplaceLocation + "${CMAKE_CURRENT_SOURCE_DIR}/../../clang-replace/include" REALPATH) +include_directories( + ${CPP11_MIGRATE_SOURCE_DIR} + ${ClangReplaceLocation} + ) + +add_extra_unittest(Cpp11MigrateTests + FileOverridesTest.cpp + ReformattingTest.cpp + IncludeExcludeTest.cpp + PerfSupportTest.cpp + TransformTest.cpp + UniqueHeaderNameTest.cpp + IncludeDirectivesTest.cpp + ) + +target_link_libraries(Cpp11MigrateTests + migrateCore + clangFormat + clangTooling + clangBasic + clangASTMatchers + clangRewriteFrontend + ) diff --git a/clang-tools-extra/unittests/cpp11-migrate/FileOverridesTest.cpp b/clang-tools-extra/unittests/cpp11-migrate/FileOverridesTest.cpp index fc54474af84..5404aeb579d 100644 --- a/clang-tools-extra/unittests/cpp11-migrate/FileOverridesTest.cpp +++ b/clang-tools-extra/unittests/cpp11-migrate/FileOverridesTest.cpp @@ -8,56 +8,34 @@ //===----------------------------------------------------------------------===// #include "Core/FileOverrides.h" +#include "Core/Refactoring.h" #include "gtest/gtest.h" #include "VirtualFileHelper.h" +#include "clang/Rewrite/Core/Rewriter.h" using namespace clang; using namespace clang::tooling; -TEST(SourceOverridesTest, Interface) { - llvm::StringRef FileName = "<test-file>"; - VirtualFileHelper VFHelper; - VFHelper.mapFile( - FileName, - "std::vector<such_a_long_name_for_a_type>::const_iterator long_type =\n" - " vec.begin();\n"); - SourceOverrides Overrides(FileName, /*TrackFileChanges=*/false); - - EXPECT_EQ(FileName, Overrides.getMainFileName()); - EXPECT_FALSE(Overrides.isSourceOverriden()); - EXPECT_FALSE(Overrides.isTrackingFileChanges()); - - Replacements Replaces; - unsigned ReplacementLength = - strlen("std::vector<such_a_long_name_for_a_type>::const_iterator"); - Replaces.insert( - Replacement(FileName, 0, ReplacementLength, "auto")); - Overrides.applyReplacements(Replaces, VFHelper.getNewSourceManager()); - EXPECT_TRUE(Overrides.isSourceOverriden()); - - std::string ExpectedContent = "auto long_type =\n" - " vec.begin();\n"; - EXPECT_EQ(ExpectedContent, Overrides.getMainFileContent()); -} - -namespace { -Replacement makeReplacement(unsigned Offset, unsigned Length, - unsigned ReplacementLength) { - return Replacement("", Offset, Length, std::string(ReplacementLength, '~')); +static Replacement makeReplacement(unsigned Offset, unsigned Length, + unsigned ReplacementLength, + llvm::StringRef FilePath) { + return Replacement(FilePath, Offset, Length, + std::string(ReplacementLength, '~')); } // generate a set of replacements containing one element -Replacements makeReplacements(unsigned Offset, unsigned Length, - unsigned ReplacementLength) { - Replacements Replaces; - Replaces.insert(makeReplacement(Offset, Length, ReplacementLength)); +static ReplacementsVec makeReplacements(unsigned Offset, unsigned Length, + unsigned ReplacementLength, + llvm::StringRef FilePath = "~") { + ReplacementsVec Replaces; + Replaces.push_back( + makeReplacement(Offset, Length, ReplacementLength, FilePath)); return Replaces; } -bool equalRanges(Range A, Range B) { +static bool equalRanges(Range A, Range B) { return A.getOffset() == B.getOffset() && A.getLength() == B.getLength(); } -} // end anonymous namespace TEST(ChangedRangesTest, adjustChangedRangesShrink) { ChangedRanges Changes; @@ -139,3 +117,71 @@ TEST(ChangedRangesTest, adjustChangedRangesRangeResized) { EXPECT_TRUE( std::equal(Changes.begin(), Changes.end(), ExpectedChanges, equalRanges)); } + +TEST(FileOverridesTest, applyOverrides) { + + // Set up initial state + VirtualFileHelper VFHelper; + + SmallString<128> fileAPath("fileA.cpp"); + ASSERT_FALSE(llvm::sys::fs::make_absolute(fileAPath)); + SmallString<128> fileBPath("fileB.cpp"); + ASSERT_FALSE(llvm::sys::fs::make_absolute(fileBPath)); + VFHelper.mapFile(fileAPath, "Content A"); + VFHelper.mapFile(fileBPath, "Content B"); + SourceManager &SM = VFHelper.getNewSourceManager(); + + // Fill a Rewriter with changes + Rewriter Rewrites(SM, LangOptions()); + ReplacementsVec R(1, Replacement(fileAPath, 0, 7, "Stuff")); + ASSERT_TRUE(applyAllReplacements(R, Rewrites)); + + FileOverrides Overrides; + Overrides.updateState(Rewrites); + + const FileOverrides::FileStateMap &State = Overrides.getState(); + + // Ensure state updated + ASSERT_TRUE(State.end() == State.find(fileBPath)); + ASSERT_TRUE(State.begin() == State.find(fileAPath)); + ASSERT_EQ("Stuff A", State.begin()->getValue()); + + Overrides.applyOverrides(SM); + + const FileEntry *EntryA = SM.getFileManager().getFile(fileAPath); + FileID IdA = SM.translateFile(EntryA); + ASSERT_FALSE(IdA.isInvalid()); + + // Ensure the contents of the buffer matches what we'd expect. + const llvm::MemoryBuffer *BufferA = SM.getBuffer(IdA); + ASSERT_FALSE(0 == BufferA); + ASSERT_EQ("Stuff A", BufferA->getBuffer()); +} + +TEST(FileOverridesTest, adjustChangedRanges) { + SmallString<128> fileAPath("fileA.cpp"); + ASSERT_FALSE(llvm::sys::fs::make_absolute(fileAPath)); + SmallString<128> fileBPath("fileB.cpp"); + ASSERT_FALSE(llvm::sys::fs::make_absolute(fileBPath)); + + replace::FileToReplacementsMap GroupedReplacements; + GroupedReplacements[fileAPath] = makeReplacements(0, 5, 4, fileAPath); + GroupedReplacements[fileBPath] = makeReplacements(10, 0, 6, fileBPath); + + FileOverrides Overrides; + + const FileOverrides::ChangeMap &Map = Overrides.getChangedRanges(); + + ASSERT_TRUE(Map.empty()); + + Overrides.adjustChangedRanges(GroupedReplacements); + + ASSERT_TRUE(Map.end() != Map.find(fileAPath)); + ASSERT_TRUE(Map.end() != Map.find(fileBPath)); + const Range &RA = *Map.find(fileAPath)->second.begin(); + EXPECT_EQ(0u, RA.getOffset()); + EXPECT_EQ(4u, RA.getLength()); + const Range &RB = *Map.find(fileBPath)->second.begin(); + EXPECT_EQ(10u, RB.getOffset()); + EXPECT_EQ(6u, RB.getLength()); +} diff --git a/clang-tools-extra/unittests/cpp11-migrate/Makefile b/clang-tools-extra/unittests/cpp11-migrate/Makefile index 270c523798b..2f4a59afd07 100644 --- a/clang-tools-extra/unittests/cpp11-migrate/Makefile +++ b/clang-tools-extra/unittests/cpp11-migrate/Makefile @@ -13,7 +13,7 @@ include $(CLANG_LEVEL)/../../Makefile.config TESTNAME = Cpp11MigrateTests LINK_COMPONENTS := asmparser bitreader support MC MCParser option \ TransformUtils -USEDLIBS = migrateCore.a clangFormat.a clangTooling.a clangFrontend.a \ +USEDLIBS = migrateCore.a clangFormat.a clangReplace.a clangTooling.a clangFrontend.a \ clangSerialization.a clangDriver.a clangRewriteFrontend.a \ clangRewriteCore.a clangParse.a clangSema.a clangAnalysis.a \ clangAST.a clangASTMatchers.a clangEdit.a clangLex.a \ @@ -21,5 +21,5 @@ USEDLIBS = migrateCore.a clangFormat.a clangTooling.a clangFrontend.a \ include $(CLANG_LEVEL)/Makefile MAKEFILE_UNITTEST_NO_INCLUDE_COMMON := 1 -CPP.Flags += -I$(PROJ_SRC_DIR)/../../cpp11-migrate +CPP.Flags += -I$(PROJ_SRC_DIR)/../../cpp11-migrate -I$(PROJ_SRC_DIR)/../../clang-replace/include include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest diff --git a/clang-tools-extra/unittests/cpp11-migrate/PerfSupportTest.cpp b/clang-tools-extra/unittests/cpp11-migrate/PerfSupportTest.cpp index bbfb08e217c..81235481bff 100644 --- a/clang-tools-extra/unittests/cpp11-migrate/PerfSupportTest.cpp +++ b/clang-tools-extra/unittests/cpp11-migrate/PerfSupportTest.cpp @@ -18,7 +18,7 @@ public: TransformA(const TransformOptions &Options)
: Transform("TransformA", Options) {}
- virtual int apply(FileOverrides &,
+ virtual int apply(const FileOverrides &,
const tooling::CompilationDatabase &,
const std::vector<std::string> &) {
return 0;
@@ -34,7 +34,7 @@ public: TransformB(const TransformOptions &Options)
: Transform("TransformB", Options) {}
- virtual int apply(FileOverrides &,
+ virtual int apply(const FileOverrides &,
const tooling::CompilationDatabase &,
const std::vector<std::string> &) {
return 0;
diff --git a/clang-tools-extra/unittests/cpp11-migrate/ReformattingTest.cpp b/clang-tools-extra/unittests/cpp11-migrate/ReformattingTest.cpp index fcde6b81db4..b4b9a365478 100644 --- a/clang-tools-extra/unittests/cpp11-migrate/ReformattingTest.cpp +++ b/clang-tools-extra/unittests/cpp11-migrate/ReformattingTest.cpp @@ -9,6 +9,7 @@ #include "Core/Reformatting.h" #include "Core/FileOverrides.h" +#include "Core/Refactoring.h" #include "gtest/gtest.h" #include "VirtualFileHelper.h" @@ -19,9 +20,9 @@ namespace { // convenience function to create a ChangedRanges containing one Range ChangedRanges makeChangedRanges(unsigned Offset, unsigned Length) { ChangedRanges Changes; - Replacements Replaces; + ReplacementsVec Replaces; - Replaces.insert(Replacement("", Offset, 0, std::string(Length, '~'))); + Replaces.push_back(Replacement("", Offset, 0, std::string(Length, '~'))); Changes.adjustChangedRanges(Replaces); return Changes; } @@ -35,16 +36,20 @@ TEST(Reformatter, SingleReformat) { Reformatter ChangesReformatter(format::getLLVMStyle()); ChangedRanges Changes = makeChangedRanges(0, 6); - tooling::Replacements Replaces = ChangesReformatter.reformatSingleFile( - FileName, Changes, VFHelper.getNewSourceManager()); - - SourceOverrides Overrides(FileName, /*TrackChanges=*/false); - Overrides.applyReplacements(Replaces, VFHelper.getNewSourceManager()); - - std::string Expected, Result; - - Expected = "int a;\n" - "int b;\n"; - Result = Overrides.getMainFileContent(); - EXPECT_EQ(Expected, Result); + tooling::ReplacementsVec Replaces; + ChangesReformatter.reformatSingleFile( + FileName, Changes, VFHelper.getNewSourceManager(), Replaces); + + // We expect the code above to reformatted like so: + // + // int a; + // int b; + // + // This test is slightly fragile since there's more than one Replacement that + // results in the above change. However, testing the result of applying the + // replacement is more trouble than it's worth in this context. + ASSERT_EQ(1u, Replaces.size()); + EXPECT_EQ(3u, Replaces[0].getOffset()); + EXPECT_EQ(2u, Replaces[0].getLength()); + EXPECT_EQ(" ", Replaces[0].getReplacementText()); } diff --git a/clang-tools-extra/unittests/cpp11-migrate/TransformTest.cpp b/clang-tools-extra/unittests/cpp11-migrate/TransformTest.cpp index b8efc9b5840..75397bf7760 100644 --- a/clang-tools-extra/unittests/cpp11-migrate/TransformTest.cpp +++ b/clang-tools-extra/unittests/cpp11-migrate/TransformTest.cpp @@ -26,7 +26,7 @@ public: DummyTransform(llvm::StringRef Name, const TransformOptions &Options) : Transform(Name, Options) {} - virtual int apply(FileOverrides &, + virtual int apply(const FileOverrides &, const tooling::CompilationDatabase &, const std::vector<std::string> &) { return 0; } @@ -161,7 +161,7 @@ TEST(Transform, Timings) { // Transform's handle* functions require FileOverrides to be set, even if // there aren't any. - FileOverrides Overrides(/*TrackFileChanges=*/false); + FileOverrides Overrides; T.setOverrides(Overrides); Tool.run(clang::tooling::newFrontendActionFactory(&Factory, &Callbacks)); diff --git a/clang-tools-extra/unittests/cpp11-migrate/UniqueHeaderNameTest.cpp b/clang-tools-extra/unittests/cpp11-migrate/UniqueHeaderNameTest.cpp index 0323222c03c..a2d70e03baa 100644 --- a/clang-tools-extra/unittests/cpp11-migrate/UniqueHeaderNameTest.cpp +++ b/clang-tools-extra/unittests/cpp11-migrate/UniqueHeaderNameTest.cpp @@ -28,34 +28,31 @@ TEST(UniqueHeaderName, testUniqueHeaderName) { append(SourceFile, "project/lib/feature.cpp"); native(SourceFile.str().str(), SourceFile); - llvm::SmallString<128> HeaderFile(TmpDir); - append(HeaderFile, "project/include/feature.h"); - native(HeaderFile.str().str(), HeaderFile); - - llvm::SmallString<128> ExpectedName("^feature.cpp_feature.h_[0-9a-f]{2}_[0-9a-f]{2}_[0-9a-f]{2}_[0-9a-f]{2}_[0-9a-f]{2}_[0-9a-f]{2}.yaml$"); - - llvm::SmallString<128> ActualName; + llvm::SmallString<128> FullActualPath; llvm::SmallString<128> Error; bool Result = - generateReplacementsFileName(SourceFile, HeaderFile, ActualName, Error); + generateReplacementsFileName(SourceFile, FullActualPath, Error); ASSERT_TRUE(Result); EXPECT_TRUE(Error.empty()); // We need to check the directory name and filename separately since on // Windows, the path separator is '\' which is a regex escape character. - llvm::SmallString<128> ExpectedHeaderPath = - llvm::sys::path::parent_path(HeaderFile); - llvm::SmallString<128> ActualHeaderPath = - llvm::sys::path::parent_path(ActualName); - llvm::SmallString<128> ActualHeaderName = - llvm::sys::path::filename(ActualName); - - EXPECT_STREQ(ExpectedHeaderPath.c_str(), ActualHeaderPath.c_str()); - + llvm::SmallString<128> ExpectedPath = + llvm::sys::path::parent_path(SourceFile); + llvm::SmallString<128> ActualPath = + llvm::sys::path::parent_path(FullActualPath); + llvm::SmallString<128> ActualName = + llvm::sys::path::filename(FullActualPath); + + EXPECT_STREQ(ExpectedPath.c_str(), ActualPath.c_str()); + + llvm::StringRef ExpectedName = + "^feature.cpp_[0-9a-f]{2}_[0-9a-f]{2}_[0-9a-f]{2}_[0-9a-f]{2}_[" + "0-9a-f]{2}_[0-9a-f]{2}.yaml$"; llvm::Regex R(ExpectedName); - ASSERT_TRUE(R.match(ActualHeaderName)) - << "ExpectedName: " << ExpectedName.c_str() + ASSERT_TRUE(R.match(ActualName)) + << "ExpectedName: " << ExpectedName.data() << "\nActualName: " << ActualName.c_str(); ASSERT_TRUE(Error.empty()) << "Error: " << Error.c_str(); } |