/******************************************************************************** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).** All rights reserved.** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying** this package.**** 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.1, included in the file LGPL_EXCEPTION.txt in this package.**** If you have questions regarding the use of this file, please contact** Nokia at qt-info@nokia.com.****************** $QT_END_LICENSE$******************************************************************************/#include <QtTest/QtTest>#include <qcoreapplication.h>#include <qdebug.h>#include <qscrollarea.h>#include <qlayout.h>//TESTED_CLASS=//TESTED_FILES=class tst_QScrollArea : public QObject{Q_OBJECTpublic: tst_QScrollArea(); virtual ~tst_QScrollArea();private slots: void getSetCheck(); void ensureMicroFocusVisible_Task_167838(); void checkHFW_Task_197736();};tst_QScrollArea::tst_QScrollArea(){}tst_QScrollArea::~tst_QScrollArea(){}// Testing get/set functionsvoid tst_QScrollArea::getSetCheck(){ QScrollArea obj1; // QWidget * QScrollArea::widget() // void QScrollArea::setWidget(QWidget *) QWidget *var1 = new QWidget(); obj1.setWidget(var1); QCOMPARE(var1, obj1.widget()); obj1.setWidget((QWidget *)0); QCOMPARE(var1, obj1.widget()); // Cannot set a 0-widget. Old widget returned // delete var1; // No delete, since QScrollArea takes ownership // bool QScrollArea::widgetResizable() // void QScrollArea::setWidgetResizable(bool) obj1.setWidgetResizable(false); QCOMPARE(false, obj1.widgetResizable()); obj1.setWidgetResizable(true); QCOMPARE(true, obj1.widgetResizable());}class WidgetWithMicroFocus : public QWidget{public: WidgetWithMicroFocus(QWidget *parent = 0) : QWidget(parent) { setBackgroundRole(QPalette::Dark); }protected: QVariant inputMethodQuery(Qt::InputMethodQuery query) const { if (query == Qt::ImMicroFocus) return QRect(width() / 2, height() / 2, 5, 5); return QWidget::inputMethodQuery(query); }// void paintEvent(QPaintEvent *event)// {// QPainter painter(this);// painter.fillRect(rect(), QBrush(Qt::red));// }};void tst_QScrollArea::ensureMicroFocusVisible_Task_167838(){ QScrollArea scrollArea; scrollArea.resize(100, 100); scrollArea.show(); QWidget *parent = new QWidget; parent->setLayout(new QVBoxLayout); QWidget *child = new WidgetWithMicroFocus; parent->layout()->addWidget(child); parent->resize(300, 300); scrollArea.setWidget(parent); scrollArea.ensureWidgetVisible(child, 10, 10); QRect microFocus = child->inputMethodQuery(Qt::ImMicroFocus).toRect(); QPoint p = child->mapTo(scrollArea.viewport(), microFocus.topLeft()); microFocus.translate(p - microFocus.topLeft()); QVERIFY(scrollArea.viewport()->rect().contains(microFocus));}class HFWWidget : public QWidget{ public: HFWWidget(); int heightForWidth(int w) const;};HFWWidget::HFWWidget() : QWidget(){ setMinimumSize(QSize(100,50)); QSizePolicy s = sizePolicy(); s.setHeightForWidth(true); setSizePolicy(s);}int HFWWidget::heightForWidth(int w) const{ // Mimic a label - the narrower we are, the taller we have to be if (w > 0) return 40000 / w; else return 40000;}void tst_QScrollArea::checkHFW_Task_197736(){ QScrollArea scrollArea; HFWWidget *w = new HFWWidget; scrollArea.resize(200,100); scrollArea.show(); scrollArea.setWidgetResizable(true); scrollArea.setWidget(w); // at 200x100px, we expect HFW to be 200px tall, not 100px QVERIFY(w->height() >= 200); // at 200x300px, we expect HFW to be 300px tall (the heightForWidth is a min, not prescribed) scrollArea.resize(QSize(200, 300)); QVERIFY(w->height() >= 250); // 50px for a fudge factor (size of frame margins/scrollbars etc) // make sure this only happens with widget resizable scrollArea.setWidgetResizable(false); scrollArea.resize(QSize(100,100)); w->resize(QSize(200,200)); QVERIFY(w->width() == 200); QVERIFY(w->height() == 200);}QTEST_MAIN(tst_QScrollArea)#include "tst_qscrollarea.moc"