1248 lines
59 KiB
C++
1248 lines
59 KiB
C++
|
/****************************************************************************
|
||
|
**
|
||
|
** Copyright (C) 2011 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 <QAbstractSlider>
|
||
|
#include <QScrollBar>
|
||
|
#include <QSlider>
|
||
|
#include <QStyle>
|
||
|
#include <QStyleOption>
|
||
|
#include <QTime>
|
||
|
#include <QDebug>
|
||
|
|
||
|
// defined to be 120 by the wheel mouse vendors according to the docs
|
||
|
#define WHEEL_DELTA 120
|
||
|
|
||
|
class Slider : public QAbstractSlider
|
||
|
{
|
||
|
public:
|
||
|
Slider(QWidget *parent)
|
||
|
: QAbstractSlider(parent) {}
|
||
|
using QAbstractSlider::setRepeatAction;
|
||
|
using QAbstractSlider::repeatAction;
|
||
|
};
|
||
|
|
||
|
class tst_QAbstractSlider: public QObject
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
public slots:
|
||
|
void initTestCase();
|
||
|
void cleanupTestCase();
|
||
|
void actionTriggered(int action);
|
||
|
void rangeChanged(int min, int max);
|
||
|
void valueChanged(int value);
|
||
|
void sliderMoved(int value);
|
||
|
|
||
|
private slots:
|
||
|
void triggerAction_data();
|
||
|
void triggerAction();
|
||
|
void minimum_maximum_data();
|
||
|
void minimum_maximum();
|
||
|
void keyPressed_data();
|
||
|
void keyPressed();
|
||
|
void wheelEvent_data();
|
||
|
void wheelEvent();
|
||
|
void sliderPressedReleased_data();
|
||
|
void sliderPressedReleased();
|
||
|
void setOrientation();
|
||
|
void sliderMoved_data();
|
||
|
void sliderMoved();
|
||
|
void rangeChanged_data();
|
||
|
void rangeChanged();
|
||
|
void setSliderPosition_data();
|
||
|
void setSliderPosition();
|
||
|
void setValue_data();
|
||
|
void setValue();
|
||
|
void setRepeatAction();
|
||
|
|
||
|
private:
|
||
|
void waitUntilTimeElapsed(const QTime& t, int ms);
|
||
|
|
||
|
QWidget *topLevel;
|
||
|
Slider *slider;
|
||
|
int previousAction;
|
||
|
int reportedMinimum;
|
||
|
int reportedMaximum;
|
||
|
int reportedValue;
|
||
|
int reportedSliderPosition;
|
||
|
qint64 timeStamp;
|
||
|
qint64 actionTriggeredTimeStamp;
|
||
|
qint64 valueChangedTimeStamp;
|
||
|
qint64 rangeChangedTimeStamp;
|
||
|
qint64 sliderMovedTimeStamp;
|
||
|
};
|
||
|
|
||
|
Q_DECLARE_METATYPE(QList<Qt::Key>)
|
||
|
Q_DECLARE_METATYPE(QPoint)
|
||
|
|
||
|
void tst_QAbstractSlider::initTestCase()
|
||
|
{
|
||
|
topLevel = new QWidget;
|
||
|
slider = new Slider(topLevel);
|
||
|
slider->setObjectName("testWidget");
|
||
|
slider->resize(100,100);
|
||
|
slider->show();
|
||
|
|
||
|
previousAction = QAbstractSlider::SliderNoAction;
|
||
|
timeStamp = 0;
|
||
|
|
||
|
connect(slider,SIGNAL(actionTriggered(int)),this,SLOT(actionTriggered(int)));
|
||
|
connect(slider,SIGNAL(rangeChanged(int,int)),this,SLOT(rangeChanged(int,int)));
|
||
|
connect(slider,SIGNAL(valueChanged(int)),this,SLOT(valueChanged(int)));
|
||
|
connect(slider,SIGNAL(sliderMoved(int)),this,SLOT(sliderMoved(int)));
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::cleanupTestCase()
|
||
|
{
|
||
|
delete topLevel;
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::actionTriggered(int action)
|
||
|
{
|
||
|
previousAction = action;
|
||
|
actionTriggeredTimeStamp = timeStamp++;
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::rangeChanged(int min,int max)
|
||
|
{
|
||
|
reportedMinimum = min;
|
||
|
reportedMaximum = max;
|
||
|
rangeChangedTimeStamp = timeStamp++;
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::valueChanged(int value)
|
||
|
{
|
||
|
reportedValue = value;
|
||
|
valueChangedTimeStamp = timeStamp++;
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::sliderMoved(int value)
|
||
|
{
|
||
|
reportedSliderPosition = value;
|
||
|
sliderMovedTimeStamp = timeStamp++;
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::triggerAction_data()
|
||
|
{
|
||
|
QTest::addColumn<int>("sliderAction");
|
||
|
QTest::addColumn<int>("maximum");
|
||
|
QTest::addColumn<int>("minimum");
|
||
|
QTest::addColumn<int>("initialSliderPosition");
|
||
|
QTest::addColumn<int>("singleStep");
|
||
|
QTest::addColumn<int>("pageStep");
|
||
|
QTest::addColumn<int>("expectedSliderPosition");
|
||
|
|
||
|
QTest::newRow("No action") << int(QAbstractSlider::SliderNoAction) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 987 // initial position
|
||
|
<< 237 // single step size
|
||
|
<< 234 // page step size
|
||
|
<< 987; // expected position after
|
||
|
|
||
|
QTest::newRow("Move action") << int(QAbstractSlider::SliderMove) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 988 // initial position
|
||
|
<< 237 // single step size
|
||
|
<< 234 // page step size
|
||
|
<< 988; // expected position after
|
||
|
|
||
|
QTest::newRow("Empty step add") << int(QAbstractSlider::SliderSingleStepAdd) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 988 // initial position
|
||
|
<< 0 // single step size
|
||
|
<< 234 // page step size
|
||
|
<< 988; // expected position after
|
||
|
|
||
|
QTest::newRow("Empty step sub") << int(QAbstractSlider::SliderSingleStepSub) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 987 // initial position
|
||
|
<< 0 // single step size
|
||
|
<< 234 // page step size
|
||
|
<< 987; // expected position after
|
||
|
|
||
|
QTest::newRow("Empty page add") << int(QAbstractSlider::SliderPageStepAdd) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 988 // initial position
|
||
|
<< 234 // single step size
|
||
|
<< 0 // page step size
|
||
|
<< 988; // expected position after
|
||
|
|
||
|
QTest::newRow("Empty page sub") << int(QAbstractSlider::SliderPageStepSub) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 987 // initial position
|
||
|
<< 234 // single step size
|
||
|
<< 0 // page step size
|
||
|
<< 987; // expected position after
|
||
|
|
||
|
QTest::newRow("Legal step add") << int(QAbstractSlider::SliderSingleStepAdd) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 988 // initial position
|
||
|
<< 5 // single step size
|
||
|
<< 234 // page step size
|
||
|
<< 993; // expected position after
|
||
|
|
||
|
QTest::newRow("Legal step sub") << int(QAbstractSlider::SliderSingleStepSub) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 987 // initial position
|
||
|
<< 5 // single step size
|
||
|
<< 234 // page step size
|
||
|
<< 982; // expected position after
|
||
|
|
||
|
QTest::newRow("Legal page add") << int(QAbstractSlider::SliderPageStepAdd) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 988 // initial position
|
||
|
<< 234 // single step size
|
||
|
<< 5 // page step size
|
||
|
<< 993; // expected position after
|
||
|
|
||
|
QTest::newRow("Legal page sub") << int(QAbstractSlider::SliderPageStepSub) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 987 // initial position
|
||
|
<< 234 // single step size
|
||
|
<< 5 // page step size
|
||
|
<< 982; // expected position after
|
||
|
|
||
|
QTest::newRow("Illegal step add") << int(QAbstractSlider::SliderSingleStepAdd) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 988 // initial position
|
||
|
<< 500 // single step size
|
||
|
<< 234 // page step size
|
||
|
<< 1000; // expected position after
|
||
|
|
||
|
QTest::newRow("Illegal step sub") << int(QAbstractSlider::SliderSingleStepSub) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 987 // initial position
|
||
|
<< 500 // single step size
|
||
|
<< 234 // page step size
|
||
|
<< 900; // expected position after
|
||
|
|
||
|
QTest::newRow("Illegal page add") << int(QAbstractSlider::SliderPageStepAdd) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 988 // initial position
|
||
|
<< 234 // single step size
|
||
|
<< 500 // page step size
|
||
|
<< 1000; // expected position after
|
||
|
|
||
|
QTest::newRow("Illegal page sub") << int(QAbstractSlider::SliderPageStepSub) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 987 // initial position
|
||
|
<< 234 // single step size
|
||
|
<< 500 // page step size
|
||
|
<< 900; // expected position after
|
||
|
|
||
|
// Negative steps will also be abs()'d so, check that case.
|
||
|
QTest::newRow("Negative step add") << int(QAbstractSlider::SliderSingleStepAdd) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 988 // initial position
|
||
|
<< -1 // single step size
|
||
|
<< 234 // page step size
|
||
|
<< 989; // expected position after
|
||
|
|
||
|
QTest::newRow("Negative step sub") << int(QAbstractSlider::SliderSingleStepSub) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 987 // initial position
|
||
|
<< -1 // single step size
|
||
|
<< 234 // page step size
|
||
|
<< 986; // expected position after
|
||
|
|
||
|
QTest::newRow("Negative page add") << int(QAbstractSlider::SliderPageStepAdd) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 988 // initial position
|
||
|
<< 234 // single step size
|
||
|
<< -1 // page step size
|
||
|
<< 989; // expected position after
|
||
|
|
||
|
QTest::newRow("Negative page sub") << int(QAbstractSlider::SliderPageStepSub) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 987 // initial position
|
||
|
<< 234 // single step size
|
||
|
<< -1 // page step size
|
||
|
<< 986; // expected position after
|
||
|
|
||
|
QTest::newRow("Illegal negative step add") << int(QAbstractSlider::SliderSingleStepAdd) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 988 // initial position
|
||
|
<< -500 // single step size
|
||
|
<< 234 // page step size
|
||
|
<< 1000; // expected position after
|
||
|
|
||
|
|
||
|
QTest::newRow("Illegal negative step sub") << int(QAbstractSlider::SliderSingleStepSub) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 988 // initial position
|
||
|
<< -500 // single step size
|
||
|
<< 234 // page step size
|
||
|
<< 900; // expected position after
|
||
|
|
||
|
QTest::newRow("Illegal negative page add") << int(QAbstractSlider::SliderPageStepAdd) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 988 // initial position
|
||
|
<< 234 // single step size
|
||
|
<< -500 // page step size
|
||
|
<< 1000; // expected position after
|
||
|
|
||
|
QTest::newRow("Illegal negative page sub") << int(QAbstractSlider::SliderPageStepSub) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 988 // initial position
|
||
|
<< 245 // single step size
|
||
|
<< -500 // page step size
|
||
|
<< 900; // expected position after
|
||
|
|
||
|
QTest::newRow("Slider to minimum") << int(QAbstractSlider::SliderToMinimum) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 988 // initial position
|
||
|
<< 245 // single step size
|
||
|
<< 1 // page step size
|
||
|
<< 900; // expected position after
|
||
|
|
||
|
QTest::newRow("Slider to maximum") << int(QAbstractSlider::SliderToMaximum) // sliderAction
|
||
|
<< 1000 // max
|
||
|
<< 900 // min
|
||
|
<< 988 // initial position
|
||
|
<< 245 // single step size
|
||
|
<< 1 // page step size
|
||
|
<< 1000; // expected position after
|
||
|
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::triggerAction()
|
||
|
{
|
||
|
QFETCH(int,sliderAction);
|
||
|
QFETCH(int,maximum);
|
||
|
QFETCH(int,minimum);
|
||
|
QFETCH(int,initialSliderPosition);
|
||
|
QFETCH(int,singleStep);
|
||
|
QFETCH(int,pageStep);
|
||
|
QFETCH(int,expectedSliderPosition);
|
||
|
|
||
|
slider->setTracking(true);
|
||
|
slider->setRange(minimum,maximum);
|
||
|
slider->setSingleStep(singleStep);
|
||
|
slider->setPageStep(pageStep);
|
||
|
QCOMPARE(slider->singleStep(), qAbs(singleStep));
|
||
|
QCOMPARE(slider->pageStep(), qAbs(pageStep));
|
||
|
|
||
|
int oldPosition = slider->sliderPosition();
|
||
|
slider->setSliderPosition(initialSliderPosition);
|
||
|
|
||
|
QVERIFY( (oldPosition == initialSliderPosition && previousAction == int(QAbstractSlider::SliderNoAction)) ||
|
||
|
(oldPosition != initialSliderPosition && previousAction == int(QAbstractSlider::SliderMove)));
|
||
|
previousAction = int(QAbstractSlider::SliderNoAction);
|
||
|
|
||
|
QAbstractSlider::SliderAction *action = reinterpret_cast<QAbstractSlider::SliderAction*>(&sliderAction);
|
||
|
QVERIFY(action != 0);
|
||
|
|
||
|
slider->triggerAction(*action);
|
||
|
QCOMPARE(previousAction,sliderAction); // previousAction set in the actionTriggered() slot
|
||
|
QCOMPARE(slider->sliderPosition(),expectedSliderPosition);
|
||
|
QCOMPARE(slider->value(),expectedSliderPosition);
|
||
|
QCOMPARE(reportedValue,expectedSliderPosition);
|
||
|
previousAction = int(QAbstractSlider::SliderNoAction);
|
||
|
if (initialSliderPosition != expectedSliderPosition)
|
||
|
QVERIFY(actionTriggeredTimeStamp < valueChangedTimeStamp);
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::minimum_maximum_data()
|
||
|
{
|
||
|
QTest::addColumn<int>("minimum");
|
||
|
QTest::addColumn<int>("maximum");
|
||
|
QTest::addColumn<int>("expectedMinimum");
|
||
|
QTest::addColumn<int>("expectedMaximum");
|
||
|
|
||
|
QTest::newRow("Normal range") << 100 << 200 << 100 << 200;
|
||
|
QTest::newRow("Minimum higher") << 100 << 0 << 100 << 100;
|
||
|
QTest::newRow("Negative minimum") << -100 << 100 << -100 << 100;
|
||
|
QTest::newRow("Negative range") << -100 << -50 << -100 << -50;
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::minimum_maximum()
|
||
|
{
|
||
|
QFETCH(int, minimum);
|
||
|
QFETCH(int, maximum);
|
||
|
QFETCH(int, expectedMinimum);
|
||
|
QFETCH(int, expectedMaximum);
|
||
|
|
||
|
slider->setRange(minimum,maximum);
|
||
|
QCOMPARE(slider->minimum(),expectedMinimum);
|
||
|
QCOMPARE(slider->maximum(),expectedMaximum);
|
||
|
QCOMPARE(reportedMinimum,expectedMinimum);
|
||
|
QCOMPARE(reportedMaximum,expectedMaximum);
|
||
|
|
||
|
slider->setRange(minimum,maximum);
|
||
|
slider->setMaximum(slider->minimum() - 1);
|
||
|
QCOMPARE(slider->maximum(),slider->minimum());
|
||
|
QCOMPARE(reportedMinimum,slider->minimum());
|
||
|
QCOMPARE(reportedMaximum,slider->maximum());
|
||
|
|
||
|
slider->setRange(minimum,maximum);
|
||
|
slider->setMinimum(slider->maximum() + 1);
|
||
|
QCOMPARE(slider->minimum(),slider->maximum());
|
||
|
QCOMPARE(reportedMinimum,slider->minimum());
|
||
|
QCOMPARE(reportedMaximum,slider->maximum());
|
||
|
|
||
|
slider->setRange(minimum,maximum);
|
||
|
slider->setSliderPosition(slider->maximum() + 1);
|
||
|
QCOMPARE(slider->sliderPosition(), slider->maximum());
|
||
|
QCOMPARE(slider->value(), slider->maximum());
|
||
|
QCOMPARE(reportedValue, slider->maximum());
|
||
|
|
||
|
slider->setRange(minimum,maximum);
|
||
|
slider->setSliderPosition(slider->minimum() - 1);
|
||
|
QCOMPARE(slider->sliderPosition(), slider->minimum());
|
||
|
QCOMPARE(slider->value(), slider->minimum());
|
||
|
QCOMPARE(reportedValue, slider->minimum());
|
||
|
|
||
|
slider->setRange(minimum,maximum);
|
||
|
int oldPosition = slider->sliderPosition();
|
||
|
slider->setMaximum(oldPosition - 1);
|
||
|
QCOMPARE(slider->sliderPosition(),oldPosition - 1);
|
||
|
|
||
|
slider->setRange(minimum,maximum);
|
||
|
oldPosition = slider->sliderPosition();
|
||
|
slider->setMinimum(oldPosition + 1);
|
||
|
QCOMPARE(slider->sliderPosition(), oldPosition + 1);
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::keyPressed_data()
|
||
|
{
|
||
|
QTest::addColumn<int>("initialSliderPosition");
|
||
|
QTest::addColumn<int>("minimum");
|
||
|
QTest::addColumn<int>("maximum");
|
||
|
QTest::addColumn<int>("stepSize");
|
||
|
QTest::addColumn<int>("pageSize");
|
||
|
QTest::addColumn<QList<Qt::Key> >("keySequence");
|
||
|
QTest::addColumn<int>("expectedSliderPositionHorizontal");
|
||
|
QTest::addColumn<int>("expectedSliderPositionVertical");
|
||
|
QTest::addColumn<int>("expectedSliderPositionHorizontalInverted"); // :)
|
||
|
QTest::addColumn<int>("expectedSliderPositionVerticalInverted");
|
||
|
|
||
|
|
||
|
QList<Qt::Key> list;
|
||
|
|
||
|
list << Qt::Key_Down;
|
||
|
QTest::newRow("Step down once") << 10 // initial position
|
||
|
<< 0 // minimum
|
||
|
<< 100 // maximum
|
||
|
<< 3 // single step size
|
||
|
<< 0 // page step size
|
||
|
<< list // key sequence
|
||
|
<< 7 // result in case of horizontal slider
|
||
|
<< 7 // result in case of vertical slider
|
||
|
<< 13 // result in case of inverted horiz. slider
|
||
|
<< 13; // result in case of inverted vertical slider
|
||
|
|
||
|
list = QList<Qt::Key>();
|
||
|
list << Qt::Key_Up;
|
||
|
QTest::newRow("Step down once") << 10 // initial position
|
||
|
<< 0 // minimum
|
||
|
<< 100 // maximum
|
||
|
<< 3 // single step size
|
||
|
<< 0 // page step size
|
||
|
<< list // key sequence
|
||
|
<< 13 // result in case of horizontal slider
|
||
|
<< 13 // result in case of vertical slider
|
||
|
<< 7 // result in case of inverted horiz. slider
|
||
|
<< 7; // result in case of inverted vertical slider
|
||
|
|
||
|
|
||
|
list = QList<Qt::Key>();
|
||
|
list << Qt::Key_Left;
|
||
|
QTest::newRow("Step left once") << 10 // initial position
|
||
|
<< 0 // minimum
|
||
|
<< 100 // maximum
|
||
|
<< 3 // single step size
|
||
|
<< 0 // page step size
|
||
|
<< list // key sequence
|
||
|
<< 7 // result in case of horizontal slider
|
||
|
<< 7 // result in case of vertical slider
|
||
|
<< 13 // result in case of inverted horiz. slider
|
||
|
<< 13; // result in case of inverted vertical slider
|
||
|
|
||
|
list = QList<Qt::Key>();
|
||
|
list << Qt::Key_Right;
|
||
|
QTest::newRow("Step right once") << 10 // initial position
|
||
|
<< 0 // minimum
|
||
|
<< 100 // maximum
|
||
|
<< 3 // single step size
|
||
|
<< 0 // page step size
|
||
|
<< list // key sequence
|
||
|
<< 13 // result in case of horizontal slider
|
||
|
<< 13 // result in case of vertical slider
|
||
|
<< 7 // result in case of inverted horiz. slider
|
||
|
<< 7; // result in case of inverted vertical slider
|
||
|
|
||
|
list = QList<Qt::Key>();
|
||
|
list << Qt::Key_PageDown;
|
||
|
QTest::newRow("Page down once") << 10 // initial position
|
||
|
<< 0 // minimum
|
||
|
<< 100 // maximum
|
||
|
<< 0 // single step size
|
||
|
<< 3 // page step size
|
||
|
<< list // key sequence
|
||
|
<< 7 // result in case of horizontal slider
|
||
|
<< 7 // result in case of vertical slider
|
||
|
<< 13 // result in case of inverted horiz. slider
|
||
|
<< 13; // result in case of inverted vertical slider
|
||
|
|
||
|
list = QList<Qt::Key>();
|
||
|
list << Qt::Key_PageUp;
|
||
|
QTest::newRow("Page up once") << 10 // initial position
|
||
|
<< 0 // minimum
|
||
|
<< 100 // maximum
|
||
|
<< 0 // single step size
|
||
|
<< 3 // page step size
|
||
|
<< list // key sequence
|
||
|
<< 13 // result in case of horizontal slider
|
||
|
<< 13 // result in case of vertical slider
|
||
|
<< 7 // result in case of inverted horiz. slider
|
||
|
<< 7; // result in case of inverted vertical slider
|
||
|
|
||
|
list = QList<Qt::Key>();
|
||
|
list << Qt::Key_Up << Qt::Key_Up << Qt::Key_PageDown << Qt::Key_PageDown << Qt::Key_Left << Qt::Key_Left
|
||
|
<< Qt::Key_Right << Qt::Key_Down << Qt::Key_PageUp << Qt::Key_PageUp << Qt::Key_Down << Qt::Key_Right;
|
||
|
QTest::newRow("Symmetric seq") << 50 // initial position
|
||
|
<< 0 // minimum
|
||
|
<< 100 // maximum
|
||
|
<< 3 // single step size
|
||
|
<< 3 // page step size
|
||
|
<< list // key sequence
|
||
|
<< 50 // result in case of horizontal slider
|
||
|
<< 50 // result in case of vertical slider
|
||
|
<< 50 // result in case of inverted horiz. slider
|
||
|
<< 50; // result in case of inverted vertical slider
|
||
|
|
||
|
|
||
|
list = QList<Qt::Key>();
|
||
|
list << Qt::Key_Home;
|
||
|
QTest::newRow("Home") << 10 // initial position
|
||
|
<< 0 // minimum
|
||
|
<< 100 // maximum
|
||
|
<< 0 // single step size
|
||
|
<< 3 // page step size
|
||
|
<< list // key sequence
|
||
|
<< 0 // result in case of horizontal slider
|
||
|
<< 0 // result in case of vertical slider
|
||
|
<< 0 // result in case of inverted horiz. slider
|
||
|
<< 0; // result in case of inverted vertical slider
|
||
|
|
||
|
list = QList<Qt::Key>();
|
||
|
list << Qt::Key_End;
|
||
|
QTest::newRow("End") << 10 // initial position
|
||
|
<< 0 // minimum
|
||
|
<< 100 // maximum
|
||
|
<< 0 // single step size
|
||
|
<< 3 // page step size
|
||
|
<< list // key sequence
|
||
|
<< 100 // result in case of horizontal slider
|
||
|
<< 100 // result in case of vertical slider
|
||
|
<< 100 // result in case of inverted horiz. slider
|
||
|
<< 100; // result in case of inverted vertical slider
|
||
|
|
||
|
list = QList<Qt::Key>();
|
||
|
list << Qt::Key_End << Qt::Key_Up;
|
||
|
QTest::newRow("Past end")<< 10 // initial position
|
||
|
<< 0 // minimum
|
||
|
<< 100 // maximum
|
||
|
<< 3 // single step size
|
||
|
<< 3 // page step size
|
||
|
<< list // key sequence
|
||
|
<< 100 // result in case of horizontal slider
|
||
|
<< 100 // result in case of vertical slider
|
||
|
<< 97 // result in case of inverted horiz. slider
|
||
|
<< 97; // result in case of inverted vertical slider
|
||
|
|
||
|
list = QList<Qt::Key>();
|
||
|
list << Qt::Key_Home << Qt::Key_Down;
|
||
|
QTest::newRow("Past home")<< 10 // initial position
|
||
|
<< 0 // minimum
|
||
|
<< 100 // maximum
|
||
|
<< 3 // single step size
|
||
|
<< 3 // page step size
|
||
|
<< list // key sequence
|
||
|
<< 0 // result in case of horizontal slider
|
||
|
<< 0 // result in case of vertical slider
|
||
|
<< 3 // result in case of inverted horiz. slider
|
||
|
<< 3; // result in case of inverted vertical slider
|
||
|
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::keyPressed()
|
||
|
{
|
||
|
QFETCH(int, initialSliderPosition);
|
||
|
QFETCH(int, minimum);
|
||
|
QFETCH(int, maximum);
|
||
|
QFETCH(int, stepSize);
|
||
|
QFETCH(int, pageSize);
|
||
|
QFETCH(QList<Qt::Key>, keySequence);
|
||
|
QFETCH(int, expectedSliderPositionHorizontal);
|
||
|
QFETCH(int, expectedSliderPositionVertical);
|
||
|
QFETCH(int, expectedSliderPositionHorizontalInverted);
|
||
|
QFETCH(int, expectedSliderPositionVerticalInverted);
|
||
|
|
||
|
// Horizontal non-inverted
|
||
|
slider->setRange(minimum,maximum);
|
||
|
slider->setSliderPosition(initialSliderPosition);
|
||
|
slider->setSingleStep(stepSize);
|
||
|
slider->setPageStep(pageSize);
|
||
|
slider->setOrientation(Qt::Horizontal);
|
||
|
slider->setInvertedAppearance(false);
|
||
|
slider->setInvertedControls(false);
|
||
|
for (int i=0;i<keySequence.count();i++) {
|
||
|
QTest::keyClick(slider, keySequence.at(i));
|
||
|
}
|
||
|
QCOMPARE(slider->sliderPosition(), expectedSliderPositionHorizontal);
|
||
|
|
||
|
// Horizontal inverted
|
||
|
slider->setRange(minimum,maximum);
|
||
|
slider->setSliderPosition(initialSliderPosition);
|
||
|
slider->setSingleStep(stepSize);
|
||
|
slider->setPageStep(pageSize);
|
||
|
slider->setOrientation(Qt::Horizontal);
|
||
|
slider->setInvertedAppearance(true);
|
||
|
slider->setInvertedControls(true);
|
||
|
for (int i=0;i<keySequence.count();i++)
|
||
|
QTest::keyPress(slider, keySequence.at(i));
|
||
|
QCOMPARE(slider->sliderPosition(), expectedSliderPositionHorizontalInverted);
|
||
|
|
||
|
// Vertical non-inverted
|
||
|
slider->setRange(minimum,maximum);
|
||
|
slider->setSliderPosition(initialSliderPosition);
|
||
|
slider->setSingleStep(stepSize);
|
||
|
slider->setPageStep(pageSize);
|
||
|
slider->setOrientation(Qt::Vertical);
|
||
|
slider->setInvertedAppearance(false);
|
||
|
slider->setInvertedControls(false);
|
||
|
for (int i=0;i<keySequence.count();i++)
|
||
|
QTest::keyPress(slider, keySequence.at(i));
|
||
|
QCOMPARE(slider->sliderPosition(), expectedSliderPositionVertical);
|
||
|
|
||
|
// Vertical inverted
|
||
|
slider->setRange(minimum,maximum);
|
||
|
slider->setSliderPosition(initialSliderPosition);
|
||
|
slider->setSingleStep(stepSize);
|
||
|
slider->setPageStep(pageSize);
|
||
|
slider->setOrientation(Qt::Vertical);
|
||
|
slider->setInvertedAppearance(true);
|
||
|
slider->setInvertedControls(true);
|
||
|
for (int i=0;i<keySequence.count();i++)
|
||
|
QTest::keyPress(slider, keySequence.at(i));
|
||
|
QCOMPARE(slider->sliderPosition(), expectedSliderPositionVerticalInverted);
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::wheelEvent_data()
|
||
|
{
|
||
|
QTest::addColumn<int>("initialSliderPosition");
|
||
|
QTest::addColumn<int>("minimum");
|
||
|
QTest::addColumn<int>("maximum");
|
||
|
QTest::addColumn<int>("singleStep");
|
||
|
QTest::addColumn<int>("pageStep");
|
||
|
QTest::addColumn<bool>("invertedControls");
|
||
|
QTest::addColumn<int>("wheelScrollLines");
|
||
|
QTest::addColumn<bool>("withModifiers"); // use keyboard modifiers while scrolling? (CTRL and SHIFT)
|
||
|
QTest::addColumn<int>("deltaMultiple"); // multiples of WHEEL_DELTA
|
||
|
QTest::addColumn<int>("sliderOrientation");
|
||
|
QTest::addColumn<int>("wheelOrientation");
|
||
|
QTest::addColumn<int>("expectedSliderPosition");
|
||
|
QTest::addColumn<QPoint>("distanceFromBottomRight"); // mpointer's distance from bottom-right corner of widget
|
||
|
|
||
|
QTest::newRow("Normal data step") << 0 // initial position
|
||
|
<< 0 // minimum
|
||
|
<< 100 // maximum
|
||
|
<< 1 // single step
|
||
|
<< 100 // page step
|
||
|
<< false // inverted controls
|
||
|
<< 20 // wheel scroll lines
|
||
|
<< false // with modifiers
|
||
|
<< 1 // delta
|
||
|
<< int(Qt::Vertical) // orientation of slider
|
||
|
<< int(Qt::Vertical) // orientation of wheel
|
||
|
<< 20 // expected position after
|
||
|
<< QPoint(0,0);
|
||
|
|
||
|
QTest::newRow("Normal data page") << 0 // initial position
|
||
|
<< 0 // minimum
|
||
|
<< 100 // maximum
|
||
|
<< 100 // single step
|
||
|
<< 1 // page step
|
||
|
<< false // inverted controls
|
||
|
<< 20 // wheel scroll lines
|
||
|
<< false // with modifiers
|
||
|
<< 1 // delta
|
||
|
<< int(Qt::Vertical) // orientation of slider
|
||
|
<< int(Qt::Vertical) // orientation of wheel
|
||
|
#ifndef Q_WS_MAC
|
||
|
<< 1 // expected position after
|
||
|
#else
|
||
|
// We don't restrict scrolling to pageStep on Mac
|
||
|
<< 100 // expected position after
|
||
|
#endif
|
||
|
<< QPoint(1,1);
|
||
|
QTest::newRow("Different orientation") << 0 // initial position
|
||
|
<< 0 // minimum
|
||
|
<< 100 // maximum
|
||
|
<< 100 // single step
|
||
|
<< 1 // page step
|
||
|
<< false // inverted controls
|
||
|
<< 20 // wheel scroll lines
|
||
|
<< false // with modifiers
|
||
|
<< 1 // delta
|
||
|
<< int(Qt::Horizontal) // orientation of slider
|
||
|
<< int(Qt::Vertical) // orientation of wheel
|
||
|
#ifndef Q_WS_MAC
|
||
|
<< 1 // expected position after
|
||
|
#else
|
||
|
// We don't restrict scrolling to pageStep on Mac
|
||
|
<< 100 // expected position after
|
||
|
#endif
|
||
|
<< QPoint(1,1);
|
||
|
|
||
|
QTest::newRow("Different orientation2")<< 0 // initial position
|
||
|
<< 0 // minimum
|
||
|
<< 100 // maximum
|
||
|
<< 100 // single step
|
||
|
<< 1 // page step
|
||
|
<< false // inverted controls
|
||
|
<< 20 // wheel scroll lines
|
||
|
<< false // with modifiers
|
||
|
<< 1 // delta
|
||
|
<< int(Qt::Horizontal) // orientation of slider
|
||
|
<< int(Qt::Vertical) // orientation of wheel
|
||
|
#ifndef Q_WS_MAC
|
||
|
<< 1 // expected position after
|
||
|
#else
|
||
|
// We don't restrict scrolling to pageStep on Mac
|
||
|
<< 100 // expected position after
|
||
|
#endif
|
||
|
<< QPoint(0,0);
|
||
|
|
||
|
QTest::newRow("Inverted controls") << 50 // initial position
|
||
|
<< 0 // minimum
|
||
|
<< 100 // maximum
|
||
|
<< 1 // single step
|
||
|
<< 100 // page step
|
||
|
<< true // inverted controls
|
||
|
<< 20 // wheel scroll lines
|
||
|
<< false // with modifiers
|
||
|
<< -1 // delta
|
||
|
<< int(Qt::Horizontal) // orientation of slider
|
||
|
<< int(Qt::Horizontal) // orientation of wheel
|
||
|
<< 30 // expected position after
|
||
|
<< QPoint(1,1);
|
||
|
|
||
|
QTest::newRow("Past end") << 50 // initial position
|
||
|
<< 0 // minimum
|
||
|
<< 100 // maximum
|
||
|
<< 26 // single step
|
||
|
<< 100 // page step
|
||
|
<< false // inverted controls
|
||
|
<< 1 // wheel scroll lines
|
||
|
<< false // with modifiers
|
||
|
<< -2 // delta
|
||
|
<< int(Qt::Horizontal) // orientation of slider
|
||
|
<< int(Qt::Horizontal) // orientation of wheel
|
||
|
<< 100 // expected position after
|
||
|
<< QPoint(0,0);
|
||
|
|
||
|
QTest::newRow("Past start") << 50 // initial position
|
||
|
<< 0 // minimum
|
||
|
<< 100 // maximum
|
||
|
<< 26 // single step
|
||
|
<< 100 // page step
|
||
|
<< false // inverted controls
|
||
|
<< 1 // wheel scroll lines
|
||
|
<< false // with modifiers
|
||
|
<< 2 // delta
|
||
|
<< int(Qt::Horizontal) // orientation of slider
|
||
|
<< int(Qt::Horizontal) // orientation of wheel
|
||
|
<< 0 // expected position after
|
||
|
<< QPoint(0,0);
|
||
|
|
||
|
QTest::newRow("With modifiers") << 50 // initial position
|
||
|
<< 0 // minimum
|
||
|
<< 100 // maximum
|
||
|
<< 1 // single step
|
||
|
<< 40 // page step
|
||
|
<< false // inverted controls
|
||
|
<< 20 // wheel scroll lines
|
||
|
<< true // with modifiers
|
||
|
<< -1 // delta
|
||
|
<< int(Qt::Horizontal) // orientation of slider
|
||
|
<< int(Qt::Horizontal) // orientation of wheel
|
||
|
<< 90 // expected position after
|
||
|
<< QPoint(0,0);
|
||
|
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::wheelEvent()
|
||
|
{
|
||
|
QFETCH(int,initialSliderPosition);
|
||
|
QFETCH(int,minimum);
|
||
|
QFETCH(int,maximum);
|
||
|
QFETCH(int,singleStep);
|
||
|
QFETCH(int,pageStep);
|
||
|
QFETCH(bool,invertedControls);
|
||
|
QFETCH(int,wheelScrollLines);
|
||
|
QFETCH(bool,withModifiers);
|
||
|
QFETCH(int,deltaMultiple);
|
||
|
QFETCH(int,sliderOrientation);
|
||
|
QFETCH(int,wheelOrientation);
|
||
|
QFETCH(int,expectedSliderPosition);
|
||
|
QFETCH(QPoint,distanceFromBottomRight);
|
||
|
|
||
|
QCoreApplication *applicationInstance = QCoreApplication::instance();
|
||
|
QVERIFY(applicationInstance != 0);
|
||
|
QApplication::setWheelScrollLines(wheelScrollLines);
|
||
|
|
||
|
Qt::Orientation orientation = *reinterpret_cast<Qt::Orientation*>(&sliderOrientation);
|
||
|
slider->setRange(minimum,maximum);
|
||
|
slider->setSliderPosition(initialSliderPosition);
|
||
|
slider->setSingleStep(singleStep);
|
||
|
slider->setPageStep(pageStep);
|
||
|
slider->setInvertedControls(invertedControls);
|
||
|
slider->setOrientation(orientation);
|
||
|
|
||
|
Qt::KeyboardModifier k = withModifiers ? Qt::ControlModifier : Qt::NoModifier;
|
||
|
orientation = *reinterpret_cast<Qt::Orientation*>(&wheelOrientation);
|
||
|
QWheelEvent event(slider->rect().bottomRight() + distanceFromBottomRight, WHEEL_DELTA * deltaMultiple,
|
||
|
Qt::NoButton, k, orientation);
|
||
|
QVERIFY(applicationInstance->sendEvent(slider,&event));
|
||
|
QCOMPARE(slider->sliderPosition(),expectedSliderPosition);
|
||
|
|
||
|
slider->setSliderPosition(initialSliderPosition);
|
||
|
k = withModifiers ? Qt::ShiftModifier : Qt::NoModifier;
|
||
|
event = QWheelEvent(slider->rect().bottomRight() + distanceFromBottomRight, WHEEL_DELTA * deltaMultiple,
|
||
|
Qt::NoButton, k, orientation);
|
||
|
QSignalSpy spy1(slider, SIGNAL(actionTriggered(int)));
|
||
|
QSignalSpy spy2(slider, SIGNAL(valueChanged(int)));
|
||
|
QVERIFY(applicationInstance->sendEvent(slider,&event));
|
||
|
QCOMPARE(slider->sliderPosition(),expectedSliderPosition);
|
||
|
int expectedSignalCount = (initialSliderPosition == expectedSliderPosition) ? 0 : 1;
|
||
|
QCOMPARE(spy1.count(), expectedSignalCount);
|
||
|
QCOMPARE(spy2.count(), expectedSignalCount);
|
||
|
if (expectedSignalCount)
|
||
|
QVERIFY(actionTriggeredTimeStamp < valueChangedTimeStamp);
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::sliderPressedReleased_data()
|
||
|
{
|
||
|
QTest::addColumn<int>("control");
|
||
|
QTest::addColumn<int>("minimum");
|
||
|
QTest::addColumn<int>("maximum");
|
||
|
QTest::addColumn<uint>("subControl");
|
||
|
QTest::addColumn<int>("expectedCount");
|
||
|
|
||
|
QTest::newRow("slider on the handle") << int(QStyle::CC_Slider)
|
||
|
<< 0
|
||
|
<< 20
|
||
|
<< uint(QStyle::SC_SliderHandle)
|
||
|
<< 1;
|
||
|
|
||
|
QTest::newRow("slider on the groove") << int(QStyle::CC_Slider)
|
||
|
<< 0
|
||
|
<< 20
|
||
|
<< uint(QStyle::SC_SliderGroove)
|
||
|
<< ((qApp->style()->styleHint(QStyle::SH_Slider_AbsoluteSetButtons) & Qt::LeftButton) ? 1 : 0);
|
||
|
|
||
|
QTest::newRow("scrollbar on the handle") << int(QStyle::CC_ScrollBar)
|
||
|
<< 0
|
||
|
<< 20
|
||
|
<< uint(QStyle::SC_ScrollBarSlider)
|
||
|
<< 1;
|
||
|
|
||
|
QTest::newRow("scrollbar on the groove") << int(QStyle::CC_ScrollBar)
|
||
|
<< 0
|
||
|
<< 20
|
||
|
<< uint(QStyle::SC_ScrollBarGroove)
|
||
|
<< 0;
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::sliderPressedReleased()
|
||
|
{
|
||
|
QFETCH(int, control);
|
||
|
QFETCH(int, minimum);
|
||
|
QFETCH(int, maximum);
|
||
|
QFETCH(uint, subControl);
|
||
|
QFETCH(int, expectedCount);
|
||
|
|
||
|
QWidget topLevel;
|
||
|
QAbstractSlider *slider;
|
||
|
switch (control) {
|
||
|
default:
|
||
|
qWarning("Bad input into test, leaving");
|
||
|
return;
|
||
|
break;
|
||
|
case QStyle::CC_Slider:
|
||
|
slider = new QSlider(&topLevel);
|
||
|
slider->setLayoutDirection(Qt::LeftToRight); // Makes "upside down" much easier to compute
|
||
|
break;
|
||
|
case QStyle::CC_ScrollBar:
|
||
|
slider = new QScrollBar(&topLevel);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
slider->setMinimum(minimum);
|
||
|
slider->setMaximum(maximum);
|
||
|
slider->setValue(0);
|
||
|
slider->setOrientation(Qt::Vertical);
|
||
|
slider->resize(slider->sizeHint().width(), slider->sizeHint().height() + 100);
|
||
|
QSignalSpy spy1(slider, SIGNAL(sliderPressed()));
|
||
|
QSignalSpy spy2(slider, SIGNAL(sliderReleased()));
|
||
|
|
||
|
// Mac Style requires the control to be active to get the correct values...
|
||
|
topLevel.show();
|
||
|
slider->activateWindow();
|
||
|
|
||
|
QStyleOptionSlider option;
|
||
|
option.init(slider);
|
||
|
option.upsideDown = control == QStyle::CC_Slider ? !slider->invertedAppearance()
|
||
|
: slider->invertedAppearance();
|
||
|
option.subControls = QStyle::SC_None;
|
||
|
option.activeSubControls = QStyle::SC_None;
|
||
|
option.orientation = slider->orientation();
|
||
|
option.maximum = maximum;
|
||
|
option.minimum = minimum;
|
||
|
option.sliderPosition = slider->value();
|
||
|
option.sliderValue = slider->value();
|
||
|
option.singleStep = slider->singleStep();
|
||
|
option.pageStep = slider->pageStep();
|
||
|
QRect rect = slider->style()->subControlRect(QStyle::ComplexControl(control), &option,
|
||
|
QStyle::SubControl(subControl), slider);
|
||
|
|
||
|
QTest::mousePress(slider, Qt::LeftButton, 0, QPoint(rect.center().x() + 2, rect.center().y() + 2));
|
||
|
QCOMPARE(spy1.count(), expectedCount);
|
||
|
QTest::mouseRelease(slider, Qt::LeftButton, 0, rect.center());
|
||
|
QCOMPARE(spy2.count(), expectedCount);
|
||
|
|
||
|
delete slider;
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::sliderMoved_data()
|
||
|
{
|
||
|
QTest::addColumn<int>("control");
|
||
|
QTest::addColumn<int>("minimum");
|
||
|
QTest::addColumn<int>("maximum");
|
||
|
QTest::addColumn<int>("position");
|
||
|
QTest::addColumn<bool>("sliderDown");
|
||
|
QTest::addColumn<int>("expectedCount");
|
||
|
|
||
|
QTest::newRow("slider pressed") << int(QStyle::CC_Slider)
|
||
|
<< 0
|
||
|
<< 20
|
||
|
<< 10
|
||
|
<< true
|
||
|
<< 1;
|
||
|
|
||
|
QTest::newRow("slider not pressed") << int(QStyle::CC_Slider)
|
||
|
<< 0
|
||
|
<< 20
|
||
|
<< 10
|
||
|
<< false
|
||
|
<< 0;
|
||
|
|
||
|
QTest::newRow("scrollbar pressed") << int(QStyle::CC_ScrollBar)
|
||
|
<< 0
|
||
|
<< 20
|
||
|
<< 10
|
||
|
<< true
|
||
|
<< 1;
|
||
|
|
||
|
QTest::newRow("scrollbar not pressed") << int(QStyle::CC_ScrollBar)
|
||
|
<< 0
|
||
|
<< 20
|
||
|
<< 10
|
||
|
<< false
|
||
|
<< 0;
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::sliderMoved()
|
||
|
{
|
||
|
QFETCH(int, control);
|
||
|
QFETCH(int, minimum);
|
||
|
QFETCH(int, maximum);
|
||
|
QFETCH(int, position);
|
||
|
QFETCH(bool, sliderDown);
|
||
|
QFETCH(int, expectedCount);
|
||
|
QAbstractSlider *slider;
|
||
|
switch (control) {
|
||
|
default:
|
||
|
slider = 0;
|
||
|
break;
|
||
|
case QStyle::CC_Slider:
|
||
|
slider = new QSlider;
|
||
|
break;
|
||
|
case QStyle::CC_ScrollBar:
|
||
|
slider = new QScrollBar;
|
||
|
break;
|
||
|
}
|
||
|
QSignalSpy spy(slider, SIGNAL(sliderMoved(int)));
|
||
|
|
||
|
slider->setMinimum(minimum);
|
||
|
slider->setMaximum(maximum);
|
||
|
slider->setSliderDown(sliderDown);
|
||
|
slider->setSliderPosition(position);
|
||
|
QCOMPARE(spy.count(), expectedCount);
|
||
|
|
||
|
delete slider;
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::setOrientation()
|
||
|
{
|
||
|
QSlider slider(0);
|
||
|
|
||
|
QSizePolicy sp = slider.sizePolicy();
|
||
|
slider.setOrientation(slider.orientation());
|
||
|
QSizePolicy sp2 = slider.sizePolicy();
|
||
|
QCOMPARE(sp, sp2);
|
||
|
|
||
|
slider.setOrientation(Qt::Horizontal);
|
||
|
sp = slider.sizePolicy();
|
||
|
slider.setOrientation(Qt::Vertical);
|
||
|
sp2 = slider.sizePolicy();
|
||
|
|
||
|
QVERIFY(sp != sp2);
|
||
|
sp2.transpose();
|
||
|
QCOMPARE(sp, sp2);
|
||
|
}
|
||
|
|
||
|
|
||
|
void tst_QAbstractSlider::rangeChanged_data()
|
||
|
{
|
||
|
QTest::addColumn<int>("minimum");
|
||
|
QTest::addColumn<int>("maximum");
|
||
|
QTest::addColumn<int>("newMin");
|
||
|
QTest::addColumn<int>("newMax");
|
||
|
QTest::addColumn<int>("expectedCount");
|
||
|
|
||
|
QTest::newRow("no change")
|
||
|
<< 0
|
||
|
<< 20
|
||
|
<< 0
|
||
|
<< 20
|
||
|
<< 0;
|
||
|
|
||
|
QTest::newRow("min change")
|
||
|
<< 0
|
||
|
<< 20
|
||
|
<< 10
|
||
|
<< 20
|
||
|
<< 1;
|
||
|
QTest::newRow("max change")
|
||
|
<< 0
|
||
|
<< 20
|
||
|
<< 0
|
||
|
<< 30
|
||
|
<< 1;
|
||
|
|
||
|
QTest::newRow("both change")
|
||
|
<< 0
|
||
|
<< 20
|
||
|
<< 10
|
||
|
<< 30
|
||
|
<< 1;
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::rangeChanged()
|
||
|
{
|
||
|
QFETCH(int, minimum);
|
||
|
QFETCH(int, maximum);
|
||
|
QFETCH(int, newMin);
|
||
|
QFETCH(int, newMax);
|
||
|
QFETCH(int, expectedCount);
|
||
|
QSlider slider;
|
||
|
slider.setRange(minimum, maximum);
|
||
|
QSignalSpy spy(&slider, SIGNAL(rangeChanged(int, int)));
|
||
|
slider.setRange(newMin, newMax);
|
||
|
QCOMPARE(spy.count(), expectedCount);
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::setSliderPosition_data()
|
||
|
{
|
||
|
QTest::addColumn<bool>("tracking");
|
||
|
QTest::addColumn<bool>("down");
|
||
|
|
||
|
QTest::newRow("tracking, slider down")
|
||
|
<< true
|
||
|
<< true;
|
||
|
QTest::newRow("tracking, slider not down")
|
||
|
<< true
|
||
|
<< false;
|
||
|
QTest::newRow("no tracking, slider down")
|
||
|
<< false
|
||
|
<< true;
|
||
|
QTest::newRow("no tracking, slider not down")
|
||
|
<< false
|
||
|
<< false;
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::setSliderPosition()
|
||
|
{
|
||
|
QFETCH(bool, tracking);
|
||
|
QFETCH(bool, down);
|
||
|
const int minimum = 0;
|
||
|
const int maximum = 100;
|
||
|
const int initialValue = 50;
|
||
|
const int targetPosition = 75;
|
||
|
slider->setRange(minimum, maximum);
|
||
|
slider->setTracking(tracking);
|
||
|
slider->setSliderDown(down);
|
||
|
slider->setValue(initialValue);
|
||
|
QCOMPARE(slider->sliderPosition(), initialValue);
|
||
|
QSignalSpy spy1(slider, SIGNAL(sliderMoved(int)));
|
||
|
QSignalSpy spy2(slider, SIGNAL(valueChanged(int)));
|
||
|
slider->setSliderPosition(targetPosition);
|
||
|
QCOMPARE(slider->sliderPosition(), targetPosition);
|
||
|
QCOMPARE(spy1.count(), down ? 1 : 0);
|
||
|
QCOMPARE(spy2.count(), tracking ? 1 : 0);
|
||
|
QCOMPARE(slider->value(), tracking ? targetPosition : initialValue);
|
||
|
if (tracking && down)
|
||
|
QVERIFY(sliderMovedTimeStamp < valueChangedTimeStamp);
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::setValue_data()
|
||
|
{
|
||
|
QTest::addColumn<bool>("down");
|
||
|
|
||
|
QTest::newRow("slider down")
|
||
|
<< true;
|
||
|
QTest::newRow("slider not down")
|
||
|
<< false;
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::setValue()
|
||
|
{
|
||
|
QFETCH(bool, down);
|
||
|
const int minimum = 0;
|
||
|
const int maximum = 100;
|
||
|
slider->setRange(minimum, maximum);
|
||
|
slider->setSliderDown(down);
|
||
|
slider->setValue(49); // to force a valueChanged() below
|
||
|
QSignalSpy spy1(slider, SIGNAL(sliderMoved(int)));
|
||
|
QSignalSpy spy2(slider, SIGNAL(valueChanged(int)));
|
||
|
QSignalSpy spy3(slider, SIGNAL(actionTriggered(int)));
|
||
|
slider->setValue(50);
|
||
|
QCOMPARE(spy1.count(), down ? 1 : 0);
|
||
|
QCOMPARE(spy2.count(), 1);
|
||
|
QCOMPARE(spy3.count(), 0);
|
||
|
QCOMPARE(slider->value(), reportedValue);
|
||
|
QCOMPARE(slider->sliderPosition(), reportedSliderPosition);
|
||
|
if (down)
|
||
|
QVERIFY(sliderMovedTimeStamp < valueChangedTimeStamp);
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::waitUntilTimeElapsed(const QTime& t, int ms)
|
||
|
{
|
||
|
const int eps = 80;
|
||
|
while (t.elapsed() < ms + eps)
|
||
|
QTest::qWait(qMax(ms - t.elapsed() + eps, 25));
|
||
|
}
|
||
|
|
||
|
void tst_QAbstractSlider::setRepeatAction()
|
||
|
{
|
||
|
slider->setRange(0, 1000);
|
||
|
slider->setValue(55);
|
||
|
slider->setPageStep(10);
|
||
|
QSignalSpy spy(slider, SIGNAL(actionTriggered(int)));
|
||
|
|
||
|
// Start repeat action with initial delay of 500 ms, and then repeating
|
||
|
// every 250 ms.
|
||
|
slider->setRepeatAction(QAbstractSlider::SliderPageStepAdd, 500, 250);
|
||
|
QCOMPARE(spy.count(), 0);
|
||
|
QCOMPARE(slider->value(), 55);
|
||
|
|
||
|
QTime t;
|
||
|
t.start();
|
||
|
QTest::qWait(300);
|
||
|
QCOMPARE(spy.count(), 0);
|
||
|
QCOMPARE(slider->value(), 55);
|
||
|
|
||
|
waitUntilTimeElapsed(t, 550);
|
||
|
QCOMPARE(spy.count(), 1);
|
||
|
QCOMPARE(slider->value(), 65);
|
||
|
QCOMPARE(spy.at(0).at(0).toUInt(), (uint)QAbstractSlider::SliderPageStepAdd);
|
||
|
|
||
|
waitUntilTimeElapsed(t, 790);
|
||
|
QCOMPARE(spy.count(), 2);
|
||
|
QCOMPARE(slider->value(), 75);
|
||
|
QCOMPARE(spy.at(1).at(0).toUInt(), (uint)QAbstractSlider::SliderPageStepAdd);
|
||
|
|
||
|
waitUntilTimeElapsed(t, 1790);
|
||
|
QCOMPARE(spy.count(), 6);
|
||
|
QCOMPARE(slider->value(), 115);
|
||
|
QCOMPARE(spy.at(4).at(0).toUInt(), (uint)QAbstractSlider::SliderPageStepAdd);
|
||
|
QCOMPARE(spy.at(5).at(0).toUInt(), (uint)QAbstractSlider::SliderPageStepAdd);
|
||
|
|
||
|
slider->setRepeatAction(QAbstractSlider::SliderNoAction);
|
||
|
QCOMPARE(spy.count(), 6);
|
||
|
QCOMPARE(slider->value(), 115);
|
||
|
|
||
|
QTest::qWait(300);
|
||
|
QCOMPARE(spy.count(), 6);
|
||
|
QCOMPARE(slider->value(), 115);
|
||
|
}
|
||
|
|
||
|
QTEST_MAIN(tst_QAbstractSlider)
|
||
|
#include "tst_qabstractslider.moc"
|