diff options
| author | Piotr Wierciński <piotr.wiercinski@qt.io> | 2023-12-06 16:41:11 +0100 |
|---|---|---|
| committer | Piotr Wierciński <piotr.wiercinski@qt.io> | 2024-02-07 13:15:09 +0100 |
| commit | d2862a8f026bcce5a31aff08adc98013f8becf3f (patch) | |
| tree | 9566c54b5bd3dbd154626fbca784a40ec3618b65 /tests/manual/wasm/selenium/qwasmwindow/qwasmwindow_harness.cpp | |
| parent | a046bc19e451f6f2e42ac1fcddaf5ef3efc81f0d (diff) | |
wasm: Refractor Selenium manual test into auto test
Using Selenium for WebAssembly testing enables us
to test user interactions, which is very valuable.
Turning this test into automated allows us to run
it in CI pipeline. This will help with detecting
regressions.
Two of these tests are currently failing on CI
machine and they have been temporarily disabled.
Change-Id: I754dd05955e55eb031070f5328ef715b7826c2b5
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Diffstat (limited to 'tests/manual/wasm/selenium/qwasmwindow/qwasmwindow_harness.cpp')
| -rw-r--r-- | tests/manual/wasm/selenium/qwasmwindow/qwasmwindow_harness.cpp | 270 |
1 files changed, 0 insertions, 270 deletions
diff --git a/tests/manual/wasm/selenium/qwasmwindow/qwasmwindow_harness.cpp b/tests/manual/wasm/selenium/qwasmwindow/qwasmwindow_harness.cpp deleted file mode 100644 index b1624822930..00000000000 --- a/tests/manual/wasm/selenium/qwasmwindow/qwasmwindow_harness.cpp +++ /dev/null @@ -1,270 +0,0 @@ -// Copyright (C) 2022 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only - -#include <QtCore/QEvent> - -#include <QtGui/qevent.h> -#include <QtCore/qobject.h> -#include <QtCore/qregularexpression.h> -#include <QtGui/qpainter.h> -#include <QtGui/qrasterwindow.h> -#include <QtGui/qscreen.h> -#include <QtGui/qwindow.h> -#include <QtGui/qguiapplication.h> - -#include <emscripten.h> -#include <emscripten/bind.h> -#include <emscripten/val.h> - -#include <memory> -#include <sstream> -#include <vector> - -class TestWindow : public QRasterWindow -{ - Q_OBJECT - -public: - void setBackgroundColor(int r, int g, int b) - { - m_backgroundColor = QColor::fromRgb(r, g, b); - update(); - } - -private: - void closeEvent(QCloseEvent *ev) override - { - Q_UNUSED(ev); - delete this; - } - - void keyPressEvent(QKeyEvent *event) final - { - auto data = emscripten::val::object(); - data.set("type", emscripten::val("keyPress")); - data.set("windowId", emscripten::val(winId())); - data.set("windowTitle", emscripten::val(title().toStdString())); - data.set("key", emscripten::val(event->text().toStdString())); - emscripten::val::global("window")["testSupport"].call<void>("reportEvent", std::move(data)); - } - - void keyReleaseEvent(QKeyEvent *event) final - { - auto data = emscripten::val::object(); - data.set("type", emscripten::val("keyRelease")); - data.set("windowId", emscripten::val(winId())); - data.set("windowTitle", emscripten::val(title().toStdString())); - data.set("key", emscripten::val(event->text().toStdString())); - emscripten::val::global("window")["testSupport"].call<void>("reportEvent", std::move(data)); - } - - void paintEvent(QPaintEvent *e) final - { - QPainter painter(this); - painter.fillRect(e->rect(), m_backgroundColor); - } - - QColor m_backgroundColor = Qt::white; -}; - -namespace { -TestWindow *findWindowByTitle(const std::string &title) -{ - auto windows = qGuiApp->allWindows(); - auto window_it = std::find_if(windows.begin(), windows.end(), [&title](QWindow *window) { - return window->title() == QString::fromLatin1(title); - }); - return window_it == windows.end() ? nullptr : static_cast<TestWindow *>(*window_it); -} -} // namespace - -using namespace emscripten; - -std::string toJSArray(const std::vector<std::string> &elements) -{ - std::ostringstream out; - out << "["; - bool comma = false; - for (const auto &element : elements) { - out << (comma ? "," : ""); - out << element; - comma = true; - } - out << "]"; - return out.str(); -} - -std::string toJSString(const QString &qstring) -{ - Q_ASSERT_X(([qstring]() { - static QRegularExpression unescapedQuoteRegex(R"re((?:^|[^\\])')re"); - return qstring.indexOf(unescapedQuoteRegex) == -1; - })(), - Q_FUNC_INFO, "Unescaped single quotes found"); - return "'" + qstring.toStdString() + "'"; -} - -std::string rectToJSObject(const QRect &rect) -{ - std::ostringstream out; - out << "{" - << " x: " << std::to_string(rect.x()) << "," - << " y: " << std::to_string(rect.y()) << "," - << " width: " << std::to_string(rect.width()) << "," - << " height: " << std::to_string(rect.height()) << "}"; - return out.str(); -} - -std::string screenToJSObject(const QScreen &screen) -{ - std::ostringstream out; - out << "{" - << " name: " << toJSString(screen.name()) << "," - << " geometry: " << rectToJSObject(screen.geometry()) << "}"; - return out.str(); -} - -std::string windowToJSObject(const QWindow &window) -{ - std::ostringstream out; - out << "{" - << " id: " << std::to_string(window.winId()) << "," - << " geometry: " << rectToJSObject(window.geometry()) << "," - << " frameGeometry: " << rectToJSObject(window.frameGeometry()) << "," - << " screen: " << screenToJSObject(*window.screen()) << "," - << " title: '" << window.title().toStdString() << "' }"; - return out.str(); -} - -void windowInformation() -{ - auto windows = qGuiApp->allWindows(); - - std::vector<std::string> windowsAsJsObjects; - windowsAsJsObjects.reserve(windows.size()); - std::transform(windows.begin(), windows.end(), std::back_inserter(windowsAsJsObjects), - [](const QWindow *window) { return windowToJSObject(*window); }); - - emscripten::val::global("window").call<void>("windowInformationCallback", - emscripten::val(toJSArray(windowsAsJsObjects))); -} - -void screenInformation() -{ - auto screens = qGuiApp->screens(); - - std::vector<std::string> screensAsJsObjects; - screensAsJsObjects.reserve(screens.size()); - std::transform(screens.begin(), screens.end(), std::back_inserter(screensAsJsObjects), - [](const QScreen *screen) { return screenToJSObject(*screen); }); - emscripten::val::global("window").call<void>("screenInformationCallback", - emscripten::val(toJSArray(screensAsJsObjects))); -} - -void createWindow(int x, int y, int w, int h, std::string parentType, std::string parentId, - std::string title) -{ - QScreen *parentScreen = nullptr; - QWindow *parentWindow = nullptr; - if (parentType == "screen") { - auto screens = qGuiApp->screens(); - auto screen_it = std::find_if(screens.begin(), screens.end(), [&parentId](QScreen *screen) { - return screen->name() == QString::fromLatin1(parentId); - }); - if (screen_it == screens.end()) { - qWarning() << "No such screen: " << parentId; - return; - } - parentScreen = *screen_it; - } else if (parentType == "window") { - auto windows = qGuiApp->allWindows(); - auto window_it = std::find_if(windows.begin(), windows.end(), [&parentId](QWindow *window) { - return window->title() == QString::fromLatin1(parentId); - }); - if (window_it == windows.end()) { - qWarning() << "No such window: " << parentId; - return; - } - parentWindow = *window_it; - parentScreen = parentWindow->screen(); - } else { - qWarning() << "Wrong parent type " << parentType; - return; - } - - auto *window = new TestWindow; - - window->setFlag(Qt::WindowTitleHint); - window->setFlag(Qt::WindowMaximizeButtonHint); - window->setTitle(QString::fromLatin1(title)); - window->setGeometry(x, y, w, h); - window->setScreen(parentScreen); - window->setParent(parentWindow); -} - -void setWindowBackgroundColor(std::string title, int r, int g, int b) -{ - auto *window = findWindowByTitle(title); - if (!window) { - qWarning() << "No such window: " << title; - return; - } - window->setBackgroundColor(r, g, b); -} - -void setWindowVisible(int windowId, bool visible) { - auto windows = qGuiApp->allWindows(); - auto window_it = std::find_if(windows.begin(), windows.end(), [windowId](QWindow *window) { - return window->winId() == WId(windowId); - }); - if (window_it == windows.end()) { - qWarning() << "No such window: " << windowId; - return; - } - - (*window_it)->setVisible(visible); -} - -void setWindowParent(std::string windowTitle, std::string parentTitle) -{ - QWindow *window = findWindowByTitle(windowTitle); - if (!window) { - qWarning() << "Window could not be found " << parentTitle; - return; - } - QWindow *parent = nullptr; - if (parentTitle != "none") { - if ((parent = findWindowByTitle(parentTitle)) == nullptr) { - qWarning() << "Parent window could not be found " << parentTitle; - return; - } - } - window->setParent(parent); -} - -bool closeWindow(std::string title) -{ - QWindow *window = findWindowByTitle(title); - return window ? window->close() : false; -} - -EMSCRIPTEN_BINDINGS(qwasmwindow) -{ - emscripten::function("screenInformation", &screenInformation); - emscripten::function("windowInformation", &windowInformation); - emscripten::function("createWindow", &createWindow); - emscripten::function("setWindowVisible", &setWindowVisible); - emscripten::function("setWindowParent", &setWindowParent); - emscripten::function("closeWindow", &closeWindow); - emscripten::function("setWindowBackgroundColor", &setWindowBackgroundColor); -} - -int main(int argc, char **argv) -{ - QGuiApplication app(argc, argv); - - app.exec(); - return 0; -} - -#include "qwasmwindow_harness.moc" |
