/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (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 either Technology Preview License Agreement or the ** Beta Release License Agreement. ** ** 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.0, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at qt-sales@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include #include #include //TESTED_CLASS= //TESTED_FILES= class tst_QAbstractScrollArea : public QObject { Q_OBJECT public: tst_QAbstractScrollArea(); virtual ~tst_QAbstractScrollArea(); private slots: void scrollBarWidgets(); void setScrollBars(); void setScrollBars2(); void objectNaming(); void viewportCrash(); void task214488_layoutDirection_data(); void task214488_layoutDirection(); }; tst_QAbstractScrollArea::tst_QAbstractScrollArea() { } tst_QAbstractScrollArea::~tst_QAbstractScrollArea() { } void tst_QAbstractScrollArea::scrollBarWidgets() { QWidget *w1 = new QWidget(0); QWidget *w2 = new QWidget(0); QWidget *w3 = new QWidget(0); Qt::Alignment all = Qt::AlignLeft | Qt::AlignRight | Qt::AlignTop | Qt::AlignBottom; QWidgetList w1List = QWidgetList() << w1; QWidgetList w2List = QWidgetList() << w2; QWidgetList w3List = QWidgetList() << w3; QWidgetList w1w2List = w1List + w2List; QWidgetList allList = w1List + w2List + w3List; QAbstractScrollArea area; area.show(); QCOMPARE(area.scrollBarWidgets(all), QWidgetList()); area.addScrollBarWidget(w1, Qt::AlignLeft); QCOMPARE(area.scrollBarWidgets(all), w1List); QCOMPARE(area.scrollBarWidgets(Qt::AlignLeft), w1List); QCOMPARE(area.scrollBarWidgets(Qt::AlignRight), QWidgetList()); QCOMPARE(area.scrollBarWidgets(Qt::AlignTop), QWidgetList()); QCOMPARE(area.scrollBarWidgets(Qt::AlignBottom), QWidgetList()); area.addScrollBarWidget(w2, Qt::AlignBottom); QCOMPARE(area.scrollBarWidgets(all), w1w2List); QCOMPARE(area.scrollBarWidgets(Qt::AlignLeft), w1List); QCOMPARE(area.scrollBarWidgets(Qt::AlignRight), QWidgetList()); QCOMPARE(area.scrollBarWidgets(Qt::AlignTop), QWidgetList()); QCOMPARE(area.scrollBarWidgets(Qt::AlignBottom), w2List); // duplicate add area.addScrollBarWidget(w2, Qt::AlignBottom); QCOMPARE(area.scrollBarWidgets(all), w1w2List); QCOMPARE(area.scrollBarWidgets(Qt::AlignLeft), w1List); QCOMPARE(area.scrollBarWidgets(Qt::AlignRight), QWidgetList()); QCOMPARE(area.scrollBarWidgets(Qt::AlignTop), QWidgetList()); QCOMPARE(area.scrollBarWidgets(Qt::AlignBottom), w2List); //reparent w2->setParent(w1); QCOMPARE(area.scrollBarWidgets(all), w1List); QCOMPARE(area.scrollBarWidgets(Qt::AlignLeft), w1List); QCOMPARE(area.scrollBarWidgets(Qt::AlignRight), QWidgetList()); QCOMPARE(area.scrollBarWidgets(Qt::AlignTop), QWidgetList()); QCOMPARE(area.scrollBarWidgets(Qt::AlignBottom), QWidgetList()); // add after reparent area.addScrollBarWidget(w2, Qt::AlignBottom); QCOMPARE(area.scrollBarWidgets(all), w1w2List); QCOMPARE(area.scrollBarWidgets(Qt::AlignLeft), w1List); QCOMPARE(area.scrollBarWidgets(Qt::AlignRight), QWidgetList()); QCOMPARE(area.scrollBarWidgets(Qt::AlignTop), QWidgetList()); QCOMPARE(area.scrollBarWidgets(Qt::AlignBottom), w2List); // two widgets at Bottom. area.addScrollBarWidget(w3, Qt::AlignBottom); QCOMPARE(area.scrollBarWidgets(all).toSet(), allList.toSet()); QCOMPARE(area.scrollBarWidgets(Qt::AlignLeft), w1List); QCOMPARE(area.scrollBarWidgets(Qt::AlignRight), QWidgetList()); QCOMPARE(area.scrollBarWidgets(Qt::AlignTop), QWidgetList()); QCOMPARE(area.scrollBarWidgets(Qt::AlignBottom).toSet(), (w2List + w3List).toSet()); //delete delete w1; delete w2; delete w3; QCOMPARE(area.scrollBarWidgets(all), QWidgetList()); QCOMPARE(area.scrollBarWidgets(Qt::AlignLeft), QWidgetList()); QCOMPARE(area.scrollBarWidgets(Qt::AlignRight), QWidgetList()); QCOMPARE(area.scrollBarWidgets(Qt::AlignTop), QWidgetList()); QCOMPARE(area.scrollBarWidgets(Qt::AlignBottom), QWidgetList()); } void tst_QAbstractScrollArea::setScrollBars() { QScrollArea scrollArea; scrollArea.resize(300, 300); scrollArea.show(); QPointer vbar = scrollArea.verticalScrollBar(); QPointer hbar = scrollArea.horizontalScrollBar(); // Now set properties on the scroll bars scrollArea.verticalScrollBar()->setInvertedAppearance(true); scrollArea.verticalScrollBar()->setInvertedControls(true); scrollArea.verticalScrollBar()->setTracking(true); scrollArea.verticalScrollBar()->setRange(-100, 100); scrollArea.verticalScrollBar()->setPageStep(42); scrollArea.verticalScrollBar()->setSingleStep(3); scrollArea.verticalScrollBar()->setValue(43); scrollArea.horizontalScrollBar()->setInvertedAppearance(true); scrollArea.horizontalScrollBar()->setInvertedControls(true); scrollArea.horizontalScrollBar()->setTracking(true); scrollArea.horizontalScrollBar()->setRange(-100, 100); scrollArea.horizontalScrollBar()->setPageStep(42); scrollArea.horizontalScrollBar()->setSingleStep(3); scrollArea.horizontalScrollBar()->setValue(43); qApp->processEvents(); // Then replace the scroll bars scrollArea.setVerticalScrollBar(new QScrollBar); scrollArea.setHorizontalScrollBar(new QScrollBar); // Check that the old ones were deleted QVERIFY(!vbar); QVERIFY(!hbar); qApp->processEvents(); // Check that all properties have been populated QVERIFY(scrollArea.verticalScrollBar()->invertedAppearance()); QVERIFY(scrollArea.verticalScrollBar()->invertedControls()); QVERIFY(scrollArea.verticalScrollBar()->hasTracking()); QVERIFY(scrollArea.verticalScrollBar()->isVisible()); QCOMPARE(scrollArea.verticalScrollBar()->minimum(), -100); QCOMPARE(scrollArea.verticalScrollBar()->maximum(), 100); QCOMPARE(scrollArea.verticalScrollBar()->pageStep(), 42); QCOMPARE(scrollArea.verticalScrollBar()->singleStep(), 3); QCOMPARE(scrollArea.verticalScrollBar()->value(), 43); QVERIFY(scrollArea.horizontalScrollBar()->invertedAppearance()); QVERIFY(scrollArea.horizontalScrollBar()->invertedControls()); QVERIFY(scrollArea.horizontalScrollBar()->hasTracking()); QVERIFY(scrollArea.horizontalScrollBar()->isVisible()); QCOMPARE(scrollArea.horizontalScrollBar()->minimum(), -100); QCOMPARE(scrollArea.horizontalScrollBar()->maximum(), 100); QCOMPARE(scrollArea.horizontalScrollBar()->pageStep(), 42); QCOMPARE(scrollArea.horizontalScrollBar()->singleStep(), 3); QCOMPARE(scrollArea.horizontalScrollBar()->value(), 43); } void tst_QAbstractScrollArea::setScrollBars2() { QAbstractScrollArea scrollArea; scrollArea.resize(300, 300); QScrollBar *hbar = new QScrollBar; scrollArea.setHorizontalScrollBar(hbar); qApp->processEvents(); QCOMPARE(scrollArea.horizontalScrollBar(), hbar); QScrollBar *vbar = new QScrollBar; scrollArea.setVerticalScrollBar(vbar); qApp->processEvents(); QCOMPARE(scrollArea.verticalScrollBar(), vbar); scrollArea.horizontalScrollBar()->setRange(0, 100); scrollArea.verticalScrollBar()->setRange(0, 100); scrollArea.show(); // Make sure scroll bars are not explicitly hidden by QAbstractScrollArea itself. QVERIFY(hbar->isVisible()); QVERIFY(vbar->isVisible()); // Hide the OLD scroll bar and ensure that the NEW one is hidden. hbar->hide(); scrollArea.setHorizontalScrollBar(new QScrollBar); qApp->processEvents(); QVERIFY(!scrollArea.horizontalScrollBar()->isVisible()); vbar->hide(); scrollArea.setVerticalScrollBar(new QScrollBar); qApp->processEvents(); QVERIFY(!scrollArea.verticalScrollBar()->isVisible()); scrollArea.verticalScrollBar()->show(); scrollArea.horizontalScrollBar()->show(); // Hide the NEW scroll bar and ensure that it's visible // (because the OLD one is visible). hbar = new QScrollBar; hbar->hide(); scrollArea.setHorizontalScrollBar(hbar); qApp->processEvents(); QVERIFY(hbar->isVisible()); vbar = new QScrollBar; vbar->hide(); scrollArea.setVerticalScrollBar(vbar); qApp->processEvents(); QVERIFY(vbar->isVisible()); vbar->setRange(0, 0); qApp->processEvents(); QVERIFY(!vbar->isVisible()); hbar->setRange(0, 0); qApp->processEvents(); QVERIFY(!hbar->isVisible()); } // we need to make sure the viewport internal widget is named // qt_scrollarea_viewport, otherwise we're going to confuse Squish // and friends. void tst_QAbstractScrollArea::objectNaming() { QScrollArea area; QCOMPARE(area.viewport()->objectName(), QString("qt_scrollarea_viewport")); } class ViewportCrashWidget : public QDialog { public: ViewportCrashWidget() { // temprorary set PaintOnScreen to set the nativeChildrenForced flag. setAttribute(Qt::WA_PaintOnScreen, true); setAttribute(Qt::WA_PaintOnScreen, false); setAttribute(Qt::WA_DropSiteRegistered, true); startTimer(2000); } void timerEvent(QTimerEvent *event) { // should not crash. (void)new QScrollArea(this); accept(); } }; void tst_QAbstractScrollArea::viewportCrash() { ViewportCrashWidget w; // should not crash w.exec(); } Q_DECLARE_METATYPE(Qt::LayoutDirection); Q_DECLARE_METATYPE(Qt::Key); void tst_QAbstractScrollArea::task214488_layoutDirection_data() { QTest::addColumn("dir"); QTest::addColumn("key"); QTest::addColumn("lessThan"); QTest::newRow("LTR left") << Qt::LeftToRight << Qt::Key_Left << true; QTest::newRow("LTR right") << Qt::LeftToRight << Qt::Key_Right << false; QTest::newRow("RTL left") << Qt::RightToLeft << Qt::Key_Left << false; QTest::newRow("RTL right") << Qt::RightToLeft << Qt::Key_Right << true; } void tst_QAbstractScrollArea::task214488_layoutDirection() { QScrollArea scrollArea; scrollArea.resize(200, 200); QWidget widget; widget.resize(600, 600); scrollArea.setWidget(&widget); scrollArea.show(); QScrollBar *hbar = scrollArea.horizontalScrollBar(); hbar->setValue((hbar->minimum() + hbar->maximum()) / 2); QFETCH(Qt::LayoutDirection, dir); QFETCH(Qt::Key, key); QFETCH(bool, lessThan); scrollArea.setLayoutDirection(dir); int refValue = hbar->value(); qApp->sendEvent(&scrollArea, new QKeyEvent(QEvent::KeyPress, key, Qt::NoModifier)); QVERIFY(lessThan ? (hbar->value() < refValue) : (hbar->value() > refValue)); } QTEST_MAIN(tst_QAbstractScrollArea) #include "tst_qabstractscrollarea.moc"