diff options
author | Sergio Ahumada <sergio.ahumada@digia.com> | 2013-09-07 16:17:29 +0200 |
---|---|---|
committer | Sergio Ahumada <sergio.ahumada@digia.com> | 2013-09-07 16:18:32 +0200 |
commit | 2346ae167568bb9e5d247da0b946067b7f9aad48 (patch) | |
tree | f3a975711bcd223f4d6803caa5b53c080bb68819 /tests/auto | |
parent | 5dd2713c8ba98e06ae5c4f3da44b2ed73121d247 (diff) | |
parent | 730bc064a070e886e10950ccfd59780e8976f5fd (diff) |
Merge remote-tracking branch 'origin/stable' into dev
Change-Id: I9ee4176f0a0078908d49896508826154c9f71530
Diffstat (limited to 'tests/auto')
8 files changed, 578 insertions, 433 deletions
diff --git a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp index ca80c8926f..4f1320e375 100644 --- a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp +++ b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp @@ -328,6 +328,7 @@ public slots: QObject *sl11(); const char *sl12(); QList<QString> sl13(QList<QString> l1); + qint64 sl14(); void testSender(); void testReference(QString &str); @@ -395,6 +396,9 @@ const char *QtTestObject::sl12() { slotResult = "sl12"; return "foo"; } QList<QString> QtTestObject::sl13(QList<QString> l1) { slotResult = "sl13"; return l1; } +qint64 QtTestObject::sl14() +{ slotResult = "sl14"; return Q_INT64_C(123456789)*123456789; } + void QtTestObject::testReference(QString &str) { slotResult = "testReference:" + str; str = "gotcha"; } @@ -513,6 +517,13 @@ void tst_QMetaObject::invokeMetaMember() QCOMPARE(returnValue, argument); QCOMPARE(obj.slotResult, QString("sl13")); + // return qint64 + qint64 return64; + QVERIFY(QMetaObject::invokeMethod(&obj, "sl14", + Q_RETURN_ARG(qint64, return64))); + QCOMPARE(return64, Q_INT64_C(123456789)*123456789); + QCOMPARE(obj.slotResult, QString("sl14")); + //test signals QVERIFY(QMetaObject::invokeMethod(&obj, "sig0")); QCOMPARE(obj.slotResult, QString("sl0")); diff --git a/tests/auto/network-settings.h b/tests/auto/network-settings.h index 2ffb89241c..ad51df9090 100644 --- a/tests/auto/network-settings.h +++ b/tests/auto/network-settings.h @@ -103,20 +103,9 @@ public: static bool compareReplyFtp(QByteArray const& actual) { - QList<QByteArray> expected; - - // A few different vsFTPd versions. - // Feel free to add more as needed - expected << QByteArray( "220 (vsFTPd 2.0.5)\r\n221 Goodbye.\r\n" ); - expected << QByteArray( "220 (vsFTPd 2.2.2)\r\n221 Goodbye.\r\n" ); - - Q_FOREACH (QByteArray const& ba, expected) { - if (ba == actual) { - return true; - } - } - - return false; + // output would be e.g. "220 (vsFTPd 2.3.5)\r\n221 Goodbye.\r\n" + QRegExp ftpVersion(QStringLiteral("220 \\(vsFTPd \\d+\\.\\d+.\\d+\\)\\r\\n221 Goodbye.\\r\\n")); + return ftpVersion.exactMatch(actual); } static bool hasIPv6() diff --git a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp index ea547ffae5..3d57345d2d 100644 --- a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp +++ b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp @@ -4389,6 +4389,10 @@ void tst_QNetworkReply::ioPostToHttpFromSocket_data() void tst_QNetworkReply::ioPostToHttpFromSocket() { + if (QTest::currentDataTag() == QByteArray("128k+1+proxyauth") + || QTest::currentDataTag() == QByteArray("128k+1+auth+proxyauth")) + QSKIP("Squid cannot handle authentication with POST data >= 64K (QTBUG-33180)"); + QFETCH(QByteArray, data); QFETCH(QUrl, url); QFETCH(QNetworkProxy, proxy); diff --git a/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp b/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp index cb19712818..b6df536b98 100644 --- a/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp +++ b/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp @@ -1578,7 +1578,7 @@ void tst_QTcpSocket::recursiveReadyRead() QSignalSpy spy(testSocket, SIGNAL(readyRead())); - testSocket->connectToHost(QtNetworkSettings::serverName(), 25); + testSocket->connectToHost(QtNetworkSettings::serverName(), 143); enterLoop(30); QVERIFY2(!timeout(), "Timed out when connecting to QtNetworkSettings::serverName()."); diff --git a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp index 9e06435ca7..7a0ba50ff0 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp @@ -221,6 +221,9 @@ private slots: void scrollBarRanges_data(); void scrollBarRanges(); void acceptMousePressEvent(); + void acceptMouseDoubleClickEvent(); + void forwardMousePress(); + void forwardMouseDoubleClick(); void replayMouseMove(); void itemsUnderMouse(); void embeddedViews(); @@ -2832,16 +2835,22 @@ class TestView : public QGraphicsView { public: TestView(QGraphicsScene *scene) - : QGraphicsView(scene), accepted(false) + : QGraphicsView(scene), pressAccepted(false), doubleClickAccepted(false) { } - bool accepted; + bool pressAccepted; + bool doubleClickAccepted; protected: void mousePressEvent(QMouseEvent *event) { QGraphicsView::mousePressEvent(event); - accepted = event->isAccepted(); + pressAccepted = event->isAccepted(); + } + void mouseDoubleClickEvent(QMouseEvent *event) + { + QGraphicsView::mouseDoubleClickEvent(event); + doubleClickAccepted = event->isAccepted(); } }; @@ -2859,14 +2868,109 @@ void tst_QGraphicsView::acceptMousePressEvent() Qt::LeftButton, 0, 0); event.setAccepted(false); QApplication::sendEvent(view.viewport(), &event); - QVERIFY(!view.accepted); + QVERIFY(!view.pressAccepted); scene.addRect(0, 0, 2000, 2000)->setFlag(QGraphicsItem::ItemIsMovable); qApp->processEvents(); // ensure scene rect is updated QApplication::sendEvent(view.viewport(), &event); - QVERIFY(view.accepted); + QVERIFY(view.pressAccepted); +} + +void tst_QGraphicsView::acceptMouseDoubleClickEvent() +{ + QGraphicsScene scene; + + TestView view(&scene); + view.show(); + QVERIFY(QTest::qWaitForWindowExposed(&view)); + + QMouseEvent event(QEvent::MouseButtonDblClick, + view.viewport()->rect().center(), + view.viewport()->mapToGlobal(view.viewport()->rect().center()), + Qt::LeftButton, 0, 0); + event.setAccepted(false); + QApplication::sendEvent(view.viewport(), &event); + QVERIFY(!view.doubleClickAccepted); + + scene.addRect(0, 0, 2000, 2000)->setFlag(QGraphicsItem::ItemIsMovable); + + qApp->processEvents(); // ensure scene rect is updated + + QApplication::sendEvent(view.viewport(), &event); + QVERIFY(view.doubleClickAccepted); +} + +class TestWidget : public QWidget +{ +public: + TestWidget() + : QWidget(), pressForwarded(false), doubleClickForwarded(false) + { } + + bool pressForwarded; + bool doubleClickForwarded; + +protected: + void mousePressEvent(QMouseEvent *event) + { + QWidget::mousePressEvent(event); + pressForwarded = true; + } + void mouseDoubleClickEvent(QMouseEvent *event) + { + QWidget::mouseDoubleClickEvent(event); + doubleClickForwarded = true; + } +}; + +void tst_QGraphicsView::forwardMousePress() +{ + TestWidget widget; + QGraphicsScene scene; + QGraphicsView view(&scene); + QHBoxLayout layout; + widget.setLayout(&layout); + layout.addWidget(&view); + widget.show(); + QVERIFY(QTest::qWaitForWindowExposed(&widget)); + + widget.pressForwarded = false; + QTest::mouseClick(view.viewport(), Qt::LeftButton); + QVERIFY(widget.pressForwarded); + + scene.addRect(0, 0, 2000, 2000); + + qApp->processEvents(); // ensure scene rect is updated + + widget.pressForwarded = false; + QTest::mouseClick(view.viewport(), Qt::LeftButton); + QVERIFY(widget.pressForwarded); +} + +void tst_QGraphicsView::forwardMouseDoubleClick() +{ + TestWidget widget; + QGraphicsScene scene; + QGraphicsView view(&scene); + QHBoxLayout layout; + widget.setLayout(&layout); + layout.addWidget(&view); + widget.show(); + QVERIFY(QTest::qWaitForWindowExposed(&widget)); + + widget.doubleClickForwarded = false; + QTest::mouseDClick(view.viewport(), Qt::LeftButton); + QVERIFY(widget.doubleClickForwarded); + + scene.addRect(0, 0, 2000, 2000); + + qApp->processEvents(); // ensure scene rect is updated + + widget.doubleClickForwarded = false; + QTest::mouseDClick(view.viewport(), Qt::LeftButton); + QVERIFY(widget.doubleClickForwarded); } void tst_QGraphicsView::replayMouseMove() diff --git a/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp b/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp index d3191b2206..6c04e5b39a 100644 --- a/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp +++ b/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp @@ -52,6 +52,7 @@ #include <qitemdelegate.h> #include <qscrollbar.h> #include <private/qcolumnview_p.h> +#include <qscreen.h> #define ANIMATION_DELAY 300 @@ -387,6 +388,12 @@ void tst_QColumnView::scrollTo_data() QTest::newRow("reverse") << true << false; } +static inline void centerOnScreen(QWidget *w) +{ + const QPoint offset = QPoint(w->width() / 2, w->height() / 2); + w->move(QGuiApplication::primaryScreen()->availableGeometry().center() - offset); +} + void tst_QColumnView::scrollTo() { QFETCH(bool, reverse); @@ -397,6 +404,7 @@ void tst_QColumnView::scrollTo() ColumnView view(&topLevel); view.resize(200, 200); topLevel.show(); + centerOnScreen(&topLevel); view.scrollTo(QModelIndex(), QAbstractItemView::EnsureVisible); QCOMPARE(view.HorizontalOffset(), 0); diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp index 0085b75299..227f61b0a3 100644 --- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp +++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp @@ -164,6 +164,12 @@ static inline void setFrameless(QWidget *w) w->setWindowFlags(flags); } +static inline void centerOnScreen(QWidget *w) +{ + const QPoint offset = QPoint(w->width() / 2, w->height() / 2); + w->move(QGuiApplication::primaryScreen()->availableGeometry().center() - offset); +} + class tst_QWidget : public QObject { Q_OBJECT @@ -4004,7 +4010,8 @@ void tst_QWidget::update() Q_CHECK_PAINTEVENTS UpdateWidget w; - w.setGeometry(50, 50, 100, 100); + w.resize(100, 100); + centerOnScreen(&w); w.show(); QVERIFY(QTest::qWaitForWindowExposed(&w)); @@ -7647,6 +7654,7 @@ void tst_QWidget::doubleRepaint() QSKIP("QTBUG-30566 - Unstable auto-test"); #endif UpdateWidget widget; + centerOnScreen(&widget); widget.setFocusPolicy(Qt::StrongFocus); // Filter out activation change and focus events to avoid update() calls in QWidget. widget.updateOnActivationChangeAndFocusIn = false; @@ -7774,6 +7782,7 @@ void tst_QWidget::setMaskInResizeEvent() UpdateWidget w; w.reset(); w.resize(200, 200); + centerOnScreen(&w); w.setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); w.raise(); @@ -7851,6 +7860,7 @@ void tst_QWidget::immediateRepaintAfterShow() QSKIP("We don't support immediate repaint right after show on other platforms."); UpdateWidget widget; + centerOnScreen(&widget); widget.show(); qApp->processEvents(); // On X11 in particular, we are now waiting for a MapNotify event before @@ -7867,6 +7877,7 @@ void tst_QWidget::immediateRepaintAfterInvalidateBuffer() QSKIP("We don't support immediate repaint right after show on other platforms."); QScopedPointer<UpdateWidget> widget(new UpdateWidget); + centerOnScreen(widget.data()); widget->show(); QVERIFY(QTest::qWaitForWindowExposed(widget.data())); QTest::qWait(200); @@ -8282,6 +8293,7 @@ void tst_QWidget::setClearAndResizeMask() { UpdateWidget topLevel; topLevel.resize(160, 160); + centerOnScreen(&topLevel); topLevel.show(); qApp->setActiveWindow(&topLevel); QVERIFY(QTest::qWaitForWindowActive(&topLevel)); @@ -8434,6 +8446,7 @@ void tst_QWidget::maskedUpdate() { UpdateWidget topLevel; topLevel.resize(200, 200); + centerOnScreen(&topLevel); const QRegion topLevelMask(50, 50, 70, 70); topLevel.setMask(topLevelMask); @@ -8859,6 +8872,7 @@ void tst_QWidget::focusWidget_task254563() void tst_QWidget::destroyBackingStore() { UpdateWidget w; + centerOnScreen(&w); w.reset(); w.show(); diff --git a/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp b/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp index e7450fdd2c..2b8e735a0e 100644 --- a/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp +++ b/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp @@ -50,6 +50,7 @@ #include <qdesktopwidget.h> #include <qaction.h> #include <qstyleoption.h> +#include <qscreen.h> #include <qobject.h> @@ -57,23 +58,6 @@ QT_FORWARD_DECLARE_CLASS(QMainWindow) #include <qmenubar.h> -class QtTestSlot : public QObject -{ - Q_OBJECT - -public: - QtTestSlot( QObject* parent = 0 ): QObject( parent ) { clear(); }; - virtual ~QtTestSlot() {}; - - void clear() { sel_count = 0; }; - uint selCount() { return sel_count; }; - -public slots: - void selected() { sel_count++; }; - -private: - uint sel_count; -}; class Menu : public QMenu { @@ -87,20 +71,24 @@ class Menu : public QMenu } }; +static inline void centerOnScreen(QWidget *w) +{ + const QPoint offset = QPoint(w->width() / 2, w->height() / 2); + w->move(QGuiApplication::primaryScreen()->availableGeometry().center() - offset); +} + +struct TestMenu +{ + QList<QMenu *> menus; + QList<QAction *> actions; +}; + class tst_QMenuBar : public QObject { Q_OBJECT public: tst_QMenuBar(); - virtual ~tst_QMenuBar(); - void initSimpleMenubar(); - void initComplexMenubar(); - -public slots: - void initTestCase(); - void cleanupTestCase(); - void init(); private slots: void getSetCheck(); @@ -145,39 +133,23 @@ private slots: void taskQTBUG4965_escapeEaten(); #endif void taskQTBUG11823_crashwithInvisibleActions(); + void closeOnSecondClick(); protected slots: - void onActivated( QAction*); + void onSimpleActivated( QAction*); + void onComplexActionTriggered(); private: - QtTestSlot *menu1; - QtTestSlot *menu2; - QtTestSlot *menu3; - QtTestSlot *menu4; - - QtTestSlot *item1_A; - QtTestSlot *item1_B; - QtTestSlot *item2_C; - QtTestSlot *item2_D; - QtTestSlot *item2_E; - QtTestSlot *item2_F; - QtTestSlot *item2_G; - QtTestSlot *item2_H; - - void resetSlots(); - void resetCount(); - - void reset() { resetSlots(); resetCount(); }; - - QAction* last_accel_id; - int activated_count; - - QAction *action; - QAction *action1; - QMainWindow *mw; - QMenuBar *mb; - QMenu *pm1; - QMenu *pm2; + TestMenu initSimpleMenuBar(QMenuBar *mb); + TestMenu initWindowWithSimpleMenuBar(QMainWindow &w); + QAction *createCharacterAction(QMenu *menu, char lowerAscii); + QMenu *addNumberedMenu(QMenuBar *mb, int n); + TestMenu initComplexMenuBar(QMenuBar *mb); + TestMenu initWindowWithComplexMenuBar(QMainWindow &w); + + QAction* m_lastSimpleAcceleratorId; + int m_simpleActivatedCount; + int m_complexTriggerCount['k']; }; // Testing get/set functions @@ -220,116 +192,119 @@ const int RESET = 0; */ -tst_QMenuBar::tst_QMenuBar() - +tst_QMenuBar::tst_QMenuBar() : m_lastSimpleAcceleratorId(0), m_simpleActivatedCount(0) { QApplication::setEffectEnabled(Qt::UI_AnimateMenu, false); - - - activated_count = 0; - mb = 0; - pm1 = 0; - pm2 = 0; - last_accel_id = 0; } -tst_QMenuBar::~tst_QMenuBar() +void tst_QMenuBar::onSimpleActivated( QAction* action ) { - //delete mw; //#### cannot do that AFTER qapplication was destroyed! - mw = 0; + m_lastSimpleAcceleratorId = action; + m_simpleActivatedCount++; } -void tst_QMenuBar::initTestCase() +// Create a simple menu bar and connect its actions to onSimpleActivated(). + +TestMenu tst_QMenuBar::initSimpleMenuBar(QMenuBar *mb) { - // create a default mainwindow - // If you run a widget test, this will be replaced in the testcase by the - // widget under test - mw = new QMainWindow(0, Qt::X11BypassWindowManagerHint); - mb = new QMenuBar( mw ); - connect( mb, SIGNAL(triggered(QAction*)), this, SLOT(onActivated(QAction*)) ); - - initSimpleMenubar(); - mw->show(); - mw->activateWindow(); - QVERIFY(QTest::qWaitForWindowActive(mw)); - - menu1 = new QtTestSlot( mw ); - menu2 = new QtTestSlot( mw ); - menu3 = new QtTestSlot( mw ); - menu4 = new QtTestSlot( mw ); - item1_A = new QtTestSlot( mw ); - item1_B = new QtTestSlot( mw ); - item2_C = new QtTestSlot( mw ); - item2_D = new QtTestSlot( mw ); - item2_E = new QtTestSlot( mw ); - item2_F = new QtTestSlot( mw ); - item2_G = new QtTestSlot( mw ); - item2_H = new QtTestSlot( mw ); + TestMenu result; + connect(mb, SIGNAL(triggered(QAction*)), this, SLOT(onSimpleActivated(QAction*))); + QMenu *menu = mb->addMenu(QStringLiteral("&accel")); + QAction *action = menu->addAction(QStringLiteral("menu1") ); + action->setShortcut(QKeySequence(Qt::ALT + Qt::Key_A)); + action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_A)); + connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(onSimpleActivated(QAction*))); + result.menus << menu; + result.actions << action; + + menu = mb->addMenu(QStringLiteral("accel1")); + action = menu->addAction(QStringLiteral("&Open...") ); + action->setShortcut(Qt::Key_O); + result.menus << menu; + connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(onSimpleActivated(QAction*))); + result.actions << action; + + m_lastSimpleAcceleratorId = 0; + m_simpleActivatedCount = 0; + + return result; } - -void tst_QMenuBar::cleanupTestCase() +inline TestMenu tst_QMenuBar::initWindowWithSimpleMenuBar(QMainWindow &w) { - delete mw; + w.resize(200, 200); + centerOnScreen(&w); + return initSimpleMenuBar(w.menuBar()); } -void tst_QMenuBar::initSimpleMenubar() +// add a menu with number n, set number as data. +QMenu *tst_QMenuBar::addNumberedMenu(QMenuBar *mb, int n) { - mb->hide(); - mb->clear(); - - delete pm1; - pm1 = mb->addMenu("&accel"); - action = pm1->addAction( "menu1" ); - action->setShortcut(QKeySequence("ALT+A")); - action->setShortcut(QKeySequence("CTRL+A")); - - connect( pm1, SIGNAL(triggered(QAction*)), this, SLOT(onActivated(QAction*))); - - delete pm2; - pm2 = mb->addMenu("accel1"); - - action1 = pm2->addAction( "&Open..." ); - action1->setShortcut(Qt::Key_O); - connect(pm2, SIGNAL(triggered(QAction*)), this, SLOT(onActivated(QAction*))); - - mb->show(); - qApp->processEvents(); + const QString text = QStringLiteral("Menu &") + QString::number(n); + QMenu *menu = mb->addMenu(text); + menu->setObjectName(text); + QAction *action = menu->menuAction(); + action->setObjectName(text + QStringLiteral("Action")); + action->setData(QVariant(n)); + connect(action, SIGNAL(triggered()), this, SLOT(onComplexActionTriggered())); + return menu; } -void tst_QMenuBar::init() +// Create an action triggering on Ctrl+character, set number as data. +QAction *tst_QMenuBar::createCharacterAction(QMenu *menu, char lowerAscii) { - resetSlots(); - resetCount(); + const QString text = QStringLiteral("Item ") + QChar(QLatin1Char(lowerAscii)).toUpper(); + QAction *action = menu->addAction(text); + action->setObjectName(text); + action->setData(QVariant(int(lowerAscii))); + action->setShortcut(Qt::CTRL + (lowerAscii - 'a' + Qt::Key_A)); + connect(action, SIGNAL(triggered()), this, SLOT(onComplexActionTriggered())); + return action; } -void tst_QMenuBar::resetSlots() +void tst_QMenuBar::onComplexActionTriggered() { - menu1->clear(); - menu2->clear(); - menu3->clear(); - menu4->clear(); - item1_A->clear(); - item1_B->clear(); - item2_C->clear(); - item2_D->clear(); - item2_E->clear(); - item2_F->clear(); - item2_G->clear(); - item2_H->clear(); + if (QAction *a = qobject_cast<QAction *>(sender())) + m_complexTriggerCount[a->data().toInt()]++; } -void tst_QMenuBar::resetCount() +// Create a complex menu bar and connect its actions to onComplexActionTriggered() +// for their invocations to be counted in m_complexTriggerCount. The index is the +// menu number (1..n) for the menu bar actions and the ASCII-code of the shortcut +// character for the actions in the menus. +TestMenu tst_QMenuBar::initComplexMenuBar(QMenuBar *mb) { - last_accel_id = 0; - activated_count = 0; + TestMenu result; + QMenu *menu = addNumberedMenu(mb, 1); + result.menus << menu; + for (char c = 'a'; c < 'c'; ++c) + result.actions << createCharacterAction(menu, c); + + menu = addNumberedMenu(mb, 2); + menu->menuAction()->setData(QVariant(2)); + result.menus << menu; + for (char c = 'c'; c < 'g'; ++c) + result.actions << createCharacterAction(menu, c); + menu->addSeparator(); + for (char c = 'g'; c < 'i'; ++c) + result.actions << createCharacterAction(menu, c); + + QAction *action = mb->addAction(QStringLiteral("M&enu 3")); + action->setData(QVariant(3)); + action->setShortcut(Qt::ALT + Qt::Key_J); + connect(action, SIGNAL(triggered()), this, SLOT(onComplexActionTriggered())); + result.actions << action; + + qFill(m_complexTriggerCount, m_complexTriggerCount + sizeof(m_complexTriggerCount) / sizeof(int), 0); + + return result; } -void tst_QMenuBar::onActivated( QAction* action ) +inline TestMenu tst_QMenuBar::initWindowWithComplexMenuBar(QMainWindow &w) { - last_accel_id = action; - activated_count++; -// printf( QString("acceleratorId: %1, count: %1\n").arg( i ).arg(activated_count) ); + w.resize(400, 200); + centerOnScreen(&w); + return initComplexMenuBar(w.menuBar()); } // On Mac/WinCE, native key events are needed to test menu action activation @@ -337,15 +312,16 @@ void tst_QMenuBar::onActivated( QAction* action ) void tst_QMenuBar::accel() { // create a popup menu with menu items set the accelerators later... - initSimpleMenubar(); - + QMainWindow w; + const TestMenu menu = initWindowWithSimpleMenuBar(w); + w.show(); + QApplication::setActiveWindow(&w); + QVERIFY(QTest::qWaitForWindowActive(&w)); // shortcuts won't work unless the window is active - QTRY_VERIFY( QApplication::activeWindow() ); -// QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_A, AltKey ); QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_A, Qt::ControlModifier ); QTest::qWait(300); - QCOMPARE( last_accel_id, action ); + QCOMPARE( m_lastSimpleAcceleratorId, menu.actions.front() ); } #endif @@ -354,40 +330,45 @@ void tst_QMenuBar::accel() void tst_QMenuBar::activatedCount() { // create a popup menu with menu items set the accelerators later... - initSimpleMenubar(); + QMainWindow w; + initWindowWithSimpleMenuBar(w); + w.show(); + QApplication::setActiveWindow(&w); + QVERIFY(QTest::qWaitForWindowActive(&w)); QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_A, Qt::ControlModifier ); //wait(5000); - QCOMPARE( activated_count, 2 ); //1 from the popupmenu and 1 from the menubar + QCOMPARE( m_simpleActivatedCount, 2 ); //1 from the popupmenu and 1 from the menubar } #endif void tst_QMenuBar::clear() { - mb->clear(); - QVERIFY( (uint) mb->actions().size() == 0 ); - - mb->clear(); - for (uint i=0; i<10; i++) { - QMenu *menu = mb->addMenu( QString("Menu %1")); - for (uint k=0; k<i; k++) - menu->addAction( QString("Item %1")); - QCOMPARE( (uint) mb->actions().size(), (uint)i+1 ); + QMenuBar menuBar; + initSimpleMenuBar(&menuBar); + menuBar.clear(); + QCOMPARE( menuBar.actions().size(), 0 ); + + menuBar.clear(); + for (int i = 0; i < 10; i++) { + QMenu *menu = menuBar.addMenu( QStringLiteral("Menu ") + QString::number(i)); + for (int k = 0; k < i; k++) + menu->addAction( QStringLiteral("Item ") + QString::number(k)); + QCOMPARE( menuBar.actions().size(), i + 1 ); } - QCOMPARE( (uint) mb->actions().size(), 10u ); - - mb->clear(); - QVERIFY( (uint) mb->actions().size() == 0 ); + QCOMPARE( menuBar.actions().size(), 10 ); + menuBar.clear(); + QCOMPARE( menuBar.actions().size(), 0 ); } void tst_QMenuBar::count() { - mb->clear(); - QVERIFY( mb->actions().size() == 0 ); + QMenuBar menuBar; + QCOMPARE( menuBar.actions().size(), 0 ); - for (uint i=0; i<10; i++) { - mb->addAction( QString("Menu %1")); - QCOMPARE( (uint) mb->actions().size(), (uint) i+1 ); + for (int i = 0; i < 10; i++) { + menuBar.addAction( QStringLiteral("Menu ") + QString::number(i)); + QCOMPARE( menuBar.actions().size(), i + 1 ); } } @@ -402,27 +383,26 @@ void tst_QMenuBar::removeItem_data() // Basically the same test as removeItemAt, except that we remember and remove id's. void tst_QMenuBar::removeItem() { - mb->clear(); + QMenuBar menuBar; - QMenu *pm; - pm = new QMenu( "stuff", mb ); + QMenu *pm = new QMenu( "stuff", &menuBar ); pm->setTitle("Menu 1"); pm->addAction( QString("Item 10") ); - QAction* action1 = mb->addMenu( pm ); + QAction* action1 = menuBar.addMenu( pm ); - pm = new QMenu( mb ); + pm = new QMenu( &menuBar ); pm->setTitle("Menu 2"); pm->addAction( QString("Item 20") ); pm->addAction( QString("Item 21") ); - QAction *action2 = mb->addMenu( pm ); + QAction *action2 = menuBar.addMenu( pm ); - pm = new QMenu( "Menu 3", mb ); + pm = new QMenu( "Menu 3", &menuBar ); pm->addAction( QString("Item 30") ); pm->addAction( QString("Item 31") ); pm->addAction( QString("Item 32") ); - QAction *action3 = mb->addMenu( pm ); + QAction *action3 = menuBar.addMenu( pm ); - QList<QAction *> menuBarActions = mb->actions(); + const QList<QAction *> menuBarActions = menuBar.actions(); QCOMPARE( action1->text(), QString("Menu 1") ); QCOMPARE( action2->text(), QString("Menu 2") ); @@ -437,28 +417,28 @@ void tst_QMenuBar::removeItem() switch (removeIndex ) { case 0: { - mb->removeAction(action1); - QList<QAction *> menuBarActions2 = mb->actions(); + menuBar.removeAction(action1); + const QList<QAction *> menuBarActions2 = menuBar.actions(); QCOMPARE( menuBarActions2.at(0)->text(), QString("Menu 2") ); QCOMPARE( menuBarActions2.at(1)->text(), QString("Menu 3") ); } break; case 1: { - mb->removeAction(action2); - QList<QAction *> menuBarActions2 = mb->actions(); + menuBar.removeAction(action2); + const QList<QAction *> menuBarActions2 = menuBar.actions(); QCOMPARE( menuBarActions2.at(0)->text(), QString("Menu 1") ); QCOMPARE( menuBarActions2.at(1)->text(), QString("Menu 3") ); } break; case 2: { - mb->removeAction(action3); - QList<QAction *> menuBarActions2 = mb->actions(); + menuBar.removeAction(action3); + const QList<QAction *> menuBarActions2 = menuBar.actions(); QCOMPARE( menuBarActions2.at(0)->text(), QString("Menu 1") ); QCOMPARE( menuBarActions2.at(1)->text(), QString("Menu 2") ); } break; } - QList<QAction *> menuBarActions2 = mb->actions(); + QList<QAction *> menuBarActions2 = menuBar.actions(); QVERIFY( menuBarActions2.size() == 2 ); } @@ -472,25 +452,23 @@ void tst_QMenuBar::removeItemAt_data() void tst_QMenuBar::removeItemAt() { - mb->clear(); - - QMenu *pm; - pm = new QMenu("Menu 1", mb); + QMenuBar menuBar; + QMenu *pm = new QMenu("Menu 1", &menuBar); pm->addAction( QString("Item 10") ); - mb->addMenu( pm ); + menuBar.addMenu( pm ); - pm = new QMenu( "Menu 2", mb ); + pm = new QMenu( "Menu 2", &menuBar); pm->addAction( QString("Item 20") ); pm->addAction( QString("Item 21") ); - mb->addMenu( pm ); + menuBar.addMenu( pm ); - pm = new QMenu( "Menu 3", mb ); + pm = new QMenu( "Menu 3", &menuBar); pm->addAction( QString("Item 30") ); pm->addAction( QString("Item 31") ); pm->addAction( QString("Item 32") ); - mb->addMenu( pm ); + menuBar.addMenu( pm ); - QList<QAction *> menuBarActions = mb->actions(); + QList<QAction *> menuBarActions = menuBar.actions(); QCOMPARE( menuBarActions.at(0)->text(), QString("Menu 1") ); QCOMPARE( menuBarActions.at(1)->text(), QString("Menu 2") ); @@ -498,8 +476,8 @@ void tst_QMenuBar::removeItemAt() // Ok, now that we know we have created the menu we expect, lets remove an item... QFETCH( int, removeIndex ); - mb->removeAction(menuBarActions.at(removeIndex)); - QList<QAction *> menuBarActions2 = mb->actions(); + menuBar.removeAction(menuBarActions.at(removeIndex)); + const QList<QAction *> menuBarActions2 = menuBar.actions(); switch (removeIndex ) { case 0: @@ -519,32 +497,6 @@ void tst_QMenuBar::removeItemAt() QVERIFY( menuBarActions2.size() == 2 ); } -void tst_QMenuBar::initComplexMenubar() // well, complex.... -{ - mb->hide(); - mb->clear(); - - delete pm1; - pm1 = mb->addMenu("Menu &1"); - pm1->addAction( QString("Item A"), item1_A, SLOT(selected()), Qt::CTRL+Qt::Key_A ); - pm1->addAction( QString("Item B"), item1_B, SLOT(selected()), Qt::CTRL+Qt::Key_B ); - - delete pm2; - pm2 = mb->addMenu("Menu &2"); - pm2->addAction( QString("Item C"), item2_C, SLOT(selected()), Qt::CTRL+Qt::Key_C ); - pm2->addAction( QString("Item D"), item2_D, SLOT(selected()), Qt::CTRL+Qt::Key_D ); - pm2->addAction( QString("Item E"), item2_E, SLOT(selected()), Qt::CTRL+Qt::Key_E ); - pm2->addAction( QString("Item F"), item2_F, SLOT(selected()), Qt::CTRL+Qt::Key_F ); - pm2->addSeparator(); - pm2->addAction( QString("Item G"), item2_G, SLOT(selected()), Qt::CTRL+Qt::Key_G ); - pm2->addAction( QString("Item H"), item2_H, SLOT(selected()), Qt::CTRL+Qt::Key_H ); - - QAction *ac = mb->addAction( QString("M&enu 3"), menu3, SLOT(selected())); - ac->setShortcut(Qt::ALT+Qt::Key_J); - mb->show(); -} - - /* Check the insert functions that create menu items. For the moment i only check the strings and pixmaps. The rest are special cases which are @@ -553,9 +505,10 @@ void tst_QMenuBar::initComplexMenubar() // well, complex.... void tst_QMenuBar::insertItem_QString_QObject() { - initComplexMenubar(); + QMenuBar menuBar; + initComplexMenuBar(&menuBar); - QList<QAction *> actions = mb->actions(); + const QList<QAction *> actions = menuBar.actions(); QCOMPARE(actions.at(0)->text(), QString("Menu &1") ); QCOMPARE(actions.at(1)->text(), QString("Menu &2") ); @@ -567,68 +520,72 @@ void tst_QMenuBar::insertItem_QString_QObject() #if !defined(Q_OS_MAC) && !defined(Q_OS_WINCE) void tst_QMenuBar::check_accelKeys() { - initComplexMenubar(); + QMainWindow w; + initWindowWithComplexMenuBar(w); + w.show(); + QApplication::setActiveWindow(&w); + QVERIFY(QTest::qWaitForWindowActive(&w)); // start with a bogus key that shouldn't trigger anything QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_I, Qt::ControlModifier); - QCOMPARE(menu1->selCount(), 0u); - QCOMPARE(menu2->selCount(), 0u); - QCOMPARE(menu3->selCount(), 0u); - QCOMPARE(menu4->selCount(), 0u); - QCOMPARE(item1_A->selCount(), 0u); - QCOMPARE(item1_B->selCount(), 0u); - QCOMPARE(item2_C->selCount(), 0u); - QCOMPARE(item2_D->selCount(), 0u); + QCOMPARE(m_complexTriggerCount[1], 0); + QCOMPARE(m_complexTriggerCount[2], 0); + QCOMPARE(m_complexTriggerCount[3], 0); + QCOMPARE(m_complexTriggerCount[4], 0); + QCOMPARE(m_complexTriggerCount['a'], 0); + QCOMPARE(m_complexTriggerCount['b'], 0); + QCOMPARE(m_complexTriggerCount['c'], 0); + QCOMPARE(m_complexTriggerCount['d'], 0); QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_A, Qt::ControlModifier); - QCOMPARE(menu1->selCount(), 0u); - QCOMPARE(menu2->selCount(), 0u); - QCOMPARE(menu3->selCount(), 0u); - QCOMPARE(menu4->selCount(), 0u); - QCOMPARE(item1_A->selCount(), 1u); - QCOMPARE(item1_B->selCount(), 0u); - QCOMPARE(item2_C->selCount(), 0u); - QCOMPARE(item2_D->selCount(), 0u); + QCOMPARE(m_complexTriggerCount[1], 0); + QCOMPARE(m_complexTriggerCount[2], 0); + QCOMPARE(m_complexTriggerCount[3], 0); + QCOMPARE(m_complexTriggerCount[4], 0); + QCOMPARE(m_complexTriggerCount['a'], 1); + QCOMPARE(m_complexTriggerCount['b'], 0); + QCOMPARE(m_complexTriggerCount['c'], 0); + QCOMPARE(m_complexTriggerCount['d'], 0); QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_C, Qt::ControlModifier); - QCOMPARE(menu1->selCount(), 0u); - QCOMPARE(menu2->selCount(), 0u); - QCOMPARE(menu3->selCount(), 0u); - QCOMPARE(menu4->selCount(), 0u); - QCOMPARE(item1_A->selCount(), 1u); - QCOMPARE(item1_B->selCount(), 0u); - QCOMPARE(item2_C->selCount(), 1u); - QCOMPARE(item2_D->selCount(), 0u); + QCOMPARE(m_complexTriggerCount[1], 0); + QCOMPARE(m_complexTriggerCount[2], 0); + QCOMPARE(m_complexTriggerCount[3], 0); + QCOMPARE(m_complexTriggerCount[4], 0); + QCOMPARE(m_complexTriggerCount['a'], 1); + QCOMPARE(m_complexTriggerCount['b'], 0); + QCOMPARE(m_complexTriggerCount['c'], 1); + QCOMPARE(m_complexTriggerCount['d'], 0); QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_B, Qt::ControlModifier); - QCOMPARE(menu1->selCount(), 0u); - QCOMPARE(menu2->selCount(), 0u); - QCOMPARE(menu3->selCount(), 0u); - QCOMPARE(menu4->selCount(), 0u); - QCOMPARE(item1_A->selCount(), 1u); - QCOMPARE(item1_B->selCount(), 1u); - QCOMPARE(item2_C->selCount(), 1u); - QCOMPARE(item2_D->selCount(), 0u); + QCOMPARE(m_complexTriggerCount[1], 0); + QCOMPARE(m_complexTriggerCount[2], 0); + QCOMPARE(m_complexTriggerCount[3], 0); + QCOMPARE(m_complexTriggerCount[4], 0); + QCOMPARE(m_complexTriggerCount['a'], 1); + QCOMPARE(m_complexTriggerCount['b'], 1); + QCOMPARE(m_complexTriggerCount['c'], 1); + QCOMPARE(m_complexTriggerCount['d'], 0); QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_D, Qt::ControlModifier); - QCOMPARE(menu1->selCount(), 0u); - QCOMPARE(menu2->selCount(), 0u); - QCOMPARE(menu3->selCount(), 0u); - QCOMPARE(menu4->selCount(), 0u); - QCOMPARE(item1_A->selCount(), 1u); - QCOMPARE(item1_B->selCount(), 1u); - QCOMPARE(item2_C->selCount(), 1u); - QCOMPARE(item2_D->selCount(), 1u); + QCOMPARE(m_complexTriggerCount[1], 0); + QCOMPARE(m_complexTriggerCount[2], 0); + QCOMPARE(m_complexTriggerCount[3], 0); + QCOMPARE(m_complexTriggerCount[4], 0); + QCOMPARE(m_complexTriggerCount['a'], 1); + QCOMPARE(m_complexTriggerCount['b'], 1); + QCOMPARE(m_complexTriggerCount['c'], 1); + QCOMPARE(m_complexTriggerCount['d'], 1); QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_J, Qt::AltModifier); - QCOMPARE(menu1->selCount(), 0u); - QCOMPARE(menu2->selCount(), 0u); - QCOMPARE(menu3->selCount(), 1u); - QCOMPARE(menu4->selCount(), 0u); - QCOMPARE(item1_A->selCount(), 1u); - QCOMPARE(item1_B->selCount(), 1u); - QCOMPARE(item2_C->selCount(), 1u); - QCOMPARE(item2_D->selCount(), 1u); + QCOMPARE(m_complexTriggerCount[1], 0); + QCOMPARE(m_complexTriggerCount[2], 0); + QCOMPARE(m_complexTriggerCount[3], 1); + QCOMPARE(m_complexTriggerCount[4], 0); + QCOMPARE(m_complexTriggerCount['a'], 1); + QCOMPARE(m_complexTriggerCount['b'], 1); + QCOMPARE(m_complexTriggerCount['c'], 1); + QCOMPARE(m_complexTriggerCount['d'], 1); } #endif @@ -636,29 +593,33 @@ void tst_QMenuBar::check_accelKeys() #if !defined(Q_OS_MAC) && !defined(Q_OS_WINCE) void tst_QMenuBar::check_cursorKeys1() { - initComplexMenubar(); + QMainWindow w; + initWindowWithComplexMenuBar(w); + w.show(); + QApplication::setActiveWindow(&w); + QVERIFY(QTest::qWaitForWindowActive(&w)); // start with a ALT + 1 that activates the first popupmenu QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_1, Qt::AltModifier ); // the Popupmenu should be visible now - QCOMPARE(menu3->selCount(), 0u); - QCOMPARE(menu4->selCount(), 0u); - QCOMPARE(item1_A->selCount(), 0u); - QCOMPARE(item1_B->selCount(), 0u); - QCOMPARE(item2_C->selCount(), 0u); - QCOMPARE(item2_D->selCount(), 0u); + QCOMPARE(m_complexTriggerCount[3], 0); + QCOMPARE(m_complexTriggerCount[4], 0); + QCOMPARE(m_complexTriggerCount['a'], 0); + QCOMPARE(m_complexTriggerCount['b'], 0); + QCOMPARE(m_complexTriggerCount['c'], 0); + QCOMPARE(m_complexTriggerCount['d'], 0); // Simulate a cursor key down click QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_Down ); // and an Enter key QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_Enter ); // Let's see if the correct slot is called... - QCOMPARE(menu3->selCount(), 0u); - QCOMPARE(menu4->selCount(), 0u); - QCOMPARE(item1_A->selCount(), 0u); // this shouldn't have been called - QCOMPARE(item1_B->selCount(), 1u); // and this should have been called by a signal now - QCOMPARE(item2_C->selCount(), 0u); - QCOMPARE(item2_D->selCount(), 0u); + QCOMPARE(m_complexTriggerCount[3], 0); + QCOMPARE(m_complexTriggerCount[4], 0); + QCOMPARE(m_complexTriggerCount['a'], 0); // this shouldn't have been called + QCOMPARE(m_complexTriggerCount['b'], 1); // and this should have been called by a signal now + QCOMPARE(m_complexTriggerCount['c'], 0); + QCOMPARE(m_complexTriggerCount['d'], 0); } #endif @@ -666,7 +627,11 @@ void tst_QMenuBar::check_cursorKeys1() #if !defined(Q_OS_MAC) && !defined(Q_OS_WINCE) void tst_QMenuBar::check_cursorKeys2() { - initComplexMenubar(); + QMainWindow w; + initWindowWithComplexMenuBar(w); + w.show(); + QApplication::setActiveWindow(&w); + QVERIFY(QTest::qWaitForWindowActive(&w)); // select popupmenu2 QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_2, Qt::AltModifier ); @@ -679,12 +644,12 @@ void tst_QMenuBar::check_cursorKeys2() // and an Enter key QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_Enter ); // Let's see if the correct slot is called... - QCOMPARE(menu3->selCount(), 0u); - QCOMPARE(menu4->selCount(), 0u); - QCOMPARE(item1_A->selCount(), 0u); // this shouldn't have been caled - QCOMPARE(item1_B->selCount(), 0u); // and this should have been called by a signal ow - QCOMPARE(item2_C->selCount(), 0u); - QCOMPARE(item2_D->selCount(), 1u); + QCOMPARE(m_complexTriggerCount[3], 0); + QCOMPARE(m_complexTriggerCount[4], 0); + QCOMPARE(m_complexTriggerCount['a'], 0); // this shouldn't have been caled + QCOMPARE(m_complexTriggerCount['b'], 0); // and this should have been called by a signal ow + QCOMPARE(m_complexTriggerCount['c'], 0); + QCOMPARE(m_complexTriggerCount['d'], 1); } #endif @@ -695,7 +660,11 @@ void tst_QMenuBar::check_cursorKeys2() #if !defined(Q_OS_MAC) && !defined(Q_OS_WINCE) void tst_QMenuBar::check_cursorKeys3() { - initComplexMenubar(); + QMainWindow w; + initWindowWithComplexMenuBar(w); + w.show(); + QApplication::setActiveWindow(&w); + QVERIFY(QTest::qWaitForWindowActive(&w)); // select Popupmenu 2 QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_2, Qt::AltModifier ); @@ -706,12 +675,12 @@ void tst_QMenuBar::check_cursorKeys3() // and press ENTER QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_Enter ); // Let's see if the correct slot is called... - QCOMPARE(menu3->selCount(), 0u); - QCOMPARE(menu4->selCount(), 0u); - QCOMPARE(item1_A->selCount(), 0u); // this shouldn't have been called - QCOMPARE(item1_B->selCount(), 1u); // and this should have been called by a signal now - QCOMPARE(item2_C->selCount(), 0u); - QCOMPARE(item2_D->selCount(), 0u); + QCOMPARE(m_complexTriggerCount[3], 0); + QCOMPARE(m_complexTriggerCount[4], 0); + QCOMPARE(m_complexTriggerCount['a'], 0); // this shouldn't have been called + QCOMPARE(m_complexTriggerCount['b'], 1); // and this should have been called by a signal now + QCOMPARE(m_complexTriggerCount['c'], 0); + QCOMPARE(m_complexTriggerCount['d'], 0); } #endif @@ -727,7 +696,11 @@ void tst_QMenuBar::check_homeKey() QEXPECT_FAIL( "0", "Popupmenu should respond to a Home key", Abort ); - initComplexMenubar(); + QMainWindow w; + initWindowWithComplexMenuBar(w); + w.show(); + QApplication::setActiveWindow(&w); + QVERIFY(QTest::qWaitForWindowActive(&w)); // select Popupmenu 2 QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_2, Qt::AltModifier ); @@ -740,17 +713,17 @@ void tst_QMenuBar::check_homeKey() // and press ENTER QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_Enter ); // Let's see if the correct slot is called... -// QVERIFY2( item2_C->selCount() == 1, "Popupmenu should respond to a Home key" ); - QCOMPARE(item2_C->selCount(), 1u); - QCOMPARE(menu3->selCount(), 0u); - QCOMPARE(menu4->selCount(), 0u); - QCOMPARE(item1_A->selCount(), 0u); - QCOMPARE(item1_B->selCount(), 0u); - QCOMPARE(item2_D->selCount(), 0u); - QCOMPARE(item2_E->selCount(), 0u); - QCOMPARE(item2_F->selCount(), 0u); - QCOMPARE(item2_G->selCount(), 0u); - QCOMPARE(item2_H->selCount(), 0u); +// QVERIFY2( m_complexActionTriggerCount['c'] == 1, "Popupmenu should respond to a Home key" ); + QCOMPARE(m_complexTriggerCount['c'], 1); + QCOMPARE(m_complexTriggerCount[3], 0); + QCOMPARE(m_complexTriggerCount[4], 0); + QCOMPARE(m_complexTriggerCount['a'], 0); + QCOMPARE(m_complexTriggerCount['b'], 0); + QCOMPARE(m_complexTriggerCount['d'], 0); + QCOMPARE(m_complexTriggerCount['e'], 0); + QCOMPARE(m_complexTriggerCount['f'], 0); + QCOMPARE(m_complexTriggerCount['g'], 0); + QCOMPARE(m_complexTriggerCount['h'], 0); } /*! @@ -765,7 +738,11 @@ void tst_QMenuBar::check_endKey() QEXPECT_FAIL( "0", "Popupmenu should respond to an End key", Abort ); - initComplexMenubar(); + QMainWindow w; + initWindowWithComplexMenuBar(w); + w.show(); + QApplication::setActiveWindow(&w); + QVERIFY(QTest::qWaitForWindowActive(&w)); // select Popupmenu 2 QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_2, Qt::AltModifier ); @@ -775,17 +752,17 @@ void tst_QMenuBar::check_endKey() // and press ENTER QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_Enter ); // Let's see if the correct slot is called... -// QVERIFY2( item2_H->selCount() == 1, "Popupmenu should respond to an End key" ); - QCOMPARE(item2_H->selCount(), 1u);//, "Popupmenu should respond to an End key"); - QCOMPARE(menu3->selCount(), 0u); - QCOMPARE(menu4->selCount(), 0u); - QCOMPARE(item1_A->selCount(), 0u); - QCOMPARE(item1_B->selCount(), 0u); - QCOMPARE(item2_C->selCount(), 0u); - QCOMPARE(item2_D->selCount(), 0u); - QCOMPARE(item2_E->selCount(), 0u); - QCOMPARE(item2_F->selCount(), 0u); - QCOMPARE(item2_G->selCount(), 0u); +// QVERIFY2( m_complexActionTriggerCount['h'] == 1, "Popupmenu should respond to an End key" ); + QCOMPARE(m_complexTriggerCount['h'], 1);//, "Popupmenu should respond to an End key"); + QCOMPARE(m_complexTriggerCount[3], 0); + QCOMPARE(m_complexTriggerCount[4], 0); + QCOMPARE(m_complexTriggerCount['a'], 0); + QCOMPARE(m_complexTriggerCount['b'], 0); + QCOMPARE(m_complexTriggerCount['c'], 0); + QCOMPARE(m_complexTriggerCount['d'], 0); + QCOMPARE(m_complexTriggerCount['e'], 0); + QCOMPARE(m_complexTriggerCount['f'], 0); + QCOMPARE(m_complexTriggerCount['g'], 0); } /*! @@ -798,33 +775,38 @@ void tst_QMenuBar::check_endKey() #if !defined(Q_OS_MAC) && !defined(Q_OS_WINCE) void tst_QMenuBar::check_escKey() { - initComplexMenubar(); + QMainWindow w; + const TestMenu menu = initWindowWithComplexMenuBar(w); + w.show(); + w.setFocus(); + QApplication::setActiveWindow(&w); + QVERIFY(QTest::qWaitForWindowActive(&w)); - QVERIFY( !pm1->isActiveWindow() ); - QVERIFY( !pm2->isActiveWindow() ); + QVERIFY( !menu.menus.at(0)->isActiveWindow() ); + QVERIFY( !menu.menus.at(1)->isActiveWindow() ); // select Popupmenu 2 QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_2, Qt::AltModifier ); - QVERIFY( !pm1->isActiveWindow() ); - QVERIFY( pm2->isActiveWindow() ); + QVERIFY( !menu.menus.at(0)->isActiveWindow() ); + QVERIFY( menu.menus.at(1)->isActiveWindow() ); // If we press ESC, the popup should disappear QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_Escape ); - QVERIFY( !pm1->isActiveWindow() ); - QVERIFY( !pm2->isActiveWindow() ); + QVERIFY( !menu.menus.at(0)->isActiveWindow() ); + QVERIFY( !menu.menus.at(1)->isActiveWindow() ); if (!QApplication::style()->inherits("QWindowsStyle")) return; // If we press Down the popupmenu should be active again QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_Down ); - QVERIFY( !pm1->isActiveWindow() ); - QVERIFY( pm2->isActiveWindow() ); + QVERIFY( !menu.menus.at(0)->isActiveWindow() ); + QVERIFY( menu.menus.at(1)->isActiveWindow() ); // and press ENTER - QTest::keyClick( pm2, Qt::Key_Enter ); + QTest::keyClick( menu.menus.at(1), Qt::Key_Enter ); // Let's see if the correct slot is called... - QVERIFY2( item2_C->selCount() == 1, "Expected item 2C to be selected" ); + QVERIFY2( m_complexTriggerCount['c'] == 1, "Expected item 2C to be selected" ); } #endif @@ -850,7 +832,7 @@ void tst_QMenuBar::check_escKey() // QFETCH( int, itemA_count ); // QFETCH( int, itemB_count ); -// initComplexMenubar(); +// // initComplexMenubar(); // QVERIFY( !pm1->isActiveWindow() ); // QVERIFY( !pm2->isActiveWindow() ); @@ -864,15 +846,15 @@ void tst_QMenuBar::check_escKey() // QTest::qWait(1000); // mouse.mouseEvent( QtTestMouse::MouseClick, pm1, popup_item, Qt::LeftButton ); -// QCOMPARE(menu3->selCount(), 0u); -// QCOMPARE(menu4->selCount(), 0u); -// QCOMPARE(item1_A->selCount(), (uint)itemA_count); // this option should have fired -// QCOMPARE(item1_B->selCount(), (uint)itemB_count); -// QCOMPARE(item2_C->selCount(), 0u); -// QCOMPARE(item2_D->selCount(), 0u); -// QCOMPARE(item2_E->selCount(), 0u); -// QCOMPARE(item2_F->selCount(), 0u); -// QCOMPARE(item2_G->selCount(), 0u); +// QCOMPARE(m_complexActionTriggerCount[3], 0); +// QCOMPARE(m_complexActionTriggerCount[4], 0); +// QCOMPARE(m_complexActionTriggerCount['a'], (uint)itemA_count); // this option should have fired +// QCOMPARE(m_complexActionTriggerCount['b'], (uint)itemB_count); +// QCOMPARE(m_complexActionTriggerCount['c'], 0); +// QCOMPARE(m_complexActionTriggerCount['d'], 0); +// QCOMPARE(m_complexActionTriggerCount['e'], 0); +// QCOMPARE(m_complexActionTriggerCount['f'], 0); +// QCOMPARE(m_complexActionTriggerCount['g'], 0); // } // void tst_QMenuBar::check_mouse2_data() @@ -918,28 +900,27 @@ void tst_QMenuBar::check_escKey() // QFETCH( int, itemH_count ); // QFETCH( int, menu3_count ); -// initComplexMenubar(); +// // initComplexMenubar(); // QtTestMouse mouse; // mouse.click( QtTestMouse::Menu, label, Qt::LeftButton ); // // check if the correct signals have fired -// QCOMPARE(menu3->selCount(), (uint)menu3_count); -// QCOMPARE(menu4->selCount(), 0u); -// QCOMPARE(item1_A->selCount(), (uint)itemA_count); -// QCOMPARE(item1_B->selCount(), (uint)itemB_count); -// QCOMPARE(item2_C->selCount(), (uint)itemC_count); -// QCOMPARE(item2_D->selCount(), (uint)itemD_count); -// QCOMPARE(item2_E->selCount(), (uint)itemE_count); -// QCOMPARE(item2_F->selCount(), (uint)itemF_count); -// QCOMPARE(item2_G->selCount(), (uint)itemG_count); -// QCOMPARE(item2_H->selCount(), (uint)itemH_count); +// QCOMPARE(m_complexActionTriggerCount[3], (uint)menu3_count); +// QCOMPARE(m_complexActionTriggerCount[4], 0); +// QCOMPARE(m_complexActionTriggerCount['a'], (uint)itemA_count); +// QCOMPARE(m_complexActionTriggerCount['b'], (uint)itemB_count); +// QCOMPARE(m_complexActionTriggerCount['c'], (uint)itemC_count); +// QCOMPARE(m_complexActionTriggerCount['d'], (uint)itemD_count); +// QCOMPARE(m_complexActionTriggerCount['e'], (uint)itemE_count); +// QCOMPARE(m_complexActionTriggerCount['f'], (uint)itemF_count); +// QCOMPARE(m_complexActionTriggerCount['g'], (uint)itemG_count); +// QCOMPARE(m_complexActionTriggerCount['h'], (uint)itemH_count); // } #if !defined(Q_OS_MAC) && !defined(Q_OS_WINCE) void tst_QMenuBar::allowActiveAndDisabled() { - mb->hide(); - mb->clear(); + QMenuBar menuBar; // Task 241043 : check that second menu is activated if only // disabled menu items are added @@ -950,31 +931,30 @@ void tst_QMenuBar::allowActiveAndDisabled() QAction *act = fileMenu.addAction("Disabled"); act->setEnabled(false); - mb->addMenu(&fileMenu); + menuBar.addMenu(&fileMenu); QMenu disabledMenu("Disabled"); disabledMenu.setEnabled(false); QMenu activeMenu("Active"); - mb->addMenu(&disabledMenu); - mb->addMenu(&activeMenu); - mb->show(); - + menuBar.addMenu(&disabledMenu); + menuBar.addMenu(&activeMenu); + centerOnScreen(&menuBar); + menuBar.show(); + QVERIFY(QTest::qWaitForWindowExposed(&menuBar)); // Here we verify that AllowActiveAndDisabled correctly skips // the disabled menu entry - QTest::keyClick(mb, Qt::Key_F, Qt::AltModifier ); + QTest::keyClick(&menuBar, Qt::Key_F, Qt::AltModifier ); QTest::keyClick(&fileMenu, (Qt::Key_Right)); if (qApp->style()->styleHint(QStyle::SH_Menu_AllowActiveAndDisabled)) - QCOMPARE(mb->activeAction()->text(), disabledMenu.title()); + QCOMPARE(menuBar.activeAction()->text(), disabledMenu.title()); else - QCOMPARE(mb->activeAction()->text(), activeMenu.title()); + QCOMPARE(menuBar.activeAction()->text(), activeMenu.title()); - QTest::keyClick(mb, (Qt::Key_Left)); + QTest::keyClick(&menuBar, (Qt::Key_Left)); if (qApp->style()->styleHint(QStyle::SH_Menu_AllowActiveAndDisabled)) - QCOMPARE(mb->activeAction()->text(), fileMenu.title()); + QCOMPARE(menuBar.activeAction()->text(), fileMenu.title()); else - QCOMPARE(mb->activeAction()->text(), fileMenu.title()); - - mb->hide(); + QCOMPARE(menuBar.activeAction()->text(), fileMenu.title()); } #endif @@ -985,33 +965,38 @@ void tst_QMenuBar::check_altPress() arg( qApp->style()->objectName() ).toLatin1()); } - initSimpleMenubar(); - - qApp->setActiveWindow(mw); - mw->setFocus(); - - QTest::keyClick( mw, Qt::Key_Alt ); + QMainWindow w; + initWindowWithSimpleMenuBar(w); + w.show(); + w.setFocus(); + QApplication::setActiveWindow(&w); + QVERIFY(QTest::qWaitForWindowActive(&w)); - QVERIFY( ::qobject_cast<QMenuBar *>(qApp->focusWidget()) ); + QTest::keyClick( &w, Qt::Key_Alt ); + QTRY_VERIFY( ::qobject_cast<QMenuBar *>(qApp->focusWidget()) ); } // Qt/Mac,WinCE does not use the native popups/menubar #if !defined(Q_OS_MAC) && !defined(Q_OS_WINCE) void tst_QMenuBar::check_shortcutPress() { - initComplexMenubar(); - - qApp->setActiveWindow(mw); - QCOMPARE(menu3->selCount(), 0u); - QTest::keyClick(mw, Qt::Key_E, Qt::AltModifier); + QMainWindow w; + const TestMenu menu = initWindowWithComplexMenuBar(w); + w.show(); + w.setFocus(); + QApplication::setActiveWindow(&w); + QVERIFY(QTest::qWaitForWindowActive(&w)); + + QCOMPARE(m_complexTriggerCount[3], 0); + QTest::keyClick(&w, Qt::Key_E, Qt::AltModifier); QTest::qWait(200); - QCOMPARE(menu3->selCount(), 1u); - QVERIFY(!mb->activeAction()); + QCOMPARE(m_complexTriggerCount[3], 1); + QVERIFY(!w.menuBar()->activeAction()); - QTest::keyClick(mw, Qt::Key_1, Qt::AltModifier ); - QVERIFY(pm1->isActiveWindow()); - QTest::keyClick(mb, Qt::Key_2); - QVERIFY(pm1->isActiveWindow()); + QTest::keyClick(&w, Qt::Key_1, Qt::AltModifier ); + QVERIFY(menu.menus.at(0)->isActiveWindow()); + QTest::keyClick(&w, Qt::Key_2); + QVERIFY(menu.menus.at(0)->isActiveWindow()); } #endif @@ -1038,27 +1023,29 @@ private: #if !defined(Q_OS_MAC) && !defined(Q_OS_WINCE) void tst_QMenuBar::check_menuPosition() { + QMainWindow w; + Menu menu; - initComplexMenubar(); menu.setTitle("&menu"); - QRect availRect = QApplication::desktop()->availableGeometry(mw); - QRect screenRect = QApplication::desktop()->screenGeometry(mw); + QRect availRect = QApplication::desktop()->availableGeometry(&w); + QRect screenRect = QApplication::desktop()->screenGeometry(&w); while(menu.sizeHint().height() < (screenRect.height()*2/3)) { menu.addAction("item"); } - QAction *menu_action = mw->menuBar()->addMenu(&menu); - - qApp->setActiveWindow(mw); - qApp->processEvents(); + QAction *menu_action = w.menuBar()->addMenu(&menu); + centerOnScreen(&w); + w.show(); + qApp->setActiveWindow(&w); + QVERIFY(QTest::qWaitForWindowActive(&w)); //the menu should be below the menubar item { - mw->move(availRect.topLeft()); - QRect mbItemRect = mw->menuBar()->actionGeometry(menu_action); - mbItemRect.moveTo(mw->menuBar()->mapToGlobal(mbItemRect.topLeft())); - QTest::keyClick(mw, Qt::Key_M, Qt::AltModifier ); + w.move(availRect.topLeft()); + QRect mbItemRect = w.menuBar()->actionGeometry(menu_action); + mbItemRect.moveTo(w.menuBar()->mapToGlobal(mbItemRect.topLeft())); + QTest::keyClick(&w, Qt::Key_M, Qt::AltModifier ); QVERIFY(menu.isActiveWindow()); QCOMPARE(menu.pos(), QPoint(mbItemRect.x(), mbItemRect.bottom() + 1)); menu.close(); @@ -1066,10 +1053,10 @@ void tst_QMenuBar::check_menuPosition() //the menu should be above the menubar item { - mw->move(0,screenRect.bottom() - screenRect.height()/4); //just leave some place for the menubar - QRect mbItemRect = mw->menuBar()->actionGeometry(menu_action); - mbItemRect.moveTo(mw->menuBar()->mapToGlobal(mbItemRect.topLeft())); - QTest::keyClick(mw, Qt::Key_M, Qt::AltModifier ); + w.move(0,screenRect.bottom() - screenRect.height()/4); //just leave some place for the menubar + QRect mbItemRect = w.menuBar()->actionGeometry(menu_action); + mbItemRect.moveTo(w.menuBar()->mapToGlobal(mbItemRect.topLeft())); + QTest::keyClick(&w, Qt::Key_M, Qt::AltModifier ); QVERIFY(menu.isActiveWindow()); QCOMPARE(menu.pos(), QPoint(mbItemRect.x(), mbItemRect.top() - menu.height())); menu.close(); @@ -1077,10 +1064,10 @@ void tst_QMenuBar::check_menuPosition() //the menu should be on the side of the menubar item and should be "stuck" to the bottom of the screen { - mw->move(0,screenRect.y() + screenRect.height()/2); //put it in the middle - QRect mbItemRect = mw->menuBar()->actionGeometry(menu_action); - mbItemRect.moveTo(mw->menuBar()->mapToGlobal(mbItemRect.topLeft())); - QTest::keyClick(mw, Qt::Key_M, Qt::AltModifier ); + w.move(0,screenRect.y() + screenRect.height()/2); //put it in the middle + QRect mbItemRect = w.menuBar()->actionGeometry(menu_action); + mbItemRect.moveTo(w.menuBar()->mapToGlobal(mbItemRect.topLeft())); + QTest::keyClick(&w, Qt::Key_M, Qt::AltModifier ); QVERIFY(menu.isActiveWindow()); QPoint firstPoint = QPoint(mbItemRect.right()+1, screenRect.bottom() - menu.height() + 1); QPoint secondPoint = QPoint(mbItemRect.right()+1, availRect.bottom() - menu.height() + 1); @@ -1093,9 +1080,9 @@ void tst_QMenuBar::check_menuPosition() LayoutDirectionSaver directionSaver(Qt::RightToLeft); menu.clear(); QObject::connect(&menu, SIGNAL(aboutToShow()), &menu, SLOT(addActions())); - QRect mbItemRect = mw->menuBar()->actionGeometry(menu_action); - mbItemRect.moveTo(mw->menuBar()->mapToGlobal(mbItemRect.topLeft())); - QTest::keyClick(mw, Qt::Key_M, Qt::AltModifier ); + QRect mbItemRect = w.menuBar()->actionGeometry(menu_action); + mbItemRect.moveTo(w.menuBar()->mapToGlobal(mbItemRect.topLeft())); + QTest::keyClick(&w, Qt::Key_M, Qt::AltModifier ); QVERIFY(menu.isActiveWindow()); QCOMPARE(menu.geometry().right(), mbItemRect.right()); menu.close(); @@ -1104,9 +1091,9 @@ void tst_QMenuBar::check_menuPosition() # ifndef QTEST_NO_CURSOR // QTBUG-28031: Click at bottom-right corner. { - mw->move(400, 200); + w.move(400, 200); LayoutDirectionSaver directionSaver(Qt::RightToLeft); - QMenuBar *mb = mw->menuBar(); + QMenuBar *mb = w.menuBar(); const QPoint localPos = mb->actionGeometry(menu.menuAction()).bottomRight() - QPoint(1, 1); const QPoint globalPos = mb->mapToGlobal(localPos); QCursor::setPos(globalPos); @@ -1123,6 +1110,7 @@ void tst_QMenuBar::task223138_triggered() { //we create a window with submenus and we check that both menubar and menus get the triggered signal QMainWindow win; + centerOnScreen(&win); QMenu *menu = win.menuBar()->addMenu("test"); QAction *top = menu->addAction("toplevelaction"); QMenu *submenu = menu->addMenu("nested menu"); @@ -1162,8 +1150,10 @@ void tst_QMenuBar::task256322_highlight() file2->setText("file2"); QAction *nothing = win.menuBar()->addAction("nothing"); + centerOnScreen(&win); win.show(); - QTest::qWait(200); + QApplication::setActiveWindow(&win); + QVERIFY(QTest::qWaitForWindowActive(&win)); QTest::mousePress(win.menuBar(), Qt::LeftButton, 0, win.menuBar()->actionGeometry(file).center()); QTest::mouseMove(win.menuBar(), win.menuBar()->actionGeometry(file).center()); @@ -1184,12 +1174,11 @@ void tst_QMenuBar::task256322_highlight() QTest::mouseMove(win.menuBar(), nothingCenter); QTRY_VERIFY(!menu2.isVisible()); QVERIFY(!menu.isVisible()); - QAction *activeAction = win.menuBar()->activeAction(); #ifdef Q_OS_MAC - if ((QSysInfo::MacintoshVersion >= QSysInfo::MV_10_7) && (activeAction != nothing)) + if ((QSysInfo::MacintoshVersion >= QSysInfo::MV_10_7) && (win.menuBar()->activeAction() != nothing)) QEXPECT_FAIL("", "QTBUG-30565: Unstable test", Continue); #endif - QCOMPARE(activeAction, nothing); + QTRY_COMPARE(win.menuBar()->activeAction(), nothing); QTest::mouseRelease(win.menuBar(), Qt::LeftButton, 0, nothingCenter); } @@ -1232,6 +1221,7 @@ void tst_QMenuBar::menubarSizeHint() const int vmargin = style.pixelMetric(QStyle::PM_MenuBarVMargin); const int spacing = style.pixelMetric(QStyle::PM_MenuBarItemSpacing); + centerOnScreen(&mb); mb.show(); QRect result; foreach(QAction *action, mb.actions()) { @@ -1272,6 +1262,7 @@ void tst_QMenuBar::taskQTBUG4965_escapeEaten() QMenu menu("menu1"); QAction *first = menubar.addMenu(&menu); menu.addAction("quit", &menubar, SLOT(close()), QKeySequence("ESC")); + centerOnScreen(&menubar); menubar.show(); QApplication::setActiveWindow(&menubar); QVERIFY(QTest::qWaitForWindowExposed(&menubar)); @@ -1299,6 +1290,7 @@ void tst_QMenuBar::taskQTBUG11823_crashwithInvisibleActions() QAction * m = menubar.addAction( "&m" ); QAction * a = menubar.addAction( "&a" ); + centerOnScreen(&menubar); menubar.show(); QApplication::setActiveWindow(&menubar); QVERIFY(QTest::qWaitForWindowActive(&menubar)); @@ -1318,5 +1310,28 @@ void tst_QMenuBar::taskQTBUG11823_crashwithInvisibleActions() QCOMPARE(menubar.activeAction(), m); //the active action shouldn't have changed } +void tst_QMenuBar::closeOnSecondClick() // QTBUG-32807, menu should close on 2nd click. +{ + QMainWindow mainWindow; + mainWindow.resize(300, 200); + centerOnScreen(&mainWindow); +#ifndef QT_NO_CURSOR + QCursor::setPos(mainWindow.geometry().topLeft() - QPoint(100, 0)); +#endif + QMenuBar *menuBar = mainWindow.menuBar(); + menuBar->setNativeMenuBar(false); + QMenu *fileMenu = menuBar->addMenu(QStringLiteral("closeOnSecondClick")); + fileMenu->addAction(QStringLiteral("Quit")); + mainWindow.show(); + QApplication::setActiveWindow(&mainWindow); + QVERIFY(QTest::qWaitForWindowActive(&mainWindow)); + const QPoint center = menuBar->actionGeometry(fileMenu->menuAction()).center(); + QTest::mouseMove(menuBar, center); + QTest::mouseClick(menuBar, Qt::LeftButton, 0, center); + QTRY_VERIFY(fileMenu->isVisible()); + QTest::mouseClick(menuBar, Qt::LeftButton, 0, center); + QTRY_VERIFY(!fileMenu->isVisible()); +} + QTEST_MAIN(tst_QMenuBar) #include "tst_qmenubar.moc" |