/******************************************************************************** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).** All rights reserved.** Contact: Nokia Corporation (qt-info@nokia.com)**** This file is part of the test suite of the Qt Toolkit.**** $QT_BEGIN_LICENSE:LGPL$** No Commercial Usage** This file contains pre-release code and may not be distributed.** You may use this file in accordance with the terms and conditions** contained in the Technology Preview License Agreement accompanying** this package.**** GNU Lesser General Public License Usage** Alternatively, this file may be used under the terms of the GNU Lesser** General Public License version 2.1 as published by the Free Software** Foundation and appearing in the file LICENSE.LGPL included in the** packaging of this file. Please review the following information to** ensure the GNU Lesser General Public License version 2.1 requirements** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.**** In addition, as a special exception, Nokia gives you certain additional** rights. These rights are described in the Nokia Qt LGPL Exception** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.**** If you have questions regarding the use of this file, please contact** Nokia at qt-info@nokia.com.****************** $QT_END_LICENSE$******************************************************************************/#include <QApplication>#include <QMessageBox> #include <QtTest/QtTest>#include <QSplashScreen>#include <QScrollBar>#include <QProgressDialog>#include <QSpinBox>#include <guitest.h>#ifdef Q_OS_MACclass tst_MacGui : public GuiTester{Q_OBJECTprivate slots: void scrollbarPainting(); void dummy(); void splashScreenModality(); void dialogModality(); void nonModalOrder(); void spinBoxArrowButtons();};QPixmap grabWindowContents(QWidget * widget){ return QPixmap::grabWindow(widget->winId());}/* Test that vertical and horizontal mac-style scrollbars paint their entire area.*/void tst_MacGui::scrollbarPainting(){ ColorWidget colorWidget; colorWidget.resize(400, 400); QSize scrollBarSize; QScrollBar verticalScrollbar(&colorWidget); verticalScrollbar.move(10, 10); scrollBarSize = verticalScrollbar.sizeHint(); scrollBarSize.setHeight(200); verticalScrollbar.resize(scrollBarSize); QScrollBar horizontalScrollbar(&colorWidget); horizontalScrollbar.move(30, 10); horizontalScrollbar.setOrientation(Qt::Horizontal); scrollBarSize = horizontalScrollbar.sizeHint(); scrollBarSize.setWidth(200); horizontalScrollbar.resize(scrollBarSize); colorWidget.show(); colorWidget.raise(); QTest::qWait(100); QPixmap pixmap = grabWindowContents(&colorWidget); QVERIFY(isContent(pixmap.toImage(), verticalScrollbar.geometry(), GuiTester::Horizontal)); QVERIFY(isContent(pixmap.toImage(), horizontalScrollbar.geometry(), GuiTester::Vertical));}// When running the auto-tests on scruffy, the first enter-the-event-loop-and-wait-for-a-click// test that runs always times out, so we have this dummy test.void tst_MacGui::dummy(){ QPixmap pix(100, 100); QSplashScreen splash(pix); splash.show(); QMessageBox *box = new QMessageBox(); box->setText("accessible?"); box->show(); // Find the "OK" button and schedule a press. InterfaceChildPair interface = wn.find(QAccessible::Name, "OK", box); QVERIFY(interface.iface); const int delay = 1000; clickLater(interface, Qt::LeftButton, delay); // Show dialog and and enter event loop. connect(wn.getWidget(interface), SIGNAL(clicked()), SLOT(exitLoopSlot())); const int timeout = 4; QTestEventLoop::instance().enterLoop(timeout);}/* Test that a message box pops up in front of a QSplashScreen.*/void tst_MacGui::splashScreenModality(){ QPixmap pix(300, 300); QSplashScreen splash(pix); splash.show(); QMessageBox box; //box.setWindowFlags(box.windowFlags() | Qt::WindowStaysOnTopHint); box.setText("accessible?"); box.show(); // Find the "OK" button and schedule a press. InterfaceChildPair interface = wn.find(QAccessible::Name, "OK", &box); QVERIFY(interface.iface); const int delay = 1000; clickLater(interface, Qt::LeftButton, delay); // Show dialog and and enter event loop. connect(wn.getWidget(interface), SIGNAL(clicked()), SLOT(exitLoopSlot())); const int timeout = 4; QTestEventLoop::instance().enterLoop(timeout); QVERIFY(QTestEventLoop::instance().timeout() == false);}/* Test that a non-modal dialog created as a child of a modal dialog is shown in front.*/void tst_MacGui::dialogModality(){ QDialog d; d.setModal(true); d.show(); QProgressDialog progress(&d); progress.setValue(2); InterfaceChildPair interface = wn.find(QAccessible::Name, "Cancel", &progress); QVERIFY(interface.iface); const int delay = 2000; clickLater(interface, Qt::LeftButton, delay); connect(&progress, SIGNAL(canceled()), SLOT(exitLoopSlot())); const int timeout = 3; QTestEventLoop::instance().enterLoop(timeout); QVERIFY(QTestEventLoop::instance().timeout() == false);}class PrimaryWindowDialog : public QDialog{Q_OBJECTpublic: PrimaryWindowDialog(); QWidget *secondaryWindow; QWidget *frontWidget;public slots: void showSecondaryWindow(); void test();};PrimaryWindowDialog::PrimaryWindowDialog() : QDialog(0){ frontWidget = 0; secondaryWindow = new ColorWidget(this); secondaryWindow->setWindowFlags(Qt::Window); secondaryWindow->resize(400, 400); secondaryWindow->move(100, 100); QTimer::singleShot(1000, this, SLOT(showSecondaryWindow())); QTimer::singleShot(2000, this, SLOT(test())); QTimer::singleShot(3000, this, SLOT(close()));}void PrimaryWindowDialog::showSecondaryWindow(){ secondaryWindow->show();}void PrimaryWindowDialog::test(){ frontWidget = QApplication::widgetAt(secondaryWindow->mapToGlobal(QPoint(100, 100)));}/* Test that a non-modal child window of a modal dialog is shown in front of the dialog even if the dialog becomes modal after the child window is created.*/void tst_MacGui::nonModalOrder(){ clearSequence(); PrimaryWindowDialog primary; primary.resize(400, 400); primary.move(100, 100); primary.exec(); QCOMPARE(primary.frontWidget, primary.secondaryWindow);}/* Test that the QSpinBox buttons are correctly positioned with the Mac style.*/void tst_MacGui::spinBoxArrowButtons(){ ColorWidget colorWidget; colorWidget.resize(200, 200); QSpinBox spinBox(&colorWidget); QSpinBox spinBox2(&colorWidget); spinBox2.move(0, 100); colorWidget.show(); QTest::qWait(100); // Grab an unfocused spin box. const QImage noFocus = grabWindowContents(&colorWidget).toImage(); // Set focus by clicking the less button. InterfaceChildPair lessInterface = wn.find(QAccessible::Name, "Less", &spinBox); QVERIFY(lessInterface.iface); const int delay = 500; clickLater(lessInterface, Qt::LeftButton, delay); const int timeout = 1; QTestEventLoop::instance().enterLoop(timeout); // Grab a focused spin box. const QImage focus = grabWindowContents(&colorWidget).toImage(); // Compare the arrow area of the less button to see if it moved. const QRect lessRect = lessInterface.iface->rect(lessInterface.possibleChild); const QRect lessLocalRect(colorWidget.mapFromGlobal(lessRect.topLeft()), colorWidget.mapFromGlobal(lessRect.bottomRight())); const QRect compareRect = lessLocalRect.adjusted(5, 3, -5, -7); QVERIFY(noFocus.copy(compareRect) == focus.copy(compareRect));}QTEST_MAIN(tst_MacGui)#elseQTEST_NOOP_MAIN#endif#include "tst_macgui.moc"