From 55d34b91e34cabc33cb0211526af5f989ca64f6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E6=9C=8B=E7=A8=8B?= Date: Sat, 6 Mar 2021 17:17:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加单元测试代码 Log: Change-Id: I9cebdef6989322b8deefd039bee7b1c8658e6dbf --- CMakeLists.txt | 3 + frame/controller/dockitemmanager.cpp | 3 +- frame/item/launcheritem.cpp | 13 +++- frame/item/launcheritem.h | 8 +-- frame/mockinterface/qgsettingsinterface.h | 29 +++++++++ .../mockinterface/qgsettingsinterfaceimpl.cpp | 60 +++++++++++++++++++ frame/mockinterface/qgsettingsinterfaceimpl.h | 28 +++++++++ .../mockinterface/qgsettingsinterfacemock.cpp | 59 ++++++++++++++++++ frame/mockinterface/qgsettingsinterfacemock.h | 25 ++++++++ tests/CMakeLists.txt | 1 - tests/ut_launcheritem.cpp | 54 +++++++++++++++++ 11 files changed, 274 insertions(+), 9 deletions(-) create mode 100644 frame/mockinterface/qgsettingsinterface.h create mode 100644 frame/mockinterface/qgsettingsinterfaceimpl.cpp create mode 100644 frame/mockinterface/qgsettingsinterfaceimpl.h create mode 100644 frame/mockinterface/qgsettingsinterfacemock.cpp create mode 100644 frame/mockinterface/qgsettingsinterfacemock.h create mode 100644 tests/ut_launcheritem.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index bb1247d98..289952b06 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,6 +62,7 @@ include_directories( frame/util frame/window frame/xcb + frame/mockinterface ) aux_source_directory(frame/controller CONTROLLER) @@ -75,6 +76,7 @@ aux_source_directory(frame/qss QSSPATH) aux_source_directory(frame/util UTIL) aux_source_directory(frame/window WINDOW) aux_source_directory(frame/xcb XCB) +aux_source_directory(frame/mockinterface MOCKINTERFACE) file(GLOB SRC_PATH ${CONTROLLER} @@ -86,6 +88,7 @@ file(GLOB SRC_PATH ${UTIL} ${WINDOW} ${XCB} + ${MOCKINTERFACE} ) add_subdirectory("frame") diff --git a/frame/controller/dockitemmanager.cpp b/frame/controller/dockitemmanager.cpp index dfbd86c73..b8ba222f4 100644 --- a/frame/controller/dockitemmanager.cpp +++ b/frame/controller/dockitemmanager.cpp @@ -24,6 +24,7 @@ #include "launcheritem.h" #include "pluginsitem.h" #include "traypluginitem.h" +#include "qgsettingsinterfaceimpl.h" #include #include @@ -36,7 +37,7 @@ DockItemManager::DockItemManager(QObject *parent) , m_pluginsInter(new DockPluginsController(this)) { //固定区域:启动器 - m_itemList.append(new LauncherItem); + m_itemList.append(new LauncherItem(new QGSettingsInterfaceImpl("com.deepin.dde.dock.module.launcher"))); // 应用区域 for (auto entry : m_appInter->entries()) { diff --git a/frame/item/launcheritem.cpp b/frame/item/launcheritem.cpp index 33c531b90..f0fd4469e 100644 --- a/frame/item/launcheritem.cpp +++ b/frame/item/launcheritem.cpp @@ -22,6 +22,8 @@ #include "launcheritem.h" #include "themeappicon.h" #include "imagefactory.h" +#include "qgsettingsinterface.h" +#include "qgsettingsinterfaceimpl.h" #include #include @@ -32,18 +34,23 @@ DCORE_USE_NAMESPACE -LauncherItem::LauncherItem(QWidget *parent) +LauncherItem::LauncherItem(QGSettingsInterface *interface, QWidget *parent) : DockItem(parent) , m_launcherInter(new LauncherInter("com.deepin.dde.Launcher", "/com/deepin/dde/Launcher", QDBusConnection::sessionBus(), this)) , m_tips(new TipsWidget(this)) - , m_gsettings(new QGSettings("com.deepin.dde.dock.module.launcher")) + , m_gsettings(interface) { m_launcherInter->setSync(true, false); m_tips->setVisible(false); m_tips->setObjectName("launcher"); - connect(m_gsettings, &QGSettings::changed, this, &LauncherItem::onGSettingsChanged); + if (m_gsettings->type() == QGSettingsInterface::REAL) { + QGSettingsInterfaceImpl *impl = dynamic_cast(m_gsettings); + if (!impl) + qWarning("Error!"); + connect(impl->gsettings(), &QGSettings::changed, this, &LauncherItem::onGSettingsChanged); + } } void LauncherItem::refershIcon() diff --git a/frame/item/launcheritem.h b/frame/item/launcheritem.h index c151f38cc..c1bbed994 100644 --- a/frame/item/launcheritem.h +++ b/frame/item/launcheritem.h @@ -24,19 +24,19 @@ #include "dockitem.h" #include "../widgets/tipswidget.h" +#include "qgsettingsinterface.h" #include - using LauncherInter = com::deepin::dde::Launcher; -class QGSettings; +class QGSettingsInterface; class LauncherItem : public DockItem { Q_OBJECT public: - explicit LauncherItem(QWidget *parent = nullptr) ; + explicit LauncherItem(QGSettingsInterface *interface, QWidget *parent = nullptr); inline ItemType itemType() const override {return Launcher;} @@ -61,7 +61,7 @@ private: QPixmap m_icon; LauncherInter *m_launcherInter; TipsWidget *m_tips; - QGSettings* m_gsettings; + QGSettingsInterface* m_gsettings; }; #endif // LAUNCHERITEM_H diff --git a/frame/mockinterface/qgsettingsinterface.h b/frame/mockinterface/qgsettingsinterface.h new file mode 100644 index 000000000..4c0be97ba --- /dev/null +++ b/frame/mockinterface/qgsettingsinterface.h @@ -0,0 +1,29 @@ +#ifndef QGSETTINGSINTERFACE_H +#define QGSETTINGSINTERFACE_H + +#include +#include + +class QGSettings; +class QGSettingsInterface +{ +public: + enum Type { + REAL, // 持有真正的QGSettings指针 + FAKE // Mock类 + }; + + virtual ~QGSettingsInterface() {} + + virtual Type type() = 0; + virtual QGSettings *gsettings() = 0; + virtual QVariant get(const QString &key) const = 0; + virtual void set(const QString &key, const QVariant &value) = 0; + virtual bool trySet(const QString &key, const QVariant &value) = 0; + virtual QStringList keys() const = 0; + virtual QVariantList choices(const QString &key) const = 0; + virtual void reset(const QString &key) = 0; + static bool isSchemaInstalled(const QByteArray &schema_id) {Q_UNUSED(schema_id); return false;} + +}; +#endif // QGSETTINGSINTERFACE_H diff --git a/frame/mockinterface/qgsettingsinterfaceimpl.cpp b/frame/mockinterface/qgsettingsinterfaceimpl.cpp new file mode 100644 index 000000000..8913cca30 --- /dev/null +++ b/frame/mockinterface/qgsettingsinterfaceimpl.cpp @@ -0,0 +1,60 @@ +#include +#include + +#include "qgsettingsinterfaceimpl.h" + +QGSettingsInterfaceImpl::QGSettingsInterfaceImpl(const QByteArray &schema_id, const QByteArray &path, QObject *parent) + : m_gsettings(new QGSettings(schema_id, path, parent)) +{ + +} + +QGSettingsInterfaceImpl::~QGSettingsInterfaceImpl() +{ + +} + +QGSettingsInterface::Type QGSettingsInterfaceImpl::type() +{ + return Type::REAL; +} + +QGSettings *QGSettingsInterfaceImpl::gsettings() +{ + return m_gsettings; +} + +QVariant QGSettingsInterfaceImpl::get(const QString &key) const +{ + return m_gsettings->get(key); +} + +void QGSettingsInterfaceImpl::set(const QString &key, const QVariant &value) +{ + return m_gsettings->set(key, value); +} + +bool QGSettingsInterfaceImpl::trySet(const QString &key, const QVariant &value) +{ + return m_gsettings->trySet(key, value); +} + +QStringList QGSettingsInterfaceImpl::keys() const +{ + return m_gsettings->keys(); +} + +QVariantList QGSettingsInterfaceImpl::choices(const QString &key) const +{ + return m_gsettings->choices(key); +} + +void QGSettingsInterfaceImpl::reset(const QString &key) +{ + return m_gsettings->reset(key); +} + +bool QGSettingsInterfaceImpl::isSchemaInstalled(const QByteArray &schema_id) +{ + return QGSettings::isSchemaInstalled(schema_id); +} diff --git a/frame/mockinterface/qgsettingsinterfaceimpl.h b/frame/mockinterface/qgsettingsinterfaceimpl.h new file mode 100644 index 000000000..da23f0e70 --- /dev/null +++ b/frame/mockinterface/qgsettingsinterfaceimpl.h @@ -0,0 +1,28 @@ +#ifndef QGSETTINGSINTERFACEIMPL_H +#define QGSETTINGSINTERFACEIMPL_H +#include + +#include "qgsettingsinterface.h" + +class QGSettings; +class QGSettingsInterfaceImpl : public QGSettingsInterface +{ +public: + QGSettingsInterfaceImpl(const QByteArray &schema_id, const QByteArray &path = QByteArray(), QObject *parent = nullptr); + ~QGSettingsInterfaceImpl() override; + + virtual Type type() override; + virtual QGSettings *gsettings() override; + virtual QVariant get(const QString &key) const override; + virtual void set(const QString &key, const QVariant &value) override; + virtual bool trySet(const QString &key, const QVariant &value) override; + virtual QStringList keys() const override; + virtual QVariantList choices(const QString &key) const override; + virtual void reset(const QString &key) override; + static bool isSchemaInstalled(const QByteArray &schema_id); + +private: + QGSettings *m_gsettings; +}; + +#endif // QGSETTINGSINTERFACEIMPL_H diff --git a/frame/mockinterface/qgsettingsinterfacemock.cpp b/frame/mockinterface/qgsettingsinterfacemock.cpp new file mode 100644 index 000000000..2999c2943 --- /dev/null +++ b/frame/mockinterface/qgsettingsinterfacemock.cpp @@ -0,0 +1,59 @@ +#include +#include + +#include "qgsettingsinterfacemock.h" + +QGSettingsInterfaceMock::QGSettingsInterfaceMock(const QByteArray &schema_id, const QByteArray &path, QObject *parent) +{ + +} + +QGSettingsInterfaceMock::~QGSettingsInterfaceMock() +{ + +} + +QGSettingsInterface::Type QGSettingsInterfaceMock::type() +{ + return Type::FAKE; +} + +QGSettings *QGSettingsInterfaceMock::gsettings() +{ + return nullptr; +} + +QVariant QGSettingsInterfaceMock::get(const QString &key) const +{ + return QVariant(); +} + +void QGSettingsInterfaceMock::set(const QString &key, const QVariant &value) +{ + +} + +bool QGSettingsInterfaceMock::trySet(const QString &key, const QVariant &value) +{ + return false; +} + +QStringList QGSettingsInterfaceMock::keys() const +{ + return QStringList(); +} + +QVariantList QGSettingsInterfaceMock::choices(const QString &key) const +{ + return QVariantList(); +} + +void QGSettingsInterfaceMock::reset(const QString &key) +{ + +} + +bool QGSettingsInterfaceMock::isSchemaInstalled(const QByteArray &schema_id) +{ + return false; +} diff --git a/frame/mockinterface/qgsettingsinterfacemock.h b/frame/mockinterface/qgsettingsinterfacemock.h new file mode 100644 index 000000000..680ffad6a --- /dev/null +++ b/frame/mockinterface/qgsettingsinterfacemock.h @@ -0,0 +1,25 @@ +#ifndef QGSETTINGSINTERFACEMOCK_H +#define QGSETTINGSINTERFACEMOCK_H +#include + +#include "qgsettingsinterface.h" + +class QGSettings; +class QGSettingsInterfaceMock : public QGSettingsInterface +{ +public: + QGSettingsInterfaceMock(const QByteArray &schema_id, const QByteArray &path = QByteArray(), QObject *parent = nullptr); + ~QGSettingsInterfaceMock() override; + + virtual Type type() override; + virtual QGSettings *gsettings() override; + virtual QVariant get(const QString &key) const override; + virtual void set(const QString &key, const QVariant &value) override; + virtual bool trySet(const QString &key, const QVariant &value) override; + virtual QStringList keys() const override; + virtual QVariantList choices(const QString &key) const override; + virtual void reset(const QString &key) override; + static bool isSchemaInstalled(const QByteArray &schema_id); +}; + +#endif // QGSETTINGSINTERFACEMOCK_H diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 495bcd710..0f9a180d3 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -30,7 +30,6 @@ pkg_check_modules(XCB_EWMH REQUIRED xcb-ewmh x11) add_executable(${BIN_NAME} ${SRCS} ${INTERFACES} ${SRC_PATH} ../frame/item/item.qrc ../frame/frame.qrc) # 包含路径 - target_include_directories(${BIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS} ${XCB_EWMH_INCLUDE_DIRS} diff --git a/tests/ut_launcheritem.cpp b/tests/ut_launcheritem.cpp new file mode 100644 index 000000000..4c74bdae4 --- /dev/null +++ b/tests/ut_launcheritem.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2018 ~ 2028 Uniontech Technology Co., Ltd. + * + * Author: chenjun + * + * Maintainer: chenjun + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include + +#include + +#include "launcheritem.h" +#include "qgsettingsinterfacemock.h" + +class Test_LauncherItem : public ::testing::Test +{ +public: + virtual void SetUp() override; + virtual void TearDown() override; + +public: + LauncherItem *launcherItem = nullptr; +}; + +void Test_LauncherItem::SetUp() +{ + launcherItem = new LauncherItem(new QGSettingsInterfaceMock("com.deepin.dde.dock.module.launcher")); +} + +void Test_LauncherItem::TearDown() +{ + delete launcherItem; + launcherItem = nullptr; +} + +TEST_F(Test_LauncherItem, dockitem_test) +{ + ASSERT_NE(launcherItem, nullptr); +}