diff options
author | Eric Liu <ioeric@google.com> | 2016-11-07 06:08:23 +0000 |
---|---|---|
committer | Eric Liu <ioeric@google.com> | 2016-11-07 06:08:23 +0000 |
commit | cf2913c6f12fbade57640c3410eb95d05baa27e5 (patch) | |
tree | c159262c42184301d0e9ebbe3669ffa8c878d2d3 /clang/unittests/Tooling/RefactoringTest.cpp | |
parent | c988b334b6a97a87b887df7aa22500961faf7701 (diff) | |
download | llvm-cf2913c6f12fbade57640c3410eb95d05baa27e5.zip llvm-cf2913c6f12fbade57640c3410eb95d05baa27e5.tar.gz llvm-cf2913c6f12fbade57640c3410eb95d05baa27e5.tar.bz2 |
Deduplicate replacements by FileEntry instead of file names.
Summary:
The current version does not deduplicate equivalent file paths correctly.
For example, a relative path and an absolute path are considered inequivalent.
Comparing FileEnry addresses these issues.
Reviewers: djasper
Subscribers: alexshap, klimek, cfe-commits
Differential Revision: https://reviews.llvm.org/D26288
llvm-svn: 286096
Diffstat (limited to 'clang/unittests/Tooling/RefactoringTest.cpp')
-rw-r--r-- | clang/unittests/Tooling/RefactoringTest.cpp | 63 |
1 files changed, 44 insertions, 19 deletions
diff --git a/clang/unittests/Tooling/RefactoringTest.cpp b/clang/unittests/Tooling/RefactoringTest.cpp index 81f0f1d..31b14ea 100644 --- a/clang/unittests/Tooling/RefactoringTest.cpp +++ b/clang/unittests/Tooling/RefactoringTest.cpp @@ -19,6 +19,7 @@ #include "clang/Basic/FileManager.h" #include "clang/Basic/LangOptions.h" #include "clang/Basic/SourceManager.h" +#include "clang/Basic/VirtualFileSystem.h" #include "clang/Format/Format.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/FrontendAction.h" @@ -972,40 +973,64 @@ TEST_F(MergeReplacementsTest, OverlappingRanges) { toReplacements({{"", 0, 3, "cc"}, {"", 3, 3, "dd"}})); } -TEST(DeduplicateByFileTest, LeaveLeadingDotDot) { +TEST(DeduplicateByFileTest, PathsWithDots) { std::map<std::string, Replacements> FileToReplaces; + llvm::IntrusiveRefCntPtr<vfs::InMemoryFileSystem> VFS( + new vfs::InMemoryFileSystem()); + FileManager *FileMgr = new FileManager(FileSystemOptions(), VFS); #if !defined(LLVM_ON_WIN32) - FileToReplaces["../../a/b/.././c.h"] = Replacements(); - FileToReplaces["../../a/c.h"] = Replacements(); + StringRef Path1 = "a/b/.././c.h"; + StringRef Path2 = "a/c.h"; #else - FileToReplaces["..\\..\\a\\b\\..\\.\\c.h"] = Replacements(); - FileToReplaces["..\\..\\a\\c.h"] = Replacements(); + StringRef Path1 = "a\\b\\..\\.\\c.h"; + StringRef Path2 = "a\\c.h"; #endif - FileToReplaces = groupReplacementsByFile(FileToReplaces); + EXPECT_TRUE(VFS->addFile(Path1, 0, llvm::MemoryBuffer::getMemBuffer(""))); + EXPECT_TRUE(VFS->addFile(Path2, 0, llvm::MemoryBuffer::getMemBuffer(""))); + FileToReplaces[Path1] = Replacements(); + FileToReplaces[Path2] = Replacements(); + FileToReplaces = groupReplacementsByFile(*FileMgr, FileToReplaces); EXPECT_EQ(1u, FileToReplaces.size()); -#if !defined(LLVM_ON_WIN32) - EXPECT_EQ("../../a/c.h", FileToReplaces.begin()->first); -#else - EXPECT_EQ("..\\..\\a\\c.h", FileToReplaces.begin()->first); -#endif + EXPECT_EQ(Path1, FileToReplaces.begin()->first); } -TEST(DeduplicateByFileTest, RemoveDotSlash) { +TEST(DeduplicateByFileTest, PathWithDotSlash) { std::map<std::string, Replacements> FileToReplaces; + llvm::IntrusiveRefCntPtr<vfs::InMemoryFileSystem> VFS( + new vfs::InMemoryFileSystem()); + FileManager *FileMgr = new FileManager(FileSystemOptions(), VFS); #if !defined(LLVM_ON_WIN32) - FileToReplaces["./a/b/.././c.h"] = Replacements(); - FileToReplaces["a/c.h"] = Replacements(); + StringRef Path1 = "./a/b/c.h"; + StringRef Path2 = "a/b/c.h"; #else - FileToReplaces[".\\a\\b\\..\\.\\c.h"] = Replacements(); - FileToReplaces["a\\c.h"] = Replacements(); + StringRef Path1 = ".\\a\\b\\c.h"; + StringRef Path2 = "a\\b\\c.h"; #endif - FileToReplaces = groupReplacementsByFile(FileToReplaces); + EXPECT_TRUE(VFS->addFile(Path1, 0, llvm::MemoryBuffer::getMemBuffer(""))); + EXPECT_TRUE(VFS->addFile(Path2, 0, llvm::MemoryBuffer::getMemBuffer(""))); + FileToReplaces[Path1] = Replacements(); + FileToReplaces[Path2] = Replacements(); + FileToReplaces = groupReplacementsByFile(*FileMgr, FileToReplaces); EXPECT_EQ(1u, FileToReplaces.size()); + EXPECT_EQ(Path1, FileToReplaces.begin()->first); +} + +TEST(DeduplicateByFileTest, NonExistingFilePath) { + std::map<std::string, Replacements> FileToReplaces; + llvm::IntrusiveRefCntPtr<vfs::InMemoryFileSystem> VFS( + new vfs::InMemoryFileSystem()); + FileManager *FileMgr = new FileManager(FileSystemOptions(), VFS); #if !defined(LLVM_ON_WIN32) - EXPECT_EQ("a/c.h", FileToReplaces.begin()->first); + StringRef Path1 = "./a/b/c.h"; + StringRef Path2 = "a/b/c.h"; #else - EXPECT_EQ("a\\c.h", FileToReplaces.begin()->first); + StringRef Path1 = ".\\a\\b\\c.h"; + StringRef Path2 = "a\\b\\c.h"; #endif + FileToReplaces[Path1] = Replacements(); + FileToReplaces[Path2] = Replacements(); + FileToReplaces = groupReplacementsByFile(*FileMgr, FileToReplaces); + EXPECT_TRUE(FileToReplaces.empty()); } } // end namespace tooling |