|
1 /**************************************************************************** |
|
2 ** |
|
3 ** Copyright (C) 2009 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 ** No Commercial Usage |
|
11 ** This file contains pre-release code and may not be distributed. |
|
12 ** You may use this file in accordance with the terms and conditions |
|
13 ** contained in the Technology Preview License Agreement accompanying |
|
14 ** this package. |
|
15 ** |
|
16 ** GNU Lesser General Public License Usage |
|
17 ** Alternatively, this file may be used under the terms of the GNU Lesser |
|
18 ** General Public License version 2.1 as published by the Free Software |
|
19 ** Foundation and appearing in the file LICENSE.LGPL included in the |
|
20 ** packaging of this file. Please review the following information to |
|
21 ** ensure the GNU Lesser General Public License version 2.1 requirements |
|
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
|
23 ** |
|
24 ** In addition, as a special exception, Nokia gives you certain additional |
|
25 ** rights. These rights are described in the Nokia Qt LGPL Exception |
|
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
|
27 ** |
|
28 ** If you have questions regarding the use of this file, please contact |
|
29 ** Nokia at qt-info@nokia.com. |
|
30 ** |
|
31 ** |
|
32 ** |
|
33 ** |
|
34 ** |
|
35 ** |
|
36 ** |
|
37 ** |
|
38 ** $QT_END_LICENSE$ |
|
39 ** |
|
40 ****************************************************************************/ |
|
41 |
|
42 |
|
43 #include <QtTest/QtTest> |
|
44 |
|
45 #include <qcoreapplication.h> |
|
46 #include <qdebug.h> |
|
47 #include <qabstractscrollarea.h> |
|
48 #include <qscrollarea.h> |
|
49 #include <qscrollbar.h> |
|
50 #include <qlabel.h> |
|
51 #include <qwidget.h> |
|
52 #include <qdialog.h> |
|
53 |
|
54 //TESTED_CLASS= |
|
55 //TESTED_FILES= |
|
56 |
|
57 class tst_QAbstractScrollArea : public QObject |
|
58 { |
|
59 Q_OBJECT |
|
60 |
|
61 public: |
|
62 tst_QAbstractScrollArea(); |
|
63 virtual ~tst_QAbstractScrollArea(); |
|
64 private slots: |
|
65 void scrollBarWidgets(); |
|
66 void setScrollBars(); |
|
67 void setScrollBars2(); |
|
68 void objectNaming(); |
|
69 void patternBackground(); |
|
70 |
|
71 void viewportCrash(); |
|
72 void task214488_layoutDirection_data(); |
|
73 void task214488_layoutDirection(); |
|
74 }; |
|
75 |
|
76 tst_QAbstractScrollArea::tst_QAbstractScrollArea() |
|
77 { |
|
78 } |
|
79 |
|
80 tst_QAbstractScrollArea::~tst_QAbstractScrollArea() |
|
81 { |
|
82 } |
|
83 |
|
84 void tst_QAbstractScrollArea::scrollBarWidgets() |
|
85 { |
|
86 QWidget *w1 = new QWidget(0); |
|
87 QWidget *w2 = new QWidget(0); |
|
88 QWidget *w3 = new QWidget(0); |
|
89 |
|
90 Qt::Alignment all = Qt::AlignLeft | Qt::AlignRight | Qt::AlignTop | Qt::AlignBottom; |
|
91 |
|
92 QWidgetList w1List = QWidgetList() << w1; |
|
93 QWidgetList w2List = QWidgetList() << w2; |
|
94 QWidgetList w3List = QWidgetList() << w3; |
|
95 |
|
96 QWidgetList w1w2List = w1List + w2List; |
|
97 QWidgetList allList = w1List + w2List + w3List; |
|
98 |
|
99 QAbstractScrollArea area; |
|
100 area.show(); |
|
101 QCOMPARE(area.scrollBarWidgets(all), QWidgetList()); |
|
102 |
|
103 area.addScrollBarWidget(w1, Qt::AlignLeft); |
|
104 QCOMPARE(area.scrollBarWidgets(all), w1List); |
|
105 QCOMPARE(area.scrollBarWidgets(Qt::AlignLeft), w1List); |
|
106 QCOMPARE(area.scrollBarWidgets(Qt::AlignRight), QWidgetList()); |
|
107 QCOMPARE(area.scrollBarWidgets(Qt::AlignTop), QWidgetList()); |
|
108 QCOMPARE(area.scrollBarWidgets(Qt::AlignBottom), QWidgetList()); |
|
109 |
|
110 area.addScrollBarWidget(w2, Qt::AlignBottom); |
|
111 QCOMPARE(area.scrollBarWidgets(all), w1w2List); |
|
112 QCOMPARE(area.scrollBarWidgets(Qt::AlignLeft), w1List); |
|
113 QCOMPARE(area.scrollBarWidgets(Qt::AlignRight), QWidgetList()); |
|
114 QCOMPARE(area.scrollBarWidgets(Qt::AlignTop), QWidgetList()); |
|
115 QCOMPARE(area.scrollBarWidgets(Qt::AlignBottom), w2List); |
|
116 |
|
117 // duplicate add |
|
118 area.addScrollBarWidget(w2, Qt::AlignBottom); |
|
119 QCOMPARE(area.scrollBarWidgets(all), w1w2List); |
|
120 QCOMPARE(area.scrollBarWidgets(Qt::AlignLeft), w1List); |
|
121 QCOMPARE(area.scrollBarWidgets(Qt::AlignRight), QWidgetList()); |
|
122 QCOMPARE(area.scrollBarWidgets(Qt::AlignTop), QWidgetList()); |
|
123 QCOMPARE(area.scrollBarWidgets(Qt::AlignBottom), w2List); |
|
124 |
|
125 //reparent |
|
126 w2->setParent(w1); |
|
127 QCOMPARE(area.scrollBarWidgets(all), w1List); |
|
128 QCOMPARE(area.scrollBarWidgets(Qt::AlignLeft), w1List); |
|
129 QCOMPARE(area.scrollBarWidgets(Qt::AlignRight), QWidgetList()); |
|
130 QCOMPARE(area.scrollBarWidgets(Qt::AlignTop), QWidgetList()); |
|
131 QCOMPARE(area.scrollBarWidgets(Qt::AlignBottom), QWidgetList()); |
|
132 |
|
133 // add after reparent |
|
134 area.addScrollBarWidget(w2, Qt::AlignBottom); |
|
135 QCOMPARE(area.scrollBarWidgets(all), w1w2List); |
|
136 QCOMPARE(area.scrollBarWidgets(Qt::AlignLeft), w1List); |
|
137 QCOMPARE(area.scrollBarWidgets(Qt::AlignRight), QWidgetList()); |
|
138 QCOMPARE(area.scrollBarWidgets(Qt::AlignTop), QWidgetList()); |
|
139 QCOMPARE(area.scrollBarWidgets(Qt::AlignBottom), w2List); |
|
140 |
|
141 // two widgets at Bottom. |
|
142 area.addScrollBarWidget(w3, Qt::AlignBottom); |
|
143 QCOMPARE(area.scrollBarWidgets(all).toSet(), allList.toSet()); |
|
144 QCOMPARE(area.scrollBarWidgets(Qt::AlignLeft), w1List); |
|
145 QCOMPARE(area.scrollBarWidgets(Qt::AlignRight), QWidgetList()); |
|
146 QCOMPARE(area.scrollBarWidgets(Qt::AlignTop), QWidgetList()); |
|
147 QCOMPARE(area.scrollBarWidgets(Qt::AlignBottom).toSet(), (w2List + w3List).toSet()); |
|
148 |
|
149 //delete |
|
150 delete w1; |
|
151 delete w2; |
|
152 delete w3; |
|
153 |
|
154 QCOMPARE(area.scrollBarWidgets(all), QWidgetList()); |
|
155 QCOMPARE(area.scrollBarWidgets(Qt::AlignLeft), QWidgetList()); |
|
156 QCOMPARE(area.scrollBarWidgets(Qt::AlignRight), QWidgetList()); |
|
157 QCOMPARE(area.scrollBarWidgets(Qt::AlignTop), QWidgetList()); |
|
158 QCOMPARE(area.scrollBarWidgets(Qt::AlignBottom), QWidgetList()); |
|
159 } |
|
160 |
|
161 void tst_QAbstractScrollArea::setScrollBars() |
|
162 { |
|
163 QScrollArea scrollArea; |
|
164 scrollArea.resize(300, 300); |
|
165 scrollArea.show(); |
|
166 |
|
167 QPointer<QScrollBar> vbar = scrollArea.verticalScrollBar(); |
|
168 QPointer<QScrollBar> hbar = scrollArea.horizontalScrollBar(); |
|
169 |
|
170 // Now set properties on the scroll bars |
|
171 scrollArea.verticalScrollBar()->setInvertedAppearance(true); |
|
172 scrollArea.verticalScrollBar()->setInvertedControls(true); |
|
173 scrollArea.verticalScrollBar()->setTracking(true); |
|
174 scrollArea.verticalScrollBar()->setRange(-100, 100); |
|
175 scrollArea.verticalScrollBar()->setPageStep(42); |
|
176 scrollArea.verticalScrollBar()->setSingleStep(3); |
|
177 scrollArea.verticalScrollBar()->setValue(43); |
|
178 scrollArea.horizontalScrollBar()->setInvertedAppearance(true); |
|
179 scrollArea.horizontalScrollBar()->setInvertedControls(true); |
|
180 scrollArea.horizontalScrollBar()->setTracking(true); |
|
181 scrollArea.horizontalScrollBar()->setRange(-100, 100); |
|
182 scrollArea.horizontalScrollBar()->setPageStep(42); |
|
183 scrollArea.horizontalScrollBar()->setSingleStep(3); |
|
184 scrollArea.horizontalScrollBar()->setValue(43); |
|
185 |
|
186 qApp->processEvents(); |
|
187 |
|
188 // Then replace the scroll bars |
|
189 scrollArea.setVerticalScrollBar(new QScrollBar); |
|
190 scrollArea.setHorizontalScrollBar(new QScrollBar); |
|
191 |
|
192 // Check that the old ones were deleted |
|
193 QVERIFY(!vbar); |
|
194 QVERIFY(!hbar); |
|
195 |
|
196 qApp->processEvents(); |
|
197 |
|
198 // Check that all properties have been populated |
|
199 QVERIFY(scrollArea.verticalScrollBar()->invertedAppearance()); |
|
200 QVERIFY(scrollArea.verticalScrollBar()->invertedControls()); |
|
201 QVERIFY(scrollArea.verticalScrollBar()->hasTracking()); |
|
202 QVERIFY(scrollArea.verticalScrollBar()->isVisible()); |
|
203 QCOMPARE(scrollArea.verticalScrollBar()->minimum(), -100); |
|
204 QCOMPARE(scrollArea.verticalScrollBar()->maximum(), 100); |
|
205 QCOMPARE(scrollArea.verticalScrollBar()->pageStep(), 42); |
|
206 QCOMPARE(scrollArea.verticalScrollBar()->singleStep(), 3); |
|
207 QCOMPARE(scrollArea.verticalScrollBar()->value(), 43); |
|
208 QVERIFY(scrollArea.horizontalScrollBar()->invertedAppearance()); |
|
209 QVERIFY(scrollArea.horizontalScrollBar()->invertedControls()); |
|
210 QVERIFY(scrollArea.horizontalScrollBar()->hasTracking()); |
|
211 QVERIFY(scrollArea.horizontalScrollBar()->isVisible()); |
|
212 QCOMPARE(scrollArea.horizontalScrollBar()->minimum(), -100); |
|
213 QCOMPARE(scrollArea.horizontalScrollBar()->maximum(), 100); |
|
214 QCOMPARE(scrollArea.horizontalScrollBar()->pageStep(), 42); |
|
215 QCOMPARE(scrollArea.horizontalScrollBar()->singleStep(), 3); |
|
216 QCOMPARE(scrollArea.horizontalScrollBar()->value(), 43); |
|
217 } |
|
218 |
|
219 void tst_QAbstractScrollArea::setScrollBars2() |
|
220 { |
|
221 QAbstractScrollArea scrollArea; |
|
222 scrollArea.resize(300, 300); |
|
223 |
|
224 QScrollBar *hbar = new QScrollBar; |
|
225 scrollArea.setHorizontalScrollBar(hbar); |
|
226 qApp->processEvents(); |
|
227 QCOMPARE(scrollArea.horizontalScrollBar(), hbar); |
|
228 |
|
229 QScrollBar *vbar = new QScrollBar; |
|
230 scrollArea.setVerticalScrollBar(vbar); |
|
231 qApp->processEvents(); |
|
232 QCOMPARE(scrollArea.verticalScrollBar(), vbar); |
|
233 |
|
234 scrollArea.horizontalScrollBar()->setRange(0, 100); |
|
235 scrollArea.verticalScrollBar()->setRange(0, 100); |
|
236 scrollArea.show(); |
|
237 |
|
238 // Make sure scroll bars are not explicitly hidden by QAbstractScrollArea itself. |
|
239 QVERIFY(hbar->isVisible()); |
|
240 QVERIFY(vbar->isVisible()); |
|
241 |
|
242 // Hide the OLD scroll bar and ensure that the NEW one is hidden. |
|
243 hbar->hide(); |
|
244 scrollArea.setHorizontalScrollBar(new QScrollBar); |
|
245 qApp->processEvents(); |
|
246 QVERIFY(!scrollArea.horizontalScrollBar()->isVisible()); |
|
247 |
|
248 vbar->hide(); |
|
249 scrollArea.setVerticalScrollBar(new QScrollBar); |
|
250 qApp->processEvents(); |
|
251 QVERIFY(!scrollArea.verticalScrollBar()->isVisible()); |
|
252 |
|
253 scrollArea.verticalScrollBar()->show(); |
|
254 scrollArea.horizontalScrollBar()->show(); |
|
255 |
|
256 // Hide the NEW scroll bar and ensure that it's visible |
|
257 // (because the OLD one is visible). |
|
258 hbar = new QScrollBar; |
|
259 hbar->hide(); |
|
260 scrollArea.setHorizontalScrollBar(hbar); |
|
261 qApp->processEvents(); |
|
262 QVERIFY(hbar->isVisible()); |
|
263 |
|
264 vbar = new QScrollBar; |
|
265 vbar->hide(); |
|
266 scrollArea.setVerticalScrollBar(vbar); |
|
267 qApp->processEvents(); |
|
268 QVERIFY(vbar->isVisible()); |
|
269 |
|
270 vbar->setRange(0, 0); |
|
271 qApp->processEvents(); |
|
272 QVERIFY(!vbar->isVisible()); |
|
273 |
|
274 hbar->setRange(0, 0); |
|
275 qApp->processEvents(); |
|
276 QVERIFY(!hbar->isVisible()); |
|
277 } |
|
278 |
|
279 // we need to make sure the viewport internal widget is named |
|
280 // qt_scrollarea_viewport, otherwise we're going to confuse Squish |
|
281 // and friends. |
|
282 void tst_QAbstractScrollArea::objectNaming() |
|
283 { |
|
284 QScrollArea area; |
|
285 QCOMPARE(area.viewport()->objectName(), QString("qt_scrollarea_viewport")); |
|
286 } |
|
287 |
|
288 class ViewportCrashWidget : public QDialog |
|
289 { |
|
290 public: |
|
291 ViewportCrashWidget() |
|
292 { |
|
293 // temprorary set PaintOnScreen to set the nativeChildrenForced flag. |
|
294 setAttribute(Qt::WA_PaintOnScreen, true); |
|
295 setAttribute(Qt::WA_PaintOnScreen, false); |
|
296 |
|
297 setAttribute(Qt::WA_DropSiteRegistered, true); |
|
298 |
|
299 startTimer(2000); |
|
300 } |
|
301 |
|
302 void timerEvent(QTimerEvent *event) |
|
303 { |
|
304 // should not crash. |
|
305 (void)new QScrollArea(this); |
|
306 accept(); |
|
307 } |
|
308 }; |
|
309 |
|
310 void tst_QAbstractScrollArea::viewportCrash() |
|
311 { |
|
312 ViewportCrashWidget w; |
|
313 // should not crash |
|
314 w.exec(); |
|
315 } |
|
316 |
|
317 Q_DECLARE_METATYPE(Qt::LayoutDirection); |
|
318 Q_DECLARE_METATYPE(Qt::Key); |
|
319 |
|
320 void tst_QAbstractScrollArea::task214488_layoutDirection_data() |
|
321 { |
|
322 QTest::addColumn<Qt::LayoutDirection>("dir"); |
|
323 QTest::addColumn<Qt::Key>("key"); |
|
324 QTest::addColumn<bool>("lessThan"); |
|
325 |
|
326 QTest::newRow("LTR left") << Qt::LeftToRight << Qt::Key_Left << true; |
|
327 QTest::newRow("LTR right") << Qt::LeftToRight << Qt::Key_Right << false; |
|
328 QTest::newRow("RTL left") << Qt::RightToLeft << Qt::Key_Left << false; |
|
329 QTest::newRow("RTL right") << Qt::RightToLeft << Qt::Key_Right << true; |
|
330 } |
|
331 |
|
332 void tst_QAbstractScrollArea::task214488_layoutDirection() |
|
333 { |
|
334 QScrollArea scrollArea; |
|
335 scrollArea.resize(200, 200); |
|
336 QWidget widget; |
|
337 widget.resize(600, 600); |
|
338 scrollArea.setWidget(&widget); |
|
339 scrollArea.show(); |
|
340 QScrollBar *hbar = scrollArea.horizontalScrollBar(); |
|
341 hbar->setValue((hbar->minimum() + hbar->maximum()) / 2); |
|
342 |
|
343 QFETCH(Qt::LayoutDirection, dir); |
|
344 QFETCH(Qt::Key, key); |
|
345 QFETCH(bool, lessThan); |
|
346 |
|
347 scrollArea.setLayoutDirection(dir); |
|
348 |
|
349 int refValue = hbar->value(); |
|
350 qApp->sendEvent(&scrollArea, new QKeyEvent(QEvent::KeyPress, key, Qt::NoModifier)); |
|
351 QVERIFY(lessThan ? (hbar->value() < refValue) : (hbar->value() > refValue)); |
|
352 } |
|
353 |
|
354 void tst_QAbstractScrollArea::patternBackground() |
|
355 { |
|
356 QScrollArea scrollArea; |
|
357 scrollArea.resize(200, 200); |
|
358 QWidget widget; |
|
359 widget.resize(600, 600); |
|
360 scrollArea.setWidget(&widget); |
|
361 scrollArea.show(); |
|
362 |
|
363 QLinearGradient linearGrad(QPointF(250, 250), QPointF(300, 300)); |
|
364 linearGrad.setColorAt(0, Qt::yellow); |
|
365 linearGrad.setColorAt(1, Qt::red); |
|
366 QBrush bg(linearGrad); |
|
367 scrollArea.viewport()->setPalette(QPalette(Qt::black, bg, bg, bg, bg, bg, bg, bg, bg)); |
|
368 widget.setPalette(Qt::transparent); |
|
369 |
|
370 QTest::qWait(50); |
|
371 |
|
372 QImage image(200, 200, QImage::Format_ARGB32); |
|
373 scrollArea.render(&image); |
|
374 |
|
375 QCOMPARE(image.pixel(QPoint(20,20)) , QColor(Qt::yellow).rgb()); |
|
376 |
|
377 QScrollBar *hbar = scrollArea.horizontalScrollBar(); |
|
378 hbar->setValue(hbar->maximum()); |
|
379 QScrollBar *vbar = scrollArea.verticalScrollBar(); |
|
380 vbar->setValue(vbar->maximum()); |
|
381 |
|
382 QTest::qWait(50); |
|
383 |
|
384 scrollArea.render(&image); |
|
385 QCOMPARE(image.pixel(QPoint(20,20)) , QColor(Qt::red).rgb()); |
|
386 } |
|
387 |
|
388 QTEST_MAIN(tst_QAbstractScrollArea) |
|
389 #include "tst_qabstractscrollarea.moc" |