diff --git a/tests/unit/unittest/projectstoragepathwatcher-test.cpp b/tests/unit/unittest/projectstoragepathwatcher-test.cpp index ded952f5d79..941d4afb278 100644 --- a/tests/unit/unittest/projectstoragepathwatcher-test.cpp +++ b/tests/unit/unittest/projectstoragepathwatcher-test.cpp @@ -7,18 +7,19 @@ #include "mockqfilesystemwatcher.h" #include "mocktimer.h" #include "projectstoragepathwatchernotifiermock.h" -#include "sourcepathcachemock.h" +#include #include -#include +#include +#include #include namespace { - +using SourcePathCache = QmlDesigner::SourcePathCache>; using Watcher = QmlDesigner::ProjectStoragePathWatcher, NiceMock, - NiceMock>; + SourcePathCache>; using QmlDesigner::FileStatus; using QmlDesigner::IdPaths; using QmlDesigner::ProjectChunkId; @@ -40,47 +41,16 @@ class ProjectStoragePathWatcher : public testing::Test protected: ProjectStoragePathWatcher() { - ON_CALL(sourcePathCacheMock, sourceId(Eq(path1))).WillByDefault(Return(pathIds[0])); - ON_CALL(sourcePathCacheMock, sourceId(Eq(path2))).WillByDefault(Return(pathIds[1])); - ON_CALL(sourcePathCacheMock, sourceId(Eq(path3))).WillByDefault(Return(pathIds[2])); - ON_CALL(sourcePathCacheMock, sourceId(Eq(path4))).WillByDefault(Return(pathIds[3])); - ON_CALL(sourcePathCacheMock, sourceId(Eq(path5))).WillByDefault(Return(pathIds[4])); - ON_CALL(sourcePathCacheMock, sourcePath(Eq(pathIds[0]))).WillByDefault(Return(SourcePath{path1})); - ON_CALL(sourcePathCacheMock, sourcePath(Eq(pathIds[1]))).WillByDefault(Return(SourcePath{path2})); - ON_CALL(sourcePathCacheMock, sourcePath(Eq(pathIds[2]))).WillByDefault(Return(SourcePath{path3})); - ON_CALL(sourcePathCacheMock, sourcePath(Eq(pathIds[3]))).WillByDefault(Return(SourcePath{path4})); - ON_CALL(sourcePathCacheMock, sourcePath(Eq(pathIds[4]))).WillByDefault(Return(SourcePath{path5})); - ON_CALL(sourcePathCacheMock, sourceContextId(TypedEq(pathIds[0]))) - .WillByDefault(Return(sourceContextIds[0])); - ON_CALL(sourcePathCacheMock, sourceContextId(TypedEq(pathIds[1]))) - .WillByDefault(Return(sourceContextIds[0])); - ON_CALL(sourcePathCacheMock, sourceContextId(TypedEq(pathIds[2]))) - .WillByDefault(Return(sourceContextIds[1])); - ON_CALL(sourcePathCacheMock, sourceContextId(TypedEq(pathIds[3]))) - .WillByDefault(Return(sourceContextIds[1])); - ON_CALL(sourcePathCacheMock, sourceContextId(TypedEq(pathIds[4]))) - .WillByDefault(Return(sourceContextIds[2])); ON_CALL(mockFileSystem, fileStatus(_)).WillByDefault([](auto sourceId) { return FileStatus{sourceId, 1, 1}; }); - ON_CALL(sourcePathCacheMock, - sourceContextId(TypedEq(sourceContextPathString))) - .WillByDefault(Return(sourceContextIds[0])); - ON_CALL(sourcePathCacheMock, - sourceContextId(TypedEq(sourceContextPathString2))) - .WillByDefault(Return(sourceContextIds[1])); - ON_CALL(sourcePathCacheMock, sourceContextPath(Eq(sourceContextIds[0]))) - .WillByDefault(Return(sourceContextPath)); - ON_CALL(sourcePathCacheMock, sourceContextPath(Eq(sourceContextIds[1]))) - .WillByDefault(Return(sourceContextPath2)); - ON_CALL(sourcePathCacheMock, sourceContextPath(Eq(sourceContextIds[2]))) - .WillByDefault(Return(sourceContextPath3)); + ON_CALL(mockFileSystem, directoryEntries(Eq(sourceContextPath))) - .WillByDefault(Return(SourceIds{pathIds[0], pathIds[1]})); + .WillByDefault(Return(SourceIds{sourceIds[0], sourceIds[1]})); ON_CALL(mockFileSystem, directoryEntries(Eq(sourceContextPath2))) - .WillByDefault(Return(SourceIds{pathIds[2], pathIds[3]})); + .WillByDefault(Return(SourceIds{sourceIds[2], sourceIds[3]})); ON_CALL(mockFileSystem, directoryEntries(Eq(sourceContextPath3))) - .WillByDefault(Return(SourceIds{pathIds[4]})); + .WillByDefault(Return(SourceIds{sourceIds[4]})); } static WatcherEntries sorted(WatcherEntries &&entries) { @@ -90,14 +60,16 @@ protected: } protected: - NiceMock sourcePathCacheMock; NiceMock notifier; NiceMock mockFileSystem; - Watcher watcher{sourcePathCacheMock, mockFileSystem, ¬ifier}; + Sqlite::Database database{":memory:", Sqlite::JournalMode::Memory}; + QmlDesigner::ProjectStorage storage{database, database.isInitialized()}; + SourcePathCache pathCache{storage}; + Watcher watcher{pathCache, mockFileSystem, ¬ifier}; NiceMock &mockQFileSytemWatcher = watcher.fileSystemWatcher(); - ProjectChunkId id1{ProjectPartId::create(2), SourceType::Qml}; - ProjectChunkId id2{ProjectPartId::create(2), SourceType::QmlUi}; - ProjectChunkId id3{ProjectPartId::create(4), SourceType::QmlTypes}; + ProjectChunkId projectChunkId1{ProjectPartId::create(2), SourceType::Qml}; + ProjectChunkId projectChunkId2{ProjectPartId::create(2), SourceType::QmlUi}; + ProjectChunkId projectChunkId3{ProjectPartId::create(4), SourceType::QmlTypes}; SourcePathView path1{"/path/path1"}; SourcePathView path2{"/path/path2"}; SourcePathView path3{"/path2/path1"}; @@ -110,23 +82,23 @@ protected: QString sourceContextPath3 = "/path3"; Utils::PathString sourceContextPathString = sourceContextPath; Utils::PathString sourceContextPathString2 = sourceContextPath2; - SourceIds pathIds = {SourceId::create(1), - SourceId::create(2), - SourceId::create(3), - SourceId::create(4), - SourceId::create(5)}; - SourceContextIds sourceContextIds = {SourceContextId::create(1), - SourceContextId::create(2), - SourceContextId::create(3)}; - ProjectChunkIds ids{id1, id2, id3}; - WatcherEntry watcherEntry1{id1, sourceContextIds[0], pathIds[0]}; - WatcherEntry watcherEntry2{id2, sourceContextIds[0], pathIds[0]}; - WatcherEntry watcherEntry3{id1, sourceContextIds[0], pathIds[1]}; - WatcherEntry watcherEntry4{id2, sourceContextIds[0], pathIds[1]}; - WatcherEntry watcherEntry5{id3, sourceContextIds[0], pathIds[1]}; - WatcherEntry watcherEntry6{id1, sourceContextIds[1], pathIds[2]}; - WatcherEntry watcherEntry7{id2, sourceContextIds[1], pathIds[3]}; - WatcherEntry watcherEntry8{id3, sourceContextIds[1], pathIds[3]}; + SourceIds sourceIds = {pathCache.sourceId(path1), + pathCache.sourceId(path2), + pathCache.sourceId(path3), + pathCache.sourceId(path4), + pathCache.sourceId(path5)}; + SourceContextIds sourceContextIds = {pathCache.sourceContextId(sourceIds[0]), + pathCache.sourceContextId(sourceIds[2]), + pathCache.sourceContextId(sourceIds[4])}; + ProjectChunkIds ids{projectChunkId1, projectChunkId2, projectChunkId3}; + WatcherEntry watcherEntry1{projectChunkId1, sourceContextIds[0], sourceIds[0]}; + WatcherEntry watcherEntry2{projectChunkId2, sourceContextIds[0], sourceIds[0]}; + WatcherEntry watcherEntry3{projectChunkId1, sourceContextIds[0], sourceIds[1]}; + WatcherEntry watcherEntry4{projectChunkId2, sourceContextIds[0], sourceIds[1]}; + WatcherEntry watcherEntry5{projectChunkId3, sourceContextIds[0], sourceIds[1]}; + WatcherEntry watcherEntry6{projectChunkId1, sourceContextIds[1], sourceIds[2]}; + WatcherEntry watcherEntry7{projectChunkId2, sourceContextIds[1], sourceIds[3]}; + WatcherEntry watcherEntry8{projectChunkId3, sourceContextIds[1], sourceIds[3]}; }; TEST_F(ProjectStoragePathWatcher, AddIdPaths) @@ -135,53 +107,59 @@ TEST_F(ProjectStoragePathWatcher, AddIdPaths) addPaths( UnorderedElementsAre(QString(sourceContextPath), QString(sourceContextPath2)))); - watcher.updateIdPaths( - {{id1, {pathIds[0], pathIds[1], pathIds[2]}}, {id2, {pathIds[0], pathIds[1], pathIds[3]}}}); + watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2]}}, + {projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[3]}}}); } TEST_F(ProjectStoragePathWatcher, UpdateIdPathsCallsAddPathInFileWatcher) { - watcher.updateIdPaths({{id1, {pathIds[0], pathIds[1]}}, {id2, {pathIds[0], pathIds[1]}}}); + watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1]}}, + {projectChunkId2, {sourceIds[0], sourceIds[1]}}}); EXPECT_CALL(mockQFileSytemWatcher, addPaths(UnorderedElementsAre(QString(sourceContextPath2)))); - watcher.updateIdPaths( - {{id1, {pathIds[0], pathIds[1], pathIds[2]}}, {id2, {pathIds[0], pathIds[1], pathIds[3]}}}); + watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2]}}, + {projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[3]}}}); } TEST_F(ProjectStoragePathWatcher, UpdateIdPathsAndRemoveUnusedPathsCallsRemovePathInFileWatcher) { - watcher.updateIdPaths( - {{id1, {pathIds[0], pathIds[1], pathIds[2]}}, {id2, {pathIds[0], pathIds[1], pathIds[3]}}}); + watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2]}}, + {projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[3]}}}); EXPECT_CALL(mockQFileSytemWatcher, removePaths(UnorderedElementsAre(QString(sourceContextPath2)))); - watcher.updateIdPaths({{id1, {pathIds[0], pathIds[1]}}, {id2, {pathIds[0], pathIds[1]}}}); + watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1]}}, + {projectChunkId2, {sourceIds[0], sourceIds[1]}}}); } TEST_F(ProjectStoragePathWatcher, UpdateIdPathsAndRemoveUnusedPathsDoNotCallsRemovePathInFileWatcher) { - watcher.updateIdPaths({{id1, {pathIds[0], pathIds[1], pathIds[2]}}, - {id2, {pathIds[0], pathIds[1], pathIds[3]}}, - {id3, {pathIds[0]}}}); + watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2]}}, + {projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[3]}}, + {projectChunkId3, {sourceIds[0]}}}); EXPECT_CALL(mockQFileSytemWatcher, removePaths(_)).Times(0); - watcher.updateIdPaths({{id1, {pathIds[1]}}, {id2, {pathIds[3]}}}); + watcher.updateIdPaths({{projectChunkId1, {sourceIds[1]}}, {projectChunkId2, {sourceIds[3]}}}); } TEST_F(ProjectStoragePathWatcher, UpdateIdPathsAndRemoveUnusedPaths) { - watcher.updateIdPaths({{id1, {pathIds[0], pathIds[1]}}, {id2, {pathIds[0], pathIds[1]}}, {id3, {pathIds[1]}}}); + watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1]}}, + {projectChunkId2, {sourceIds[0], sourceIds[1]}}, + {projectChunkId3, {sourceIds[1]}}}); - watcher.updateIdPaths({{id1, {pathIds[0]}}, {id2, {pathIds[1]}}}); + watcher.updateIdPaths({{projectChunkId1, {sourceIds[0]}}, {projectChunkId2, {sourceIds[1]}}}); ASSERT_THAT(watcher.watchedEntries(), ElementsAre(watcherEntry1, watcherEntry4, watcherEntry5)); } TEST_F(ProjectStoragePathWatcher, ExtractSortedEntriesFromConvertIdPaths) { - auto entriesAndIds = watcher.convertIdPathsToWatcherEntriesAndIds({{id2, {pathIds[0], pathIds[1]}}, {id1, {pathIds[0], pathIds[1]}}}); + auto entriesAndIds = watcher.convertIdPathsToWatcherEntriesAndIds( + {{projectChunkId2, {sourceIds[0], sourceIds[1]}}, + {projectChunkId1, {sourceIds[0], sourceIds[1]}}}); ASSERT_THAT(entriesAndIds.first, ElementsAre(watcherEntry1, watcherEntry2, watcherEntry3, watcherEntry4)); @@ -189,23 +167,24 @@ TEST_F(ProjectStoragePathWatcher, ExtractSortedEntriesFromConvertIdPaths) TEST_F(ProjectStoragePathWatcher, ExtractSortedIdsFromConvertIdPaths) { - auto entriesAndIds = watcher.convertIdPathsToWatcherEntriesAndIds({{id2, {}}, {id1, {}}, {id3, {}}}); + auto entriesAndIds = watcher.convertIdPathsToWatcherEntriesAndIds( + {{projectChunkId2, {}}, {projectChunkId1, {}}, {projectChunkId3, {}}}); ASSERT_THAT(entriesAndIds.second, ElementsAre(ids[0], ids[1], ids[2])); } TEST_F(ProjectStoragePathWatcher, MergeEntries) { - watcher.updateIdPaths({{id1, {pathIds[0]}}, {id2, {pathIds[1]}}}); + watcher.updateIdPaths({{projectChunkId1, {sourceIds[0]}}, {projectChunkId2, {sourceIds[1]}}}); ASSERT_THAT(watcher.watchedEntries(), ElementsAre(watcherEntry1, watcherEntry4)); } TEST_F(ProjectStoragePathWatcher, MergeMoreEntries) { - watcher.updateIdPaths({{id2, {pathIds[0], pathIds[1]}}}); + watcher.updateIdPaths({{projectChunkId2, {sourceIds[0], sourceIds[1]}}}); - watcher.updateIdPaths({{id1, {pathIds[0], pathIds[1]}}}); + watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1]}}}); ASSERT_THAT(watcher.watchedEntries(), ElementsAre(watcherEntry1, watcherEntry2, watcherEntry3, watcherEntry4)); } @@ -223,39 +202,44 @@ TEST_F(ProjectStoragePathWatcher, AddEntriesWithSameIdAndDifferentPaths) EXPECT_CALL(mockQFileSytemWatcher, addPaths(ElementsAre(sourceContextPath, sourceContextPath2, sourceContextPath3))); - watcher.updateIdPaths({{id1, {pathIds[0], pathIds[1], pathIds[2], pathIds[4]}}}); + watcher.updateIdPaths( + {{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2], sourceIds[4]}}}); } TEST_F(ProjectStoragePathWatcher, AddEntriesWithDifferentIdAndSamePaths) { EXPECT_CALL(mockQFileSytemWatcher, addPaths(ElementsAre(sourceContextPath))); - watcher.updateIdPaths({{id1, {pathIds[0], pathIds[1]}}}); + watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1]}}}); } TEST_F(ProjectStoragePathWatcher, DontAddNewEntriesWithSameIdAndSamePaths) { - watcher.updateIdPaths({{id1, {pathIds[0], pathIds[1], pathIds[2], pathIds[3], pathIds[4]}}}); + watcher.updateIdPaths( + {{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2], sourceIds[3], sourceIds[4]}}}); EXPECT_CALL(mockQFileSytemWatcher, addPaths(_)).Times(0); - watcher.updateIdPaths({{id1, {pathIds[0], pathIds[1], pathIds[2], pathIds[3], pathIds[4]}}}); + watcher.updateIdPaths( + {{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2], sourceIds[3], sourceIds[4]}}}); } TEST_F(ProjectStoragePathWatcher, DontAddNewEntriesWithDifferentIdAndSamePaths) { - watcher.updateIdPaths({{id1, {pathIds[0], pathIds[1], pathIds[2], pathIds[3], pathIds[4]}}}); + watcher.updateIdPaths( + {{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2], sourceIds[3], sourceIds[4]}}}); EXPECT_CALL(mockQFileSytemWatcher, addPaths(_)).Times(0); - watcher.updateIdPaths({{id2, {pathIds[0], pathIds[1], pathIds[2], pathIds[3], pathIds[4]}}}); + watcher.updateIdPaths( + {{projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[2], sourceIds[3], sourceIds[4]}}}); } TEST_F(ProjectStoragePathWatcher, RemoveEntriesWithId) { - watcher.updateIdPaths({{id1, {pathIds[0], pathIds[1]}}, - {id2, {pathIds[0], pathIds[1]}}, - {id3, {pathIds[1], pathIds[3]}}}); + watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1]}}, + {projectChunkId2, {sourceIds[0], sourceIds[1]}}, + {projectChunkId3, {sourceIds[1], sourceIds[3]}}}); watcher.removeIds({ProjectPartId::create(2)}); @@ -272,55 +256,56 @@ TEST_F(ProjectStoragePathWatcher, RemoveNoPathsForEmptyIds) TEST_F(ProjectStoragePathWatcher, RemoveNoPathsForOneId) { - watcher.updateIdPaths( - {{id1, {pathIds[0], pathIds[1]}}, {id2, {pathIds[0], pathIds[1], pathIds[3]}}}); + watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1]}}, + {projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[3]}}}); EXPECT_CALL(mockQFileSytemWatcher, removePaths(_)) .Times(0); - watcher.removeIds({id3.id}); + watcher.removeIds({projectChunkId3.id}); } TEST_F(ProjectStoragePathWatcher, RemovePathForOneId) { - watcher.updateIdPaths( - {{id1, {pathIds[0], pathIds[1]}}, {id3, {pathIds[0], pathIds[1], pathIds[3]}}}); + watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1]}}, + {projectChunkId3, {sourceIds[0], sourceIds[1], sourceIds[3]}}}); EXPECT_CALL(mockQFileSytemWatcher, removePaths(ElementsAre(sourceContextPath2))); - watcher.removeIds({id3.id}); + watcher.removeIds({projectChunkId3.id}); } TEST_F(ProjectStoragePathWatcher, RemoveNoPathSecondTime) { - watcher.updateIdPaths( - {{id1, {pathIds[0], pathIds[1]}}, {id2, {pathIds[0], pathIds[1], pathIds[3]}}}); - watcher.removeIds({id2.id}); + watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1]}}, + {projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[3]}}}); + watcher.removeIds({projectChunkId2.id}); EXPECT_CALL(mockQFileSytemWatcher, removePaths(_)).Times(0); - watcher.removeIds({id2.id}); + watcher.removeIds({projectChunkId2.id}); } TEST_F(ProjectStoragePathWatcher, RemoveAllPathsForThreeId) { - watcher.updateIdPaths( - {{id1, {pathIds[0], pathIds[1], pathIds[2]}}, {id2, {pathIds[0], pathIds[1], pathIds[3]}}}); + watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2]}}, + {projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[3]}}}); EXPECT_CALL(mockQFileSytemWatcher, removePaths(ElementsAre(sourceContextPath, sourceContextPath2))); - watcher.removeIds({id1.id, id2.id, id3.id}); + watcher.removeIds({projectChunkId1.id, projectChunkId2.id, projectChunkId3.id}); } TEST_F(ProjectStoragePathWatcher, RemoveOnePathForTwoId) { - watcher.updateIdPaths( - {{id1, {pathIds[0], pathIds[1]}}, {id2, {pathIds[0], pathIds[1]}}, {id3, {pathIds[3]}}}); + watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1]}}, + {projectChunkId2, {sourceIds[0], sourceIds[1]}}, + {projectChunkId3, {sourceIds[3]}}}); EXPECT_CALL(mockQFileSytemWatcher, removePaths(ElementsAre(sourceContextPath))); - watcher.removeIds({id1.id, id2.id}); + watcher.removeIds({projectChunkId1.id, projectChunkId2.id}); } TEST_F(ProjectStoragePathWatcher, NotAnymoreWatchedEntriesWithId) @@ -343,20 +328,22 @@ TEST_F(ProjectStoragePathWatcher, RemoveUnusedEntries) TEST_F(ProjectStoragePathWatcher, TwoNotifyFileChanges) { - watcher.updateIdPaths({{id1, {pathIds[0], pathIds[1], pathIds[2]}}, - {id2, {pathIds[0], pathIds[1], pathIds[2], pathIds[3], pathIds[4]}}, - {id3, {pathIds[4]}}}); - ON_CALL(mockFileSystem, fileStatus(Eq(pathIds[0]))) - .WillByDefault(Return(FileStatus{pathIds[0], 1, 2})); - ON_CALL(mockFileSystem, fileStatus(Eq(pathIds[1]))) - .WillByDefault(Return(FileStatus{pathIds[1], 1, 2})); - ON_CALL(mockFileSystem, fileStatus(Eq(pathIds[3]))) - .WillByDefault(Return(FileStatus{pathIds[3], 1, 2})); + watcher.updateIdPaths( + {{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2]}}, + {projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[2], sourceIds[3], sourceIds[4]}}, + {projectChunkId3, {sourceIds[4]}}}); + ON_CALL(mockFileSystem, fileStatus(Eq(sourceIds[0]))) + .WillByDefault(Return(FileStatus{sourceIds[0], 1, 2})); + ON_CALL(mockFileSystem, fileStatus(Eq(sourceIds[1]))) + .WillByDefault(Return(FileStatus{sourceIds[1], 1, 2})); + ON_CALL(mockFileSystem, fileStatus(Eq(sourceIds[3]))) + .WillByDefault(Return(FileStatus{sourceIds[3], 1, 2})); EXPECT_CALL(notifier, pathsWithIdsChanged(ElementsAre( - IdPaths{id1, {SourceId::create(1), SourceId::create(2)}}, - IdPaths{id2, {SourceId::create(1), SourceId::create(2), SourceId::create(4)}}))); + IdPaths{projectChunkId1, {SourceId::create(1), SourceId::create(2)}}, + IdPaths{projectChunkId2, + {SourceId::create(1), SourceId::create(2), SourceId::create(4)}}))); mockQFileSytemWatcher.directoryChanged(sourceContextPath); mockQFileSytemWatcher.directoryChanged(sourceContextPath2); @@ -364,22 +351,22 @@ TEST_F(ProjectStoragePathWatcher, TwoNotifyFileChanges) TEST_F(ProjectStoragePathWatcher, NotifyForPathChanges) { - watcher.updateIdPaths( - {{id1, {pathIds[0], pathIds[1], pathIds[2]}}, {id2, {pathIds[0], pathIds[1], pathIds[3]}}}); - ON_CALL(mockFileSystem, fileStatus(Eq(pathIds[0]))) - .WillByDefault(Return(FileStatus{pathIds[0], 1, 2})); + watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2]}}, + {projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[3]}}}); + ON_CALL(mockFileSystem, fileStatus(Eq(sourceIds[0]))) + .WillByDefault(Return(FileStatus{sourceIds[0], 1, 2})); - ON_CALL(mockFileSystem, fileStatus(Eq(pathIds[3]))) - .WillByDefault(Return(FileStatus{pathIds[3], 1, 2})); + ON_CALL(mockFileSystem, fileStatus(Eq(sourceIds[3]))) + .WillByDefault(Return(FileStatus{sourceIds[3], 1, 2})); - EXPECT_CALL(notifier, pathsChanged(ElementsAre(pathIds[0]))); + EXPECT_CALL(notifier, pathsChanged(ElementsAre(sourceIds[0]))); mockQFileSytemWatcher.directoryChanged(sourceContextPath); } TEST_F(ProjectStoragePathWatcher, NoNotifyForUnwatchedPathChanges) { - watcher.updateIdPaths({{id1, {pathIds[3]}}, {id2, {pathIds[3]}}}); + watcher.updateIdPaths({{projectChunkId1, {sourceIds[3]}}, {projectChunkId2, {sourceIds[3]}}}); EXPECT_CALL(notifier, pathsChanged(IsEmpty())); @@ -388,14 +375,26 @@ TEST_F(ProjectStoragePathWatcher, NoNotifyForUnwatchedPathChanges) TEST_F(ProjectStoragePathWatcher, NoDuplicatePathChanges) { - watcher.updateIdPaths( - {{id1, {pathIds[0], pathIds[1], pathIds[2]}}, {id2, {pathIds[0], pathIds[1], pathIds[3]}}}); - ON_CALL(mockFileSystem, fileStatus(Eq(pathIds[0]))) - .WillByDefault(Return(FileStatus{pathIds[0], 1, 2})); + watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2]}}, + {projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[3]}}}); + ON_CALL(mockFileSystem, fileStatus(Eq(sourceIds[0]))) + .WillByDefault(Return(FileStatus{sourceIds[0], 1, 2})); - EXPECT_CALL(notifier, pathsChanged(ElementsAre(pathIds[0]))); + EXPECT_CALL(notifier, pathsChanged(ElementsAre(sourceIds[0]))); mockQFileSytemWatcher.directoryChanged(sourceContextPath); mockQFileSytemWatcher.directoryChanged(sourceContextPath); } + +TEST_F(ProjectStoragePathWatcher, UpdateContextIdPathsAndRemoveUnusedPaths) +{ + watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1]}}, + {projectChunkId2, {sourceIds[0], sourceIds[1]}}, + {projectChunkId3, {sourceIds[1]}}}); + + watcher.updateIdPaths({{projectChunkId1, {sourceIds[0]}}, {projectChunkId2, {sourceIds[1]}}}); + + ASSERT_THAT(watcher.watchedEntries(), ElementsAre(watcherEntry1, watcherEntry4, watcherEntry5)); +} + } // namespace