diff options
author | Edwin Vane <edwin.vane@intel.com> | 2013-08-08 13:31:14 +0000 |
---|---|---|
committer | Edwin Vane <edwin.vane@intel.com> | 2013-08-08 13:31:14 +0000 |
commit | d5692dbfeb97ed2e7ff11bca26059fa735e1b308 (patch) | |
tree | 248ea17c70e78a29cb8fb71ccb9fb79974cee5ed /unittests/Tooling/RefactoringTest.cpp | |
parent | 1e9fdc1a8b090c2c419c64e429c3f6595e86bae9 (diff) | |
download | clang-d5692dbfeb97ed2e7ff11bca26059fa735e1b308.tar.gz clang-d5692dbfeb97ed2e7ff11bca26059fa735e1b308.tar.bz2 clang-d5692dbfeb97ed2e7ff11bca26059fa735e1b308.tar.xz |
Introduce Replacement deduplication and conflict detection function
Summary:
This patch adds tooling::deduplicate() which removes duplicates from and
looks for conflicts in a vector of Replacements.
Differential Revision: http://llvm-reviews.chandlerc.com/D1314
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@187979 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'unittests/Tooling/RefactoringTest.cpp')
-rw-r--r-- | unittests/Tooling/RefactoringTest.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/unittests/Tooling/RefactoringTest.cpp b/unittests/Tooling/RefactoringTest.cpp index 5741e5d222..3030162858 100644 --- a/unittests/Tooling/RefactoringTest.cpp +++ b/unittests/Tooling/RefactoringTest.cpp @@ -347,5 +347,76 @@ TEST(Range, contains) { EXPECT_FALSE(Range(0, 10).contains(Range(0, 11))); } +TEST(DeduplicateTest, removesDuplicates) { + std::vector<Replacement> Input; + Input.push_back(Replacement("fileA", 50, 0, " foo ")); + Input.push_back(Replacement("fileA", 10, 3, " bar ")); + Input.push_back(Replacement("fileA", 10, 2, " bar ")); // Length differs + Input.push_back(Replacement("fileA", 9, 3, " bar ")); // Offset differs + Input.push_back(Replacement("fileA", 50, 0, " foo ")); // Duplicate + Input.push_back(Replacement("fileA", 51, 3, " bar ")); + Input.push_back(Replacement("fileB", 51, 3, " bar ")); // Filename differs! + Input.push_back(Replacement("fileA", 51, 3, " moo ")); // Replacement text + // differs! + + std::vector<Replacement> Expected; + Expected.push_back(Replacement("fileA", 9, 3, " bar ")); + Expected.push_back(Replacement("fileA", 10, 2, " bar ")); + Expected.push_back(Replacement("fileA", 10, 3, " bar ")); + Expected.push_back(Replacement("fileA", 50, 0, " foo ")); + Expected.push_back(Replacement("fileA", 51, 3, " bar ")); + Expected.push_back(Replacement("fileA", 51, 3, " moo ")); + Expected.push_back(Replacement("fileB", 51, 3, " bar ")); + + std::vector<Range> Conflicts; // Ignored for this test + deduplicate(Input, Conflicts); + + ASSERT_TRUE(Expected == Input); +} + +TEST(DeduplicateTest, detectsConflicts) { + { + std::vector<Replacement> Input; + Input.push_back(Replacement("fileA", 0, 5, " foo ")); + Input.push_back(Replacement("fileA", 0, 5, " foo ")); // Duplicate not a + // conflict. + Input.push_back(Replacement("fileA", 2, 6, " bar ")); + Input.push_back(Replacement("fileA", 7, 3, " moo ")); + + std::vector<Range> Conflicts; + deduplicate(Input, Conflicts); + + // One duplicate is removed and the remaining three items form one + // conflicted range. + ASSERT_EQ(3u, Input.size()); + ASSERT_EQ(1u, Conflicts.size()); + ASSERT_EQ(0u, Conflicts.front().getOffset()); + ASSERT_EQ(3u, Conflicts.front().getLength()); + } + { + std::vector<Replacement> Input; + + // Expected sorted order is shown. It is the sorted order to which the + // returned conflict info refers to. + Input.push_back(Replacement("fileA", 0, 5, " foo ")); // 0 + Input.push_back(Replacement("fileA", 5, 5, " bar ")); // 1 + Input.push_back(Replacement("fileA", 5, 5, " moo ")); // 2 + Input.push_back(Replacement("fileA", 15, 5, " golf ")); // 4 + Input.push_back(Replacement("fileA", 16, 5, " bag ")); // 5 + Input.push_back(Replacement("fileA", 10, 3, " club ")); // 6 + + std::vector<Range> Conflicts; + deduplicate(Input, Conflicts); + + // No duplicates + ASSERT_EQ(6u, Input.size()); + ASSERT_EQ(2u, Conflicts.size()); + ASSERT_EQ(1u, Conflicts[0].getOffset()); + ASSERT_EQ(2u, Conflicts[0].getLength()); + ASSERT_EQ(4u, Conflicts[1].getOffset()); + ASSERT_EQ(2u, Conflicts[1].getLength()); + } +} + } // end namespace tooling } // end namespace clang |