summaryrefslogtreecommitdiffstats
path: root/tests/manual/wasm/qwasmwindow/qwasmwindow_harness.cpp
diff options
context:
space:
mode:
authorMikolaj Boc <[email protected]>2022-12-06 13:17:30 +0100
committerMikolaj Boc <[email protected]>2023-02-14 17:48:09 +0100
commitd846ea423d93c4575c3973f98b536ad7dec273af (patch)
tree42ae8b44f4d553c7f60cbbac4e270d9ee8f21843 /tests/manual/wasm/qwasmwindow/qwasmwindow_harness.cpp
parent21453410713650a97a074a8f3d78afbb4c70e6b3 (diff)
Add a manual test for wasm window resizing/moving
This tests resizing and moving in various setups. The test driver communicates with the actual modules to assert various postconditions. It's semi-automated so that minimum interaction is required. Change-Id: I745d689c6ffa6aa6d478b795dd433f5b067241f1 Reviewed-by: Lorn Potter <[email protected]>
Diffstat (limited to 'tests/manual/wasm/qwasmwindow/qwasmwindow_harness.cpp')
-rw-r--r--tests/manual/wasm/qwasmwindow/qwasmwindow_harness.cpp151
1 files changed, 151 insertions, 0 deletions
diff --git a/tests/manual/wasm/qwasmwindow/qwasmwindow_harness.cpp b/tests/manual/wasm/qwasmwindow/qwasmwindow_harness.cpp
new file mode 100644
index 00000000000..678d60b936a
--- /dev/null
+++ b/tests/manual/wasm/qwasmwindow/qwasmwindow_harness.cpp
@@ -0,0 +1,151 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+
+#include <QtCore/QEvent>
+#include <QtCore/QObject>
+#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>
+
+namespace qwasmwindow_harness {
+namespace {
+class Window : public QWindow
+{
+ Q_OBJECT
+public:
+ Window() = default;
+ ~Window() = default;
+
+private:
+ void closeEvent(QCloseEvent *ev) override
+ {
+ Q_UNUSED(ev);
+ delete this;
+ }
+};
+} // namespace
+} // namespace qwasmwindow_harness
+
+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)
+{
+ 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()) << "}";
+ 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 screenId, std::string title)
+{
+ auto screens = qGuiApp->screens();
+ auto screen_it = std::find_if(screens.begin(), screens.end(), [&screenId](QScreen *screen) {
+ return screen->name() == QString::fromLatin1(screenId);
+ });
+ if (screen_it == screens.end()) {
+ qWarning() << "No such screen: " << screenId;
+ return;
+ }
+
+ auto *window = new qwasmwindow_harness::Window;
+
+ window->setFlag(Qt::WindowTitleHint);
+ window->setFlag(Qt::WindowMaximizeButtonHint);
+ window->setTitle(QString::fromLatin1(title));
+ window->setGeometry(x, y, w, h);
+ window->setScreen(*screen_it);
+ window->showNormal();
+}
+
+EMSCRIPTEN_BINDINGS(qwasmwindow)
+{
+ emscripten::function("screenInformation", &screenInformation);
+ emscripten::function("windowInformation", &windowInformation);
+ emscripten::function("createWindow", &createWindow);
+}
+
+int main(int argc, char **argv)
+{
+ QGuiApplication app(argc, argv);
+
+ qDebug() << "exec";
+ app.exec();
+ qDebug() << "returning";
+ return 0;
+}
+
+#include "qwasmwindow_harness.moc"