1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the test suite of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:GPL-EXCEPT$
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 The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU
19** General Public License version 3 as published by the Free Software
20** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21** included in the packaging of this file. Please review the following
22** information to ensure the GNU General Public License requirements will
23** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24**
25** $QT_END_LICENSE$
26**
27****************************************************************************/
28
29
30#include <QtTest/QtTest>
31
32
33#include <qstatusbar.h>
34#include <QLabel>
35#include <QMainWindow>
36#include <QSizeGrip>
37
38class tst_QStatusBar: public QObject
39{
40 Q_OBJECT
41
42protected slots:
43 void messageChanged(const QString&);
44
45private slots:
46 void init();
47 void cleanup();
48
49 void tempMessage();
50 void insertWidget();
51 void insertPermanentWidget();
52 void setSizeGripEnabled();
53 void task194017_hiddenWidget();
54 void QTBUG4334_hiddenOnMaximizedWindow();
55 void QTBUG25492_msgtimeout();
56 void messageChangedSignal();
57
58private:
59 QStatusBar *testWidget;
60 QString currentMessage;
61};
62
63void tst_QStatusBar::init()
64{
65 testWidget = new QStatusBar;
66 connect(sender: testWidget, SIGNAL(messageChanged(QString)), receiver: this, SLOT(messageChanged(QString)));
67
68 QWidget *item1 = new QWidget(testWidget);
69 testWidget->addWidget(widget: item1);
70 // currentMessage needs to be null as the code relies on this
71 currentMessage = QString();
72}
73
74void tst_QStatusBar::cleanup()
75{
76 delete testWidget;
77}
78
79void tst_QStatusBar::messageChanged(const QString &m)
80{
81 currentMessage = m;
82}
83
84void tst_QStatusBar::tempMessage()
85{
86 QVERIFY(testWidget->currentMessage().isNull());
87 QVERIFY(currentMessage.isNull());
88
89 testWidget->showMessage(text: "Ready", timeout: 500);
90 QCOMPARE(testWidget->currentMessage(), QString("Ready"));
91 QCOMPARE(testWidget->currentMessage(), currentMessage);
92
93 QTRY_VERIFY(testWidget->currentMessage().isNull());
94 QVERIFY(currentMessage.isNull());
95
96 testWidget->showMessage(text: "Ready again", timeout: 500);
97 QCOMPARE(testWidget->currentMessage(), QString("Ready again"));
98 QCOMPARE(testWidget->currentMessage(), currentMessage);
99
100 testWidget->clearMessage();
101 QVERIFY(testWidget->currentMessage().isNull());
102 QVERIFY(currentMessage.isNull());
103}
104
105void tst_QStatusBar::insertWidget()
106{
107 QStatusBar sb;
108 sb.addPermanentWidget(widget: new QLabel("foo"));
109 QTest::ignoreMessage(type: QtWarningMsg, message: "QStatusBar::insertWidget: Index out of range (-1), appending widget");
110 QCOMPARE(sb.insertWidget(-1, new QLabel("foo")), 0);
111 QTest::ignoreMessage(type: QtWarningMsg, message: "QStatusBar::insertWidget: Index out of range (2), appending widget");
112 QCOMPARE(sb.insertWidget(2, new QLabel("foo")), 1);
113 QCOMPARE(sb.insertWidget(0, new QLabel("foo")), 0);
114 QCOMPARE(sb.insertWidget(3, new QLabel("foo")), 3);
115}
116
117void tst_QStatusBar::insertPermanentWidget()
118{
119 QStatusBar sb;
120 sb.addWidget(widget: new QLabel("foo"));
121 QTest::ignoreMessage(type: QtWarningMsg, message: "QStatusBar::insertPermanentWidget: Index out of range (-1), appending widget");
122 QCOMPARE(sb.insertPermanentWidget(-1, new QLabel("foo")), 1);
123 QTest::ignoreMessage(type: QtWarningMsg, message: "QStatusBar::insertPermanentWidget: Index out of range (0), appending widget");
124 QCOMPARE(sb.insertPermanentWidget(0, new QLabel("foo")), 2);
125 QCOMPARE(sb.insertPermanentWidget(2, new QLabel("foo")), 2);
126 QTest::ignoreMessage(type: QtWarningMsg, message: "QStatusBar::insertPermanentWidget: Index out of range (5), appending widget");
127 QCOMPARE(sb.insertPermanentWidget(5, new QLabel("foo")), 4);
128 QCOMPARE(sb.insertWidget(1, new QLabel("foo")), 1);
129 QTest::ignoreMessage(type: QtWarningMsg, message: "QStatusBar::insertPermanentWidget: Index out of range (1), appending widget");
130 QCOMPARE(sb.insertPermanentWidget(1, new QLabel("foo")), 6);
131}
132
133void tst_QStatusBar::setSizeGripEnabled()
134{
135 if (QGuiApplication::platformName().startsWith(s: QLatin1String("wayland"), cs: Qt::CaseInsensitive))
136 QSKIP("Wayland: This fails. Figure out why.");
137
138 QMainWindow mainWindow;
139 QPointer<QStatusBar> statusBar = mainWindow.statusBar();
140 QVERIFY(statusBar);
141 mainWindow.show();
142 QVERIFY(QTest::qWaitForWindowExposed(&mainWindow));
143
144 QTRY_VERIFY(statusBar->isVisible());
145 QPointer<QSizeGrip> sizeGrip = statusBar->findChild<QSizeGrip *>();
146 QVERIFY(sizeGrip);
147#ifdef Q_OS_WINRT
148 QEXPECT_FAIL("", "Fails on WinRT - QTBUG-68297", Abort);
149#endif
150 QVERIFY(sizeGrip->isVisible());
151
152 statusBar->setSizeGripEnabled(true);
153 QVERIFY(sizeGrip);
154 QVERIFY(sizeGrip->isVisible());
155
156 statusBar->hide();
157 QVERIFY(!sizeGrip->isVisible());
158 statusBar->show();
159 QVERIFY(sizeGrip->isVisible());
160
161 sizeGrip->setVisible(false);
162 QVERIFY(!sizeGrip->isVisible());
163 statusBar->hide();
164 statusBar->show();
165 QVERIFY(!sizeGrip->isVisible());
166
167 statusBar->setSizeGripEnabled(false);
168 QVERIFY(!sizeGrip);
169
170 qApp->processEvents();
171#ifndef Q_OS_MAC // Work around Lion fullscreen issues on CI system - QTQAINFRA-506
172 mainWindow.showFullScreen();
173#endif
174 QVERIFY(QTest::qWaitForWindowExposed(&mainWindow));
175 qApp->processEvents();
176
177 mainWindow.setStatusBar(new QStatusBar(&mainWindow));
178 //we now call deleteLater on the previous statusbar
179 QCoreApplication::sendPostedEvents(receiver: 0, event_type: QEvent::DeferredDelete);
180 QVERIFY(!statusBar);
181 statusBar = mainWindow.statusBar();
182 QVERIFY(statusBar);
183
184 sizeGrip = statusBar->findChild<QSizeGrip *>();
185 QVERIFY(sizeGrip);
186 QVERIFY(!sizeGrip->isVisible());
187
188 statusBar->setSizeGripEnabled(true);
189 QVERIFY(!sizeGrip->isVisible());
190
191 qApp->processEvents();
192#ifndef Q_OS_MAC
193 mainWindow.showNormal();
194#endif
195 qApp->processEvents();
196 QTRY_VERIFY(sizeGrip->isVisible());
197}
198
199void tst_QStatusBar::task194017_hiddenWidget()
200{
201 QStatusBar sb;
202
203 QWidget *label= new QLabel("bar",&sb);
204 sb.addWidget(widget: label);
205 sb.show();
206 QVERIFY(label->isVisible());
207 sb.showMessage(text: "messssage");
208 QVERIFY(!label->isVisible());
209 sb.hide();
210 QVERIFY(!label->isVisible());
211 sb.show();
212 QVERIFY(!label->isVisible());
213 sb.clearMessage();
214 QVERIFY(label->isVisible());
215 label->hide();
216 QVERIFY(!label->isVisible());
217 sb.showMessage(text: "messssage");
218 QVERIFY(!label->isVisible());
219 sb.clearMessage();
220 QVERIFY(!label->isVisible());
221 sb.hide();
222 QVERIFY(!label->isVisible());
223 sb.show();
224 QVERIFY(!label->isVisible());
225}
226
227void tst_QStatusBar::QTBUG4334_hiddenOnMaximizedWindow()
228{
229 if (QGuiApplication::platformName().startsWith(s: QLatin1String("wayland"), cs: Qt::CaseInsensitive))
230 QSKIP("Wayland: This fails. Figure out why.");
231
232 QMainWindow main;
233 QStatusBar statusbar;
234 statusbar.setSizeGripEnabled(true);
235 main.setStatusBar(&statusbar);
236 main.showMaximized();
237 QVERIFY(QTest::qWaitForWindowActive(&main));
238#ifndef Q_OS_MAC
239 QVERIFY(!statusbar.findChild<QSizeGrip*>()->isVisible());
240#endif
241 main.showNormal();
242 QVERIFY(QTest::qWaitForWindowExposed(&main));
243 QVERIFY(statusbar.findChild<QSizeGrip*>()->isVisible());
244 main.showFullScreen();
245 QVERIFY(QTest::qWaitForWindowExposed(&main));
246 QVERIFY(!statusbar.findChild<QSizeGrip*>()->isVisible());
247}
248
249void tst_QStatusBar::QTBUG25492_msgtimeout()
250{
251 QVERIFY(testWidget->currentMessage().isNull());
252 QVERIFY(currentMessage.isNull());
253 testWidget->show();
254
255 // Set display message forever first
256 testWidget->showMessage(text: "Ready", timeout: 0);
257 QCOMPARE(testWidget->currentMessage(), QString("Ready"));
258 QCOMPARE(testWidget->currentMessage(), currentMessage);
259
260 // Set display message for 2 seconds
261 QElapsedTimer t;
262 t.start();
263 testWidget->showMessage(text: "Ready 2000", timeout: 2000);
264 QCOMPARE(testWidget->currentMessage(), QString("Ready 2000"));
265 QCOMPARE(testWidget->currentMessage(), currentMessage);
266
267 // Message disappears after 2 seconds
268 QTRY_VERIFY(testWidget->currentMessage().isNull());
269 qint64 ts = t.elapsed();
270
271 // XXX: ideally ts should be 2000, but sometimes it appears to go away early, probably due to timer granularity.
272 QVERIFY2(ts >= 1800, qPrintable("Timer was " + QString::number(ts)));
273 if (ts < 2000)
274 qWarning(msg: "QTBUG25492_msgtimeout: message vanished early, should be >= 2000, was %lld", ts);
275 QVERIFY(currentMessage.isNull());
276
277 // Set display message for 2 seconds first
278 testWidget->showMessage(text: "Ready 25492", timeout: 2000);
279 QCOMPARE(testWidget->currentMessage(), QString("Ready 25492"));
280 QCOMPARE(testWidget->currentMessage(), currentMessage);
281
282 // Set display message forever again
283 testWidget->showMessage(text: "Ready 25492", timeout: 0);
284 QCOMPARE(testWidget->currentMessage(), QString("Ready 25492"));
285 QCOMPARE(testWidget->currentMessage(), currentMessage);
286
287 QTest::qWait(ms: 3000);
288
289 // Message displays forever
290 QCOMPARE(testWidget->currentMessage(), QString("Ready 25492"));
291 QCOMPARE(testWidget->currentMessage(), currentMessage);
292}
293
294void tst_QStatusBar::messageChangedSignal()
295{
296 QVERIFY(testWidget->currentMessage().isNull());
297 QVERIFY(currentMessage.isNull());
298 testWidget->show();
299
300 QSignalSpy spy(testWidget, SIGNAL(messageChanged(QString)));
301 testWidget->showMessage(text: "Ready", timeout: 0);
302 QCOMPARE(testWidget->currentMessage(), QString("Ready"));
303 QCOMPARE(testWidget->currentMessage(), currentMessage);
304 QCOMPARE(spy.count(), 1);
305 QCOMPARE(spy.takeFirst().at(0).toString(), currentMessage);
306 testWidget->clearMessage();
307 QCOMPARE(testWidget->currentMessage(), QString());
308 QCOMPARE(testWidget->currentMessage(), currentMessage);
309 QCOMPARE(spy.count(), 1);
310 QCOMPARE(spy.takeFirst().at(0).toString(), currentMessage);
311 testWidget->showMessage(text: "Ready", timeout: 0);
312 testWidget->showMessage(text: "Ready", timeout: 0);
313 QCOMPARE(testWidget->currentMessage(), QString("Ready"));
314 QCOMPARE(testWidget->currentMessage(), currentMessage);
315 QCOMPARE(spy.count(), 1);
316 QCOMPARE(spy.takeFirst().at(0).toString(), currentMessage);
317}
318
319QTEST_MAIN(tst_QStatusBar)
320#include "tst_qstatusbar.moc"
321

source code of qtbase/tests/auto/widgets/widgets/qstatusbar/tst_qstatusbar.cpp