/**************************************************************************** ** ** 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 #include #include #include //TESTED_CLASS=QAnimationGroup //TESTED_FILES= Q_DECLARE_METATYPE(QAbstractAnimation::State) class tst_QAnimationGroup : public QObject { Q_OBJECT public: tst_QAnimationGroup(); virtual ~tst_QAnimationGroup(); public Q_SLOTS: void init(); void cleanup(); private slots: void construction(); void emptyGroup(); void setCurrentTime(); void statesAndSignals(); void setParentAutoAdd(); void beginNestedGroup(); void addChildTwice(); void loopWithoutStartValue(); }; tst_QAnimationGroup::tst_QAnimationGroup() { } tst_QAnimationGroup::~tst_QAnimationGroup() { } void tst_QAnimationGroup::init() { qRegisterMetaType("QAbstractAnimation::State"); } void tst_QAnimationGroup::cleanup() { } void tst_QAnimationGroup::construction() { QSequentialAnimationGroup animationgroup; } class AnimationObject : public QObject { Q_OBJECT Q_PROPERTY(int value READ value WRITE setValue) public: AnimationObject(int startValue = 0) : v(startValue) { } int value() const { return v; } void setValue(int value) { v = value; } int v; }; class TestAnimation : public QVariantAnimation { Q_OBJECT public: virtual void updateCurrentValue(const QVariant &value) { Q_UNUSED(value)}; virtual void updateState(QAbstractAnimation::State oldState, QAbstractAnimation::State newState) { Q_UNUSED(oldState) Q_UNUSED(newState) }; }; class UncontrolledAnimation : public QPropertyAnimation { Q_OBJECT public: UncontrolledAnimation(QObject *target, const QByteArray &propertyName, QObject *parent = 0) : QPropertyAnimation(target, propertyName, parent), id(0) { setDuration(250); } int duration() const { return -1; /* not time driven */ } protected: void timerEvent(QTimerEvent *event) { if (event->timerId() == id) stop(); } void updateRunning(bool running) { if (running) { id = startTimer(500); } else { killTimer(id); id = 0; } } private: int id; }; void tst_QAnimationGroup::emptyGroup() { QSequentialAnimationGroup group; QSignalSpy groupStateChangedSpy(&group, SIGNAL(stateChanged(QAbstractAnimation::State, QAbstractAnimation::State))); QCOMPARE(group.state(), QAnimationGroup::Stopped); group.start(); QCOMPARE(groupStateChangedSpy.count(), 2); QCOMPARE(qVariantValue(groupStateChangedSpy.at(0).first()), QAnimationGroup::Running); QCOMPARE(qVariantValue(groupStateChangedSpy.at(1).first()), QAnimationGroup::Stopped); QCOMPARE(group.state(), QAnimationGroup::Stopped); QTest::ignoreMessage(QtWarningMsg, "QAbstractAnimation::pause: Cannot pause a stopped animation"); group.pause(); QCOMPARE(groupStateChangedSpy.count(), 2); QCOMPARE(group.state(), QAnimationGroup::Stopped); group.start(); QCOMPARE(qVariantValue(groupStateChangedSpy.at(2).first()), QAnimationGroup::Running); QCOMPARE(qVariantValue(groupStateChangedSpy.at(3).first()), QAnimationGroup::Stopped); QCOMPARE(group.state(), QAnimationGroup::Stopped); group.stop(); QCOMPARE(groupStateChangedSpy.count(), 4); QCOMPARE(group.state(), QAnimationGroup::Stopped); } void tst_QAnimationGroup::setCurrentTime() { AnimationObject s_o1; AnimationObject s_o2; AnimationObject s_o3; AnimationObject p_o1; AnimationObject p_o2; AnimationObject p_o3; AnimationObject t_o1; AnimationObject t_o2; // sequence operating on same object/property QSequentialAnimationGroup *sequence = new QSequentialAnimationGroup(); QAbstractAnimation *a1_s_o1 = new QPropertyAnimation(&s_o1, "value"); QAbstractAnimation *a2_s_o1 = new QPropertyAnimation(&s_o1, "value"); QAbstractAnimation *a3_s_o1 = new QPropertyAnimation(&s_o1, "value"); a2_s_o1->setLoopCount(3); sequence->addAnimation(a1_s_o1); sequence->addAnimation(a2_s_o1); sequence->addAnimation(a3_s_o1); // sequence operating on different object/properties QAnimationGroup *sequence2 = new QSequentialAnimationGroup(); QAbstractAnimation *a1_s_o2 = new QPropertyAnimation(&s_o2, "value"); QAbstractAnimation *a1_s_o3 = new QPropertyAnimation(&s_o3, "value"); sequence2->addAnimation(a1_s_o2); sequence2->addAnimation(a1_s_o3); // parallel operating on different object/properties QAnimationGroup *parallel = new QParallelAnimationGroup(); QAbstractAnimation *a1_p_o1 = new QPropertyAnimation(&p_o1, "value"); QAbstractAnimation *a1_p_o2 = new QPropertyAnimation(&p_o2, "value"); QAbstractAnimation *a1_p_o3 = new QPropertyAnimation(&p_o3, "value"); a1_p_o2->setLoopCount(3); parallel->addAnimation(a1_p_o1); parallel->addAnimation(a1_p_o2); parallel->addAnimation(a1_p_o3); QAbstractAnimation *notTimeDriven = new UncontrolledAnimation(&t_o1, "value"); QCOMPARE(notTimeDriven->totalDuration(), -1); QAbstractAnimation *loopsForever = new QPropertyAnimation(&t_o2, "value"); loopsForever->setLoopCount(-1); QCOMPARE(loopsForever->totalDuration(), -1); QParallelAnimationGroup group; group.addAnimation(sequence); group.addAnimation(sequence2); group.addAnimation(parallel); group.addAnimation(notTimeDriven); group.addAnimation(loopsForever); // Current time = 1 group.setCurrentTime(1); QCOMPARE(group.state(), QAnimationGroup::Stopped); QCOMPARE(sequence->state(), QAnimationGroup::Stopped); QCOMPARE(a1_s_o1->state(), QAnimationGroup::Stopped); QCOMPARE(sequence2->state(), QAnimationGroup::Stopped); QCOMPARE(a1_s_o2->state(), QAnimationGroup::Stopped); QCOMPARE(parallel->state(), QAnimationGroup::Stopped); QCOMPARE(a1_p_o1->state(), QAnimationGroup::Stopped); QCOMPARE(a1_p_o2->state(), QAnimationGroup::Stopped); QCOMPARE(a1_p_o3->state(), QAnimationGroup::Stopped); QCOMPARE(notTimeDriven->state(), QAnimationGroup::Stopped); QCOMPARE(loopsForever->state(), QAnimationGroup::Stopped); QCOMPARE(group.currentLoopTime(), 1); QCOMPARE(sequence->currentLoopTime(), 1); QCOMPARE(a1_s_o1->currentLoopTime(), 1); QCOMPARE(a2_s_o1->currentLoopTime(), 0); QCOMPARE(a3_s_o1->currentLoopTime(), 0); QCOMPARE(a1_s_o2->currentLoopTime(), 1); QCOMPARE(a1_s_o3->currentLoopTime(), 0); QCOMPARE(a1_p_o1->currentLoopTime(), 1); QCOMPARE(a1_p_o2->currentLoopTime(), 1); QCOMPARE(a1_p_o3->currentLoopTime(), 1); QCOMPARE(notTimeDriven->currentLoopTime(), 1); QCOMPARE(loopsForever->currentLoopTime(), 1); // Current time = 250 group.setCurrentTime(250); QCOMPARE(group.currentLoopTime(), 250); QCOMPARE(sequence->currentLoopTime(), 250); QCOMPARE(a1_s_o1->currentLoopTime(), 250); QCOMPARE(a2_s_o1->currentLoopTime(), 0); QCOMPARE(a3_s_o1->currentLoopTime(), 0); QCOMPARE(a1_s_o2->currentLoopTime(), 250); QCOMPARE(a1_s_o3->currentLoopTime(), 0); QCOMPARE(a1_p_o1->currentLoopTime(), 250); QCOMPARE(a1_p_o2->currentLoopTime(), 0); QCOMPARE(a1_p_o2->currentLoop(), 1); QCOMPARE(a1_p_o3->currentLoopTime(), 250); QCOMPARE(notTimeDriven->currentLoopTime(), 250); QCOMPARE(loopsForever->currentLoopTime(), 0); QCOMPARE(loopsForever->currentLoop(), 1); QCOMPARE(sequence->currentAnimation(), a2_s_o1); // Current time = 251 group.setCurrentTime(251); QCOMPARE(group.currentLoopTime(), 251); QCOMPARE(sequence->currentLoopTime(), 251); QCOMPARE(a1_s_o1->currentLoopTime(), 250); QCOMPARE(a2_s_o1->currentLoopTime(), 1); QCOMPARE(a2_s_o1->currentLoop(), 0); QCOMPARE(a3_s_o1->currentLoopTime(), 0); QCOMPARE(sequence2->currentLoopTime(), 251); QCOMPARE(a1_s_o2->currentLoopTime(), 250); QCOMPARE(a1_s_o3->currentLoopTime(), 1); QCOMPARE(a1_p_o1->currentLoopTime(), 250); QCOMPARE(a1_p_o2->currentLoopTime(), 1); QCOMPARE(a1_p_o2->currentLoop(), 1); QCOMPARE(a1_p_o3->currentLoopTime(), 250); QCOMPARE(notTimeDriven->currentLoopTime(), 251); QCOMPARE(loopsForever->currentLoopTime(), 1); QCOMPARE(sequence->currentAnimation(), a2_s_o1); } void tst_QAnimationGroup::statesAndSignals() { } void tst_QAnimationGroup::setParentAutoAdd() { QParallelAnimationGroup group; QVariantAnimation *animation = new QPropertyAnimation(&group); QCOMPARE(animation->group(), static_cast(&group)); } void tst_QAnimationGroup::beginNestedGroup() { QAnimationGroup *subGroup; QAnimationGroup *parent = new QParallelAnimationGroup(); for (int i = 0; i < 10; ++i) { if (i & 1) subGroup = new QParallelAnimationGroup(parent); else subGroup = new QSequentialAnimationGroup(parent); QCOMPARE(parent->animationCount(), 1); QAnimationGroup *child = static_cast(parent->animationAt(0)); QCOMPARE(child->parent(), static_cast(parent)); if (i & 1) QVERIFY(qobject_cast (child)); else QVERIFY(qobject_cast (child)); parent = child; } } void tst_QAnimationGroup::addChildTwice() { QAbstractAnimation *subGroup; QAbstractAnimation *subGroup2; QAnimationGroup *parent = new QSequentialAnimationGroup(); subGroup = new QPropertyAnimation(); subGroup->setParent(parent); parent->addAnimation(subGroup); QCOMPARE(parent->animationCount(), 1); parent->clear(); QCOMPARE(parent->animationCount(), 0); // adding the same item twice to a group will remove the item from its current position // and append it to the end subGroup = new QPropertyAnimation(parent); subGroup2 = new QPropertyAnimation(parent); QCOMPARE(parent->animationCount(), 2); QCOMPARE(parent->animationAt(0), subGroup); QCOMPARE(parent->animationAt(1), subGroup2); parent->addAnimation(subGroup); QCOMPARE(parent->animationCount(), 2); QCOMPARE(parent->animationAt(0), subGroup2); QCOMPARE(parent->animationAt(1), subGroup); delete parent; } void tst_QAnimationGroup::loopWithoutStartValue() { QAnimationGroup *parent = new QSequentialAnimationGroup(); QObject o; o.setProperty("ole", 0); QCOMPARE(o.property("ole").toInt(), 0); QPropertyAnimation anim1(&o, "ole"); anim1.setEndValue(-50); anim1.setDuration(100); QPropertyAnimation anim2(&o, "ole"); anim2.setEndValue(50); anim2.setDuration(100); parent->addAnimation(&anim1); parent->addAnimation(&anim2); parent->setLoopCount(-1); parent->start(); QVERIFY(anim1.startValue().isNull()); QCOMPARE(anim1.currentValue().toInt(), 0); QCOMPARE(parent->currentLoop(), 0); parent->setCurrentTime(200); QCOMPARE(parent->currentLoop(), 1); QCOMPARE(anim1.currentValue().toInt(), 50); parent->stop(); } QTEST_MAIN(tst_QAnimationGroup) #include "tst_qanimationgroup.moc"