feat: 添加单元测试代码

添加以下类的单元测试代码:
mainwindow,
删除部分用不到的代码

Log:
Change-Id: I2c6d5f01b730f230d1fdb73fabc8421442fd9e39
This commit is contained in:
范朋程 2021-03-18 11:19:07 +08:00
parent 1cce47a4e7
commit 84f4d74cc6
9 changed files with 205 additions and 63 deletions

View File

@ -4,7 +4,8 @@
#include <QMouseEvent>
#include <QTouchEvent>
DockApplication::DockApplication(int &argc, char **argv) : DApplication (argc, argv)
DockApplication::DockApplication(int &argc, char **argv)
: DApplication (argc, argv)
{
}

View File

@ -220,10 +220,8 @@ QMenu *MenuWorker::createMenu()
void MenuWorker::showDockSettingsMenu()
{
// 菜单功能被禁用
const QGSettings *setting = Utils::SettingsPtr("menu");
static const QGSettings *setting = Utils::SettingsPtr("menu", this);
if (setting && setting->keys().contains("enable") && !setting->get("enable").toBool()) {
delete setting;
setting = nullptr;
return;
}

View File

@ -28,7 +28,7 @@
#include <QRegion>
#include <QSequentialAnimationGroup>
#include <QVariantAnimation>
#include <QX11Info>
#include <QDBusConnection>
const QString MonitorsSwitchTime = "monitorsSwitchTime";
@ -231,7 +231,7 @@ void MultiScreenWorker::onExtralRegionMonitorChanged(int x, int y, const QString
m_delayTimer->stop();
if (m_hideMode == HideMode::KeepShowing
|| ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Show)) {
|| ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Show)) {
displayAnimation(m_ds.current(), AniAction::Show);
} else if ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Hide) {
displayAnimation(m_ds.current(), AniAction::Hide);
@ -384,16 +384,16 @@ void MultiScreenWorker::updateParentGeometry(const QVariant &value, const Positi
case Position::Top: {
parent()->panel()->move(0, rect.height() - panelSize);
}
break;
break;
case Position::Left: {
parent()->panel()->move(rect.width() - panelSize, 0);
}
break;
break;
case Position::Bottom:
case Position::Right: {
parent()->panel()->move(0, 0);
}
break;
break;
}
}
@ -490,7 +490,7 @@ void MultiScreenWorker::onHideModeChanged()
m_hideMode = hideMode;
if (m_hideMode == HideMode::KeepShowing
|| ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Show)) {
|| ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Show)) {
displayAnimation(m_ds.current(), AniAction::Show);
} else if ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Hide) {
displayAnimation(m_ds.current(), AniAction::Hide);
@ -526,7 +526,7 @@ void MultiScreenWorker::onHideStateChanged()
qInfo() << "hidestate change:" << m_hideMode << m_hideState;
if (m_hideMode == HideMode::KeepShowing
|| ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Show)) {
|| ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Show)) {
displayAnimation(m_ds.current(), AniAction::Show);
} else if ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Hide) {
displayAnimation(m_ds.current(), AniAction::Hide);
@ -591,28 +591,28 @@ void MultiScreenWorker::onRequestUpdateRegionMonitor()
rect.x2 = inter->x() + inter->w();
rect.y2 = inter->y() + monitorHeight;
}
break;
break;
case Bottom: {
rect.x1 = inter->x();
rect.y1 = inter->y() + inter->h() - monitorHeight;
rect.x2 = inter->x() + inter->w();
rect.y2 = inter->y() + inter->h();
}
break;
break;
case Left: {
rect.x1 = inter->x();
rect.y1 = inter->y();
rect.x2 = inter->x() + monitorHeight;
rect.y2 = inter->y() + inter->h();
}
break;
break;
case Right: {
rect.x1 = inter->x() + inter->w() - monitorHeight;
rect.y1 = inter->y();
rect.x2 = inter->x() + inter->w();
rect.y2 = inter->y() + inter->h();
}
break;
break;
}
if (!m_monitorRectList.contains(rect)) {
@ -637,28 +637,28 @@ void MultiScreenWorker::onRequestUpdateRegionMonitor()
rect.x2 = inter->x() + inter->w();
rect.y2 = inter->y() + inter->h();
}
break;
break;
case Bottom: {
rect.x1 = inter->x();
rect.y1 = inter->y();
rect.x2 = inter->x() + inter->w();
rect.y2 = inter->y() + inter->h() - realDockSize;
}
break;
break;
case Left: {
rect.x1 = inter->x() + realDockSize;
rect.y1 = inter->y();
rect.x2 = inter->x() + inter->w();
rect.y2 = inter->y() + inter->h();
}
break;
break;
case Right: {
rect.x1 = inter->x();
rect.y1 = inter->y();
rect.x2 = inter->x() + inter->w() - realDockSize;
rect.y2 = inter->y() + inter->h();
}
break;
break;
}
if (!m_extralRectList.contains(rect)) {
@ -686,28 +686,28 @@ void MultiScreenWorker::onRequestUpdateRegionMonitor()
touchRect.x2 = inter->x() + inter->w();
touchRect.y2 = inter->y() + monitHeight;
}
break;
break;
case Bottom: {
touchRect.x1 = inter->x();
touchRect.y1 = inter->y() + inter->h() - monitHeight;
touchRect.x2 = inter->x() + inter->w();
touchRect.y2 = inter->y() + inter->h();
}
break;
break;
case Left: {
touchRect.x1 = inter->x();
touchRect.y1 = inter->y();
touchRect.x2 = inter->x() + monitHeight;
touchRect.y2 = inter->y() + inter->h();
}
break;
break;
case Right: {
touchRect.x1 = inter->x() + inter->w() - monitHeight;
touchRect.y1 = inter->y();
touchRect.x2 = inter->x() + inter->w();
touchRect.y2 = inter->y() + inter->h();
}
break;
break;
}
if (!m_touchRectList.contains(touchRect)) {
@ -749,6 +749,13 @@ void MultiScreenWorker::onRequestNotifyWindowManager()
/* 在非主屏或非一直显示状态时,清除任务栏区域,不挤占应用 */
if (m_ds.current() != m_ds.primary() || m_hideMode != HideMode::KeepShowing) {
lastRect = QRect();
const auto display = QX11Info::display();
if (!display) {
qWarning() << "QX11Info::display() is " << display;
return;
}
XcbMisc::instance()->clear_strut_partial(xcb_window_t(parent()->winId()));
return;
}
@ -798,6 +805,13 @@ void MultiScreenWorker::onRequestNotifyWindowManager()
}
qDebug() << "set reserved area to xcb:" << strut << strutStart << strutEnd;
const auto display = QX11Info::display();
if (!display) {
qWarning() << "QX11Info::display() is " << display;
return;
}
XcbMisc::instance()->set_strut_partial(static_cast<xcb_window_t>(parent()->winId()), orientation,
static_cast<uint>(strut + WINDOWMARGIN * ratio), // 设置窗口与屏幕边缘距离,需要乘缩放
static_cast<uint>(strutStart), // 设置任务栏起点坐标上下为x左右为y
@ -1139,13 +1153,13 @@ void MultiScreenWorker::displayAnimation(const QString &screen, const Position &
case AniAction::Show:
if (pos == Position::Top || pos == Position::Bottom) {
if (dockShowRect.height() > mainwindowRect.height() - 2
&& dockShowRect.height() < mainwindowRect.height() + 2) {
&& dockShowRect.height() < mainwindowRect.height() + 2) {
emit requestNotifyWindowManager();
return;
}
} else if (pos == Position::Left || pos == Position::Right) {
if (dockShowRect.width() > mainwindowRect.width() - 2
&& dockShowRect.width() < mainwindowRect.width() + 2) {
&& dockShowRect.width() < mainwindowRect.width() + 2) {
emit requestNotifyWindowManager();
return;
}
@ -1320,13 +1334,17 @@ void MultiScreenWorker::changeDockPosition(QString fromScreen, QString toScreen,
// 如果更改了显示位置,在显示之前应该更新一下界面布局方向
if (fromPos != toPos)
connect(ani1, &QVariantAnimation::finished, this, [ = ] {
const auto display = QX11Info::display();
if (!display) {
qWarning() << "QX11Info::display() is " << display;
} else {
// 先清除原先的窗管任务栏区域
XcbMisc::instance()->clear_strut_partial(xcb_window_t(parent()->winId()));
}
// 先清除原先的窗管任务栏区域
XcbMisc::instance()->clear_strut_partial(xcb_window_t(parent()->winId()));
// 隐藏后需要通知界面更新布局方向
emit requestUpdateLayout();
});
// 隐藏后需要通知界面更新布局方向
emit requestUpdateLayout();
});
connect(group, &QVariantAnimation::finished, this, [ = ] {
m_aniStart = false;
@ -1715,9 +1733,9 @@ const QPoint MultiScreenWorker::rawXPosition(const QPoint &scaledPos)
QScreen const *screen = Utils::screenAtByScaled(scaledPos);
return screen ? screen->geometry().topLeft() +
(scaledPos - screen->geometry().topLeft()) *
screen->devicePixelRatio()
: scaledPos;
(scaledPos - screen->geometry().topLeft()) *
screen->devicePixelRatio()
: scaledPos;
}
/**

View File

@ -56,26 +56,6 @@
using org::kde::StatusNotifierWatcher;
using DBusDock = com::deepin::dde::daemon::Dock;
const QPoint rawXPosition(const QPoint &scaledPos)
{
QScreen const *screen = Utils::screenAtByScaled(scaledPos);
return screen ? screen->geometry().topLeft() +
(scaledPos - screen->geometry().topLeft()) *
screen->devicePixelRatio()
: scaledPos;
}
const QPoint scaledPos(const QPoint &rawXPos)
{
QScreen const *screen = Utils::screenAt(rawXPos);
return screen
? screen->geometry().topLeft() +
(rawXPos - screen->geometry().topLeft()) / screen->devicePixelRatio()
: rawXPos;
}
// let startdde know that we've already started.
void RegisterDdeSession()
{
@ -110,14 +90,19 @@ MainWindow::MainWindow(QWidget *parent)
, m_dragWidget(new DragWidget(this))
, m_launched(false)
{
setAccessibleName("mainwindow");
m_mainPanel->setAccessibleName("mainpanel");
setAttribute(Qt::WA_TranslucentBackground);
setAttribute(Qt::WA_X11DoNotAcceptFocus);
// 确保下面两行代码的先后顺序,否则会导致任务栏界面不再置顶
//1 确保这两行代码的先后顺序,否则会导致任务栏界面不再置顶
setWindowFlags(Qt::WindowDoesNotAcceptFocus);
XcbMisc::instance()->set_window_type(xcb_window_t(this->winId()), XcbMisc::Dock);
const auto display = QX11Info::display();
if (!display) {
qWarning() << "QX11Info::display() is " << display;
} else {
//2 确保这两行代码的先后顺序,否则会导致任务栏界面不再置顶
XcbMisc::instance()->set_window_type(xcb_window_t(this->winId()), XcbMisc::Dock);
}
setMouseTracking(true);
setAcceptDrops(true);

View File

@ -153,6 +153,10 @@ void XEmbedTrayWidget::mouseMoveEvent(QMouseEvent *e)
void XEmbedTrayWidget::configContainerPosition()
{
auto c = QX11Info::connection();
if (!c) {
qWarning() << "QX11Info::connection() is " << c;
return;
}
const QPoint p(rawXPosition(QCursor::pos()));
@ -173,6 +177,10 @@ void XEmbedTrayWidget::configContainerPosition()
void XEmbedTrayWidget::wrapWindow()
{
auto c = QX11Info::connection();
if (!c) {
qWarning() << "QX11Info::connection() is " << c;
return;
}
auto cookie = xcb_get_geometry(c, m_windowId);
QScopedPointer<xcb_get_geometry_reply_t> clientGeom(xcb_get_geometry_reply(c, cookie, Q_NULLPTR));
@ -334,6 +342,10 @@ void XEmbedTrayWidget::sendClick(uint8_t mouseButton, int x, int y)
QString XEmbedTrayWidget::getWindowProperty(quint32 winId, QString propName)
{
const auto display = QX11Info::display();
if (!display) {
qWarning() << "QX11Info::display() is " << display;
return QString();
}
Atom atom_prop = XInternAtom(display, propName.toLocal8Bit(), true);
if (!atom_prop) {
@ -383,6 +395,11 @@ void XEmbedTrayWidget::refershIconImage()
{
const auto ratio = devicePixelRatioF();
auto c = QX11Info::connection();
if (!c) {
qWarning() << "QX11Info::connection() is " << c;
return;
}
auto cookie = xcb_get_geometry(c, m_windowId);
QScopedPointer<xcb_get_geometry_reply_t> geom(xcb_get_geometry_reply(c, cookie, Q_NULLPTR));
if (geom.isNull())
@ -504,6 +521,10 @@ void XEmbedTrayWidget::setX11PassMouseEvent(const bool pass)
void XEmbedTrayWidget::setWindowOnTop(const bool top)
{
auto c = QX11Info::connection();
if (!c) {
qWarning() << "QX11Info::connection() is " << c;
return;
}
const uint32_t stackAboveData[] = {top ? XCB_STACK_MODE_ABOVE : XCB_STACK_MODE_BELOW};
xcb_configure_window(c, m_containerWid, XCB_CONFIG_WINDOW_STACK_MODE, stackAboveData);
xcb_flush(c);

View File

@ -38,13 +38,10 @@ class Test_AppItem : public ::testing::Test
public:
virtual void SetUp() override;
virtual void TearDown() override;
public:
AppItem *appItem = nullptr;
};
void Test_AppItem::SetUp()
{
{
}
void Test_AppItem::TearDown()
@ -59,7 +56,7 @@ TEST_F(Test_AppItem, coverage_test)
ON_CALL(mock, keys()).WillByDefault(Return(QStringList() << "enable" << "control"));
ON_CALL(mock, get(_)) .WillByDefault(::testing::Invoke([](const QString& key){return true; }));
appItem = new AppItem(&mock, &mock, &mock, QDBusObjectPath("/com/deepin/dde/daemon/Dock/entries/e0T6045b766"));
AppItem *appItem = new AppItem(&mock, &mock, &mock, QDBusObjectPath("/com/deepin/dde/daemon/Dock/entries/e0T6045b766"));
// 触发信号测试
// emit appItem->m_refershIconTimer->start(10);

View File

@ -25,7 +25,9 @@
#include <gtest/gtest.h>
#define private public
#include "mainpanelcontrol.h"
#undef private
using namespace ::testing;
@ -53,4 +55,20 @@ void Test_MainPanelControl::TearDown()
TEST_F(Test_MainPanelControl, coverage_test)
{
ASSERT_TRUE(mainPanel);
mainPanel->setPositonValue(Dock::Position::Top);
mainPanel->updateMainPanelLayout();
QTest::qWait(10);
mainPanel->setPositonValue(Dock::Position::Bottom);
mainPanel->updateMainPanelLayout();
QTest::qWait(10);
mainPanel->setPositonValue(Dock::Position::Left);
mainPanel->updateMainPanelLayout();
QTest::qWait(10);
mainPanel->setPositonValue(Dock::Position::Right);
mainPanel->updateMainPanelLayout();
QTest::qWait(10);
}

View File

@ -23,6 +23,8 @@
#include "dockapplication.h"
#include <QDebug>
#include <QMouseEvent>
#include <QTouchEvent>
#include <DLog>
@ -34,6 +36,17 @@ int main(int argc, char **argv)
qApp->setProperty("CANSHOW", true);
QMouseEvent mouseEvent1(QMouseEvent::MouseButtonPress, QPoint(), QPoint(), QPoint(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier, Qt::MouseEventSynthesizedByQt);
qApp->sendEvent(&app, &mouseEvent1);
QMouseEvent mouseEvent2(QMouseEvent::MouseButtonPress, QPoint(), QPoint(), QPoint(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier, Qt::MouseEventSynthesizedByApplication);
qApp->sendEvent(&app, &mouseEvent2);
QList<QTouchEvent::TouchPoint> list;
list << QTouchEvent::TouchPoint(0) << QTouchEvent::TouchPoint(1) << QTouchEvent::TouchPoint(2);
QTouchEvent touchEven(QEvent::TouchBegin, nullptr, Qt::NoModifier, Qt::TouchPointPressed, list);
qApp->sendEvent(&app, &touchEven);
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();

View File

@ -0,0 +1,91 @@
/*
* Copyright (C) 2018 ~ 2028 Uniontech Technology Co., Ltd.
*
* Author: fanpengcheng <fanpengcheng@uniontech.com>
*
* Maintainer: fanpengcheng <fanpengcheng@uniontech.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
#include <QObject>
#include <QThread>
#include <QTest>
#include <gtest/gtest.h>
#define private public
#include "mainwindow.h"
#undef private
using namespace ::testing;
class Test_MainWindow : public ::testing::Test
{
public:
virtual void SetUp() override;
virtual void TearDown() override;
public:
MainWindow *m_window = nullptr;
};
void Test_MainWindow::SetUp()
{
m_window = new MainWindow;
}
void Test_MainWindow::TearDown()
{
delete m_window;
m_window = nullptr;
}
TEST_F(Test_MainWindow, coverage_test)
{
ASSERT_TRUE(m_window);
m_window->getTrayVisableItemCount();
m_window->adjustShadowMask();
m_window->resetDragWindow();
m_window->onMainWindowSizeChanged(QPoint(10, 10));
m_window->touchRequestResizeDock();
m_window->sendNotifications();
m_window->callShow();
QTest::qWait(450);
m_window->relaodPlugins();
QTest::qWait(100);
QEvent enterEvent(QEvent::Enter);
qApp->sendEvent(m_window, &enterEvent);
QTest::qWait(10);
QEvent dragEnterEvent(QEvent::Enter);
qApp->sendEvent(m_window->m_dragWidget, &dragEnterEvent);
QTest::qWait(10);
ASSERT_EQ(QApplication::overrideCursor()->shape(), m_window->m_dragWidget->cursor().shape());
QEvent dragLeaveEvent(QEvent::Leave);
qApp->sendEvent(m_window->m_dragWidget, &dragLeaveEvent);
QTest::qWait(10);
ASSERT_EQ(QApplication::overrideCursor()->shape(), Qt::ArrowCursor);
// QTest::mouseClick(m_window, Qt::RightButton, Qt::NoModifier, QPoint(100 ,10));
// QTest::qWait(10);
// QTest::mouseClick(m_window, Qt::LeftButton, Qt::NoModifier, QPoint(0 ,0));
// QTest::qWait(10);
}