| 1 |
/**************************************************************************** |
| 2 |
** |
| 3 |
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). |
| 4 |
** All rights reserved. |
| 5 |
** Contact: Nokia Corporation (qt-info@nokia.com) |
| 6 |
** |
| 7 |
** This file is part of the test suite of the Qt Toolkit. |
| 8 |
** |
| 9 |
** $QT_BEGIN_LICENSE:LGPL$ |
| 10 |
** GNU Lesser General Public License Usage |
| 11 |
** This file may be used under the terms of the GNU Lesser General Public |
| 12 |
** License version 2.1 as published by the Free Software Foundation and |
| 13 |
** appearing in the file LICENSE.LGPL included in the packaging of this |
| 14 |
** file. Please review the following information to ensure the GNU Lesser |
| 15 |
** General Public License version 2.1 requirements will be met: |
| 16 |
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
| 17 |
** |
| 18 |
** In addition, as a special exception, Nokia gives you certain additional |
| 19 |
** rights. These rights are described in the Nokia Qt LGPL Exception |
| 20 |
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
| 21 |
** |
| 22 |
** GNU General Public License Usage |
| 23 |
** Alternatively, this file may be used under the terms of the GNU General |
| 24 |
** Public License version 3.0 as published by the Free Software Foundation |
| 25 |
** and appearing in the file LICENSE.GPL included in the packaging of this |
| 26 |
** file. Please review the following information to ensure the GNU General |
| 27 |
** Public License version 3.0 requirements will be met: |
| 28 |
** http://www.gnu.org/copyleft/gpl.html. |
| 29 |
** |
| 30 |
** Other Usage |
| 31 |
** Alternatively, this file may be used in accordance with the terms and |
| 32 |
** conditions contained in a signed written agreement between you and Nokia. |
| 33 |
** |
| 34 |
** |
| 35 |
** |
| 36 |
** |
| 37 |
** |
| 38 |
** $QT_END_LICENSE$ |
| 39 |
** |
| 40 |
****************************************************************************/ |
| 41 |
|
| 42 |
|
| 43 |
#include <QApplication> |
| 44 |
#include <QMessageBox> |
| 45 |
#include <QtTest/QtTest> |
| 46 |
#include <QSplashScreen> |
| 47 |
#include <QScrollBar> |
| 48 |
#include <QProgressDialog> |
| 49 |
#include <QSpinBox> |
| 50 |
|
| 51 |
#include <guitest.h> |
| 52 |
|
| 53 |
#ifdef Q_OS_MAC |
| 54 |
|
| 55 |
class tst_MacGui : public GuiTester |
| 56 |
{ |
| 57 |
Q_OBJECT |
| 58 |
private slots: |
| 59 |
void scrollbarPainting(); |
| 60 |
|
| 61 |
void dummy(); |
| 62 |
void splashScreenModality(); |
| 63 |
void nonModalOrder(); |
| 64 |
|
| 65 |
void spinBoxArrowButtons(); |
| 66 |
}; |
| 67 |
|
| 68 |
|
| 69 |
QPixmap grabWindowContents(QWidget * widget) |
| 70 |
{ |
| 71 |
return QPixmap::grabWindow(widget->winId()); |
| 72 |
} |
| 73 |
|
| 74 |
/* |
| 75 |
Test that vertical and horizontal mac-style scrollbars paint their |
| 76 |
entire area. |
| 77 |
*/ |
| 78 |
void tst_MacGui::scrollbarPainting() |
| 79 |
{ |
| 80 |
ColorWidget colorWidget; |
| 81 |
colorWidget.resize(400, 400); |
| 82 |
|
| 83 |
QSize scrollBarSize; |
| 84 |
|
| 85 |
QScrollBar verticalScrollbar(&colorWidget); |
| 86 |
verticalScrollbar.move(10, 10); |
| 87 |
scrollBarSize = verticalScrollbar.sizeHint(); |
| 88 |
scrollBarSize.setHeight(200); |
| 89 |
verticalScrollbar.resize(scrollBarSize); |
| 90 |
|
| 91 |
QScrollBar horizontalScrollbar(&colorWidget); |
| 92 |
horizontalScrollbar.move(30, 10); |
| 93 |
horizontalScrollbar.setOrientation(Qt::Horizontal); |
| 94 |
scrollBarSize = horizontalScrollbar.sizeHint(); |
| 95 |
scrollBarSize.setWidth(200); |
| 96 |
horizontalScrollbar.resize(scrollBarSize); |
| 97 |
|
| 98 |
colorWidget.show(); |
| 99 |
colorWidget.raise(); |
| 100 |
QTest::qWait(100); |
| 101 |
|
| 102 |
QPixmap pixmap = grabWindowContents(&colorWidget); |
| 103 |
|
| 104 |
QVERIFY(isContent(pixmap.toImage(), verticalScrollbar.geometry(), GuiTester::Horizontal)); |
| 105 |
QVERIFY(isContent(pixmap.toImage(), horizontalScrollbar.geometry(), GuiTester::Vertical)); |
| 106 |
} |
| 107 |
|
| 108 |
// When running the auto-tests on scruffy, the first enter-the-event-loop-and-wait-for-a-click |
| 109 |
// test that runs always times out, so we have this dummy test. |
| 110 |
void tst_MacGui::dummy() |
| 111 |
{ |
| 112 |
QPixmap pix(100, 100); |
| 113 |
QSplashScreen splash(pix); |
| 114 |
splash.show(); |
| 115 |
|
| 116 |
QMessageBox *box = new QMessageBox(); |
| 117 |
box->setText("accessible?"); |
| 118 |
box->show(); |
| 119 |
|
| 120 |
// Find the "OK" button and schedule a press. |
| 121 |
InterfaceChildPair interface = wn.find(QAccessible::Name, "OK", box); |
| 122 |
QVERIFY(interface.iface); |
| 123 |
const int delay = 1000; |
| 124 |
clickLater(interface, Qt::LeftButton, delay); |
| 125 |
|
| 126 |
// Show dialog and and enter event loop. |
| 127 |
connect(wn.getWidget(interface), SIGNAL(clicked()), SLOT(exitLoopSlot())); |
| 128 |
const int timeout = 4; |
| 129 |
QTestEventLoop::instance().enterLoop(timeout); |
| 130 |
} |
| 131 |
|
| 132 |
/* |
| 133 |
Test that a message box pops up in front of a QSplashScreen. |
| 134 |
*/ |
| 135 |
void tst_MacGui::splashScreenModality() |
| 136 |
{ |
| 137 |
QPixmap pix(300, 300); |
| 138 |
QSplashScreen splash(pix); |
| 139 |
splash.show(); |
| 140 |
|
| 141 |
QMessageBox box; |
| 142 |
//box.setWindowFlags(box.windowFlags() | Qt::WindowStaysOnTopHint); |
| 143 |
box.setText("accessible?"); |
| 144 |
box.show(); |
| 145 |
|
| 146 |
// Find the "OK" button and schedule a press. |
| 147 |
InterfaceChildPair interface = wn.find(QAccessible::Name, "OK", &box); |
| 148 |
QVERIFY(interface.iface); |
| 149 |
const int delay = 1000; |
| 150 |
clickLater(interface, Qt::LeftButton, delay); |
| 151 |
|
| 152 |
// Show dialog and and enter event loop. |
| 153 |
connect(wn.getWidget(interface), SIGNAL(clicked()), SLOT(exitLoopSlot())); |
| 154 |
const int timeout = 4; |
| 155 |
QTestEventLoop::instance().enterLoop(timeout); |
| 156 |
QVERIFY(QTestEventLoop::instance().timeout() == false); |
| 157 |
} |
| 158 |
|
| 159 |
class PrimaryWindowDialog : public QDialog |
| 160 |
{ |
| 161 |
Q_OBJECT |
| 162 |
public: |
| 163 |
PrimaryWindowDialog(); |
| 164 |
QWidget *secondaryWindow; |
| 165 |
QWidget *frontWidget; |
| 166 |
public slots: |
| 167 |
void showSecondaryWindow(); |
| 168 |
void test(); |
| 169 |
}; |
| 170 |
|
| 171 |
PrimaryWindowDialog::PrimaryWindowDialog() : QDialog(0) |
| 172 |
{ |
| 173 |
frontWidget = 0; |
| 174 |
secondaryWindow = new ColorWidget(this); |
| 175 |
secondaryWindow->setWindowFlags(Qt::Window); |
| 176 |
secondaryWindow->resize(400, 400); |
| 177 |
secondaryWindow->move(100, 100); |
| 178 |
QTimer::singleShot(1000, this, SLOT(showSecondaryWindow())); |
| 179 |
QTimer::singleShot(2000, this, SLOT(test())); |
| 180 |
QTimer::singleShot(3000, this, SLOT(close())); |
| 181 |
} |
| 182 |
|
| 183 |
void PrimaryWindowDialog::showSecondaryWindow() |
| 184 |
{ |
| 185 |
secondaryWindow->show(); |
| 186 |
} |
| 187 |
|
| 188 |
void PrimaryWindowDialog::test() |
| 189 |
{ |
| 190 |
frontWidget = QApplication::widgetAt(secondaryWindow->mapToGlobal(QPoint(100, 100))); |
| 191 |
} |
| 192 |
|
| 193 |
/* |
| 194 |
Test that a non-modal child window of a modal dialog is shown in front |
| 195 |
of the dialog even if the dialog becomes modal after the child window |
| 196 |
is created. |
| 197 |
*/ |
| 198 |
void tst_MacGui::nonModalOrder() |
| 199 |
{ |
| 200 |
clearSequence(); |
| 201 |
PrimaryWindowDialog primary; |
| 202 |
primary.resize(400, 400); |
| 203 |
primary.move(100, 100); |
| 204 |
primary.exec(); |
| 205 |
QCOMPARE(primary.frontWidget, primary.secondaryWindow); |
| 206 |
} |
| 207 |
|
| 208 |
/* |
| 209 |
Test that the QSpinBox buttons are correctly positioned with the Mac style. |
| 210 |
*/ |
| 211 |
void tst_MacGui::spinBoxArrowButtons() |
| 212 |
{ |
| 213 |
ColorWidget colorWidget; |
| 214 |
colorWidget.resize(200, 200); |
| 215 |
QSpinBox spinBox(&colorWidget); |
| 216 |
QSpinBox spinBox2(&colorWidget); |
| 217 |
spinBox2.move(0, 100); |
| 218 |
colorWidget.show(); |
| 219 |
QTest::qWait(100); |
| 220 |
|
| 221 |
// Grab an unfocused spin box. |
| 222 |
const QImage noFocus = grabWindowContents(&colorWidget).toImage(); |
| 223 |
|
| 224 |
// Set focus by clicking the less button. |
| 225 |
InterfaceChildPair lessInterface = wn.find(QAccessible::Name, "Less", &spinBox); |
| 226 |
QVERIFY(lessInterface.iface); |
| 227 |
const int delay = 500; |
| 228 |
clickLater(lessInterface, Qt::LeftButton, delay); |
| 229 |
const int timeout = 1; |
| 230 |
QTestEventLoop::instance().enterLoop(timeout); |
| 231 |
|
| 232 |
// Grab a focused spin box. |
| 233 |
const QImage focus = grabWindowContents(&colorWidget).toImage(); |
| 234 |
|
| 235 |
// Compare the arrow area of the less button to see if it moved. |
| 236 |
const QRect lessRect = lessInterface.iface->rect(lessInterface.possibleChild); |
| 237 |
const QRect lessLocalRect(colorWidget.mapFromGlobal(lessRect.topLeft()), colorWidget.mapFromGlobal(lessRect.bottomRight())); |
| 238 |
const QRect compareRect = lessLocalRect.adjusted(5, 3, -5, -7); |
| 239 |
QVERIFY(noFocus.copy(compareRect) == focus.copy(compareRect)); |
| 240 |
} |
| 241 |
|
| 242 |
QTEST_MAIN(tst_MacGui) |
| 243 |
|
| 244 |
#else |
| 245 |
|
| 246 |
QTEST_NOOP_MAIN |
| 247 |
|
| 248 |
#endif |
| 249 |
|
| 250 |
#include "tst_macgui.moc" |