diff --git a/tests/Testing.h b/tests/Testing.h index 045bcb36..dab58f7b 100644 --- a/tests/Testing.h +++ b/tests/Testing.h @@ -25,12 +25,15 @@ #define KDDOCKWIDGETS_TESTING_H #include "KDDockWidgets.h" +#include "MainWindowBase.h" +#include "DockWidgetBase.h" #include #include #include #include #include +#include /** * @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(); diff --git a/tests/fuzzer/CMakeLists.txt b/tests/fuzzer/CMakeLists.txt index 78ef4dbb..f2ece262 100644 --- a/tests/fuzzer/CMakeLists.txt +++ b/tests/fuzzer/CMakeLists.txt @@ -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) diff --git a/tests/fuzzer/Fuzzer.cpp b/tests/fuzzer/Fuzzer.cpp index ad32de75..4b01be08 100644 --- a/tests/fuzzer/Fuzzer.cpp +++ b/tests/fuzzer/Fuzzer.cpp @@ -165,7 +165,7 @@ bool Fuzzer::getRandomBool(int truePercentage) return distrib(m_randomEngine) < truePercentage; } -Fuzzer::AddDockWidgetParams Fuzzer::getRandomAddDockWidgetParams() +Testing::AddDockWidgetParams Fuzzer::getRandomAddDockWidgetParams() { AddDockWidgetParams params; diff --git a/tests/fuzzer/Fuzzer.h b/tests/fuzzer/Fuzzer.h index 3d4e206e..03bdfe8d 100644 --- a/tests/fuzzer/Fuzzer.h +++ b/tests/fuzzer/Fuzzer.h @@ -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); diff --git a/tests/fuzzer/Operations.cpp b/tests/fuzzer/Operations.cpp index 980a2b23..50573e0b 100644 --- a/tests/fuzzer/Operations.cpp +++ b/tests/fuzzer/Operations.cpp @@ -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(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(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(params.dockWidget->window()); - params.mainWindow->addDockWidget(params.dockWidget, params.location, params.relativeTo, params.addingOption); + auto fw = qobject_cast(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(); +} diff --git a/tests/fuzzer/Operations.h b/tests/fuzzer/Operations.h index 44e8ec9d..966b54d4 100644 --- a/tests/fuzzer/Operations.h +++ b/tests/fuzzer/Operations.h @@ -25,11 +25,13 @@ #define KDDOCKWIDGETS_TESTING_OPERATIONS_H #include "KDDockWidgets.h" +#include "../Testing.h" #include #include #include +#include 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 m_params; }; }