diff --git a/src/libs/utils/settingsaccessor.h b/src/libs/utils/settingsaccessor.h index 35f23352c80..d347d9456f3 100644 --- a/src/libs/utils/settingsaccessor.h +++ b/src/libs/utils/settingsaccessor.h @@ -139,6 +139,8 @@ protected: virtual Utils::optional findIssues(const QVariantMap &data, const Utils::FileName &path) const; + QVariantMap mergeSettings(const QVariantMap &userMap, const QVariantMap &sharedMap) const; + virtual void storeSharedSettings(const QVariantMap &data) const; virtual QVariant retrieveSharedSettings() const; @@ -151,7 +153,6 @@ private: QVariantMap readUserSettings(QWidget *parent) const; QVariantMap readSharedSettings(QWidget *parent) const; - QVariantMap mergeSettings(const QVariantMap &userMap, const QVariantMap &sharedMap) const; static QByteArray settingsIdFromMap(const QVariantMap &data); static QString differentEnvironmentMsg(const QString &projectName); diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h index 899255c2bb6..3de6ccfffa0 100644 --- a/src/plugins/projectexplorer/projectexplorer.h +++ b/src/plugins/projectexplorer/projectexplorer.h @@ -233,6 +233,14 @@ private slots: void testToolChainManager_data(); void testToolChainManager(); + + void testUserFileAccessor_prepareSettings(); + void testUserFileAccessor_prepareSettingsObsoleteVersion(); + void testUserFileAccessor_prepareSettingsObsoleteVersionNewVersion(); + void testUserFileAccessor_prepareToSaveSettings(); + void testUserFileAccessor_mergeSettings(); + void testUserFileAccessor_mergeSettingsEmptyUser(); + void testUserFileAccessor_mergeSettingsEmptyShared(); #endif // WITH_TESTS }; diff --git a/src/plugins/projectexplorer/userfileaccessor.cpp b/src/plugins/projectexplorer/userfileaccessor.cpp index 39eec6cb6e0..50f08924172 100644 --- a/src/plugins/projectexplorer/userfileaccessor.cpp +++ b/src/plugins/projectexplorer/userfileaccessor.cpp @@ -1969,3 +1969,191 @@ QVariant UserFileVersion17Upgrader::process(const QVariant &entry) return entry; } } + +#if defined(WITH_TESTS) + +#include + +#include "projectexplorer.h" + +namespace { + +class TestUserFileAccessor : public UserFileAccessor +{ +public: + TestUserFileAccessor(Project *project) : UserFileAccessor(project) { } + + void storeSharedSettings(const QVariantMap &data) const final { m_storedSettings = data; } + QVariant retrieveSharedSettings() const final { return m_storedSettings; } + + using UserFileAccessor::prepareSettings; + using UserFileAccessor::prepareToSaveSettings; + + using UserFileAccessor::mergeSettings; + +private: + mutable QVariantMap m_storedSettings; +}; + + +class TestProject : public Project +{ +public: + TestProject() : Project("x-test/testproject", Utils::FileName::fromString("/test/project")) { + setDisplayName("Test Project"); + } +}; + +} // namespace + +void ProjectExplorerPlugin::testUserFileAccessor_prepareSettings() +{ + TestProject project; + TestUserFileAccessor accessor(&project); + + QVariantMap data; + data.insert("Version", 4); + data.insert("Foo", "bar"); + + QVariantMap result = accessor.prepareSettings(data); + + QCOMPARE(result, data); +} + +void ProjectExplorerPlugin::testUserFileAccessor_prepareSettingsObsoleteVersion() +{ + TestProject project; + TestUserFileAccessor accessor(&project); + + QVariantMap data; + data.insert("ProjectExplorer.Project.Updater.FileVersion", 4); + data.insert("Foo", "bar"); + + QVariantMap result = accessor.prepareSettings(data); + + QCOMPARE(result.count(), data.count()); + QCOMPARE(result.value("Foo"), data.value("Foo")); + QCOMPARE(result.value("Version"), data.value("ProjectExplorer.Project.Updater.FileVersion")); +} + +void ProjectExplorerPlugin::testUserFileAccessor_prepareSettingsObsoleteVersionNewVersion() +{ + TestProject project; + TestUserFileAccessor accessor(&project); + + QVariantMap data; + data.insert("ProjectExplorer.Project.Updater.FileVersion", 4); + data.insert("Version", 5); + data.insert("Foo", "bar"); + + QVariantMap result = accessor.prepareSettings(data); + + QCOMPARE(result.count(), data.count() - 1); + QCOMPARE(result.value("Foo"), data.value("Foo")); + // TODO: Does this make sense? Shouldn't the Version stay unchanged? + QCOMPARE(result.value("Version"), data.value("ProjectExplorer.Project.Updater.FileVersion")); +} + +void ProjectExplorerPlugin::testUserFileAccessor_prepareToSaveSettings() +{ + TestProject project; + TestUserFileAccessor accessor(&project); + + QVariantMap sharedData; + sharedData.insert("Version", 10); + sharedData.insert("shared1", "bar"); + sharedData.insert("shared2", "baz"); + sharedData.insert("shared3", "foo"); + + accessor.storeSharedSettings(sharedData); + + QVariantMap data; + data.insert("Version", 10); + data.insert("shared1", "bar1"); + data.insert("unique1", 1234); + data.insert("shared3", "foo"); + QVariantMap result = accessor.prepareToSaveSettings(data); + + QCOMPARE(result.count(), data.count() + 3); + QCOMPARE(result.value("EnvironmentId"), ProjectExplorerPlugin::projectExplorerSettings().environmentId.toByteArray()); + QCOMPARE(result.value("UserStickyKeys"), QVariant(QStringList({"shared1"}))); + QCOMPARE(result.value("Version"), accessor.currentVersion()); + QCOMPARE(result.value("shared1"), data.value("shared1")); + QCOMPARE(result.value("shared3"), data.value("shared3")); + QCOMPARE(result.value("unique1"), data.value("unique1")); +} + +void ProjectExplorerPlugin::testUserFileAccessor_mergeSettings() +{ + TestProject project; + TestUserFileAccessor accessor(&project); + + QVariantMap sharedData; + sharedData.insert("Version", accessor.currentVersion()); + sharedData.insert("EnvironmentId", "foobar"); + sharedData.insert("shared1", "bar"); + sharedData.insert("shared2", "baz"); + sharedData.insert("shared3", "foooo"); + + QVariantMap data; + data.insert("Version", accessor.currentVersion()); + data.insert("EnvironmentId", ProjectExplorerPlugin::projectExplorerSettings().environmentId.toByteArray()); + data.insert("UserStickyKeys", QStringList({"shared1"})); + data.insert("shared1", "bar1"); + data.insert("unique1", 1234); + data.insert("shared3", "foo"); + QVariantMap result = accessor.mergeSettings(data, sharedData); + + QCOMPARE(result.count(), data.count() + 1); + QCOMPARE(result.value("OriginalVersion"), accessor.currentVersion()); + QCOMPARE(result.value("EnvironmentId"), ProjectExplorerPlugin::projectExplorerSettings().environmentId.toByteArray()); // unchanged + QCOMPARE(result.value("UserStickyKeys"), QVariant(QStringList({"shared1"}))); // unchanged + QCOMPARE(result.value("Version"), accessor.currentVersion()); // forced + QCOMPARE(result.value("shared1"), data.value("shared1")); // from data + // FIXME: Why is this missing? + // QCOMPARE(result.value("shared2"), sharedData.value("shared2")); // from shared, missing! + QCOMPARE(result.value("shared3"), sharedData.value("shared3")); // from shared + QCOMPARE(result.value("unique1"), data.value("unique1")); +} + +void ProjectExplorerPlugin::testUserFileAccessor_mergeSettingsEmptyUser() +{ + TestProject project; + TestUserFileAccessor accessor(&project); + + QVariantMap sharedData; + sharedData.insert("Version", accessor.currentVersion()); + sharedData.insert("EnvironmentId", "foobar"); + sharedData.insert("shared1", "bar"); + sharedData.insert("shared2", "baz"); + sharedData.insert("shared3", "foooo"); + + QVariantMap data; + QVariantMap result = accessor.mergeSettings(data, sharedData); + + QCOMPARE(result, sharedData); +} + +void ProjectExplorerPlugin::testUserFileAccessor_mergeSettingsEmptyShared() +{ + TestProject project; + TestUserFileAccessor accessor(&project); + + QVariantMap sharedData; + + QVariantMap data; + data.insert("Version", accessor.currentVersion()); + data.insert("EnvironmentId", ProjectExplorerPlugin::projectExplorerSettings().environmentId.toByteArray()); + data.insert("UserStickyKeys", QStringList({"shared1"})); + data.insert("shared1", "bar1"); + data.insert("unique1", 1234); + data.insert("shared3", "foo"); + QVariantMap result = accessor.mergeSettings(data, sharedData); + + // FIXME: OriginalVersion should not have been added by merge! + QCOMPARE(result.value("OriginalVersion"), accessor.currentVersion()); + result.remove("OriginalVersion"); + QCOMPARE(result, data); +} + +#endif // WITH_TESTS diff --git a/src/plugins/projectexplorer/userfileaccessor.h b/src/plugins/projectexplorer/userfileaccessor.h index ed5cc734713..d1c98a29c16 100644 --- a/src/plugins/projectexplorer/userfileaccessor.h +++ b/src/plugins/projectexplorer/userfileaccessor.h @@ -48,8 +48,8 @@ protected: QVariantMap prepareSettings(const QVariantMap &data) const final; QVariantMap prepareToSaveSettings(const QVariantMap &data) const final; - void storeSharedSettings(const QVariantMap &data) const final; - QVariant retrieveSharedSettings() const final; + void storeSharedSettings(const QVariantMap &data) const override; + QVariant retrieveSharedSettings() const override; private: Project *m_project;