fuzzer: Also serialize the AddDockWidget operation

This commit is contained in:
Sergio Martins
2019-10-11 17:04:26 +01:00
parent 2769c8a789
commit 954fb271d3
6 changed files with 113 additions and 16 deletions

View File

@@ -25,12 +25,15 @@
#define KDDOCKWIDGETS_TESTING_H
#include "KDDockWidgets.h"
#include "MainWindowBase.h"
#include "DockWidgetBase.h"
#include <QSize>
#include <QRect>
#include <QVector>
#include <QEvent>
#include <QWidget>
#include <QVariant>
/**
* @file
@@ -38,6 +41,8 @@
*/
namespace KDDockWidgets {
namespace Testing {
class WarningObserver
@@ -46,6 +51,30 @@ namespace Testing {
virtual void onFatal() = 0;
};
struct AddDockWidgetParams {
MainWindowBase *mainWindow;
DockWidgetBase *dockWidget;
DockWidgetBase *relativeTo;
KDDockWidgets::Location location;
KDDockWidgets::AddingOption addingOption;
QVariantMap toVariantMap() const
{
QVariantMap map;
map["mainWindowName"] = mainWindow->uniqueName();
map["dockWidgetName"] = dockWidget->uniqueName();
if (relativeTo)
map["relativeToName"] = relativeTo->uniqueName();
map["location"] = location;
map["addingOption"] = addingOption;
return map;
}
};
void setWarningObserver(WarningObserver *);
void installFatalMessageHandler();

View File

@@ -5,5 +5,5 @@ add_executable(fuzzer
Operations.cpp
../Testing.cpp)
set_property(TARGET fuzzer PROPERTY CXX_STANDARD 17)
target_link_libraries(fuzzer kddockwidgets Qt5::Widgets Qt5::Test)

View File

@@ -165,7 +165,7 @@ bool Fuzzer::getRandomBool(int truePercentage)
return distrib(m_randomEngine) < truePercentage;
}
Fuzzer::AddDockWidgetParams Fuzzer::getRandomAddDockWidgetParams()
Testing::AddDockWidgetParams Fuzzer::getRandomAddDockWidgetParams()
{
AddDockWidgetParams params;

View File

@@ -133,19 +133,25 @@ public:
{
QVariantMap map;
map[QStringLiteral("initialLayout")] = initialLayout.toVariantMap();
QVariantList operationsVariant;
operationsVariant.reserve(operations.size());
int i = 0;
for (const auto &o : operations) {
QVariantMap operationVariant = o->toVariantMap();
if (operationVariant.isEmpty())
break;
operationVariant["index"] = i;
++i;
operationsVariant << operationVariant;
}
map[QStringLiteral("operations")] = operationsVariant;
return map;
}
};
struct AddDockWidgetParams {
MainWindowBase *mainWindow;
DockWidgetBase *dockWidget;
DockWidgetBase *relativeTo;
KDDockWidgets::Location location;
KDDockWidgets::AddingOption addingOption;
};
void runTest(const Test &);
explicit Fuzzer(FuzzerConfig config, QObject *parent = nullptr);
@@ -158,7 +164,7 @@ public:
bool getRandomBool(int truePercentage = 50);
AddDockWidgetParams getRandomAddDockWidgetParams();
Testing::AddDockWidgetParams getRandomAddDockWidgetParams();
KDDockWidgets::MainWindowBase* getRandomMainWindow();
KDDockWidgets::DockWidgetBase* getRandomDockWidget(DockWidgetBase *excluding = nullptr);

View File

@@ -47,6 +47,19 @@ void OperationBase::execute()
execute_impl();
}
QVariantMap OperationBase::toVariantMap() const
{
const QVariantMap params = paramsToVariantMap();
if (params.isEmpty())
return {};
QVariantMap map;
map["type"] = m_operationType;
map["params"] = params;
return map;
}
DockWidgetBase *OperationBase::dockByName(const QString &name) const
{
return DockRegistry::self()->dockByName(name);
@@ -65,6 +78,7 @@ CloseViaDockWidgetAPI::CloseViaDockWidgetAPI(Fuzzer *fuzzer)
void CloseViaDockWidgetAPI::execute_impl()
{
if (DockWidgetBase *dw = m_fuzzer->getRandomDockWidget()) {
m_dockWidgetName = dw->uniqueName();
auto fw = qobject_cast<FloatingWindow*>(dw->window());
dw->close();
if (fw && fw->beingDeleted())
@@ -72,6 +86,14 @@ void CloseViaDockWidgetAPI::execute_impl()
}
}
QVariantMap CloseViaDockWidgetAPI::paramsToVariantMap() const
{
QVariantMap map;
if (!m_dockWidgetName.isEmpty())
map["dockWidgetName"] = m_dockWidgetName;
return map;
}
HideViaDockWidgetAPI::HideViaDockWidgetAPI(Fuzzer *fuzzer)
: OperationBase(OperationType_HideViaDockWidgetAPI, fuzzer)
{
@@ -80,6 +102,7 @@ HideViaDockWidgetAPI::HideViaDockWidgetAPI(Fuzzer *fuzzer)
void HideViaDockWidgetAPI::execute_impl()
{
if (DockWidgetBase *dw = m_fuzzer->getRandomDockWidget()) {
m_dockWidgetName = dw->uniqueName();
auto fw = qobject_cast<FloatingWindow*>(dw->window());
dw->hide();
if (fw && fw->beingDeleted())
@@ -87,6 +110,14 @@ void HideViaDockWidgetAPI::execute_impl()
}
}
QVariantMap HideViaDockWidgetAPI::paramsToVariantMap() const
{
QVariantMap map;
if (!m_dockWidgetName.isEmpty())
map["dockWidgetName"] = m_dockWidgetName;
return map;
}
ShowViaDockWidgetAPI::ShowViaDockWidgetAPI(Fuzzer *fuzzer)
: OperationBase(OperationType_ShowViaDockWidgetAPI, fuzzer)
{
@@ -94,8 +125,18 @@ ShowViaDockWidgetAPI::ShowViaDockWidgetAPI(Fuzzer *fuzzer)
void ShowViaDockWidgetAPI::execute_impl()
{
if (DockWidgetBase *dw = m_fuzzer->getRandomDockWidget())
if (DockWidgetBase *dw = m_fuzzer->getRandomDockWidget()) {
m_dockWidgetName = dw->uniqueName();
dw->show();
}
}
QVariantMap ShowViaDockWidgetAPI::paramsToVariantMap() const
{
QVariantMap map;
if (!m_dockWidgetName.isEmpty())
map["dockWidgetName"] = m_dockWidgetName;
return map;
}
AddDockWidget::AddDockWidget(Fuzzer *fuzzer)
@@ -105,10 +146,16 @@ AddDockWidget::AddDockWidget(Fuzzer *fuzzer)
void AddDockWidget::execute_impl()
{
const Fuzzer::AddDockWidgetParams params = m_fuzzer->getRandomAddDockWidgetParams();
m_params = m_fuzzer->getRandomAddDockWidgetParams();
auto fw = qobject_cast<FloatingWindow*>(params.dockWidget->window());
params.mainWindow->addDockWidget(params.dockWidget, params.location, params.relativeTo, params.addingOption);
auto fw = qobject_cast<FloatingWindow*>(m_params->dockWidget->window());
m_params->mainWindow->addDockWidget(m_params->dockWidget, m_params->location, m_params->relativeTo, m_params->addingOption);
if (fw && fw->beingDeleted())
Testing::waitForDeleted(fw);
}
QVariantMap AddDockWidget::paramsToVariantMap() const
{
return m_params ? m_params->toVariantMap()
: QVariantMap();
}

View File

@@ -25,11 +25,13 @@
#define KDDOCKWIDGETS_TESTING_OPERATIONS_H
#include "KDDockWidgets.h"
#include "../Testing.h"
#include <QObject>
#include <QVector>
#include <memory>
#include <optional>
namespace KDDockWidgets {
@@ -61,8 +63,12 @@ public:
virtual ~OperationBase();
void execute();
QVariantMap toVariantMap() const;
protected:
virtual void execute_impl() = 0;
virtual QVariantMap paramsToVariantMap() const = 0;
DockWidgetBase* dockByName(const QString &) const;
MainWindowBase* mainWindowByName(const QString &) const;
@@ -77,6 +83,8 @@ public:
protected:
void execute_impl() override;
QVariantMap paramsToVariantMap() const override;
QString m_dockWidgetName;
};
class HideViaDockWidgetAPI : public OperationBase
@@ -86,6 +94,8 @@ public:
protected:
void execute_impl() override;
QVariantMap paramsToVariantMap() const override;
QString m_dockWidgetName;
};
class ShowViaDockWidgetAPI : public OperationBase
@@ -95,6 +105,8 @@ public:
protected:
void execute_impl() override;
QVariantMap paramsToVariantMap() const override;
QString m_dockWidgetName;
};
class AddDockWidget : public OperationBase
@@ -104,6 +116,9 @@ public:
protected:
void execute_impl() override;
QVariantMap paramsToVariantMap() const override;
private:
std::optional<Testing::AddDockWidgetParams> m_params;
};
}