diff options
Diffstat (limited to 'src/testlib')
-rw-r--r-- | src/testlib/qasciikey.cpp | 2 | ||||
-rw-r--r-- | src/testlib/qbenchmark.cpp | 2 | ||||
-rw-r--r-- | src/testlib/qtest.h | 14 | ||||
-rw-r--r-- | src/testlib/qtest_gui.h | 2 | ||||
-rw-r--r-- | src/testlib/qtestaccessible.h | 4 | ||||
-rw-r--r-- | src/testlib/qtestkeyboard.h | 87 | ||||
-rw-r--r-- | src/testlib/qtestmouse.h | 81 | ||||
-rw-r--r-- | src/testlib/qtestsystem.h | 7 | ||||
-rw-r--r-- | src/testlib/qtesttouch.h | 77 | ||||
-rw-r--r-- | src/testlib/testlib.pro | 2 |
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 |