tests/auto/qmenubar/tst_qmenubar.cpp
changeset 3 41300fa6a67c
parent 0 1918ee327afb
child 4 3b1da2848fc7
--- a/tests/auto/qmenubar/tst_qmenubar.cpp	Tue Jan 26 12:42:25 2010 +0200
+++ b/tests/auto/qmenubar/tst_qmenubar.cpp	Tue Feb 02 00:43:10 2010 +0200
@@ -86,6 +86,18 @@
     uint sel_count;
 };
 
+class Menu : public QMenu
+{
+    Q_OBJECT
+        public slots:
+            void addActions()
+            {
+                //this will change the geometry of the menu
+                addAction("action1");
+                addAction("action2");
+            }
+};
+
 class tst_QMenuBar : public QObject
 {
     Q_OBJECT
@@ -155,7 +167,8 @@
     void task223138_triggered();
     void task256322_highlight();
     void menubarSizeHint();
-    
+    void taskQTBUG4965_escapeEaten();
+
 #if defined(QT3_SUPPORT)
     void indexBasedInsertion_data();
     void indexBasedInsertion();
@@ -1347,7 +1360,7 @@
     // disabled menu items are added
 
     QMenu fileMenu("&File");
-    // Task 241043 : check that second menu is activated 
+    // Task 241043 : check that second menu is activated
     // if all items are disabled
     QAction *act = fileMenu.addAction("Disabled");
     act->setEnabled(false);
@@ -1375,7 +1388,7 @@
         QCOMPARE(mb->activeAction()->text(), fileMenu.title());
     else
         QCOMPARE(mb->activeAction()->text(), fileMenu.title());
-    
+
     mb->hide();
 #endif //Q_WS_MAC
 }
@@ -1442,7 +1455,7 @@
 #ifdef Q_OS_WINCE_WM
     QSKIP("Qt/CE uses native menubar", SkipAll);
 #endif
-    QMenu menu;
+    Menu menu;
 #ifdef QT3_SUPPORT
     initComplexMenubar();
 #else
@@ -1496,6 +1509,21 @@
         menu.close();
     }
 
+    //in RTL, the menu should be stuck at the right of the action geometry
+    {
+        Qt::LayoutDirection dir = qApp->layoutDirection();
+        qApp->setLayoutDirection(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 );
+        QVERIFY(menu.isActiveWindow());
+        QCOMPARE(menu.geometry().right(), mbItemRect.right());
+        menu.close();
+        qApp->setLayoutDirection(dir);
+    }
+
 }
 
 void tst_QMenuBar::task223138_triggered()
@@ -1575,7 +1603,7 @@
         virtual int pixelMetric(PixelMetric metric, const QStyleOption * option = 0, const QWidget * widget = 0 ) const
         {
             // I chose strange values (prime numbers to be more sure that the size of the menubar is correct)
-            switch (metric) 
+            switch (metric)
             {
             case QStyle::PM_MenuBarItemSpacing:
                 return 7;
@@ -1593,7 +1621,7 @@
 
     QMenuBar mb;
     mb.setNativeMenuBar(false); //we can't check the geometry of native menubars
-		
+
     mb.setStyle(&style);
     //this is a list of arbitrary strings so that we check the geometry
     QStringList list = QStringList() << "trer" << "ezrfgtgvqd" << "sdgzgzerzerzer" << "eerzertz"  << "er";
@@ -1637,6 +1665,30 @@
     QCOMPARE(resSize, mb.sizeHint());
 }
 
+void tst_QMenuBar::taskQTBUG4965_escapeEaten()
+{
+#ifdef Q_WS_MAC
+    QSKIP("On Mac, do not test the menubar with escape key", SkipAll);
+#endif
+    QMenuBar menubar;
+    QMenu menu("menu1");
+    QAction *first = menubar.addMenu(&menu);
+    menu.addAction("quit", &menubar, SLOT(close()), QKeySequence("ESC"));
+    menubar.show();
+    QApplication::setActiveWindow(&menubar);
+    QTest::qWaitForWindowShown(&menubar);
+    menubar.setActiveAction(first);
+    QTRY_VERIFY(menu.isVisible());
+    QCOMPARE(menubar.activeAction(), first);
+    QTest::keyClick(0, Qt::Key_Escape);
+    QVERIFY(!menu.isVisible());
+    QTRY_VERIFY(menubar.hasFocus());
+    QCOMPARE(menubar.activeAction(), first);
+    QTest::keyClick(0, Qt::Key_Escape);
+    QVERIFY(!menubar.activeAction());
+    QTest::keyClick(0, Qt::Key_Escape); //now the action should be triggered
+    QTRY_VERIFY(!menubar.isVisible());
+}
 
 #if defined(QT3_SUPPORT)
 void tst_QMenuBar::indexBasedInsertion_data()