forked from qt-creator/qt-creator
QmlDesigner: Add interface to manually trigger project storage update
It is triggering the path watcher to check if the directory was updated and then update the updater. Task-number: QDS-15136 Change-Id: I80d654c5e476a47f75c6ebda3fa86dfe69226cb4 Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
@@ -391,6 +391,7 @@ extend_qtc_library(QmlDesignerCore
|
|||||||
projectstorageinfotypes.h
|
projectstorageinfotypes.h
|
||||||
projectstorageobserver.h
|
projectstorageobserver.h
|
||||||
projectstoragepathwatcher.h
|
projectstoragepathwatcher.h
|
||||||
|
projectstoragetriggerupdateinterface.h
|
||||||
projectstoragepathwatcherinterface.h
|
projectstoragepathwatcherinterface.h
|
||||||
projectstoragepathwatchernotifierinterface.h
|
projectstoragepathwatchernotifierinterface.h
|
||||||
projectstoragepathwatcher.h
|
projectstoragepathwatcher.h
|
||||||
|
@@ -281,6 +281,7 @@ public:
|
|||||||
NotNullPointer<const ProjectStorageType> projectStorage() const;
|
NotNullPointer<const ProjectStorageType> projectStorage() const;
|
||||||
const PathCacheType &pathCache() const;
|
const PathCacheType &pathCache() const;
|
||||||
PathCacheType &pathCache();
|
PathCacheType &pathCache();
|
||||||
|
ProjectStorageTriggerUpdateInterface &projectStorageTriggerUpdate() const;
|
||||||
|
|
||||||
void emitInstancePropertyChange(AbstractView *view,
|
void emitInstancePropertyChange(AbstractView *view,
|
||||||
const QList<QPair<ModelNode, PropertyName>> &propertyList);
|
const QList<QPair<ModelNode, PropertyName>> &propertyList);
|
||||||
|
@@ -42,6 +42,7 @@ constexpr bool useProjectStorage()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
class SourcePathStorage;
|
class SourcePathStorage;
|
||||||
|
class ProjectStorageTriggerUpdateInterface;
|
||||||
using PathCache = SourcePathCache<SourcePathStorage, std::shared_mutex>;
|
using PathCache = SourcePathCache<SourcePathStorage, std::shared_mutex>;
|
||||||
|
|
||||||
#ifdef QDS_MODEL_USE_PROJECTSTORAGEINTERFACE
|
#ifdef QDS_MODEL_USE_PROJECTSTORAGEINTERFACE
|
||||||
@@ -52,11 +53,11 @@ using PathCacheType = SourcePathCacheInterface;
|
|||||||
using ProjectStorageType = ProjectStorage;
|
using ProjectStorageType = ProjectStorage;
|
||||||
using PathCacheType = SourcePathCache<SourcePathStorage, std::shared_mutex>;
|
using PathCacheType = SourcePathCache<SourcePathStorage, std::shared_mutex>;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct ProjectStorageDependencies
|
struct ProjectStorageDependencies
|
||||||
{
|
{
|
||||||
ProjectStorageType &storage;
|
ProjectStorageType &storage;
|
||||||
PathCacheType &cache;
|
PathCacheType &cache;
|
||||||
|
ProjectStorageTriggerUpdateInterface &triggerUpdate;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class PropertyType {
|
enum class PropertyType {
|
||||||
|
@@ -85,6 +85,7 @@ ModelPrivate::ModelPrivate(Model *model,
|
|||||||
std::unique_ptr<ModelResourceManagementInterface> resourceManagement)
|
std::unique_ptr<ModelResourceManagementInterface> resourceManagement)
|
||||||
: projectStorage{&projectStorageDependencies.storage}
|
: projectStorage{&projectStorageDependencies.storage}
|
||||||
, pathCache{&projectStorageDependencies.cache}
|
, pathCache{&projectStorageDependencies.cache}
|
||||||
|
, projectStorageTriggerUpdate{&projectStorageDependencies.triggerUpdate}
|
||||||
, m_model{model}
|
, m_model{model}
|
||||||
, m_resourceManagement{std::move(resourceManagement)}
|
, m_resourceManagement{std::move(resourceManagement)}
|
||||||
{
|
{
|
||||||
@@ -110,6 +111,7 @@ ModelPrivate::ModelPrivate(Model *model,
|
|||||||
std::unique_ptr<ModelResourceManagementInterface> resourceManagement)
|
std::unique_ptr<ModelResourceManagementInterface> resourceManagement)
|
||||||
: projectStorage{&projectStorageDependencies.storage}
|
: projectStorage{&projectStorageDependencies.storage}
|
||||||
, pathCache{&projectStorageDependencies.cache}
|
, pathCache{&projectStorageDependencies.cache}
|
||||||
|
, projectStorageTriggerUpdate{&projectStorageDependencies.triggerUpdate}
|
||||||
, m_model{model}
|
, m_model{model}
|
||||||
, m_resourceManagement{std::move(resourceManagement)}
|
, m_resourceManagement{std::move(resourceManagement)}
|
||||||
{
|
{
|
||||||
@@ -1771,7 +1773,7 @@ Model::Model(const TypeName &typeName,
|
|||||||
ModelPointer Model::createModel(const TypeName &typeName,
|
ModelPointer Model::createModel(const TypeName &typeName,
|
||||||
std::unique_ptr<ModelResourceManagementInterface> resourceManagement)
|
std::unique_ptr<ModelResourceManagementInterface> resourceManagement)
|
||||||
{
|
{
|
||||||
return Model::create({*d->projectStorage, *d->pathCache},
|
return Model::create({*d->projectStorage, *d->pathCache, *d->projectStorageTriggerUpdate},
|
||||||
typeName,
|
typeName,
|
||||||
imports(),
|
imports(),
|
||||||
fileUrl(),
|
fileUrl(),
|
||||||
@@ -2018,6 +2020,11 @@ PathCacheType &Model::pathCache()
|
|||||||
return *d->pathCache;
|
return *d->pathCache;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ProjectStorageTriggerUpdateInterface &Model::projectStorageTriggerUpdate() const
|
||||||
|
{
|
||||||
|
return *d->projectStorageTriggerUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
void Model::emitInstancePropertyChange(AbstractView *view,
|
void Model::emitInstancePropertyChange(AbstractView *view,
|
||||||
const QList<QPair<ModelNode, PropertyName>> &propertyList)
|
const QList<QPair<ModelNode, PropertyName>> &propertyList)
|
||||||
{
|
{
|
||||||
|
@@ -347,6 +347,7 @@ private:
|
|||||||
public:
|
public:
|
||||||
NotNullPointer<ProjectStorageType> projectStorage = nullptr;
|
NotNullPointer<ProjectStorageType> projectStorage = nullptr;
|
||||||
NotNullPointer<PathCacheType> pathCache = nullptr;
|
NotNullPointer<PathCacheType> pathCache = nullptr;
|
||||||
|
NotNullPointer<ProjectStorageTriggerUpdateInterface> projectStorageTriggerUpdate = nullptr;
|
||||||
ModelTracing::AsynchronousToken traceToken = ModelTracing::category().beginAsynchronous("Model");
|
ModelTracing::AsynchronousToken traceToken = ModelTracing::category().beginAsynchronous("Model");
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@@ -8,6 +8,7 @@
|
|||||||
#include "projectstoragepathwatcherinterface.h"
|
#include "projectstoragepathwatcherinterface.h"
|
||||||
#include "projectstoragepathwatchernotifierinterface.h"
|
#include "projectstoragepathwatchernotifierinterface.h"
|
||||||
#include "projectstoragepathwatchertypes.h"
|
#include "projectstoragepathwatchertypes.h"
|
||||||
|
#include "projectstoragetriggerupdateinterface.h"
|
||||||
|
|
||||||
#include <sourcepathstorage/storagecache.h>
|
#include <sourcepathstorage/storagecache.h>
|
||||||
|
|
||||||
@@ -34,7 +35,8 @@ void set_greedy_intersection_call(
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename FileSystemWatcher, typename Timer, class SourcePathCache>
|
template<typename FileSystemWatcher, typename Timer, class SourcePathCache>
|
||||||
class ProjectStoragePathWatcher : public ProjectStoragePathWatcherInterface
|
class ProjectStoragePathWatcher : public ProjectStoragePathWatcherInterface,
|
||||||
|
public ProjectStorageTriggerUpdateInterface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ProjectStoragePathWatcher(SourcePathCache &pathCache,
|
ProjectStoragePathWatcher(SourcePathCache &pathCache,
|
||||||
@@ -83,6 +85,13 @@ public:
|
|||||||
removeUnusedEntries(entires, notContainsId);
|
removeUnusedEntries(entires, notContainsId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void checkForChangeInDirectory(SourceContextIds sourceContextIds) override
|
||||||
|
{
|
||||||
|
std::ranges::sort(sourceContextIds);
|
||||||
|
|
||||||
|
addChangedPathForFilePath(sourceContextIds);
|
||||||
|
}
|
||||||
|
|
||||||
void removeIds(const ProjectPartIds &ids) override
|
void removeIds(const ProjectPartIds &ids) override
|
||||||
{
|
{
|
||||||
auto removedEntries = removeIdsFromWatchedEntries(ids);
|
auto removedEntries = removeIdsFromWatchedEntries(ids);
|
||||||
@@ -279,10 +288,7 @@ public:
|
|||||||
return notWatchedPaths(uniquePaths(entries));
|
return notWatchedPaths(uniquePaths(entries));
|
||||||
}
|
}
|
||||||
|
|
||||||
const WatcherEntries &watchedEntries() const
|
const WatcherEntries &watchedEntries() const { return m_watchedEntries; }
|
||||||
{
|
|
||||||
return m_watchedEntries;
|
|
||||||
}
|
|
||||||
|
|
||||||
WatcherEntries removeIdsFromWatchedEntries(const ProjectPartIds &ids)
|
WatcherEntries removeIdsFromWatchedEntries(const ProjectPartIds &ids)
|
||||||
{
|
{
|
||||||
|
@@ -0,0 +1,23 @@
|
|||||||
|
// Copyright (C) 2025 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "projectstorageids.h"
|
||||||
|
|
||||||
|
namespace QmlDesigner {
|
||||||
|
|
||||||
|
class ProjectStorageTriggerUpdateInterface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ProjectStorageTriggerUpdateInterface() = default;
|
||||||
|
ProjectStorageTriggerUpdateInterface(const ProjectStorageTriggerUpdateInterface &) = delete;
|
||||||
|
ProjectStorageTriggerUpdateInterface &operator=(const ProjectStorageTriggerUpdateInterface &) = delete;
|
||||||
|
|
||||||
|
virtual void checkForChangeInDirectory(SourceContextIds sourceContextIds) = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
~ProjectStorageTriggerUpdateInterface() = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace QmlDesigner
|
@@ -366,14 +366,21 @@ namespace {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[maybe_unused]] ProjectStorageTriggerUpdateInterface *dummyTriggerUpdate()
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
ProjectStorageDependencies QmlDesignerProjectManager::projectStorageDependencies()
|
ProjectStorageDependencies QmlDesignerProjectManager::projectStorageDependencies()
|
||||||
{
|
{
|
||||||
if constexpr (useProjectStorage()) {
|
if constexpr (useProjectStorage()) {
|
||||||
return {m_projectData->projectStorageData->storage, m_data->pathCache};
|
return {m_projectData->projectStorageData->storage,
|
||||||
|
m_data->pathCache,
|
||||||
|
m_projectData->projectStorageData->pathWatcher};
|
||||||
} else {
|
} else {
|
||||||
return {*dummyProjectStorage(), *dummyPathCache()};
|
return {*dummyProjectStorage(), *dummyPathCache(), *dummyTriggerUpdate()};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -28,6 +28,7 @@ add_qtc_library(TestMocks OBJECT
|
|||||||
projectstorageobservermock.h
|
projectstorageobservermock.h
|
||||||
projectstoragepathwatchermock.h
|
projectstoragepathwatchermock.h
|
||||||
projectstoragepathwatchernotifiermock.h
|
projectstoragepathwatchernotifiermock.h
|
||||||
|
projectstoragetriggerupdatemock.h
|
||||||
qmldocumentparsermock.h
|
qmldocumentparsermock.h
|
||||||
qmltypesparsermock.h
|
qmltypesparsermock.h
|
||||||
sourcepathcachemock.h sourcepathcachemock.cpp
|
sourcepathcachemock.h sourcepathcachemock.cpp
|
||||||
|
19
tests/unit/tests/mocks/projectstoragetriggerupdatemock.h
Normal file
19
tests/unit/tests/mocks/projectstoragetriggerupdatemock.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
// Copyright (C) 2021 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "../utils/googletest.h"
|
||||||
|
|
||||||
|
#include <projectstorage/projectstoragetriggerupdateinterface.h>
|
||||||
|
|
||||||
|
class ProjectStorageTriggerUpdateMock : public QmlDesigner::ProjectStorageTriggerUpdateInterface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~ProjectStorageTriggerUpdateMock() = default;
|
||||||
|
|
||||||
|
MOCK_METHOD(void,
|
||||||
|
checkForChangeInDirectory,
|
||||||
|
(QmlDesigner::SourceContextIds sourceContextIds),
|
||||||
|
(override));
|
||||||
|
};
|
@@ -342,6 +342,7 @@ extend_qtc_library(TestDesignerCore
|
|||||||
projectstorageinfotypes.h
|
projectstorageinfotypes.h
|
||||||
projectstorageobserver.h
|
projectstorageobserver.h
|
||||||
projectstoragepathwatcher.h
|
projectstoragepathwatcher.h
|
||||||
|
projectstoragetriggerupdateinterface.h
|
||||||
projectstoragepathwatcherinterface.h
|
projectstoragepathwatcherinterface.h
|
||||||
projectstoragepathwatchernotifierinterface.h
|
projectstoragepathwatchernotifierinterface.h
|
||||||
projectstoragepathwatcher.h
|
projectstoragepathwatcher.h
|
||||||
|
@@ -5,6 +5,7 @@
|
|||||||
#include <mocks/abstractviewmock.h>
|
#include <mocks/abstractviewmock.h>
|
||||||
#include <mocks/modelresourcemanagementmock.h>
|
#include <mocks/modelresourcemanagementmock.h>
|
||||||
#include <mocks/projectstoragemock.h>
|
#include <mocks/projectstoragemock.h>
|
||||||
|
#include <mocks/projectstoragetriggerupdatemock.h>
|
||||||
#include <mocks/sourcepathcachemock.h>
|
#include <mocks/sourcepathcachemock.h>
|
||||||
#include <strippedstring-matcher.h>
|
#include <strippedstring-matcher.h>
|
||||||
|
|
||||||
@@ -173,10 +174,11 @@ protected:
|
|||||||
protected:
|
protected:
|
||||||
inline static QSharedPointer<const QmlJS::SimpleReaderNode> simpleReaderNode;
|
inline static QSharedPointer<const QmlJS::SimpleReaderNode> simpleReaderNode;
|
||||||
NiceMock<AbstractViewMock> viewMock;
|
NiceMock<AbstractViewMock> viewMock;
|
||||||
|
NiceMock<ProjectStorageTriggerUpdateMock> projectStorageTriggerUpdateMock;
|
||||||
NiceMock<SourcePathCacheMockWithPaths> pathCacheMock{"/path/foo.qml"};
|
NiceMock<SourcePathCacheMockWithPaths> pathCacheMock{"/path/foo.qml"};
|
||||||
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCacheMock.sourceId, "/path"};
|
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCacheMock.sourceId, "/path"};
|
||||||
NiceMock<ModelResourceManagementMock> resourceManagementMock;
|
NiceMock<ModelResourceManagementMock> resourceManagementMock;
|
||||||
QmlDesigner::Model model{{projectStorageMock, pathCacheMock},
|
QmlDesigner::Model model{{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
"Item",
|
"Item",
|
||||||
-1,
|
-1,
|
||||||
-1,
|
-1,
|
||||||
|
@@ -5,7 +5,9 @@
|
|||||||
|
|
||||||
#include <mocks/abstractviewmock.h>
|
#include <mocks/abstractviewmock.h>
|
||||||
#include <mocks/projectstoragemock.h>
|
#include <mocks/projectstoragemock.h>
|
||||||
|
#include <mocks/projectstoragetriggerupdatemock.h>
|
||||||
#include <mocks/sourcepathcachemock.h>
|
#include <mocks/sourcepathcachemock.h>
|
||||||
|
|
||||||
#include <modelutils.h>
|
#include <modelutils.h>
|
||||||
#include <nodemetainfo.h>
|
#include <nodemetainfo.h>
|
||||||
#include <nodeproperty.h>
|
#include <nodeproperty.h>
|
||||||
@@ -18,11 +20,12 @@ using QmlDesigner::Storage::ModuleKind;
|
|||||||
class ModelUtilsWithModel : public ::testing::Test
|
class ModelUtilsWithModel : public ::testing::Test
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
|
NiceMock<ProjectStorageTriggerUpdateMock> projectStorageTriggerUpdateMock;
|
||||||
NiceMock<SourcePathCacheMockWithPaths> pathCacheMock{"/path/model.qml"};
|
NiceMock<SourcePathCacheMockWithPaths> pathCacheMock{"/path/model.qml"};
|
||||||
QmlDesigner::SourceId sourceId = pathCacheMock.createSourceId("/path/foo.qml");
|
QmlDesigner::SourceId sourceId = pathCacheMock.createSourceId("/path/foo.qml");
|
||||||
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCacheMock.sourceId, "/path"};
|
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCacheMock.sourceId, "/path"};
|
||||||
QmlDesigner::ModuleId moduleId = projectStorageMock.moduleId("QtQuick", ModuleKind::QmlLibrary);
|
QmlDesigner::ModuleId moduleId = projectStorageMock.moduleId("QtQuick", ModuleKind::QmlLibrary);
|
||||||
QmlDesigner::Model model{{projectStorageMock, pathCacheMock},
|
QmlDesigner::Model model{{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
"Item",
|
"Item",
|
||||||
{QmlDesigner::Import::createLibraryImport("QML"),
|
{QmlDesigner::Import::createLibraryImport("QML"),
|
||||||
QmlDesigner::Import::createLibraryImport("QtQuick"),
|
QmlDesigner::Import::createLibraryImport("QtQuick"),
|
||||||
|
@@ -7,6 +7,7 @@
|
|||||||
#include <model.h>
|
#include <model.h>
|
||||||
#include <nodeproperty.h>
|
#include <nodeproperty.h>
|
||||||
#include <projectstoragemock.h>
|
#include <projectstoragemock.h>
|
||||||
|
#include <projectstoragetriggerupdatemock.h>
|
||||||
#include <sourcepathcachemock.h>
|
#include <sourcepathcachemock.h>
|
||||||
#include <variantproperty.h>
|
#include <variantproperty.h>
|
||||||
|
|
||||||
@@ -103,9 +104,10 @@ protected:
|
|||||||
const QmlDesigner::GroupType groupType = GetParam();
|
const QmlDesigner::GroupType groupType = GetParam();
|
||||||
const QmlDesigner::PropertyName groupName = GroupId(groupType);
|
const QmlDesigner::PropertyName groupName = GroupId(groupType);
|
||||||
QmlDesigner::DSThemeGroup group;
|
QmlDesigner::DSThemeGroup group;
|
||||||
|
NiceMock<ProjectStorageTriggerUpdateMock> projectStorageTriggerUpdateMock;
|
||||||
NiceMock<SourcePathCacheMockWithPaths> pathCacheMock{"/path/model.qm"};
|
NiceMock<SourcePathCacheMockWithPaths> pathCacheMock{"/path/model.qm"};
|
||||||
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCacheMock.sourceId, "/path"};
|
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCacheMock.sourceId, "/path"};
|
||||||
QmlDesigner::Model model{{projectStorageMock, pathCacheMock},
|
QmlDesigner::Model model{{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
"QtObject",
|
"QtObject",
|
||||||
{Import::createLibraryImport("QM"),
|
{Import::createLibraryImport("QM"),
|
||||||
Import::createLibraryImport("QtQuick")},
|
Import::createLibraryImport("QtQuick")},
|
||||||
|
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include <mocks/abstractviewmock.h>
|
#include <mocks/abstractviewmock.h>
|
||||||
#include <mocks/projectstoragemock.h>
|
#include <mocks/projectstoragemock.h>
|
||||||
|
#include <mocks/projectstoragetriggerupdatemock.h>
|
||||||
#include <mocks/sourcepathcachemock.h>
|
#include <mocks/sourcepathcachemock.h>
|
||||||
|
|
||||||
#include <abstractview.h>
|
#include <abstractview.h>
|
||||||
@@ -183,12 +184,14 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
NiceMock<ProjectStorageTriggerUpdateMock> projectStorageTriggerUpdateMock;
|
||||||
NiceMock<SourcePathCacheMockWithPaths> pathCacheMock{"/path/foo.qml"};
|
NiceMock<SourcePathCacheMockWithPaths> pathCacheMock{"/path/foo.qml"};
|
||||||
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCacheMock.sourceId, "/path"};
|
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCacheMock.sourceId, "/path"};
|
||||||
NiceMock<MockFunction<ModelNode(const ModelNode &)>> goIntoComponentMock;
|
NiceMock<MockFunction<ModelNode(const ModelNode &)>> goIntoComponentMock;
|
||||||
QmlDesigner::ModelPointer designerModel{
|
QmlDesigner::ModelPointer designerModel{
|
||||||
QmlDesigner::Model::create(QmlDesigner::ProjectStorageDependencies{projectStorageMock,
|
QmlDesigner::Model::create(QmlDesigner::ProjectStorageDependencies{projectStorageMock,
|
||||||
pathCacheMock},
|
pathCacheMock,
|
||||||
|
projectStorageTriggerUpdateMock},
|
||||||
"Item",
|
"Item",
|
||||||
{QmlDesigner::Import::createLibraryImport("QtQml.Models"),
|
{QmlDesigner::Import::createLibraryImport("QtQml.Models"),
|
||||||
QmlDesigner::Import::createLibraryImport("QtQuick")},
|
QmlDesigner::Import::createLibraryImport("QtQuick")},
|
||||||
@@ -204,7 +207,7 @@ protected:
|
|||||||
ModelNode element2;
|
ModelNode element2;
|
||||||
ModelNode element3;
|
ModelNode element3;
|
||||||
QmlDesigner::ModelPointer componentModel{
|
QmlDesigner::ModelPointer componentModel{
|
||||||
QmlDesigner::Model::create({projectStorageMock, pathCacheMock},
|
QmlDesigner::Model::create({projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
"ListModel",
|
"ListModel",
|
||||||
{QmlDesigner::Import::createLibraryImport("QtQml.Models"),
|
{QmlDesigner::Import::createLibraryImport("QtQml.Models"),
|
||||||
QmlDesigner::Import::createLibraryImport("QtQuick")},
|
QmlDesigner::Import::createLibraryImport("QtQuick")},
|
||||||
|
@@ -6,6 +6,7 @@
|
|||||||
#include <matchers/info_exportedtypenames-matcher.h>
|
#include <matchers/info_exportedtypenames-matcher.h>
|
||||||
#include <matchers/projectstorage-matcher.h>
|
#include <matchers/projectstorage-matcher.h>
|
||||||
#include <mocks/projectstoragemock.h>
|
#include <mocks/projectstoragemock.h>
|
||||||
|
#include <mocks/projectstoragetriggerupdatemock.h>
|
||||||
#include <mocks/sourcepathcachemock.h>
|
#include <mocks/sourcepathcachemock.h>
|
||||||
|
|
||||||
#include <designercore/include/model.h>
|
#include <designercore/include/model.h>
|
||||||
@@ -105,9 +106,10 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
NiceMock<ProjectStorageTriggerUpdateMock> projectStorageTriggerUpdateMock;
|
||||||
NiceMock<SourcePathCacheMockWithPaths> pathCache{"/path/foo.qml"};
|
NiceMock<SourcePathCacheMockWithPaths> pathCache{"/path/foo.qml"};
|
||||||
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCache.sourceId, "/path"};
|
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCache.sourceId, "/path"};
|
||||||
QmlDesigner::Model model{{projectStorageMock, pathCache},
|
QmlDesigner::Model model{{projectStorageMock, pathCache, projectStorageTriggerUpdateMock},
|
||||||
"Item",
|
"Item",
|
||||||
{QmlDesigner::Import::createLibraryImport("QML"),
|
{QmlDesigner::Import::createLibraryImport("QML"),
|
||||||
QmlDesigner::Import::createLibraryImport("QtQuick"),
|
QmlDesigner::Import::createLibraryImport("QtQuick"),
|
||||||
|
@@ -6,6 +6,7 @@
|
|||||||
#include <matchers/info_exportedtypenames-matcher.h>
|
#include <matchers/info_exportedtypenames-matcher.h>
|
||||||
#include <matchers/qvariant-matcher.h>
|
#include <matchers/qvariant-matcher.h>
|
||||||
#include <mocks/projectstoragemock.h>
|
#include <mocks/projectstoragemock.h>
|
||||||
|
#include <mocks/projectstoragetriggerupdatemock.h>
|
||||||
#include <mocks/sourcepathcachemock.h>
|
#include <mocks/sourcepathcachemock.h>
|
||||||
|
|
||||||
#include <designercore/include/model.h>
|
#include <designercore/include/model.h>
|
||||||
@@ -41,9 +42,10 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
NiceMock<ProjectStorageTriggerUpdateMock> projectStorageTriggerUpdateMock;
|
||||||
NiceMock<SourcePathCacheMockWithPaths> pathCache{"/path/foo.qml"};
|
NiceMock<SourcePathCacheMockWithPaths> pathCache{"/path/foo.qml"};
|
||||||
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCache.sourceId, "/path"};
|
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCache.sourceId, "/path"};
|
||||||
QmlDesigner::Model model{{projectStorageMock, pathCache},
|
QmlDesigner::Model model{{projectStorageMock, pathCache, projectStorageTriggerUpdateMock},
|
||||||
"Item",
|
"Item",
|
||||||
{QmlDesigner::Import::createLibraryImport("QML"),
|
{QmlDesigner::Import::createLibraryImport("QML"),
|
||||||
QmlDesigner::Import::createLibraryImport("QtQuick"),
|
QmlDesigner::Import::createLibraryImport("QtQuick"),
|
||||||
|
@@ -6,6 +6,7 @@
|
|||||||
#include <mocks/externaldependenciesmock.h>
|
#include <mocks/externaldependenciesmock.h>
|
||||||
#include <mocks/modelresourcemanagementmock.h>
|
#include <mocks/modelresourcemanagementmock.h>
|
||||||
#include <mocks/projectstoragemock.h>
|
#include <mocks/projectstoragemock.h>
|
||||||
|
#include <mocks/projectstoragetriggerupdatemock.h>
|
||||||
#include <mocks/sourcepathcachemock.h>
|
#include <mocks/sourcepathcachemock.h>
|
||||||
|
|
||||||
#include <model/auxiliarypropertystorageview.h>
|
#include <model/auxiliarypropertystorageview.h>
|
||||||
@@ -40,17 +41,18 @@ protected:
|
|||||||
|
|
||||||
inline static std::unique_ptr<StaticData> staticData;
|
inline static std::unique_ptr<StaticData> staticData;
|
||||||
Sqlite::Database &database = staticData->database;
|
Sqlite::Database &database = staticData->database;
|
||||||
|
NiceMock<ProjectStorageTriggerUpdateMock> projectStorageTriggerUpdateMock;
|
||||||
NiceMock<SourcePathCacheMockWithPaths> pathCacheMock{"/path/foo.qml"};
|
NiceMock<SourcePathCacheMockWithPaths> pathCacheMock{"/path/foo.qml"};
|
||||||
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCacheMock.sourceId, "/path"};
|
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCacheMock.sourceId, "/path"};
|
||||||
NiceMock<ModelResourceManagementMock> resourceManagementMock;
|
NiceMock<ModelResourceManagementMock> resourceManagementMock;
|
||||||
QmlDesigner::Imports imports = {QmlDesigner::Import::createLibraryImport("QtQuick")};
|
QmlDesigner::Imports imports = {QmlDesigner::Import::createLibraryImport("QtQuick")};
|
||||||
QmlDesigner::Model model{{projectStorageMock, pathCacheMock},
|
QmlDesigner::Model model{{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
"Item",
|
"Item",
|
||||||
imports,
|
imports,
|
||||||
pathCacheMock.path.toQString(),
|
pathCacheMock.path.toQString(),
|
||||||
std::make_unique<ModelResourceManagementMockWrapper>(
|
std::make_unique<ModelResourceManagementMockWrapper>(
|
||||||
resourceManagementMock)};
|
resourceManagementMock)};
|
||||||
QmlDesigner::Model model2{{projectStorageMock, pathCacheMock},
|
QmlDesigner::Model model2{{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
"Item",
|
"Item",
|
||||||
imports,
|
imports,
|
||||||
pathCacheMock.path.toQString(),
|
pathCacheMock.path.toQString(),
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
#include <mocks/modelresourcemanagementmock.h>
|
#include <mocks/modelresourcemanagementmock.h>
|
||||||
#include <mocks/projectstoragemock.h>
|
#include <mocks/projectstoragemock.h>
|
||||||
#include <mocks/projectstorageobservermock.h>
|
#include <mocks/projectstorageobservermock.h>
|
||||||
|
#include <mocks/projectstoragetriggerupdatemock.h>
|
||||||
#include <mocks/sourcepathcachemock.h>
|
#include <mocks/sourcepathcachemock.h>
|
||||||
|
|
||||||
#include <bindingproperty.h>
|
#include <bindingproperty.h>
|
||||||
@@ -119,13 +120,14 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
NiceMock<ProjectStorageTriggerUpdateMock> projectStorageTriggerUpdateMock;
|
||||||
NiceMock<SourcePathCacheMockWithPaths> pathCacheMock{"/path/foo.qml"};
|
NiceMock<SourcePathCacheMockWithPaths> pathCacheMock{"/path/foo.qml"};
|
||||||
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCacheMock.sourceId, "/path"};
|
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCacheMock.sourceId, "/path"};
|
||||||
NiceMock<ModelResourceManagementMock> resourceManagementMock;
|
NiceMock<ModelResourceManagementMock> resourceManagementMock;
|
||||||
QmlDesigner::Imports imports = {QmlDesigner::Import::createLibraryImport("QtQuick")};
|
QmlDesigner::Imports imports = {QmlDesigner::Import::createLibraryImport("QtQuick")};
|
||||||
NiceMock<AbstractViewMock> viewMock;
|
NiceMock<AbstractViewMock> viewMock;
|
||||||
QUrl fileUrl = QUrl::fromLocalFile(pathCacheMock.path.toQString());
|
QUrl fileUrl = QUrl::fromLocalFile(pathCacheMock.path.toQString());
|
||||||
QmlDesigner::Model model{{projectStorageMock, pathCacheMock},
|
QmlDesigner::Model model{{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
"Item",
|
"Item",
|
||||||
imports,
|
imports,
|
||||||
QUrl::fromLocalFile(pathCacheMock.path.toQString()),
|
QUrl::fromLocalFile(pathCacheMock.path.toQString()),
|
||||||
@@ -147,60 +149,60 @@ class Model_Creation : public Model
|
|||||||
|
|
||||||
TEST_F(Model_Creation, root_node_has_item_type_name)
|
TEST_F(Model_Creation, root_node_has_item_type_name)
|
||||||
{
|
{
|
||||||
auto model = QmlDesigner::Model::create({projectStorageMock, pathCacheMock},
|
auto model = QmlDesigner::Model::create(
|
||||||
"Item",
|
{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
imports,
|
"Item",
|
||||||
fileUrl,
|
imports,
|
||||||
std::make_unique<ModelResourceManagementMockWrapper>(
|
fileUrl,
|
||||||
resourceManagementMock));
|
std::make_unique<ModelResourceManagementMockWrapper>(resourceManagementMock));
|
||||||
|
|
||||||
ASSERT_THAT(model->rootModelNode().type(), Eq("Item"));
|
ASSERT_THAT(model->rootModelNode().type(), Eq("Item"));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(Model_Creation, root_node_has_item_meta_info)
|
TEST_F(Model_Creation, root_node_has_item_meta_info)
|
||||||
{
|
{
|
||||||
auto model = QmlDesigner::Model::create({projectStorageMock, pathCacheMock},
|
auto model = QmlDesigner::Model::create(
|
||||||
"Item",
|
{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
imports,
|
"Item",
|
||||||
fileUrl,
|
imports,
|
||||||
std::make_unique<ModelResourceManagementMockWrapper>(
|
fileUrl,
|
||||||
resourceManagementMock));
|
std::make_unique<ModelResourceManagementMockWrapper>(resourceManagementMock));
|
||||||
|
|
||||||
ASSERT_THAT(model->rootModelNode().metaInfo(), model->qtQuickItemMetaInfo());
|
ASSERT_THAT(model->rootModelNode().metaInfo(), model->qtQuickItemMetaInfo());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(Model_Creation, file_url)
|
TEST_F(Model_Creation, file_url)
|
||||||
{
|
{
|
||||||
auto model = QmlDesigner::Model::create({projectStorageMock, pathCacheMock},
|
auto model = QmlDesigner::Model::create(
|
||||||
"Item",
|
{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
imports,
|
"Item",
|
||||||
fileUrl,
|
imports,
|
||||||
std::make_unique<ModelResourceManagementMockWrapper>(
|
fileUrl,
|
||||||
resourceManagementMock));
|
std::make_unique<ModelResourceManagementMockWrapper>(resourceManagementMock));
|
||||||
|
|
||||||
ASSERT_THAT(model->fileUrl().toLocalFile(), Eq(pathCacheMock.path.toQString()));
|
ASSERT_THAT(model->fileUrl().toLocalFile(), Eq(pathCacheMock.path.toQString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(Model_Creation, file_url_source_id)
|
TEST_F(Model_Creation, file_url_source_id)
|
||||||
{
|
{
|
||||||
auto model = QmlDesigner::Model::create({projectStorageMock, pathCacheMock},
|
auto model = QmlDesigner::Model::create(
|
||||||
"Item",
|
{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
imports,
|
"Item",
|
||||||
fileUrl,
|
imports,
|
||||||
std::make_unique<ModelResourceManagementMockWrapper>(
|
fileUrl,
|
||||||
resourceManagementMock));
|
std::make_unique<ModelResourceManagementMockWrapper>(resourceManagementMock));
|
||||||
|
|
||||||
ASSERT_THAT(model->fileUrlSourceId(), pathCacheMock.sourceId);
|
ASSERT_THAT(model->fileUrlSourceId(), pathCacheMock.sourceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(Model_Creation, imports)
|
TEST_F(Model_Creation, imports)
|
||||||
{
|
{
|
||||||
auto model = QmlDesigner::Model::create({projectStorageMock, pathCacheMock},
|
auto model = QmlDesigner::Model::create(
|
||||||
"Item",
|
{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
imports,
|
"Item",
|
||||||
fileUrl,
|
imports,
|
||||||
std::make_unique<ModelResourceManagementMockWrapper>(
|
fileUrl,
|
||||||
resourceManagementMock));
|
std::make_unique<ModelResourceManagementMockWrapper>(resourceManagementMock));
|
||||||
|
|
||||||
ASSERT_THAT(model->imports(), UnorderedElementsAreArray(imports));
|
ASSERT_THAT(model->imports(), UnorderedElementsAreArray(imports));
|
||||||
}
|
}
|
||||||
@@ -645,7 +647,8 @@ TEST_F(Model_ResourceManagment,
|
|||||||
|
|
||||||
TEST_F(Model_ResourceManagment, by_default_remove_model_node_removes_node)
|
TEST_F(Model_ResourceManagment, by_default_remove_model_node_removes_node)
|
||||||
{
|
{
|
||||||
QmlDesigner::Model newModel{{projectStorageMock, pathCacheMock}, "QtQuick.Item"};
|
QmlDesigner::Model newModel{{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
|
"QtQuick.Item"};
|
||||||
NiceMock<AbstractViewMock> viewMock;
|
NiceMock<AbstractViewMock> viewMock;
|
||||||
newModel.attachView(&viewMock);
|
newModel.attachView(&viewMock);
|
||||||
auto node = createNodeWithParent(viewMock.rootModelNode());
|
auto node = createNodeWithParent(viewMock.rootModelNode());
|
||||||
@@ -657,7 +660,8 @@ TEST_F(Model_ResourceManagment, by_default_remove_model_node_removes_node)
|
|||||||
|
|
||||||
TEST_F(Model_ResourceManagment, by_default_remove_properties_removes_property)
|
TEST_F(Model_ResourceManagment, by_default_remove_properties_removes_property)
|
||||||
{
|
{
|
||||||
QmlDesigner::Model newModel{{projectStorageMock, pathCacheMock}, "QtQuick.Item"};
|
QmlDesigner::Model newModel{{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
|
"QtQuick.Item"};
|
||||||
NiceMock<AbstractViewMock> viewMock;
|
NiceMock<AbstractViewMock> viewMock;
|
||||||
newModel.attachView(&viewMock);
|
newModel.attachView(&viewMock);
|
||||||
rootNode = viewMock.rootModelNode();
|
rootNode = viewMock.rootModelNode();
|
||||||
@@ -671,7 +675,9 @@ TEST_F(Model_ResourceManagment, by_default_remove_properties_removes_property)
|
|||||||
TEST_F(Model_ResourceManagment, by_default_remove_model_node_in_factory_method_calls_removes_node)
|
TEST_F(Model_ResourceManagment, by_default_remove_model_node_in_factory_method_calls_removes_node)
|
||||||
{
|
{
|
||||||
model.detachView(&viewMock);
|
model.detachView(&viewMock);
|
||||||
auto newModel = QmlDesigner::Model::create({projectStorageMock, pathCacheMock},
|
auto newModel = QmlDesigner::Model::create({projectStorageMock,
|
||||||
|
pathCacheMock,
|
||||||
|
projectStorageTriggerUpdateMock},
|
||||||
"Item",
|
"Item",
|
||||||
imports,
|
imports,
|
||||||
pathCacheMock.path.toQString());
|
pathCacheMock.path.toQString());
|
||||||
@@ -686,7 +692,9 @@ TEST_F(Model_ResourceManagment, by_default_remove_model_node_in_factory_method_c
|
|||||||
TEST_F(Model_ResourceManagment, by_default_remove_properties_in_factory_method_calls_remove_property)
|
TEST_F(Model_ResourceManagment, by_default_remove_properties_in_factory_method_calls_remove_property)
|
||||||
{
|
{
|
||||||
model.detachView(&viewMock);
|
model.detachView(&viewMock);
|
||||||
auto newModel = QmlDesigner::Model::create({projectStorageMock, pathCacheMock},
|
auto newModel = QmlDesigner::Model::create({projectStorageMock,
|
||||||
|
pathCacheMock,
|
||||||
|
projectStorageTriggerUpdateMock},
|
||||||
"Item",
|
"Item",
|
||||||
imports,
|
imports,
|
||||||
pathCacheMock.path.toQString());
|
pathCacheMock.path.toQString());
|
||||||
@@ -780,7 +788,8 @@ TEST_F(Model_ResourceManagment, remove_model_nodes_bypasses_model_resource_manag
|
|||||||
|
|
||||||
TEST_F(Model_ResourceManagment, by_default_remove_model_nodes_in_factory_method_calls_removes_node)
|
TEST_F(Model_ResourceManagment, by_default_remove_model_nodes_in_factory_method_calls_removes_node)
|
||||||
{
|
{
|
||||||
QmlDesigner::Model newModel{{projectStorageMock, pathCacheMock}, "QtQuick.Item"};
|
QmlDesigner::Model newModel{{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
|
"QtQuick.Item"};
|
||||||
NiceMock<AbstractViewMock> viewMock;
|
NiceMock<AbstractViewMock> viewMock;
|
||||||
newModel.attachView(&viewMock);
|
newModel.attachView(&viewMock);
|
||||||
rootNode = viewMock.rootModelNode();
|
rootNode = viewMock.rootModelNode();
|
||||||
@@ -874,7 +883,8 @@ TEST_F(Model_ResourceManagment, remove_properties_bypasses_model_resource_manage
|
|||||||
TEST_F(Model_ResourceManagment, by_default_remove_properties_in_factory_method_calls_removes_properties)
|
TEST_F(Model_ResourceManagment, by_default_remove_properties_in_factory_method_calls_removes_properties)
|
||||||
{
|
{
|
||||||
model.detachView(&viewMock);
|
model.detachView(&viewMock);
|
||||||
QmlDesigner::Model newModel{{projectStorageMock, pathCacheMock}, "QtQuick.Item"};
|
QmlDesigner::Model newModel{{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
|
"QtQuick.Item"};
|
||||||
newModel.attachView(&viewMock);
|
newModel.attachView(&viewMock);
|
||||||
rootNode = viewMock.rootModelNode();
|
rootNode = viewMock.rootModelNode();
|
||||||
auto property = createProperty(rootNode, "yi");
|
auto property = createProperty(rootNode, "yi");
|
||||||
@@ -1131,14 +1141,24 @@ TEST_F(Model_MetaInfo, add_project_storage_observer_to_project_storage)
|
|||||||
{
|
{
|
||||||
EXPECT_CALL(projectStorageMock, addObserver(_));
|
EXPECT_CALL(projectStorageMock, addObserver(_));
|
||||||
|
|
||||||
QmlDesigner::Model model{{projectStorageMock, pathCacheMock}, "Item", -1, -1, nullptr, {}};
|
QmlDesigner::Model model{{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
|
"Item",
|
||||||
|
-1,
|
||||||
|
-1,
|
||||||
|
nullptr,
|
||||||
|
{}};
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(Model_MetaInfo, remove_project_storage_observer_from_project_storage)
|
TEST_F(Model_MetaInfo, remove_project_storage_observer_from_project_storage)
|
||||||
{
|
{
|
||||||
EXPECT_CALL(projectStorageMock, removeObserver(_)).Times(2); // the fixture model is calling it too
|
EXPECT_CALL(projectStorageMock, removeObserver(_)).Times(2); // the fixture model is calling it too
|
||||||
|
|
||||||
QmlDesigner::Model model{{projectStorageMock, pathCacheMock}, "Item", -1, -1, nullptr, {}};
|
QmlDesigner::Model model{{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
|
"Item",
|
||||||
|
-1,
|
||||||
|
-1,
|
||||||
|
nullptr,
|
||||||
|
{}};
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(Model_MetaInfo, refresh_meta_infos_callback_is_calling_abstract_view)
|
TEST_F(Model_MetaInfo, refresh_meta_infos_callback_is_calling_abstract_view)
|
||||||
@@ -1148,7 +1168,12 @@ TEST_F(Model_MetaInfo, refresh_meta_infos_callback_is_calling_abstract_view)
|
|||||||
ProjectStorageObserverMock observerMock;
|
ProjectStorageObserverMock observerMock;
|
||||||
QmlDesigner::ProjectStorageObserver *observer = nullptr;
|
QmlDesigner::ProjectStorageObserver *observer = nullptr;
|
||||||
ON_CALL(projectStorageMock, addObserver(_)).WillByDefault([&](auto *o) { observer = o; });
|
ON_CALL(projectStorageMock, addObserver(_)).WillByDefault([&](auto *o) { observer = o; });
|
||||||
QmlDesigner::Model model{{projectStorageMock, pathCacheMock}, "Item", -1, -1, nullptr, {}};
|
QmlDesigner::Model model{{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
|
"Item",
|
||||||
|
-1,
|
||||||
|
-1,
|
||||||
|
nullptr,
|
||||||
|
{}};
|
||||||
model.attachView(&viewMock);
|
model.attachView(&viewMock);
|
||||||
|
|
||||||
EXPECT_CALL(viewMock, refreshMetaInfos(typeIds));
|
EXPECT_CALL(viewMock, refreshMetaInfos(typeIds));
|
||||||
@@ -1163,7 +1188,12 @@ TEST_F(Model_MetaInfo, added_exported_type_names_are_changed_callback_is_calling
|
|||||||
ProjectStorageObserverMock observerMock;
|
ProjectStorageObserverMock observerMock;
|
||||||
QmlDesigner::ProjectStorageObserver *observer = nullptr;
|
QmlDesigner::ProjectStorageObserver *observer = nullptr;
|
||||||
ON_CALL(projectStorageMock, addObserver(_)).WillByDefault([&](auto *o) { observer = o; });
|
ON_CALL(projectStorageMock, addObserver(_)).WillByDefault([&](auto *o) { observer = o; });
|
||||||
QmlDesigner::Model model{{projectStorageMock, pathCacheMock}, "Item", -1, -1, nullptr, {}};
|
QmlDesigner::Model model{{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
|
"Item",
|
||||||
|
-1,
|
||||||
|
-1,
|
||||||
|
nullptr,
|
||||||
|
{}};
|
||||||
model.attachView(&viewMock);
|
model.attachView(&viewMock);
|
||||||
|
|
||||||
EXPECT_CALL(viewMock, exportedTypeNamesChanged(added, IsEmpty()));
|
EXPECT_CALL(viewMock, exportedTypeNamesChanged(added, IsEmpty()));
|
||||||
@@ -1178,7 +1208,12 @@ TEST_F(Model_MetaInfo, removed_exported_type_names_are_changed_callback_is_calli
|
|||||||
ProjectStorageObserverMock observerMock;
|
ProjectStorageObserverMock observerMock;
|
||||||
QmlDesigner::ProjectStorageObserver *observer = nullptr;
|
QmlDesigner::ProjectStorageObserver *observer = nullptr;
|
||||||
ON_CALL(projectStorageMock, addObserver(_)).WillByDefault([&](auto *o) { observer = o; });
|
ON_CALL(projectStorageMock, addObserver(_)).WillByDefault([&](auto *o) { observer = o; });
|
||||||
QmlDesigner::Model model{{projectStorageMock, pathCacheMock}, "Item", -1, -1, nullptr, {}};
|
QmlDesigner::Model model{{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
|
"Item",
|
||||||
|
-1,
|
||||||
|
-1,
|
||||||
|
nullptr,
|
||||||
|
{}};
|
||||||
model.attachView(&viewMock);
|
model.attachView(&viewMock);
|
||||||
|
|
||||||
EXPECT_CALL(viewMock, exportedTypeNamesChanged(IsEmpty(), removed));
|
EXPECT_CALL(viewMock, exportedTypeNamesChanged(IsEmpty(), removed));
|
||||||
@@ -1355,7 +1390,7 @@ TEST_F(Model_ViewManagement, dont_call_modelAttached_if_node_instance_view_is_al
|
|||||||
TEST_F(Model_ViewManagement, detach_node_instance_view_from_other_model_before_attach_to_new_model)
|
TEST_F(Model_ViewManagement, detach_node_instance_view_from_other_model_before_attach_to_new_model)
|
||||||
{
|
{
|
||||||
InSequence s;
|
InSequence s;
|
||||||
QmlDesigner::Model otherModel{{projectStorageMock, pathCacheMock},
|
QmlDesigner::Model otherModel{{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
"Item",
|
"Item",
|
||||||
imports,
|
imports,
|
||||||
fileUrl,
|
fileUrl,
|
||||||
@@ -1401,7 +1436,7 @@ TEST_F(Model_ViewManagement, attach_view_is_not_calling_modelAttached_if_it_is_a
|
|||||||
TEST_F(Model_ViewManagement, view_is_detached_before_it_is_attached_ot_new_model)
|
TEST_F(Model_ViewManagement, view_is_detached_before_it_is_attached_ot_new_model)
|
||||||
{
|
{
|
||||||
InSequence s;
|
InSequence s;
|
||||||
QmlDesigner::Model otherModel{{projectStorageMock, pathCacheMock},
|
QmlDesigner::Model otherModel{{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
"Item",
|
"Item",
|
||||||
imports,
|
imports,
|
||||||
fileUrl,
|
fileUrl,
|
||||||
|
@@ -4,6 +4,7 @@
|
|||||||
#include "../utils/googletest.h"
|
#include "../utils/googletest.h"
|
||||||
|
|
||||||
#include "../mocks/projectstoragemock.h"
|
#include "../mocks/projectstoragemock.h"
|
||||||
|
#include "../mocks/projectstoragetriggerupdatemock.h"
|
||||||
#include "../mocks/sourcepathcachemock.h"
|
#include "../mocks/sourcepathcachemock.h"
|
||||||
|
|
||||||
#include <designercore/include/model.h>
|
#include <designercore/include/model.h>
|
||||||
@@ -15,9 +16,10 @@ namespace {
|
|||||||
class ModelNode : public testing::Test
|
class ModelNode : public testing::Test
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
|
NiceMock<ProjectStorageTriggerUpdateMock> projectStorageTriggerUpdateMock;
|
||||||
NiceMock<SourcePathCacheMockWithPaths> pathCache{"/path/foo.qml"};
|
NiceMock<SourcePathCacheMockWithPaths> pathCache{"/path/foo.qml"};
|
||||||
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCache.sourceId, "/path"};
|
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCache.sourceId, "/path"};
|
||||||
QmlDesigner::Model model{{projectStorageMock, pathCache}, "Item"};
|
QmlDesigner::Model model{{projectStorageMock, pathCache, projectStorageTriggerUpdateMock}, "Item"};
|
||||||
QmlDesigner::ModelNode rootNode = model.rootModelNode();
|
QmlDesigner::ModelNode rootNode = model.rootModelNode();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -6,6 +6,7 @@
|
|||||||
#include "../mocks/abstractviewmock.h"
|
#include "../mocks/abstractviewmock.h"
|
||||||
#include "../mocks/modelresourcemanagementmock.h"
|
#include "../mocks/modelresourcemanagementmock.h"
|
||||||
#include "../mocks/projectstoragemock.h"
|
#include "../mocks/projectstoragemock.h"
|
||||||
|
#include "../mocks/projectstoragetriggerupdatemock.h"
|
||||||
#include "../mocks/sourcepathcachemock.h"
|
#include "../mocks/sourcepathcachemock.h"
|
||||||
|
|
||||||
#include <include/bindingproperty.h>
|
#include <include/bindingproperty.h>
|
||||||
@@ -71,10 +72,11 @@ protected:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
NiceMock<AbstractViewMock> viewMock;
|
NiceMock<AbstractViewMock> viewMock;
|
||||||
|
NiceMock<ProjectStorageTriggerUpdateMock> projectStorageTriggerUpdateMock;
|
||||||
NiceMock<SourcePathCacheMockWithPaths> pathCacheMock{"/path/foo.qml"};
|
NiceMock<SourcePathCacheMockWithPaths> pathCacheMock{"/path/foo.qml"};
|
||||||
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCacheMock.sourceId, "/path"};
|
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCacheMock.sourceId, "/path"};
|
||||||
QmlDesigner::ModelResourceManagement management;
|
QmlDesigner::ModelResourceManagement management;
|
||||||
QmlDesigner::Model model{{projectStorageMock, pathCacheMock},
|
QmlDesigner::Model model{{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
"Item",
|
"Item",
|
||||||
{QmlDesigner::Import::createLibraryImport("QtQtuick")},
|
{QmlDesigner::Import::createLibraryImport("QtQtuick")},
|
||||||
QUrl::fromLocalFile(pathCacheMock.path.toQString())};
|
QUrl::fromLocalFile(pathCacheMock.path.toQString())};
|
||||||
|
@@ -4,6 +4,7 @@
|
|||||||
#include <abstractviewmock.h>
|
#include <abstractviewmock.h>
|
||||||
#include <googletest.h>
|
#include <googletest.h>
|
||||||
#include <projectstoragemock.h>
|
#include <projectstoragemock.h>
|
||||||
|
#include <projectstoragetriggerupdatemock.h>
|
||||||
#include <sourcepathcachemock.h>
|
#include <sourcepathcachemock.h>
|
||||||
|
|
||||||
#include <model.h>
|
#include <model.h>
|
||||||
@@ -73,11 +74,13 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
NiceMock<ProjectStorageTriggerUpdateMock> projectStorageTriggerUpdateMock;
|
||||||
NiceMock<SourcePathCacheMockWithPaths> pathCache{"/path/foo.qml"};
|
NiceMock<SourcePathCacheMockWithPaths> pathCache{"/path/foo.qml"};
|
||||||
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCache.sourceId, "/path"};
|
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCache.sourceId, "/path"};
|
||||||
QmlDesigner::ModelPointer model{
|
QmlDesigner::ModelPointer model{
|
||||||
QmlDesigner::Model::create(QmlDesigner::ProjectStorageDependencies{projectStorageMock,
|
QmlDesigner::Model::create(QmlDesigner::ProjectStorageDependencies{projectStorageMock,
|
||||||
pathCache},
|
pathCache,
|
||||||
|
projectStorageTriggerUpdateMock},
|
||||||
"Item",
|
"Item",
|
||||||
{QmlDesigner::Import::createLibraryImport("QtQuick")},
|
{QmlDesigner::Import::createLibraryImport("QtQuick")},
|
||||||
QUrl::fromLocalFile(pathCache.path.toQString()))};
|
QUrl::fromLocalFile(pathCache.path.toQString()))};
|
||||||
|
@@ -7,6 +7,7 @@
|
|||||||
#include <mocks/abstractviewmock.h>
|
#include <mocks/abstractviewmock.h>
|
||||||
#include <mocks/modelresourcemanagementmock.h>
|
#include <mocks/modelresourcemanagementmock.h>
|
||||||
#include <mocks/projectstoragemock.h>
|
#include <mocks/projectstoragemock.h>
|
||||||
|
#include <mocks/projectstoragetriggerupdatemock.h>
|
||||||
#include <mocks/sourcepathcachemock.h>
|
#include <mocks/sourcepathcachemock.h>
|
||||||
#include <rewriterview.h>
|
#include <rewriterview.h>
|
||||||
#include <textmodifiermock.h>
|
#include <textmodifiermock.h>
|
||||||
@@ -26,13 +27,14 @@ protected:
|
|||||||
~RewriterView() { model.setRewriterView(nullptr); }
|
~RewriterView() { model.setRewriterView(nullptr); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
NiceMock<ProjectStorageTriggerUpdateMock> projectStorageTriggerUpdateMock;
|
||||||
NiceMock<ExternalDependenciesMock> externalDependenciesMock;
|
NiceMock<ExternalDependenciesMock> externalDependenciesMock;
|
||||||
NiceMock<TextModifierMock> textModifierMock;
|
NiceMock<TextModifierMock> textModifierMock;
|
||||||
NiceMock<SourcePathCacheMockWithPaths> pathCacheMock{"/path/foo.qml"};
|
NiceMock<SourcePathCacheMockWithPaths> pathCacheMock{"/path/foo.qml"};
|
||||||
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCacheMock.sourceId, "/path"};
|
NiceMock<ProjectStorageMockWithQtQuick> projectStorageMock{pathCacheMock.sourceId, "/path"};
|
||||||
NiceMock<ModelResourceManagementMock> resourceManagementMock;
|
NiceMock<ModelResourceManagementMock> resourceManagementMock;
|
||||||
QmlDesigner::Imports imports = {QmlDesigner::Import::createLibraryImport("QtQuick")};
|
QmlDesigner::Imports imports = {QmlDesigner::Import::createLibraryImport("QtQuick")};
|
||||||
QmlDesigner::Model model{{projectStorageMock, pathCacheMock},
|
QmlDesigner::Model model{{projectStorageMock, pathCacheMock, projectStorageTriggerUpdateMock},
|
||||||
"Item",
|
"Item",
|
||||||
imports,
|
imports,
|
||||||
QUrl::fromLocalFile(pathCacheMock.path.toQString()),
|
QUrl::fromLocalFile(pathCacheMock.path.toQString()),
|
||||||
|
@@ -415,6 +415,51 @@ TEST_F(ProjectStoragePathWatcher, no_duplicate_path_changes)
|
|||||||
mockQFileSytemWatcher.directoryChanged(sourceContextPath);
|
mockQFileSytemWatcher.directoryChanged(sourceContextPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(ProjectStoragePathWatcher, trigger_manual_two_notify_file_changes)
|
||||||
|
{
|
||||||
|
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{projectChunkId1, {sourceIds[0], sourceIds[1]}},
|
||||||
|
IdPaths{projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[3]}})));
|
||||||
|
|
||||||
|
watcher.checkForChangeInDirectory({sourceIds[0].contextId(), sourceIds[1].contextId()});
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(ProjectStoragePathWatcher, trigger_manual_notify_for_path_changes)
|
||||||
|
{
|
||||||
|
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(sourceIds[3])))
|
||||||
|
.WillByDefault(Return(FileStatus{sourceIds[3], 1, 2}));
|
||||||
|
|
||||||
|
EXPECT_CALL(notifier, pathsChanged(ElementsAre(sourceIds[0])));
|
||||||
|
|
||||||
|
watcher.checkForChangeInDirectory({sourceIds[0].contextId()});
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(ProjectStoragePathWatcher, trigger_manual_no_notify_for_unwatched_path_changes)
|
||||||
|
{
|
||||||
|
watcher.updateIdPaths({{projectChunkId1, {sourceIds[3]}}, {projectChunkId2, {sourceIds[3]}}});
|
||||||
|
|
||||||
|
EXPECT_CALL(notifier, pathsChanged(IsEmpty()));
|
||||||
|
|
||||||
|
watcher.checkForChangeInDirectory({sourceIds[0].contextId()});
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(ProjectStoragePathWatcher, update_context_id_paths_adds_entry_in_new_directory)
|
TEST_F(ProjectStoragePathWatcher, update_context_id_paths_adds_entry_in_new_directory)
|
||||||
{
|
{
|
||||||
watcher.updateIdPaths({
|
watcher.updateIdPaths({
|
||||||
|
Reference in New Issue
Block a user