summaryrefslogtreecommitdiffstats
path: root/src/testlib
diff options
context:
space:
mode:
Diffstat (limited to 'src/testlib')
-rw-r--r--src/testlib/qasciikey.cpp2
-rw-r--r--src/testlib/qbenchmark.cpp2
-rw-r--r--src/testlib/qtest.h14
-rw-r--r--src/testlib/qtest_gui.h2
-rw-r--r--src/testlib/qtestaccessible.h4
-rw-r--r--src/testlib/qtestkeyboard.h87
-rw-r--r--src/testlib/qtestmouse.h81
-rw-r--r--src/testlib/qtestsystem.h7
-rw-r--r--src/testlib/qtesttouch.h77
-rw-r--r--src/testlib/testlib.pro2
10 files changed, 263 insertions, 15 deletions
diff --git a/src/testlib/qasciikey.cpp b/src/testlib/qasciikey.cpp
index 874b9a06c7..80e94acd0b 100644
--- a/src/testlib/qasciikey.cpp
+++ b/src/testlib/qasciikey.cpp
@@ -59,6 +59,8 @@ Qt::Key QTest::asciiToKey(char ascii)
case 0x0b: return Qt::Key_Backtab;
case 0x0d: return Qt::Key_Return;
case 0x1b: return Qt::Key_Escape;
+ case 0x13: return Qt::Key_Up;
+ case 0x15: return Qt::Key_Down;
case 0x20: return Qt::Key_Space;
case 0x21: return Qt::Key_Exclam;
case 0x22: return Qt::Key_QuoteDbl;
diff --git a/src/testlib/qbenchmark.cpp b/src/testlib/qbenchmark.cpp
index 8894d41bee..49fad5da4d 100644
--- a/src/testlib/qbenchmark.cpp
+++ b/src/testlib/qbenchmark.cpp
@@ -44,7 +44,7 @@
#include "QtTest/private/qbenchmarkmetric_p.h"
#ifdef QT_GUI_LIB
-#include <QtGui/qapplication.h>
+#include <QtGui/qguiapplication.h>
#endif
#include <QtCore/qprocess.h>
diff --git a/src/testlib/qtest.h b/src/testlib/qtest.h
index 386f154f72..e671828b77 100644
--- a/src/testlib/qtest.h
+++ b/src/testlib/qtest.h
@@ -247,7 +247,7 @@ int main(int argc, char *argv[]) \
#include <QtTest/qtestsystem.h>
-#ifdef QT_GUI_LIB
+#if defined(QT_WIDGETS_LIB)
#include <QtTest/qtest_gui.h>
@@ -266,6 +266,18 @@ int main(int argc, char *argv[]) \
return QTest::qExec(&tc, argc, argv); \
}
+#elif defined(QT_GUI_LIB)
+
+#include <QtTest/qtest_gui.h>
+
+#define QTEST_MAIN(TestObject) \
+int main(int argc, char *argv[]) \
+{ \
+ QGuiApplication app(argc, argv); \
+ TestObject tc; \
+ return QTest::qExec(&tc, argc, argv); \
+}
+
#else
#define QTEST_MAIN(TestObject) \
diff --git a/src/testlib/qtest_gui.h b/src/testlib/qtest_gui.h
index 722e20d961..77b19f0e21 100644
--- a/src/testlib/qtest_gui.h
+++ b/src/testlib/qtest_gui.h
@@ -57,7 +57,7 @@
#include <QtTest/qtesttouch.h>
#include <QtTest/qtestkeyboard.h>
-#include <QtGui/qicon.h>
+#include <QtWidgets/qicon.h>
#include <QtGui/qpixmap.h>
#if 0
diff --git a/src/testlib/qtestaccessible.h b/src/testlib/qtestaccessible.h
index 9cec1a6bbe..a58ed2ff69 100644
--- a/src/testlib/qtestaccessible.h
+++ b/src/testlib/qtestaccessible.h
@@ -53,8 +53,8 @@
QVERIFY(QTestAccessibility::verifyEvent(object, child, (int)event))
#include <QtCore/qlist.h>
-#include <QtGui/qaccessible.h>
-#include <QtGui/qapplication.h>
+#include <QtWidgets/qaccessible.h>
+#include <QtWidgets/qapplication.h>
QT_BEGIN_HEADER
diff --git a/src/testlib/qtestkeyboard.h b/src/testlib/qtestkeyboard.h
index 43fed84abc..4dfdaeaf56 100644
--- a/src/testlib/qtestkeyboard.h
+++ b/src/testlib/qtestkeyboard.h
@@ -53,9 +53,10 @@
#include <QtTest/qtestspontaneevent.h>
#include <QtCore/qpointer.h>
-#include <QtGui/qapplication.h>
+#include <QtWidgets/qapplication.h>
#include <QtGui/qevent.h>
-#include <QtGui/qwidget.h>
+#include <QtWidgets/qwidget.h>
+#include <QtGui/qwindowsysteminterface_qpa.h>
QT_BEGIN_HEADER
@@ -83,6 +84,14 @@ namespace QTest
if (!qApp->notify(widget, &a))
QTest::qWarn("Keyboard event not accepted by receiving widget");
}
+ //QWindow overload
+ static void simulateEvent(QWindow *window, bool press, int code,
+ Qt::KeyboardModifiers modifier, QString text, bool repeat, int delay=-1)
+ {
+ QEvent::Type type;
+ type = press ? QEvent::KeyPress : QEvent::KeyRelease;
+ QWindowSystemInterface::handleKeyEvent(window, type, code, modifier, text, repeat, delay);
+ }
static void sendKeyEvent(KeyAction action, QWidget *widget, Qt::Key code,
QString text, Qt::KeyboardModifiers modifier, int delay=-1)
@@ -147,6 +156,52 @@ namespace QTest
simulateEvent(widget, false, Qt::Key_Shift, modifier & Qt::ShiftModifier, QString(), false, delay);
}
}
+ //QWindow overload
+ static void sendKeyEvent(KeyAction action, QWindow *window, Qt::Key code,
+ QString text, Qt::KeyboardModifiers modifier, int delay=-1)
+ {
+ QTEST_ASSERT(qApp);
+ QTEST_ASSERT(window);
+
+ if (action == Click) {
+ sendKeyEvent(Press, window, code, text, modifier, delay);
+ sendKeyEvent(Release, window, code, text, modifier, delay);
+ return;
+ }
+
+ bool repeat = false;
+
+ if (action == Press) {
+ if (modifier & Qt::ShiftModifier)
+ simulateEvent(window, true, Qt::Key_Shift, 0, QString(), false, delay);
+
+ if (modifier & Qt::ControlModifier)
+ simulateEvent(window, true, Qt::Key_Control, modifier & Qt::ShiftModifier, QString(), false, delay);
+
+ if (modifier & Qt::AltModifier)
+ simulateEvent(window, true, Qt::Key_Alt,
+ modifier & (Qt::ShiftModifier | Qt::ControlModifier), QString(), false, delay);
+ if (modifier & Qt::MetaModifier)
+ simulateEvent(window, true, Qt::Key_Meta, modifier & (Qt::ShiftModifier
+ | Qt::ControlModifier | Qt::AltModifier), QString(), false, delay);
+ simulateEvent(window, true, code, modifier, text, repeat, delay);
+ } else if (action == Release) {
+ simulateEvent(window, false, code, modifier, text, repeat, delay);
+
+ if (modifier & Qt::MetaModifier)
+ simulateEvent(window, false, Qt::Key_Meta, modifier, QString(), false, delay);
+ if (modifier & Qt::AltModifier)
+ simulateEvent(window, false, Qt::Key_Alt, modifier &
+ (Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier), QString(), false, delay);
+
+ if (modifier & Qt::ControlModifier)
+ simulateEvent(window, false, Qt::Key_Control,
+ modifier & (Qt::ShiftModifier | Qt::ControlModifier), QString(), false, delay);
+
+ if (modifier & Qt::ShiftModifier)
+ simulateEvent(window, false, Qt::Key_Shift, modifier & Qt::ShiftModifier, QString(), false, delay);
+ }
+ }
// Convenience function
static void sendKeyEvent(KeyAction action, QWidget *widget, Qt::Key code,
@@ -157,6 +212,15 @@ namespace QTest
text = QString(QChar::fromLatin1(ascii));
sendKeyEvent(action, widget, code, text, modifier, delay);
}
+ // QWindow convenience function
+ static void sendKeyEvent(KeyAction action, QWindow *window, Qt::Key code,
+ char ascii, Qt::KeyboardModifiers modifier, int delay=-1)
+ {
+ QString text;
+ if (ascii)
+ text = QString(QChar::fromLatin1(ascii));
+ sendKeyEvent(action, window, code, text, modifier, delay);
+ }
inline static void keyEvent(KeyAction action, QWidget *widget, char ascii,
Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
@@ -165,6 +229,14 @@ namespace QTest
Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
{ sendKeyEvent(action, widget, key, keyToAscii(key), modifier, delay); }
+ //Support QWindow
+ inline static void keyEvent(KeyAction action, QWindow *window, char ascii,
+ Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+ { sendKeyEvent(action, window, asciiToKey(ascii), ascii, modifier, delay); }
+ inline static void keyEvent(KeyAction action, QWindow *window, Qt::Key key,
+ Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+ { sendKeyEvent(action, window, key, keyToAscii(key), modifier, delay); }
+ ///////////////
inline static void keyClicks(QWidget *widget, const QString &sequence,
Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
{
@@ -184,6 +256,17 @@ namespace QTest
{ keyEvent(Release, widget, key, modifier, delay); }
inline static void keyClick(QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
{ keyEvent(Click, widget, key, modifier, delay); }
+ //Support QWindow
+ inline static void keyClick(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+ { keyEvent(Click, window, key, modifier, delay); }
+ inline static void keyClick(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+ { keyEvent(Click, window, key, modifier, delay); }
+ inline static void keyRelease(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+ { keyEvent(Release, window, key, modifier, delay); }
+ inline static void keyPress(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+ { keyEvent(Press, window, key, modifier, delay); }
+ inline static void keyPress(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+ { keyEvent(Press, window, key, modifier, delay); }
}
diff --git a/src/testlib/qtestmouse.h b/src/testlib/qtestmouse.h
index 942b041eb1..dfd07a9d42 100644
--- a/src/testlib/qtestmouse.h
+++ b/src/testlib/qtestmouse.h
@@ -51,12 +51,12 @@
#include <QtTest/qtestassert.h>
#include <QtTest/qtestsystem.h>
#include <QtTest/qtestspontaneevent.h>
-
#include <QtCore/qpoint.h>
#include <QtCore/qstring.h>
-#include <QtGui/qapplication.h>
+#include <QtWidgets/qapplication.h>
#include <QtGui/qevent.h>
-#include <QtGui/qwidget.h>
+#include <QtWidgets/qwidget.h>
+#include <QtGui/qwindowsysteminterface_qpa.h>
QT_BEGIN_HEADER
@@ -126,6 +126,66 @@ namespace QTest
}
+ static void mouseEvent(MouseAction action, QWindow *window, Qt::MouseButton button,
+ Qt::KeyboardModifiers stateKey, QPoint pos, int delay=-1)
+ {
+ QTEST_ASSERT(window);
+ extern int Q_TESTLIB_EXPORT defaultMouseDelay();
+
+ static Qt::MouseButton lastButton = Qt::NoButton;
+
+ if (delay == -1 || delay < defaultMouseDelay())
+ delay = defaultMouseDelay();
+ if (delay > 0)
+ QTest::qWait(delay);
+
+ if (pos.isNull())
+ pos = window->geometry().center();
+
+ if (action == MouseClick) {
+ mouseEvent(MousePress, window, button, stateKey, pos);
+ mouseEvent(MouseRelease, window, button, stateKey, pos);
+ return;
+ }
+ QTEST_ASSERT(button == Qt::NoButton || button & Qt::MouseButtonMask);
+ QTEST_ASSERT(stateKey == 0 || stateKey & Qt::KeyboardModifierMask);
+
+ stateKey &= static_cast<unsigned int>(Qt::KeyboardModifierMask);
+
+
+ switch (action)
+ {
+ case MousePress:
+ QWindowSystemInterface::handleMouseEvent(window,pos,window->mapToGlobal(pos),button);
+ lastButton = button;
+ break;
+ case MouseRelease:
+ QWindowSystemInterface::handleMouseEvent(window,pos,window->mapToGlobal(pos),Qt::NoButton);
+ lastButton = Qt::NoButton;
+ break;
+ case MouseDClick:
+ QWindowSystemInterface::handleMouseEvent(window,pos,window->mapToGlobal(pos),button);
+ qWait(10);
+ QWindowSystemInterface::handleMouseEvent(window,pos,window->mapToGlobal(pos),Qt::NoButton);
+ qWait(20);
+ QWindowSystemInterface::handleMouseEvent(window,pos,window->mapToGlobal(pos),button);
+ qWait(10);
+ QWindowSystemInterface::handleMouseEvent(window,pos,window->mapToGlobal(pos),Qt::NoButton);
+ break;
+ case MouseMove:
+ QWindowSystemInterface::handleMouseEvent(window,pos,window->mapToGlobal(pos),lastButton);
+ //QCursor::setPos(window->mapToGlobal(pos));
+#ifdef QT_MAC_USE_COCOA
+ QTest::qWait(20);
+#else
+ qApp->processEvents();
+#endif
+ return;
+ default:
+ QTEST_ASSERT(false);
+ }
+ }
+
inline void mousePress(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = 0,
QPoint pos = QPoint(), int delay=-1)
{ mouseEvent(MousePress, widget, button, stateKey, pos, delay); }
@@ -141,6 +201,21 @@ namespace QTest
inline void mouseMove(QWidget *widget, QPoint pos = QPoint(), int delay=-1)
{ mouseEvent(MouseMove, widget, Qt::NoButton, 0, pos, delay); }
+ //Support QWindow
+ inline void mousePress(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = 0,
+ QPoint pos = QPoint(), int delay=-1)
+ { mouseEvent(MousePress, window, button, stateKey, pos, delay); }
+ inline void mouseRelease(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = 0,
+ QPoint pos = QPoint(), int delay=-1)
+ { mouseEvent(MouseRelease, window, button, stateKey, pos, delay); }
+ inline void mouseClick(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = 0,
+ QPoint pos = QPoint(), int delay=-1)
+ { mouseEvent(MouseClick, window, button, stateKey, pos, delay); }
+ inline void mouseDClick(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = 0,
+ QPoint pos = QPoint(), int delay=-1)
+ { mouseEvent(MouseDClick, window, button, stateKey, pos, delay); }
+ inline void mouseMove(QWindow *window, QPoint pos = QPoint(), int delay=-1)
+ { mouseEvent(MouseMove, window, Qt::NoButton, 0, pos, delay); }
}
QT_END_NAMESPACE
diff --git a/src/testlib/qtestsystem.h b/src/testlib/qtestsystem.h
index de20abeeee..0165e51528 100644
--- a/src/testlib/qtestsystem.h
+++ b/src/testlib/qtestsystem.h
@@ -45,6 +45,7 @@
#include <QtTest/qtestcase.h>
#include <QtCore/qcoreapplication.h>
#include <QtCore/qelapsedtimer.h>
+#include <QtGui/QWindow>
QT_BEGIN_HEADER
@@ -82,6 +83,12 @@ namespace QTest
#endif
return true;
}
+ inline static bool qWaitForWindowShown(QWindow *window)
+ {
+ Q_UNUSED(window);
+ qWait(200);
+ return true;
+ }
}
diff --git a/src/testlib/qtesttouch.h b/src/testlib/qtesttouch.h
index a1fe2df382..c855677189 100644
--- a/src/testlib/qtesttouch.h
+++ b/src/testlib/qtesttouch.h
@@ -51,10 +51,10 @@
#include <QtTest/qtestassert.h>
#include <QtTest/qtestsystem.h>
#include <QtTest/qtestspontaneevent.h>
-
+#include <QtGui/QWindowSystemInterface>
#include <QtCore/qmap.h>
#include <QtGui/qevent.h>
-#include <QtGui/qwidget.h>
+#include <QtWidgets/qwidget.h>
QT_BEGIN_HEADER
@@ -84,6 +84,14 @@ namespace QTest
p.setState(Qt::TouchPointPressed);
return *this;
}
+ QTouchEventSequence& press(int touchId, const QPoint &pt, QWindow *window = 0)
+ {
+ QTouchEvent::TouchPoint &p = point(touchId);
+ p.setScreenPos(mapToScreen(window, pt));
+ p.setState(Qt::TouchPointPressed);
+ return *this;
+ }
+
QTouchEventSequence& move(int touchId, const QPoint &pt, QWidget *widget = 0)
{
QTouchEvent::TouchPoint &p = point(touchId);
@@ -91,6 +99,13 @@ namespace QTest
p.setState(Qt::TouchPointMoved);
return *this;
}
+ QTouchEventSequence& move(int touchId, const QPoint &pt, QWindow *window = 0)
+ {
+ QTouchEvent::TouchPoint &p = point(touchId);
+ p.setScreenPos(mapToScreen(window, pt));
+ p.setState(Qt::TouchPointMoved);
+ return *this;
+ }
QTouchEventSequence& release(int touchId, const QPoint &pt, QWidget *widget = 0)
{
QTouchEvent::TouchPoint &p = point(touchId);
@@ -98,6 +113,13 @@ namespace QTest
p.setState(Qt::TouchPointReleased);
return *this;
}
+ QTouchEventSequence& release(int touchId, const QPoint &pt, QWindow *window = 0)
+ {
+ QTouchEvent::TouchPoint &p = point(touchId);
+ p.setScreenPos(mapToScreen(window, pt));
+ p.setState(Qt::TouchPointReleased);
+ return *this;
+ }
QTouchEventSequence& stationary(int touchId)
{
QTouchEvent::TouchPoint &p = point(touchId);
@@ -110,6 +132,10 @@ namespace QTest
: targetWidget(widget), deviceType(aDeviceType)
{
}
+ QTouchEventSequence(QWindow *window, QTouchEvent::DeviceType aDeviceType)
+ : targetWindow(window), deviceType(aDeviceType)
+ {
+ }
QTouchEventSequence(const QTouchEventSequence &v);
void operator=(const QTouchEventSequence&);
@@ -125,16 +151,53 @@ namespace QTest
return widget->mapToGlobal(pt);
return targetWidget ? targetWidget->mapToGlobal(pt) : pt;
}
+ QPoint mapToScreen(QWindow *window, const QPoint &pt)
+ {
+ if(window)
+ return window->mapToGlobal(pt);
+ return targetWindow ? targetWindow->mapToGlobal(pt) : pt;
+ }
+ QWindowSystemInterface::TouchPoint touchPoint(const QTouchEvent::TouchPoint& point)
+ {
+ QWindowSystemInterface::TouchPoint p;
+ p.id = point.id();
+ p.isPrimary = point.isPrimary();
+ p.normalPosition = point.screenRect().topLeft();
+ p.area = point.screenRect();
+ p.pressure = point.pressure();
+ p.state = point.state();
+ return p;
+ }
+ QList<struct QWindowSystemInterface::TouchPoint> touchPointList(const QList<QTouchEvent::TouchPoint>& pointList)
+ {
+ QList<struct QWindowSystemInterface::TouchPoint> newList;
+
+ foreach(QTouchEvent::TouchPoint p, pointList)
+ {
+ newList.append(touchPoint(p));
+ }
+ return newList;
+ }
void commit()
{
- qt_translateRawTouchEvent(targetWidget, deviceType, points.values());
- targetWidget = 0;
+ if(targetWindow)
+ {
+ QWindowSystemInterface::handleTouchEvent(targetWindow,QEvent::None,deviceType, touchPointList(points.values()));
+ targetWindow = 0;
+ }
+ else if(targetWidget)
+ {
+ qt_translateRawTouchEvent(targetWidget, deviceType, points.values());
+ targetWidget = 0;
+ }
}
QMap<int, QTouchEvent::TouchPoint> points;
QWidget *targetWidget;
+ QWindow *targetWindow;
QTouchEvent::DeviceType deviceType;
friend QTouchEventSequence touchEvent(QWidget *, QTouchEvent::DeviceType);
+ friend QTouchEventSequence touchEvent(QWindow *, QTouchEvent::DeviceType);
};
inline
@@ -143,6 +206,12 @@ namespace QTest
{
return QTouchEventSequence(widget, deviceType);
}
+ inline
+ QTouchEventSequence touchEvent(QWindow *window = 0,
+ QTouchEvent::DeviceType deviceType = QTouchEvent::TouchScreen)
+ {
+ return QTouchEventSequence(window, deviceType);
+ }
}
diff --git a/src/testlib/testlib.pro b/src/testlib/testlib.pro
index d4dec9660e..e8858ea1c4 100644
--- a/src/testlib/testlib.pro
+++ b/src/testlib/testlib.pro
@@ -2,7 +2,7 @@ load(qt_module)
TARGET = QtTest
QPRO_PWD = $$PWD
-QT = core
+QT = core gui widgets
CONFIG += module
MODULE_PRI = ../modules/qt_testlib.pri