1
/****************************************************************************
3
** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
4
** Contact: http://www.qt-project.org/legal
6
** This file is part of the test suite of the Qt Toolkit.
8
** $QT_BEGIN_LICENSE:LGPL$
9
** Commercial License Usage
10
** Licensees holding valid commercial Qt licenses may use this file in
11
** accordance with the commercial license agreement provided with the
12
** Software or, alternatively, in accordance with the terms contained in
13
** a written agreement between you and Digia. For licensing terms and
14
** conditions see http://qt.digia.com/licensing. For further information
15
** use the contact form at http://qt.digia.com/contact-us.
17
** GNU Lesser General Public License Usage
18
** Alternatively, this file may be used under the terms of the GNU Lesser
19
** General Public License version 2.1 as published by the Free Software
20
** Foundation and appearing in the file LICENSE.LGPL included in the
21
** packaging of this file. Please review the following information to
22
** ensure the GNU Lesser General Public License version 2.1 requirements
23
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25
** In addition, as a special exception, Digia gives you certain additional
26
** rights. These rights are described in the Digia Qt LGPL Exception
27
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29
** GNU General Public License Usage
30
** Alternatively, this file may be used under the terms of the GNU
31
** General Public License version 3.0 as published by the Free Software
32
** Foundation and appearing in the file LICENSE.GPL included in the
33
** packaging of this file. Please review the following information to
34
** ensure the GNU General Public License version 3.0 requirements will be
35
** met: http://www.gnu.org/copyleft/gpl.html.
40
****************************************************************************/
43
#include <QtTest/QtTest>
46
#include <qapplication.h>
47
#include <qlineedit.h>
48
#include <qpushbutton.h>
50
#include <QVBoxLayout>
55
QT_FORWARD_DECLARE_CLASS(QDialog)
57
class tst_QDialog : public QObject
65
void cleanupTestCase();
68
void showExtension_data();
70
void defaultButtons();
73
void showFullScreen();
76
void toolDialogPosition();
78
void deleteMainDefault();
80
#ifndef QT_NO_SIZEGRIP
90
// Testing get/set functions
91
void tst_QDialog::getSetCheck()
94
// QWidget* QDialog::extension()
95
// void QDialog::setExtension(QWidget*)
96
QWidget *var1 = new QWidget;
97
obj1.setExtension(var1);
98
QCOMPARE(var1, obj1.extension());
99
obj1.setExtension((QWidget *)0);
100
QCOMPARE((QWidget *)0, obj1.extension());
101
// No delete var1, since setExtension takes ownership
103
// int QDialog::result()
104
// void QDialog::setResult(int)
106
QCOMPARE(0, obj1.result());
107
obj1.setResult(INT_MIN);
108
QCOMPARE(INT_MIN, obj1.result());
109
obj1.setResult(INT_MAX);
110
QCOMPARE(INT_MAX, obj1.result());
113
// work around function being protected
114
class DummyDialog : public QDialog {
116
DummyDialog(): QDialog(0) {}
117
void showExtension( bool b ) { QDialog::showExtension( b ); }
120
class ToolDialog : public QDialog
123
ToolDialog(QWidget *parent = 0) : QDialog(parent, Qt::Tool), mWasActive(false), tId(-1) {
125
bool wasActive() const { return mWasActive; }
128
tId = startTimer(300);
129
return QDialog::exec();
132
void timerEvent(QTimerEvent *event) {
133
if (tId == event->timerId()) {
135
mWasActive = isActiveWindow();
145
tst_QDialog::tst_QDialog()
150
void tst_QDialog::initTestCase()
152
// Create the test class
153
testWidget = new QDialog(0, Qt::X11BypassWindowManagerHint);
154
testWidget->resize(200,200);
156
qApp->setActiveWindow(testWidget);
159
void tst_QDialog::cleanupTestCase()
167
void tst_QDialog::showExtension_data()
169
QTest::addColumn<QSize>("dlgSize");
170
QTest::addColumn<QSize>("extSize");
171
QTest::addColumn<bool>("horizontal");
172
QTest::addColumn<QSize>("result");
174
//next we fill it with data
175
QTest::newRow( "data0" ) << QSize(200,100) << QSize(50,50) << false << QSize(200,150);
176
QTest::newRow( "data1" ) << QSize(200,100) << QSize(220,50) << false << QSize(220,150);
177
QTest::newRow( "data2" ) << QSize(200,100) << QSize(50,50) << true << QSize(250,100);
178
QTest::newRow( "data3" ) << QSize(200,100) << QSize(50,120) << true << QSize(250,120);
181
void tst_QDialog::showExtension()
183
QFETCH( QSize, dlgSize );
184
QFETCH( QSize, extSize );
185
QFETCH( bool, horizontal );
187
// set geometry of main dialog and extension widget
188
testWidget->setFixedSize( dlgSize );
189
QWidget *ext = new QWidget( testWidget );
190
ext->setFixedSize( extSize );
191
testWidget->setExtension( ext );
192
testWidget->setOrientation( horizontal ? Qt::Horizontal : Qt::Vertical );
194
QCOMPARE( testWidget->size(), dlgSize );
195
QPoint oldPosition = testWidget->pos();
198
((DummyDialog*)testWidget)->showExtension( true );
199
// while ( testWidget->size() == dlgSize )
200
// qApp->processEvents();
202
QTEST( testWidget->size(), "result" );
204
QCOMPARE(testWidget->pos(), oldPosition);
206
// hide extension. back to old size ?
207
((DummyDialog*)testWidget)->showExtension( false );
208
QCOMPARE( testWidget->size(), dlgSize );
210
testWidget->setExtension( 0 );
213
void tst_QDialog::defaultButtons()
215
QLineEdit *lineEdit = new QLineEdit(testWidget);
216
QPushButton *push = new QPushButton("Button 1", testWidget);
217
QPushButton *pushTwo = new QPushButton("Button 2", testWidget);
218
QPushButton *pushThree = new QPushButton("Button 3", testWidget);
219
pushThree->setAutoDefault(false);
221
//we need to show the buttons. Otherwise they won't get the focus
226
push->setDefault(true);
227
QVERIFY(push->isDefault());
230
QVERIFY(pushTwo->isDefault());
231
pushThree->setFocus();
232
QVERIFY(push->isDefault());
233
lineEdit->setFocus();
234
QVERIFY(push->isDefault());
236
pushTwo->setDefault(true);
237
QVERIFY(pushTwo->isDefault());
240
QVERIFY(pushTwo->isDefault());
241
lineEdit->setFocus();
242
QVERIFY(pushTwo->isDefault());
245
void tst_QDialog::showMaximized()
248
dialog.setSizeGripEnabled(true);
249
#ifndef QT_NO_SIZEGRIP
250
QSizeGrip *sizeGrip = qFindChild<QSizeGrip *>(&dialog);
254
dialog.showMaximized();
255
QVERIFY(dialog.isMaximized());
256
QVERIFY(dialog.isVisible());
257
#if !defined(QT_NO_SIZEGRIP) && !defined(Q_OS_MAC) && !defined(Q_OS_IRIX) && !defined(Q_OS_HPUX)
258
QVERIFY(!sizeGrip->isVisible());
262
QVERIFY(!dialog.isMaximized());
263
QVERIFY(dialog.isVisible());
264
#ifndef QT_NO_SIZEGRIP
265
QVERIFY(sizeGrip->isVisible());
268
dialog.showMaximized();
269
QVERIFY(dialog.isMaximized());
270
QVERIFY(dialog.isVisible());
273
QVERIFY(dialog.isMaximized());
274
QVERIFY(!dialog.isVisible());
277
QVERIFY(dialog.isMaximized());
278
QVERIFY(dialog.isVisible());
281
QVERIFY(dialog.isMaximized());
282
QVERIFY(!dialog.isVisible());
284
dialog.showMaximized();
285
QVERIFY(dialog.isMaximized());
286
QVERIFY(dialog.isVisible());
289
void tst_QDialog::showMinimized()
293
dialog.showMinimized();
294
QVERIFY(dialog.isMinimized());
295
QVERIFY(dialog.isVisible());
298
QVERIFY(!dialog.isMinimized());
299
QVERIFY(dialog.isVisible());
301
dialog.showMinimized();
302
QVERIFY(dialog.isMinimized());
303
QVERIFY(dialog.isVisible());
306
QVERIFY(dialog.isMinimized());
307
QVERIFY(!dialog.isVisible());
310
QVERIFY(dialog.isMinimized());
311
QVERIFY(dialog.isVisible());
314
QVERIFY(dialog.isMinimized());
315
QVERIFY(!dialog.isVisible());
317
dialog.showMinimized();
318
QVERIFY(dialog.isMinimized());
319
QVERIFY(dialog.isVisible());
322
void tst_QDialog::showFullScreen()
324
QDialog dialog(0, Qt::X11BypassWindowManagerHint);
325
dialog.setSizeGripEnabled(true);
326
#ifndef QT_NO_SIZEGRIP
327
QSizeGrip *sizeGrip = qFindChild<QSizeGrip *>(&dialog);
332
dialog.showFullScreen();
333
QVERIFY(dialog.isFullScreen());
334
QVERIFY(dialog.isVisible());
335
#ifndef QT_NO_SIZEGRIP
336
QVERIFY(!sizeGrip->isVisible());
341
QVERIFY(!dialog.isFullScreen());
342
QVERIFY(dialog.isVisible());
343
#ifndef QT_NO_SIZEGRIP
344
QVERIFY(sizeGrip->isVisible());
348
dialog.showFullScreen();
349
QVERIFY(dialog.isFullScreen());
350
QVERIFY(dialog.isVisible());
354
QVERIFY(dialog.isFullScreen());
355
QVERIFY(!dialog.isVisible());
359
QVERIFY(dialog.isFullScreen());
360
QVERIFY(dialog.isVisible());
364
QVERIFY(dialog.isFullScreen());
365
QVERIFY(!dialog.isVisible());
368
dialog.showFullScreen();
369
QVERIFY(dialog.isFullScreen());
370
QVERIFY(dialog.isVisible());
374
QVERIFY(dialog.isFullScreen());
375
QVERIFY(!dialog.isVisible());
378
// No real support for Qt::Tool on WinCE
380
void tst_QDialog::showAsTool()
382
#if defined(Q_OS_UNIX)
383
QSKIP("Qt/X11: Skipped since activeWindow() is not respected by all window managers");
385
ToolDialog dialog(testWidget);
386
testWidget->activateWindow();
389
if (testWidget->style()->styleHint(QStyle::SH_Widget_ShareActivation, 0, testWidget)) {
390
QCOMPARE(dialog.wasActive(), true);
392
QCOMPARE(dialog.wasActive(), false);
397
// No real support for Qt::Tool on WinCE
399
// Verify that pos() returns the same before and after show()
400
// for a dialog with the Tool window type.
401
void tst_QDialog::toolDialogPosition()
403
QDialog dialog(0, Qt::Tool);
404
dialog.move(QPoint(100,100));
405
const QPoint beforeShowPosition = dialog.pos();
407
const QPoint afterShowPosition = dialog.pos();
408
QCOMPARE(afterShowPosition, beforeShowPosition);
412
class Dialog : public QDialog
415
Dialog(QPushButton *&button)
417
button = new QPushButton(this);
421
void tst_QDialog::deleteMainDefault()
424
Dialog dialog(button);
425
button->setDefault(true);
428
QTestEventLoop::instance().enterLoop(2);
431
void tst_QDialog::deleteInExec()
433
QDialog *dialog = new QDialog(0);
434
QMetaObject::invokeMethod(dialog, "deleteLater", Qt::QueuedConnection);
435
QCOMPARE(dialog->exec(), int(QDialog::Rejected));
438
#ifndef QT_NO_SIZEGRIP
440
void tst_QDialog::showSizeGrip()
444
QWidget *ext = new QWidget(&dialog);
445
QVERIFY(!dialog.extension());
446
QVERIFY(!dialog.isSizeGripEnabled());
448
dialog.setSizeGripEnabled(true);
449
QPointer<QSizeGrip> sizeGrip = qFindChild<QSizeGrip *>(&dialog);
451
QVERIFY(sizeGrip->isVisible());
452
QVERIFY(dialog.isSizeGripEnabled());
454
dialog.setExtension(ext);
455
QVERIFY(dialog.extension() && !dialog.extension()->isVisible());
456
QVERIFY(dialog.isSizeGripEnabled());
458
// normal show/hide sequence
459
dialog.showExtension(true);
460
QVERIFY(dialog.extension() && dialog.extension()->isVisible());
461
QVERIFY(!dialog.isSizeGripEnabled());
464
dialog.showExtension(false);
465
QVERIFY(dialog.extension() && !dialog.extension()->isVisible());
466
QVERIFY(dialog.isSizeGripEnabled());
467
sizeGrip = qFindChild<QSizeGrip *>(&dialog);
469
QVERIFY(sizeGrip->isVisible());
471
// show/hide sequence with interleaved size grip update
472
dialog.showExtension(true);
473
QVERIFY(dialog.extension() && dialog.extension()->isVisible());
474
QVERIFY(!dialog.isSizeGripEnabled());
477
dialog.setSizeGripEnabled(false);
478
QVERIFY(!dialog.isSizeGripEnabled());
480
dialog.showExtension(false);
481
QVERIFY(dialog.extension() && !dialog.extension()->isVisible());
482
QVERIFY(!dialog.isSizeGripEnabled());
484
dialog.setSizeGripEnabled(true);
485
sizeGrip = qFindChild<QSizeGrip *>(&dialog);
487
QVERIFY(sizeGrip->isVisible());
491
QVERIFY(!sizeGrip->isVisible());
495
void tst_QDialog::setVisible()
500
QDialog *dialog = new QDialog;
501
dialog->setLayout(new QVBoxLayout);
502
dialog->layout()->addWidget(new QPushButton("dialog button"));
504
QWidget *widget = new QWidget(&topLevel);
505
widget->setLayout(new QVBoxLayout);
506
widget->layout()->addWidget(dialog);
508
QVERIFY(!dialog->isVisible());
509
QVERIFY(!dialog->isHidden());
512
QVERIFY(dialog->isVisible());
513
QVERIFY(!dialog->isHidden());
518
QVERIFY(!dialog->isVisible());
519
QVERIFY(dialog->isHidden());
522
class TestRejectDialog : public QDialog
525
TestRejectDialog() : cancelReject(false), called(0) {}
536
void tst_QDialog::reject()
538
TestRejectDialog dialog;
540
QVERIFY(QTest::qWaitForWindowExposed(&dialog));
541
QVERIFY(dialog.isVisible());
543
QTRY_VERIFY(!dialog.isVisible());
544
QCOMPARE(dialog.called, 1);
547
QVERIFY(QTest::qWaitForWindowExposed(&dialog));
548
QVERIFY(dialog.isVisible());
549
QVERIFY(dialog.close());
550
QTRY_VERIFY(!dialog.isVisible());
551
QCOMPARE(dialog.called, 2);
553
dialog.cancelReject = true;
555
QVERIFY(QTest::qWaitForWindowExposed(&dialog));
556
QVERIFY(dialog.isVisible());
558
QTRY_VERIFY(dialog.isVisible());
559
QCOMPARE(dialog.called, 3);
560
QVERIFY(!dialog.close());
561
QTRY_VERIFY(dialog.isVisible());
562
QCOMPARE(dialog.called, 4);
566
QTEST_MAIN(tst_QDialog)
567
#include "tst_qdialog.moc"