diff options
Diffstat (limited to 'tests/auto/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp')
-rw-r--r-- | tests/auto/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp | 1672 |
1 files changed, 0 insertions, 1672 deletions
diff --git a/tests/auto/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp b/tests/auto/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp deleted file mode 100644 index eaebe3e14e..0000000000 --- a/tests/auto/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp +++ /dev/null @@ -1,1672 +0,0 @@ -/**************************************************************************** -** -** 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$ -** GNU Lesser General Public License Usage -** 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. -** -** 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. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtTest/QtTest> -#include "../../shared/util.h" - -#include <QtCore/qanimationgroup.h> -#include <QtCore/qsequentialanimationgroup.h> - -//TESTED_CLASS=QSequentialAnimationGroup -//TESTED_FILES= - -Q_DECLARE_METATYPE(QAbstractAnimation::State) -Q_DECLARE_METATYPE(QAbstractAnimation*) - -class tst_QSequentialAnimationGroup : public QObject -{ - Q_OBJECT -public: - tst_QSequentialAnimationGroup(); - virtual ~tst_QSequentialAnimationGroup(); - -public Q_SLOTS: - void init(); - void cleanup(); - -private slots: - void construction(); - void setCurrentTime(); - void setCurrentTimeWithUncontrolledAnimation(); - void seekingForwards(); - void seekingBackwards(); - void pauseAndResume(); - void restart(); - void looping(); - void startDelay(); - void clearGroup(); - void groupWithZeroDurationAnimations(); - void propagateGroupUpdateToChildren(); - void updateChildrenWithRunningGroup(); - void deleteChildrenWithRunningGroup(); - void startChildrenWithStoppedGroup(); - void stopGroupWithRunningChild(); - void startGroupWithRunningChild(); - void zeroDurationAnimation(); - void stopUncontrolledAnimations(); - void finishWithUncontrolledAnimation(); - void addRemoveAnimation(); - void currentAnimation(); - void currentAnimationWithZeroDuration(); - void insertAnimation(); - void clear(); - void pauseResume(); -}; - -tst_QSequentialAnimationGroup::tst_QSequentialAnimationGroup() -{ -} - -tst_QSequentialAnimationGroup::~tst_QSequentialAnimationGroup() -{ -} - -void tst_QSequentialAnimationGroup::init() -{ - qRegisterMetaType<QAbstractAnimation::State>("QAbstractAnimation::State"); - qRegisterMetaType<QAbstractAnimation*>("QAbstractAnimation*"); -} - -void tst_QSequentialAnimationGroup::cleanup() -{ -} - -void tst_QSequentialAnimationGroup::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 newState, - QAbstractAnimation::State oldState) - { - Q_UNUSED(oldState) - Q_UNUSED(newState) - }; -}; - -class DummyPropertyAnimation : public QPropertyAnimation -{ -public: - DummyPropertyAnimation(QObject *parent = 0) : QPropertyAnimation(parent) - { - setTargetObject(&o); - this->setPropertyName("value"); - setEndValue(0); - } - - AnimationObject o; -}; - -class UncontrolledAnimation : public QPropertyAnimation -{ - Q_OBJECT -public: - UncontrolledAnimation(QObject *target, QObject *parent = 0) - : QPropertyAnimation(target, "value", parent) - { - setDuration(250); - setEndValue(0); - } - - int duration() const { return -1; /* not time driven */ } - -protected: - void updateCurrentTime(int currentTime) - { - QPropertyAnimation::updateCurrentTime(currentTime); - if (currentTime >= QPropertyAnimation::duration()) - stop(); - } -}; - -void tst_QSequentialAnimationGroup::setCurrentTime() -{ - // sequence operating on same object/property - QAnimationGroup *sequence = new QSequentialAnimationGroup(); - QVariantAnimation *a1_s_o1 = new DummyPropertyAnimation; - QVariantAnimation *a2_s_o1 = new DummyPropertyAnimation; - QVariantAnimation *a3_s_o1 = new DummyPropertyAnimation; - 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(); - QVariantAnimation *a1_s_o2 = new DummyPropertyAnimation; - QVariantAnimation *a1_s_o3 = new DummyPropertyAnimation; - sequence2->addAnimation(a1_s_o2); - sequence2->addAnimation(a1_s_o3); - - QSequentialAnimationGroup group; - group.addAnimation(sequence); - group.addAnimation(sequence2); - - // 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(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(), 0); - QCOMPARE(a1_s_o3->currentLoopTime(), 0); - - // 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(), 0); - QCOMPARE(a1_s_o3->currentLoopTime(), 0); - - // 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(), 0); - QCOMPARE(a1_s_o2->currentLoopTime(), 0); - QCOMPARE(a1_s_o3->currentLoopTime(), 0); - - // Current time = 750 - group.setCurrentTime(750); - QCOMPARE(group.currentLoopTime(), 750); - QCOMPARE(sequence->currentLoopTime(), 750); - QCOMPARE(a1_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoopTime(), 0); - QCOMPARE(a2_s_o1->currentLoop(), 2); - QCOMPARE(a3_s_o1->currentLoopTime(), 0); - QCOMPARE(sequence2->currentLoopTime(), 0); - QCOMPARE(a1_s_o2->currentLoopTime(), 0); - QCOMPARE(a1_s_o3->currentLoopTime(), 0); - - // Current time = 1000 - group.setCurrentTime(1000); - QCOMPARE(group.currentLoopTime(), 1000); - QCOMPARE(sequence->currentLoopTime(), 1000); - QCOMPARE(a1_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoop(), 2); - QCOMPARE(a3_s_o1->currentLoopTime(), 0); - QCOMPARE(sequence2->currentLoopTime(), 0); - QCOMPARE(a1_s_o2->currentLoopTime(), 0); - QCOMPARE(a1_s_o3->currentLoopTime(), 0); - - // Current time = 1010 - group.setCurrentTime(1010); - QCOMPARE(group.currentLoopTime(), 1010); - QCOMPARE(sequence->currentLoopTime(), 1010); - QCOMPARE(a1_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoop(), 2); - QCOMPARE(a3_s_o1->currentLoopTime(), 10); - QCOMPARE(sequence2->currentLoopTime(), 0); - QCOMPARE(a1_s_o2->currentLoopTime(), 0); - QCOMPARE(a1_s_o3->currentLoopTime(), 0); - - // Current time = 1250 - group.setCurrentTime(1250); - QCOMPARE(group.currentLoopTime(), 1250); - QCOMPARE(sequence->currentLoopTime(), 1250); - QCOMPARE(a1_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoop(), 2); - QCOMPARE(a3_s_o1->currentLoopTime(), 250); - QCOMPARE(sequence2->currentLoopTime(), 0); - QCOMPARE(a1_s_o2->currentLoopTime(), 0); - QCOMPARE(a1_s_o3->currentLoopTime(), 0); - - // Current time = 1500 - group.setCurrentTime(1500); - QCOMPARE(group.currentLoopTime(), 1500); - QCOMPARE(sequence->currentLoopTime(), 1250); - QCOMPARE(a1_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoop(), 2); - QCOMPARE(a3_s_o1->currentLoopTime(), 250); - QCOMPARE(sequence2->currentLoopTime(), 250); - QCOMPARE(a1_s_o2->currentLoopTime(), 250); - QCOMPARE(a1_s_o3->currentLoopTime(), 0); - - // Current time = 1750 - group.setCurrentTime(1750); - QCOMPARE(group.currentLoopTime(), 1750); - QCOMPARE(sequence->currentLoopTime(), 1250); - QCOMPARE(a1_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoop(), 2); - QCOMPARE(a3_s_o1->currentLoopTime(), 250); - QCOMPARE(sequence2->currentLoopTime(), 500); - QCOMPARE(a1_s_o2->currentLoopTime(), 250); - QCOMPARE(a1_s_o3->currentLoopTime(), 250); - - // Current time = 2000 - group.setCurrentTime(2000); - QCOMPARE(group.currentLoopTime(), 1750); - QCOMPARE(sequence->currentLoopTime(), 1250); - QCOMPARE(a1_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoop(), 2); - QCOMPARE(a3_s_o1->currentLoopTime(), 250); - QCOMPARE(sequence2->currentLoopTime(), 500); - QCOMPARE(a1_s_o2->currentLoopTime(), 250); - QCOMPARE(a1_s_o3->currentLoopTime(), 250); -} - -void tst_QSequentialAnimationGroup::setCurrentTimeWithUncontrolledAnimation() -{ - AnimationObject t_o1; - - // sequence operating on different object/properties - QAnimationGroup *sequence = new QSequentialAnimationGroup(); - QPropertyAnimation *a1_s_o1 = new DummyPropertyAnimation; - QPropertyAnimation *a1_s_o2 = new DummyPropertyAnimation; - sequence->addAnimation(a1_s_o1); - sequence->addAnimation(a1_s_o2); - - QPropertyAnimation *notTimeDriven = new UncontrolledAnimation(&t_o1); - QCOMPARE(notTimeDriven->totalDuration(), -1); - - QAbstractAnimation *loopsForever = new DummyPropertyAnimation; - loopsForever->setLoopCount(-1); - QCOMPARE(loopsForever->totalDuration(), -1); - - QSequentialAnimationGroup group; - group.addAnimation(sequence); - group.addAnimation(notTimeDriven); - group.addAnimation(loopsForever); - group.start(); - group.pause(); // this allows the group to listen for the finish signal of its children - - // Current time = 1 - group.setCurrentTime(1); - QCOMPARE(group.state(), QAnimationGroup::Paused); - QCOMPARE(sequence->state(), QAnimationGroup::Paused); - QCOMPARE(a1_s_o1->state(), QAnimationGroup::Paused); - QCOMPARE(a1_s_o2->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(a1_s_o2->currentLoopTime(), 0); - QCOMPARE(notTimeDriven->currentLoopTime(), 0); - QCOMPARE(loopsForever->currentLoopTime(), 0); - - // Current time = 250 - group.setCurrentTime(250); - QCOMPARE(group.currentLoopTime(), 250); - QCOMPARE(sequence->currentLoopTime(), 250); - QCOMPARE(a1_s_o1->currentLoopTime(), 250); - QCOMPARE(a1_s_o2->currentLoopTime(), 0); - QCOMPARE(notTimeDriven->currentLoopTime(), 0); - QCOMPARE(loopsForever->currentLoopTime(), 0); - - // Current time = 500 - group.setCurrentTime(500); - QCOMPARE(group.currentLoopTime(), 500); - QCOMPARE(sequence->currentLoopTime(), 500); - QCOMPARE(a1_s_o1->currentLoopTime(), 250); - QCOMPARE(a1_s_o2->currentLoopTime(), 250); - QCOMPARE(notTimeDriven->currentLoopTime(), 0); - QCOMPARE(loopsForever->currentLoopTime(), 0); - QCOMPARE(group.currentAnimation(), static_cast<QAbstractAnimation *>(notTimeDriven)); - - // Current time = 505 - group.setCurrentTime(505); - QCOMPARE(group.currentLoopTime(), 505); - QCOMPARE(sequence->currentLoopTime(), 500); - QCOMPARE(a1_s_o1->currentLoopTime(), 250); - QCOMPARE(a1_s_o2->currentLoopTime(), 250); - QCOMPARE(notTimeDriven->currentLoopTime(), 5); - QCOMPARE(loopsForever->currentLoopTime(), 0); - QCOMPARE(group.currentAnimation(), static_cast<QAbstractAnimation *>(notTimeDriven)); - QCOMPARE(sequence->state(), QAnimationGroup::Stopped); - QCOMPARE(a1_s_o1->state(), QAnimationGroup::Stopped); - QCOMPARE(a1_s_o2->state(), QAnimationGroup::Stopped); - QCOMPARE(notTimeDriven->state(), QAnimationGroup::Paused); - QCOMPARE(loopsForever->state(), QAnimationGroup::Stopped); - - // Current time = 750 (end of notTimeDriven animation) - group.setCurrentTime(750); - QCOMPARE(group.currentLoopTime(), 750); - QCOMPARE(sequence->currentLoopTime(), 500); - QCOMPARE(a1_s_o1->currentLoopTime(), 250); - QCOMPARE(a1_s_o2->currentLoopTime(), 250); - QCOMPARE(notTimeDriven->currentLoopTime(), 250); - QCOMPARE(loopsForever->currentLoopTime(), 0); - QCOMPARE(group.currentAnimation(), loopsForever); - QCOMPARE(sequence->state(), QAnimationGroup::Stopped); - QCOMPARE(a1_s_o1->state(), QAnimationGroup::Stopped); - QCOMPARE(a1_s_o2->state(), QAnimationGroup::Stopped); - QCOMPARE(notTimeDriven->state(), QAnimationGroup::Stopped); - QCOMPARE(loopsForever->state(), QAnimationGroup::Paused); - - // Current time = 800 (as notTimeDriven was finished at 750, loopsforever should still run) - group.setCurrentTime(800); - QCOMPARE(group.currentLoopTime(), 800); - QCOMPARE(group.currentAnimation(), loopsForever); - QCOMPARE(sequence->currentLoopTime(), 500); - QCOMPARE(a1_s_o1->currentLoopTime(), 250); - QCOMPARE(a1_s_o2->currentLoopTime(), 250); - QCOMPARE(notTimeDriven->currentLoopTime(), 250); - QCOMPARE(loopsForever->currentLoopTime(), 50); - - loopsForever->stop(); // this should stop the group - - QCOMPARE(group.state(), QAnimationGroup::Stopped); - QCOMPARE(sequence->state(), QAnimationGroup::Stopped); - QCOMPARE(a1_s_o1->state(), QAnimationGroup::Stopped); - QCOMPARE(a1_s_o2->state(), QAnimationGroup::Stopped); - QCOMPARE(notTimeDriven->state(), QAnimationGroup::Stopped); - QCOMPARE(loopsForever->state(), QAnimationGroup::Stopped); -} - -void tst_QSequentialAnimationGroup::seekingForwards() -{ - - // sequence operating on same object/property - QAnimationGroup *sequence = new QSequentialAnimationGroup; - QVariantAnimation *a1_s_o1 = new DummyPropertyAnimation; - QVariantAnimation *a2_s_o1 = new DummyPropertyAnimation; - QVariantAnimation *a3_s_o1 = new DummyPropertyAnimation; - 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; - QVariantAnimation *a1_s_o2 = new DummyPropertyAnimation; - QVariantAnimation *a1_s_o3 = new DummyPropertyAnimation; - sequence2->addAnimation(a1_s_o2); - sequence2->addAnimation(a1_s_o3); - - QSequentialAnimationGroup group; - group.addAnimation(sequence); - group.addAnimation(sequence2); - - // 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(a1_s_o3->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(sequence2->currentLoopTime(), 0); - QCOMPARE(a1_s_o2->currentLoopTime(), 0); - QCOMPARE(a1_s_o3->currentLoopTime(), 0); - - // Current time = 1500 - group.setCurrentTime(1500); - QCOMPARE(group.currentLoopTime(), 1500); - QCOMPARE(sequence->currentLoopTime(), 1250); - QCOMPARE(a1_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoop(), 2); - QCOMPARE(a3_s_o1->currentLoopTime(), 250); - QCOMPARE(sequence2->currentLoopTime(), 250); - QCOMPARE(a1_s_o2->currentLoopTime(), 250); - QCOMPARE(a1_s_o3->currentLoopTime(), 0); - - // this will restart the group - group.start(); - group.pause(); - QCOMPARE(group.state(), QAnimationGroup::Paused); - QCOMPARE(sequence->state(), QAnimationGroup::Paused); - QCOMPARE(a1_s_o1->state(), QAnimationGroup::Paused); - QCOMPARE(sequence2->state(), QAnimationGroup::Stopped); - QCOMPARE(a1_s_o2->state(), QAnimationGroup::Stopped); - QCOMPARE(a1_s_o3->state(), QAnimationGroup::Stopped); - - // Current time = 1750 - group.setCurrentTime(1750); - QCOMPARE(group.currentLoopTime(), 1750); - QCOMPARE(sequence->currentLoopTime(), 1250); - QCOMPARE(a1_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoop(), 2); - QCOMPARE(a3_s_o1->currentLoopTime(), 250); - QCOMPARE(sequence2->currentLoopTime(), 500); - QCOMPARE(a1_s_o2->currentLoopTime(), 250); - QCOMPARE(a1_s_o3->currentLoopTime(), 250); -} - -void tst_QSequentialAnimationGroup::seekingBackwards() -{ - // sequence operating on same object/property - QAnimationGroup *sequence = new QSequentialAnimationGroup(); - QVariantAnimation *a1_s_o1 = new DummyPropertyAnimation; - QVariantAnimation *a2_s_o1 = new DummyPropertyAnimation; - QVariantAnimation *a3_s_o1 = new DummyPropertyAnimation; - 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(); - QVariantAnimation *a1_s_o2 = new DummyPropertyAnimation; - QVariantAnimation *a1_s_o3 = new DummyPropertyAnimation; - sequence2->addAnimation(a1_s_o2); - sequence2->addAnimation(a1_s_o3); - - QSequentialAnimationGroup group; - group.addAnimation(sequence); - group.addAnimation(sequence2); - - group.start(); - - // Current time = 1600 - group.setCurrentTime(1600); - QCOMPARE(group.currentLoopTime(), 1600); - QCOMPARE(sequence->currentLoopTime(), 1250); - QCOMPARE(a1_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoop(), 2); - QCOMPARE(a3_s_o1->currentLoopTime(), 250); - QCOMPARE(sequence2->currentLoopTime(), 350); - QCOMPARE(a1_s_o2->currentLoopTime(), 250); - QCOMPARE(a1_s_o3->currentLoopTime(), 100); - - QCOMPARE(group.state(), QAnimationGroup::Running); - QCOMPARE(sequence->state(), QAnimationGroup::Stopped); - QCOMPARE(a1_s_o1->state(), QAnimationGroup::Stopped); - QCOMPARE(sequence2->state(), QAnimationGroup::Running); - QCOMPARE(a1_s_o2->state(), QAnimationGroup::Stopped); - QCOMPARE(a1_s_o3->state(), QAnimationGroup::Running); - - // Seeking backwards, current time = 1 - group.setCurrentTime(1); - QCOMPARE(group.currentLoopTime(), 1); - QCOMPARE(sequence->currentLoopTime(), 1); - QCOMPARE(a1_s_o1->currentLoopTime(), 1); - - QEXPECT_FAIL("", "rewinding in nested groups is considered as a restart from the children," - "hence they don't reset from their current animation", Continue); - QCOMPARE(a2_s_o1->currentLoopTime(), 0); - QEXPECT_FAIL("", "rewinding in nested groups is considered as a restart from the children," - "hence they don't reset from their current animation", Continue); - QCOMPARE(a2_s_o1->currentLoop(), 0); - QEXPECT_FAIL("", "rewinding in nested groups is considered as a restart from the children," - "hence they don't reset from their current animation", Continue); - QCOMPARE(a3_s_o1->currentLoopTime(), 0); - QCOMPARE(sequence2->currentLoopTime(), 0); - QCOMPARE(a1_s_o2->currentLoopTime(), 0); - QCOMPARE(a1_s_o3->currentLoopTime(), 0); - - QCOMPARE(group.state(), QAnimationGroup::Running); - QCOMPARE(sequence->state(), QAnimationGroup::Running); - QCOMPARE(a1_s_o1->state(), QAnimationGroup::Running); - QCOMPARE(sequence2->state(), QAnimationGroup::Stopped); - QCOMPARE(a1_s_o2->state(), QAnimationGroup::Stopped); - QCOMPARE(a1_s_o3->state(), QAnimationGroup::Stopped); - - // Current time = 2000 - group.setCurrentTime(2000); - QCOMPARE(group.currentLoopTime(), 1750); - QCOMPARE(sequence->currentLoopTime(), 1250); - QCOMPARE(a1_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoop(), 2); - QCOMPARE(a3_s_o1->currentLoopTime(), 250); - QCOMPARE(sequence2->currentLoopTime(), 500); - QCOMPARE(a1_s_o2->currentLoopTime(), 250); - QCOMPARE(a1_s_o3->currentLoopTime(), 250); - - 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(a1_s_o3->state(), QAnimationGroup::Stopped); -} - -typedef QList<QAbstractAnimation::State> StateList; - -static bool compareStates(const QSignalSpy& spy, const StateList &expectedStates) -{ - bool equals = true; - for (int i = 0; i < qMax(expectedStates.count(), spy.count()); ++i) { - if (i >= spy.count() || i >= expectedStates.count()) { - equals = false; - break; - } - QList<QVariant> args = spy.at(i); - QAbstractAnimation::State st = expectedStates.at(i); - QAbstractAnimation::State actual = qVariantValue<QAbstractAnimation::State>(args.first()); - if (equals && actual != st) { - equals = false; - break; - } - } - if (!equals) { - const char *stateStrings[] = {"Stopped", "Paused", "Running"}; - QString e,a; - for (int i = 0; i < qMax(expectedStates.count(), spy.count()); ++i) { - if (i < expectedStates.count()) { - int exp = int(expectedStates.at(i)); - if (!e.isEmpty()) - e += QLatin1String(", "); - e += QLatin1String(stateStrings[exp]); - } - if (i < spy.count()) { - QList<QVariant> args = spy.at(i); - QAbstractAnimation::State actual = qVariantValue<QAbstractAnimation::State>(args.value(1)); - if (!a.isEmpty()) - a += QLatin1String(", "); - if (int(actual) >= 0 && int(actual) <= 2) { - a += QLatin1String(stateStrings[int(actual)]); - } else { - a += QLatin1String("NaN"); - } - } - - } - qDebug("\n" - "expected (count == %d): %s\n" - "actual (count == %d): %s\n", expectedStates.count(), qPrintable(e), spy.count(), qPrintable(a)); - } - return equals; -} - -void tst_QSequentialAnimationGroup::pauseAndResume() -{ - // sequence operating on same object/property - QAnimationGroup *sequence = new QSequentialAnimationGroup(); - QVariantAnimation *a1_s_o1 = new DummyPropertyAnimation; - QVariantAnimation *a2_s_o1 = new DummyPropertyAnimation; - QVariantAnimation *a3_s_o1 = new DummyPropertyAnimation; - a2_s_o1->setLoopCount(2); - sequence->addAnimation(a1_s_o1); - sequence->addAnimation(a2_s_o1); - sequence->addAnimation(a3_s_o1); - sequence->setLoopCount(2); - - QSignalSpy a1StateChangedSpy(a1_s_o1, SIGNAL(stateChanged(QAbstractAnimation::State, QAbstractAnimation::State))); - QSignalSpy seqStateChangedSpy(sequence, SIGNAL(stateChanged(QAbstractAnimation::State, QAbstractAnimation::State))); - - QSequentialAnimationGroup group; - group.addAnimation(sequence); - - group.start(); - group.pause(); - - // Current time = 1751 - group.setCurrentTime(1751); - QCOMPARE(group.currentLoopTime(), 1751); - QCOMPARE(sequence->currentLoopTime(), 751); - QCOMPARE(sequence->currentLoop(), 1); - QCOMPARE(a1_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoop(), 1); - QCOMPARE(a3_s_o1->currentLoop(), 0); - QCOMPARE(a3_s_o1->currentLoopTime(), 1); - - QCOMPARE(group.state(), QAnimationGroup::Paused); - QCOMPARE(sequence->state(), QAnimationGroup::Paused); - QCOMPARE(a1_s_o1->state(), QAnimationGroup::Stopped); - QCOMPARE(a2_s_o1->state(), QAnimationGroup::Stopped); - QCOMPARE(a3_s_o1->state(), QAnimationGroup::Paused); - - QCOMPARE(a1StateChangedSpy.count(), 5); // Running,Paused,Stopped,Running,Stopped - QCOMPARE(seqStateChangedSpy.count(), 2); // Running,Paused - - QVERIFY(compareStates(a1StateChangedSpy, (StateList() << QAbstractAnimation::Running - << QAbstractAnimation::Paused - << QAbstractAnimation::Stopped - << QAbstractAnimation::Running - << QAbstractAnimation::Stopped))); - - QCOMPARE(qVariantValue<QAbstractAnimation::State>(a1StateChangedSpy.at(0).first()), - QAnimationGroup::Running); - QCOMPARE(qVariantValue<QAbstractAnimation::State>(a1StateChangedSpy.at(1).first()), - QAnimationGroup::Paused); - QCOMPARE(qVariantValue<QAbstractAnimation::State>(a1StateChangedSpy.at(2).first()), - QAnimationGroup::Stopped); - QCOMPARE(qVariantValue<QAbstractAnimation::State>(a1StateChangedSpy.at(3).first()), - QAnimationGroup::Running); - QCOMPARE(qVariantValue<QAbstractAnimation::State>(a1StateChangedSpy.at(4).first()), - QAnimationGroup::Stopped); - - QCOMPARE(qVariantValue<QAbstractAnimation::State>(seqStateChangedSpy.at(0).first()), - QAnimationGroup::Running); - QCOMPARE(qVariantValue<QAbstractAnimation::State>(seqStateChangedSpy.at(1).first()), - QAnimationGroup::Paused); - - group.resume(); - - QCOMPARE(group.state(), QAnimationGroup::Running); - QCOMPARE(sequence->state(), QAnimationGroup::Running); - QCOMPARE(a1_s_o1->state(), QAnimationGroup::Stopped); - QCOMPARE(a2_s_o1->state(), QAnimationGroup::Stopped); - QCOMPARE(a3_s_o1->state(), QAnimationGroup::Running); - - QVERIFY(group.currentLoopTime() >= 1751); - QVERIFY(sequence->currentLoopTime() >= 751); - QCOMPARE(sequence->currentLoop(), 1); - QCOMPARE(a1_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoop(), 1); - QCOMPARE(a3_s_o1->currentLoop(), 0); - QVERIFY(a3_s_o1->currentLoopTime() >= 1); - - QCOMPARE(seqStateChangedSpy.count(), 3); // Running,Paused,Running - QCOMPARE(qVariantValue<QAbstractAnimation::State>(seqStateChangedSpy.at(2).first()), - QAnimationGroup::Running); - - group.pause(); - - QCOMPARE(group.state(), QAnimationGroup::Paused); - QCOMPARE(sequence->state(), QAnimationGroup::Paused); - QCOMPARE(a1_s_o1->state(), QAnimationGroup::Stopped); - QCOMPARE(a2_s_o1->state(), QAnimationGroup::Stopped); - QCOMPARE(a3_s_o1->state(), QAnimationGroup::Paused); - - QVERIFY(group.currentLoopTime() >= 1751); - QVERIFY(sequence->currentLoopTime() >= 751); - QCOMPARE(sequence->currentLoop(), 1); - QCOMPARE(a1_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoop(), 1); - QCOMPARE(a3_s_o1->currentLoop(), 0); - QVERIFY(a3_s_o1->currentLoopTime() >= 1); - - QCOMPARE(seqStateChangedSpy.count(), 4); // Running,Paused,Running,Paused - QCOMPARE(qVariantValue<QAbstractAnimation::State>(seqStateChangedSpy.at(3).first()), - QAnimationGroup::Paused); - - group.stop(); - - QCOMPARE(seqStateChangedSpy.count(), 5); // Running,Paused,Running,Paused,Stopped - QCOMPARE(qVariantValue<QAbstractAnimation::State>(seqStateChangedSpy.at(4).first()), - QAnimationGroup::Stopped); -} - -void tst_QSequentialAnimationGroup::restart() -{ - // sequence operating on same object/property - QAnimationGroup *sequence = new QSequentialAnimationGroup(); - QSignalSpy seqCurrentAnimChangedSpy(sequence, SIGNAL(currentAnimationChanged(QAbstractAnimation*))); - QSignalSpy seqStateChangedSpy(sequence, SIGNAL(stateChanged(QAbstractAnimation::State, QAbstractAnimation::State))); - - QVariantAnimation *anims[3]; - QSignalSpy *animsStateChanged[3]; - - for (int i = 0; i < 3; i++) { - anims[i] = new DummyPropertyAnimation; - anims[i]->setDuration(100); - animsStateChanged[i] = new QSignalSpy(anims[i], SIGNAL(stateChanged(QAbstractAnimation::State, QAbstractAnimation::State))); - } - - anims[1]->setLoopCount(2); - sequence->addAnimation(anims[0]); - sequence->addAnimation(anims[1]); - sequence->addAnimation(anims[2]); - sequence->setLoopCount(2); - - QSequentialAnimationGroup group; - group.addAnimation(sequence); - - group.start(); - - QTest::qWait(500); - - QCOMPARE(group.state(), QAnimationGroup::Running); - - QTest::qWait(300); - QTRY_COMPARE(group.state(), QAnimationGroup::Stopped); - - for (int i = 0; i < 3; i++) { - QCOMPARE(animsStateChanged[i]->count(), 4); - QCOMPARE(qVariantValue<QAbstractAnimation::State>(animsStateChanged[i]->at(0).first()), - QAnimationGroup::Running); - QCOMPARE(qVariantValue<QAbstractAnimation::State>(animsStateChanged[i]->at(1).first()), - QAnimationGroup::Stopped); - QCOMPARE(qVariantValue<QAbstractAnimation::State>(animsStateChanged[i]->at(2).first()), - QAnimationGroup::Running); - QCOMPARE(qVariantValue<QAbstractAnimation::State>(animsStateChanged[i]->at(3).first()), - QAnimationGroup::Stopped); - } - - QCOMPARE(seqStateChangedSpy.count(), 2); - QCOMPARE(qVariantValue<QAbstractAnimation::State>(seqStateChangedSpy.at(0).first()), - QAnimationGroup::Running); - QCOMPARE(qVariantValue<QAbstractAnimation::State>(seqStateChangedSpy.at(1).first()), - QAnimationGroup::Stopped); - - QCOMPARE(seqCurrentAnimChangedSpy.count(), 6); - for(int i=0; i<seqCurrentAnimChangedSpy.count(); i++) - QCOMPARE(static_cast<QAbstractAnimation*>(anims[i%3]), qVariantValue<QAbstractAnimation*>(seqCurrentAnimChangedSpy.at(i).at(0))); - - group.start(); - - QCOMPARE(animsStateChanged[0]->count(), 5); - QCOMPARE(animsStateChanged[1]->count(), 4); - QCOMPARE(animsStateChanged[2]->count(), 4); - QCOMPARE(seqStateChangedSpy.count(), 3); -} - -void tst_QSequentialAnimationGroup::looping() -{ - // sequence operating on same object/property - QSequentialAnimationGroup *sequence = new QSequentialAnimationGroup(); - QAbstractAnimation *a1_s_o1 = new DummyPropertyAnimation; - QAbstractAnimation *a2_s_o1 = new DummyPropertyAnimation; - QAbstractAnimation *a3_s_o1 = new DummyPropertyAnimation; - - QSignalSpy a1Spy(a1_s_o1, SIGNAL(stateChanged(QAbstractAnimation::State, QAbstractAnimation::State))); - QSignalSpy a2Spy(a2_s_o1, SIGNAL(stateChanged(QAbstractAnimation::State, QAbstractAnimation::State))); - QSignalSpy a3Spy(a3_s_o1, SIGNAL(stateChanged(QAbstractAnimation::State, QAbstractAnimation::State))); - QSignalSpy seqSpy(sequence, SIGNAL(stateChanged(QAbstractAnimation::State, QAbstractAnimation::State))); - - a2_s_o1->setLoopCount(2); - sequence->addAnimation(a1_s_o1); - sequence->addAnimation(a2_s_o1); - sequence->addAnimation(a3_s_o1); - sequence->setLoopCount(2); - - QSequentialAnimationGroup group; - QSignalSpy groupSpy(&group, SIGNAL(stateChanged(QAbstractAnimation::State, QAbstractAnimation::State))); - - group.addAnimation(sequence); - group.setLoopCount(2); - - group.start(); - group.pause(); - - // Current time = 1750 - group.setCurrentTime(1750); - QCOMPARE(group.currentLoopTime(), 1750); - QCOMPARE(sequence->currentLoopTime(), 750); - QCOMPARE(sequence->currentLoop(), 1); - QCOMPARE(a1_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoop(), 1); - // this animation is at the beginning because it is the current one inside sequence - QCOMPARE(a3_s_o1->currentLoop(), 0); - QCOMPARE(a3_s_o1->currentLoopTime(), 0); - QCOMPARE(sequence->currentAnimation(), a3_s_o1); - - QCOMPARE(group.state(), QAnimationGroup::Paused); - QCOMPARE(sequence->state(), QAnimationGroup::Paused); - QCOMPARE(a1_s_o1->state(), QAnimationGroup::Stopped); - QCOMPARE(a2_s_o1->state(), QAnimationGroup::Stopped); - QCOMPARE(a3_s_o1->state(), QAnimationGroup::Paused); - - QCOMPARE(a1Spy.count(), 5); // Running,Paused,Stopped,Running,Stopped - QVERIFY(compareStates(a1Spy, (StateList() << QAbstractAnimation::Running - << QAbstractAnimation::Paused - << QAbstractAnimation::Stopped - << QAbstractAnimation::Running - << QAbstractAnimation::Stopped))); - - QCOMPARE(a2Spy.count(), 4); // Running,Stopped,Running,Stopped - QVERIFY(compareStates(a3Spy, (StateList() << QAbstractAnimation::Running - << QAbstractAnimation::Stopped - << QAbstractAnimation::Running - << QAbstractAnimation::Paused))); - - QCOMPARE(seqSpy.count(), 2); // Running,Paused - QCOMPARE(groupSpy.count(), 2); // Running,Paused - - // Looping, current time = duration + 1 - group.setCurrentTime(group.duration() + 1); - QCOMPARE(group.currentLoopTime(), 1); - QCOMPARE(group.currentLoop(), 1); - QCOMPARE(sequence->currentLoopTime(), 1); - QCOMPARE(sequence->currentLoop(), 0); - QCOMPARE(a1_s_o1->currentLoopTime(), 1); - QCOMPARE(a2_s_o1->currentLoopTime(), 250); - QCOMPARE(a2_s_o1->currentLoop(), 1); - // this animation is at the end because it was run on the previous loop - QCOMPARE(a3_s_o1->currentLoop(), 0); - QCOMPARE(a3_s_o1->currentLoopTime(), 250); - - QCOMPARE(group.state(), QAnimationGroup::Paused); - QCOMPARE(sequence->state(), QAnimationGroup::Paused); - QCOMPARE(a1_s_o1->state(), QAnimationGroup::Paused); - QCOMPARE(a2_s_o1->state(), QAnimationGroup::Stopped); - QCOMPARE(a3_s_o1->state(), QAnimationGroup::Stopped); - - QCOMPARE(a1Spy.count(), 7); // Running,Paused,Stopped,Running,Stopped,Running,Stopped - QCOMPARE(a2Spy.count(), 4); // Running, Stopped, Running, Stopped - QVERIFY(compareStates(a3Spy, (StateList() << QAbstractAnimation::Running - << QAbstractAnimation::Stopped - << QAbstractAnimation::Running - << QAbstractAnimation::Paused - << QAbstractAnimation::Stopped))); - QVERIFY(compareStates(seqSpy, (StateList() << QAbstractAnimation::Running - << QAbstractAnimation::Paused - << QAbstractAnimation::Stopped - << QAbstractAnimation::Running - << QAbstractAnimation::Paused))); - QCOMPARE(groupSpy.count(), 2); -} - -void tst_QSequentialAnimationGroup::startDelay() -{ - QSequentialAnimationGroup group; - group.addPause(250); - group.addPause(125); - QCOMPARE(group.totalDuration(), 375); - - group.start(); - QCOMPARE(group.state(), QAnimationGroup::Running); - - QTest::qWait(500); - - QTRY_COMPARE(group.state(), QAnimationGroup::Stopped); - QVERIFY(group.currentLoopTime() == 375); -} - -void tst_QSequentialAnimationGroup::clearGroup() -{ - QSequentialAnimationGroup group; - - static const int animationCount = 20; - - for (int i = 0; i < animationCount/2; ++i) { - QSequentialAnimationGroup *subGroup = new QSequentialAnimationGroup(&group); - group.addPause(100); - subGroup->addPause(10); - } - - QCOMPARE(group.animationCount(), animationCount); - - QPointer<QAbstractAnimation> children[animationCount]; - for (int i = 0; i < animationCount; ++i) { - QVERIFY(group.animationAt(i) != 0); - children[i] = group.animationAt(i); - } - - group.clear(); - QCOMPARE(group.animationCount(), 0); - QCOMPARE(group.currentLoopTime(), 0); - for (int i = 0; i < animationCount; ++i) - QVERIFY(children[i].isNull()); -} - -void tst_QSequentialAnimationGroup::groupWithZeroDurationAnimations() -{ - QObject o; - QObject o2; - - o.setProperty("myProperty", 42); - o.setProperty("myOtherProperty", 13); - o2.setProperty("myProperty", 42); - o2.setProperty("myOtherProperty", 13); - - QSequentialAnimationGroup group; - - QVariantAnimation *a1 = new QPropertyAnimation(&o, "myProperty"); - a1->setDuration(0); - a1->setEndValue(43); - group.addAnimation(a1); - - //this should just run fine and change nothing - group.setCurrentTime(0); - QCOMPARE(group.currentAnimation(), static_cast<QAbstractAnimation*>(a1)); - - QVariantAnimation *a2 = new QPropertyAnimation(&o2, "myOtherProperty"); - a2->setDuration(500); - a2->setEndValue(31); - group.addAnimation(a2); - - QVariantAnimation *a3 = new QPropertyAnimation(&o, "myProperty"); - a3->setDuration(0); - a3->setEndValue(44); - group.addAnimation(a3); - - QVariantAnimation *a4 = new QPropertyAnimation(&o, "myOtherProperty"); - a4->setDuration(250); - a4->setEndValue(75); - group.addAnimation(a4); - - QVariantAnimation *a5 = new QPropertyAnimation(&o2, "myProperty"); - a5->setDuration(0); - a5->setEndValue(12); - group.addAnimation(a5); - - QCOMPARE(o.property("myProperty").toInt(), 42); - QCOMPARE(o.property("myOtherProperty").toInt(), 13); - QCOMPARE(o2.property("myProperty").toInt(), 42); - QCOMPARE(o2.property("myOtherProperty").toInt(), 13); - - - group.start(); - - QCOMPARE(o.property("myProperty").toInt(), 43); - QCOMPARE(o.property("myOtherProperty").toInt(), 13); - QCOMPARE(o2.property("myProperty").toInt(), 42); - QCOMPARE(o2.property("myOtherProperty").toInt(), 13); - - QTest::qWait(100); - - int o2val = o2.property("myOtherProperty").toInt(); - QVERIFY(o2val > 13); - QVERIFY(o2val < 31); - QCOMPARE(o.property("myProperty").toInt(), 43); - QCOMPARE(o.property("myOtherProperty").toInt(), 13); - - QTest::qWait(500); - - QTRY_COMPARE(o.property("myProperty").toInt(), 44); - QCOMPARE(o2.property("myProperty").toInt(), 42); - QCOMPARE(o2.property("myOtherProperty").toInt(), 31); - QCOMPARE(a1->state(), QAnimationGroup::Stopped); - QCOMPARE(a2->state(), QAnimationGroup::Stopped); - QCOMPARE(a3->state(), QAnimationGroup::Stopped); - QCOMPARE(a4->state(), QAnimationGroup::Running); - QCOMPARE(a5->state(), QAnimationGroup::Stopped); - QCOMPARE(group.state(), QAnimationGroup::Running); - QTest::qWait(500); - - QTRY_COMPARE(group.state(), QAnimationGroup::Stopped); - QCOMPARE(o.property("myProperty").toInt(), 44); - QCOMPARE(o.property("myOtherProperty").toInt(), 75); - QCOMPARE(o2.property("myProperty").toInt(), 12); - QCOMPARE(o2.property("myOtherProperty").toInt(), 31); - QCOMPARE(a1->state(), QAnimationGroup::Stopped); - QCOMPARE(a2->state(), QAnimationGroup::Stopped); - QCOMPARE(a3->state(), QAnimationGroup::Stopped); - QCOMPARE(a4->state(), QAnimationGroup::Stopped); - QCOMPARE(a5->state(), QAnimationGroup::Stopped); -} - -void tst_QSequentialAnimationGroup::propagateGroupUpdateToChildren() -{ - // this test verifies if group state changes are updating its children correctly - QSequentialAnimationGroup group; - - QObject o; - o.setProperty("ole", 42); - QCOMPARE(o.property("ole").toInt(), 42); - - QPropertyAnimation anim1(&o, "ole"); - anim1.setEndValue(43); - anim1.setDuration(100); - QVERIFY(!anim1.currentValue().isValid()); - QCOMPARE(anim1.currentValue().toInt(), 0); - QCOMPARE(o.property("ole").toInt(), 42); - - TestAnimation anim2; - anim2.setStartValue(0); - anim2.setEndValue(100); - anim2.setDuration(200); - - QVERIFY(anim2.currentValue().isValid()); - QCOMPARE(anim2.currentValue().toInt(), 0); - - QCOMPARE(group.state(), QAnimationGroup::Stopped); - QCOMPARE(anim1.state(), QAnimationGroup::Stopped); - QCOMPARE(anim2.state(), QAnimationGroup::Stopped); - - group.addAnimation(&anim1); - group.addAnimation(&anim2); - - group.start(); - - QCOMPARE(group.state(), QAnimationGroup::Running); - QCOMPARE(anim1.state(), QAnimationGroup::Running); - QCOMPARE(anim2.state(), QAnimationGroup::Stopped); - - group.pause(); - - QCOMPARE(group.state(), QAnimationGroup::Paused); - QCOMPARE(anim1.state(), QAnimationGroup::Paused); - QCOMPARE(anim2.state(), QAnimationGroup::Stopped); - - group.stop(); - - QCOMPARE(group.state(), QAnimationGroup::Stopped); - QCOMPARE(anim1.state(), QAnimationGroup::Stopped); - QCOMPARE(anim2.state(), QAnimationGroup::Stopped); -} - -void tst_QSequentialAnimationGroup::updateChildrenWithRunningGroup() -{ - // assert that its possible to modify a child's state directly while their group is running - QSequentialAnimationGroup group; - - TestAnimation anim; - anim.setStartValue(0); - anim.setEndValue(100); - anim.setDuration(200); - - QSignalSpy groupStateChangedSpy(&group, SIGNAL(stateChanged(QAbstractAnimation::State, QAbstractAnimation::State))); - QSignalSpy childStateChangedSpy(&anim, SIGNAL(stateChanged(QAbstractAnimation::State, QAbstractAnimation::State))); - - QCOMPARE(groupStateChangedSpy.count(), 0); - QCOMPARE(childStateChangedSpy.count(), 0); - QCOMPARE(group.state(), QAnimationGroup::Stopped); - QCOMPARE(anim.state(), QAnimationGroup::Stopped); - - group.addAnimation(&anim); - - group.start(); - - QCOMPARE(group.state(), QAnimationGroup::Running); - QCOMPARE(anim.state(), QAnimationGroup::Running); - - QCOMPARE(groupStateChangedSpy.count(), 1); - QCOMPARE(childStateChangedSpy.count(), 1); - - QCOMPARE(qVariantValue<QAbstractAnimation::State>(groupStateChangedSpy.at(0).first()), - QAnimationGroup::Running); - QCOMPARE(qVariantValue<QAbstractAnimation::State>(childStateChangedSpy.at(0).first()), - QAnimationGroup::Running); - - // starting directly a running child will not have any effect - anim.start(); - - QCOMPARE(groupStateChangedSpy.count(), 1); - QCOMPARE(childStateChangedSpy.count(), 1); - - anim.pause(); - - QCOMPARE(group.state(), QAnimationGroup::Running); - QCOMPARE(anim.state(), QAnimationGroup::Paused); - - // in the animation stops directly, the group will still be running - anim.stop(); - - QCOMPARE(group.state(), QAnimationGroup::Running); - QCOMPARE(anim.state(), QAnimationGroup::Stopped); -} - -void tst_QSequentialAnimationGroup::deleteChildrenWithRunningGroup() -{ - // test if children can be activated when their group is stopped - QSequentialAnimationGroup group; - - QVariantAnimation *anim1 = new TestAnimation; - anim1->setStartValue(0); - anim1->setEndValue(100); - anim1->setDuration(200); - group.addAnimation(anim1); - - QCOMPARE(group.duration(), anim1->duration()); - - group.start(); - QCOMPARE(group.state(), QAnimationGroup::Running); - QCOMPARE(anim1->state(), QAnimationGroup::Running); - - QTest::qWait(100); - QTRY_VERIFY(group.currentLoopTime() > 0); - - delete anim1; - QCOMPARE(group.animationCount(), 0); - QCOMPARE(group.duration(), 0); - QCOMPARE(group.state(), QAnimationGroup::Stopped); - QCOMPARE(group.currentLoopTime(), 0); //that's the invariant -} - -void tst_QSequentialAnimationGroup::startChildrenWithStoppedGroup() -{ - // test if children can be activated when their group is stopped - QSequentialAnimationGroup group; - - TestAnimation anim1; - anim1.setStartValue(0); - anim1.setEndValue(100); - anim1.setDuration(200); - - TestAnimation anim2; - anim2.setStartValue(0); - anim2.setEndValue(100); - anim2.setDuration(200); - - QCOMPARE(group.state(), QAnimationGroup::Stopped); - QCOMPARE(anim1.state(), QAnimationGroup::Stopped); - QCOMPARE(anim2.state(), QAnimationGroup::Stopped); - - group.addAnimation(&anim1); - group.addAnimation(&anim2); - - group.stop(); - - QCOMPARE(group.state(), QAnimationGroup::Stopped); - QCOMPARE(anim1.state(), QAnimationGroup::Stopped); - QCOMPARE(anim2.state(), QAnimationGroup::Stopped); - - anim1.start(); - anim2.start(); - anim2.pause(); - - QCOMPARE(group.state(), QAnimationGroup::Stopped); - QCOMPARE(anim1.state(), QAnimationGroup::Running); - QCOMPARE(anim2.state(), QAnimationGroup::Paused); -} - -void tst_QSequentialAnimationGroup::stopGroupWithRunningChild() -{ - // children that started independently will not be affected by a group stop - QSequentialAnimationGroup group; - - TestAnimation anim1; - anim1.setStartValue(0); - anim1.setEndValue(100); - anim1.setDuration(200); - - TestAnimation anim2; - anim2.setStartValue(0); - anim2.setEndValue(100); - anim2.setDuration(200); - - QCOMPARE(group.state(), QAnimationGroup::Stopped); - QCOMPARE(anim1.state(), QAnimationGroup::Stopped); - QCOMPARE(anim2.state(), QAnimationGroup::Stopped); - - group.addAnimation(&anim1); - group.addAnimation(&anim2); - - anim1.start(); - anim2.start(); - anim2.pause(); - - QCOMPARE(group.state(), QAnimationGroup::Stopped); - QCOMPARE(anim1.state(), QAnimationGroup::Running); - QCOMPARE(anim2.state(), QAnimationGroup::Paused); - - group.stop(); - - QCOMPARE(group.state(), QAnimationGroup::Stopped); - QCOMPARE(anim1.state(), QAnimationGroup::Running); - QCOMPARE(anim2.state(), QAnimationGroup::Paused); - - anim1.stop(); - anim2.stop(); - - QCOMPARE(group.state(), QAnimationGroup::Stopped); - QCOMPARE(anim1.state(), QAnimationGroup::Stopped); - QCOMPARE(anim2.state(), QAnimationGroup::Stopped); -} - -void tst_QSequentialAnimationGroup::startGroupWithRunningChild() -{ - // as the group has precedence over its children, starting a group will restart all the children - QSequentialAnimationGroup group; - - TestAnimation *anim1 = new TestAnimation(); - anim1->setStartValue(0); - anim1->setEndValue(100); - anim1->setDuration(200); - - TestAnimation *anim2 = new TestAnimation(); - anim2->setStartValue(0); - anim2->setEndValue(100); - anim2->setDuration(200); - - QSignalSpy stateChangedSpy1(anim1, SIGNAL(stateChanged(QAbstractAnimation::State, QAbstractAnimation::State))); - QSignalSpy stateChangedSpy2(anim2, SIGNAL(stateChanged(QAbstractAnimation::State, QAbstractAnimation::State))); - - QCOMPARE(stateChangedSpy1.count(), 0); - QCOMPARE(stateChangedSpy2.count(), 0); - QCOMPARE(group.state(), QAnimationGroup::Stopped); - QCOMPARE(anim1->state(), QAnimationGroup::Stopped); - QCOMPARE(anim2->state(), QAnimationGroup::Stopped); - - group.addAnimation(anim1); - group.addAnimation(anim2); - - anim1->start(); - anim2->start(); - anim2->pause(); - - QVERIFY(compareStates(stateChangedSpy1, (StateList() << QAbstractAnimation::Running))); - - QVERIFY(compareStates(stateChangedSpy2, (StateList() << QAbstractAnimation::Running - << QAbstractAnimation::Paused))); - - QCOMPARE(group.state(), QAnimationGroup::Stopped); - QCOMPARE(anim1->state(), QAnimationGroup::Running); - QCOMPARE(anim2->state(), QAnimationGroup::Paused); - - group.start(); - - QVERIFY(compareStates(stateChangedSpy1, (StateList() << QAbstractAnimation::Running - << QAbstractAnimation::Stopped - << QAbstractAnimation::Running))); - QVERIFY(compareStates(stateChangedSpy2, (StateList() << QAbstractAnimation::Running - << QAbstractAnimation::Paused))); - - QCOMPARE(group.state(), QAnimationGroup::Running); - QCOMPARE(anim1->state(), QAnimationGroup::Running); - QCOMPARE(anim2->state(), QAnimationGroup::Paused); - - QTest::qWait(300); - - QCOMPARE(group.state(), QAnimationGroup::Running); - QCOMPARE(anim1->state(), QAnimationGroup::Stopped); - QCOMPARE(anim2->state(), QAnimationGroup::Running); - - QCOMPARE(stateChangedSpy2.count(), 4); - QCOMPARE(qVariantValue<QAbstractAnimation::State>(stateChangedSpy2.at(2).first()), - QAnimationGroup::Stopped); - QCOMPARE(qVariantValue<QAbstractAnimation::State>(stateChangedSpy2.at(3).first()), - QAnimationGroup::Running); - - group.stop(); - - QCOMPARE(group.state(), QAnimationGroup::Stopped); - QCOMPARE(anim1->state(), QAnimationGroup::Stopped); - QCOMPARE(anim2->state(), QAnimationGroup::Stopped); -} - -void tst_QSequentialAnimationGroup::zeroDurationAnimation() -{ - QSequentialAnimationGroup group; - - TestAnimation *anim1 = new TestAnimation(); - anim1->setStartValue(0); - anim1->setEndValue(100); - anim1->setDuration(0); - - TestAnimation *anim2 = new TestAnimation(); - anim2->setStartValue(0); - anim2->setEndValue(100); - anim2->setDuration(100); - - DummyPropertyAnimation *anim3 = new DummyPropertyAnimation; - anim3->setEndValue(100); - anim3->setDuration(0); - - QSignalSpy stateChangedSpy(anim1, SIGNAL(stateChanged(QAbstractAnimation::State, QAbstractAnimation::State))); - - group.addAnimation(anim1); - group.addAnimation(anim2); - group.addAnimation(anim3); - group.setLoopCount(2); - group.start(); - - QCOMPARE(stateChangedSpy.count(), 2); - QCOMPARE(qVariantValue<QAbstractAnimation::State>(stateChangedSpy.at(0).first()), - QAnimationGroup::Running); - QCOMPARE(qVariantValue<QAbstractAnimation::State>(stateChangedSpy.at(1).first()), - QAnimationGroup::Stopped); - - QCOMPARE(anim1->state(), QAnimationGroup::Stopped); - QCOMPARE(anim2->state(), QAnimationGroup::Running); - QCOMPARE(group.state(), QAnimationGroup::Running); - - //now let's try to seek to the next loop - group.setCurrentTime(group.duration() + 1); - QCOMPARE(anim1->state(), QAnimationGroup::Stopped); - QCOMPARE(anim2->state(), QAnimationGroup::Running); - QCOMPARE(anim3->state(), QAnimationGroup::Stopped); - QCOMPARE(group.state(), QAnimationGroup::Running); - QCOMPARE(anim3->o.value(), 100); //anim3 should have been run -} - -void tst_QSequentialAnimationGroup::stopUncontrolledAnimations() -{ - QSequentialAnimationGroup group; - - AnimationObject o1; - UncontrolledAnimation notTimeDriven(&o1); - QCOMPARE(notTimeDriven.totalDuration(), -1); - - TestAnimation loopsForever; - loopsForever.setStartValue(0); - loopsForever.setEndValue(100); - loopsForever.setDuration(100); - loopsForever.setLoopCount(-1); - - group.addAnimation(¬TimeDriven); - group.addAnimation(&loopsForever); - - group.start(); - - QCOMPARE(group.state(), QAnimationGroup::Running); - QCOMPARE(notTimeDriven.state(), QAnimationGroup::Running); - QCOMPARE(loopsForever.state(), QAnimationGroup::Stopped); - - notTimeDriven.stop(); - - QCOMPARE(group.state(), QAnimationGroup::Running); - QCOMPARE(notTimeDriven.state(), QAnimationGroup::Stopped); - QCOMPARE(loopsForever.state(), QAnimationGroup::Running); - - loopsForever.stop(); - - QCOMPARE(group.state(), QAnimationGroup::Stopped); - QCOMPARE(notTimeDriven.state(), QAnimationGroup::Stopped); - QCOMPARE(loopsForever.state(), QAnimationGroup::Stopped); -} - -void tst_QSequentialAnimationGroup::finishWithUncontrolledAnimation() -{ - AnimationObject o1; - - //1st case: - //first we test a group with one uncontrolled animation - QSequentialAnimationGroup group; - UncontrolledAnimation notTimeDriven(&o1, &group); - QSignalSpy spy(&group, SIGNAL(finished())); - - group.start(); - QCOMPARE(group.state(), QAnimationGroup::Running); - QCOMPARE(notTimeDriven.state(), QAnimationGroup::Running); - QCOMPARE(group.currentLoopTime(), 0); - QCOMPARE(notTimeDriven.currentLoopTime(), 0); - - QTest::qWait(300); //wait for the end of notTimeDriven - QTRY_COMPARE(notTimeDriven.state(), QAnimationGroup::Stopped); - const int actualDuration = notTimeDriven.currentLoopTime(); - QCOMPARE(group.state(), QAnimationGroup::Stopped); - QCOMPARE(group.currentLoopTime(), actualDuration); - QCOMPARE(spy.count(), 1); - - //2nd case: - // lets make sure the seeking will work again - spy.clear(); - DummyPropertyAnimation anim(&group); - QSignalSpy animStateChangedSpy(&anim, SIGNAL(stateChanged(QAbstractAnimation::State, QAbstractAnimation::State))); - - group.setCurrentTime(300); - QCOMPARE(group.state(), QAnimationGroup::Stopped); - QCOMPARE(notTimeDriven.currentLoopTime(), actualDuration); - QCOMPARE(group.currentAnimation(), static_cast<QAbstractAnimation*>(&anim)); - - //3rd case: - //now let's add a perfectly defined animation at the end - QCOMPARE(animStateChangedSpy.count(), 0); - group.start(); - QCOMPARE(group.state(), QAnimationGroup::Running); - QCOMPARE(notTimeDriven.state(), QAnimationGroup::Running); - QCOMPARE(group.currentLoopTime(), 0); - QCOMPARE(notTimeDriven.currentLoopTime(), 0); - - QCOMPARE(animStateChangedSpy.count(), 0); - - QTest::qWait(300); //wait for the end of notTimeDriven - QTRY_COMPARE(notTimeDriven.state(), QAnimationGroup::Stopped); - QCOMPARE(group.state(), QAnimationGroup::Running); - QCOMPARE(anim.state(), QAnimationGroup::Running); - QCOMPARE(group.currentAnimation(), static_cast<QAbstractAnimation*>(&anim)); - QCOMPARE(animStateChangedSpy.count(), 1); - QTest::qWait(300); //wait for the end of anim - - QTRY_COMPARE(anim.state(), QAnimationGroup::Stopped); - QCOMPARE(anim.currentLoopTime(), anim.duration()); - - //we should simply be at the end - QCOMPARE(spy.count(), 1); - QCOMPARE(animStateChangedSpy.count(), 2); - QCOMPARE(group.currentLoopTime(), notTimeDriven.currentLoopTime() + anim.currentLoopTime()); -} - -void tst_QSequentialAnimationGroup::addRemoveAnimation() -{ - //this test is specific to the sequential animation group - QSequentialAnimationGroup group; - - QCOMPARE(group.duration(), 0); - QCOMPARE(group.currentLoopTime(), 0); - QAbstractAnimation *anim1 = new QPropertyAnimation; - group.addAnimation(anim1); - QCOMPARE(group.duration(), 250); - QCOMPARE(group.currentLoopTime(), 0); - QCOMPARE(group.currentAnimation(), anim1); - - //let's append an animation - QAbstractAnimation *anim2 = new QPropertyAnimation; - group.addAnimation(anim2); - QCOMPARE(group.duration(), 500); - QCOMPARE(group.currentLoopTime(), 0); - QCOMPARE(group.currentAnimation(), anim1); - - //let's prepend an animation - QAbstractAnimation *anim0 = new QPropertyAnimation; - group.insertAnimation(0, anim0); - QCOMPARE(group.duration(), 750); - QCOMPARE(group.currentLoopTime(), 0); - QCOMPARE(group.currentAnimation(), anim0); //anim0 has become the new currentAnimation - - group.setCurrentTime(300); //anim0 | anim1 | anim2 - QCOMPARE(group.currentLoopTime(), 300); - QCOMPARE(group.currentAnimation(), anim1); - QCOMPARE(anim1->currentLoopTime(), 50); - - group.removeAnimation(anim0); //anim1 | anim2 - QCOMPARE(group.currentLoopTime(), 50); - QCOMPARE(group.currentAnimation(), anim1); - QCOMPARE(anim1->currentLoopTime(), 50); - - group.setCurrentTime(0); - group.insertAnimation(0, anim0); //anim0 | anim1 | anim2 - group.setCurrentTime(300); - QCOMPARE(group.currentLoopTime(), 300); - QCOMPARE(group.currentAnimation(), anim1); - QCOMPARE(anim1->currentLoopTime(), 50); - - group.removeAnimation(anim1); //anim0 | anim2 - QCOMPARE(group.currentLoopTime(), 250); - QCOMPARE(group.currentAnimation(), anim2); - QCOMPARE(anim0->currentLoopTime(), 250); -} - -void tst_QSequentialAnimationGroup::currentAnimation() -{ - QSequentialAnimationGroup group; - QVERIFY(group.currentAnimation() == 0); - - QPropertyAnimation anim; - anim.setDuration(0); - group.addAnimation(&anim); - QCOMPARE(group.currentAnimation(), static_cast<QAbstractAnimation*>(&anim)); -} - -void tst_QSequentialAnimationGroup::currentAnimationWithZeroDuration() -{ - QSequentialAnimationGroup group; - QVERIFY(group.currentAnimation() == 0); - - QPropertyAnimation zero1; - zero1.setDuration(0); - QPropertyAnimation zero2; - zero2.setDuration(0); - - QPropertyAnimation anim; - - QPropertyAnimation zero3; - zero3.setDuration(0); - QPropertyAnimation zero4; - zero4.setDuration(0); - - - group.addAnimation(&zero1); - group.addAnimation(&zero2); - group.addAnimation(&anim); - group.addAnimation(&zero3); - group.addAnimation(&zero4); - - QCOMPARE(group.currentAnimation(), static_cast<QAbstractAnimation*>(&zero1)); - - group.setCurrentTime(0); - QCOMPARE(group.currentAnimation(), static_cast<QAbstractAnimation*>(&anim)); - - group.setCurrentTime(group.duration()); - QCOMPARE(group.currentAnimation(), static_cast<QAbstractAnimation*>(&zero4)); - - group.setDirection(QAbstractAnimation::Backward); - - group.setCurrentTime(0); - QCOMPARE(group.currentAnimation(), static_cast<QAbstractAnimation*>(&zero1)); - - group.setCurrentTime(group.duration()); - QCOMPARE(group.currentAnimation(), static_cast<QAbstractAnimation*>(&anim)); -} - -void tst_QSequentialAnimationGroup::insertAnimation() -{ - QSequentialAnimationGroup group; - group.setLoopCount(2); - QPropertyAnimation *anim = new DummyPropertyAnimation(&group); - QCOMPARE(group.duration(), anim->duration()); - group.setCurrentTime(300); - QCOMPARE(group.currentLoop(), 1); - - //this will crash if the sequential group calls duration on the created animation - new QPropertyAnimation(&group); -} - - -class SequentialAnimationGroup : public QSequentialAnimationGroup -{ - Q_OBJECT -public slots: - void clear() - { - QSequentialAnimationGroup::clear(); - } - - void refill() - { - stop(); - clear(); - new DummyPropertyAnimation(this); - start(); - } - -}; - - -void tst_QSequentialAnimationGroup::clear() -{ - SequentialAnimationGroup group; - QPointer<QAbstractAnimation> anim1 = new DummyPropertyAnimation(&group); - group.connect(anim1, SIGNAL(finished()), SLOT(clear())); - new DummyPropertyAnimation(&group); - QCOMPARE(group.animationCount(), 2); - - group.start(); - QTest::qWait(anim1->duration() + 100); - QTRY_COMPARE(group.animationCount(), 0); - QCOMPARE(group.state(), QAbstractAnimation::Stopped); - QCOMPARE(group.currentLoopTime(), 0); - - anim1 = new DummyPropertyAnimation(&group); - group.connect(anim1, SIGNAL(finished()), SLOT(refill())); - group.start(); - QTest::qWait(anim1->duration() + 100); - QTRY_COMPARE(group.state(), QAbstractAnimation::Running); - QVERIFY(anim1 == 0); //anim1 should have been deleted -} - -void tst_QSequentialAnimationGroup::pauseResume() -{ - QObject dummy; - dummy.setProperty("foo", 0); - QParallelAnimationGroup group; - QPropertyAnimation *anim = new QPropertyAnimation(&dummy, "foo", &group); - anim->setDuration(250); - anim->setEndValue(250); - QSignalSpy spy(anim, SIGNAL(stateChanged(QAbstractAnimation::State, QAbstractAnimation::State))); - QCOMPARE(group.duration(), 250); - group.start(); - QTest::qWait(100); - QTRY_COMPARE(group.state(), QAnimationGroup::Running); - QCOMPARE(anim->state(), QAnimationGroup::Running); - QCOMPARE(spy.count(), 1); - spy.clear(); - const int currentTime = group.currentLoopTime(); - QCOMPARE(anim->currentLoopTime(), currentTime); - - group.pause(); - QCOMPARE(group.state(), QAnimationGroup::Paused); - QCOMPARE(group.currentLoopTime(), currentTime); - QCOMPARE(anim->state(), QAnimationGroup::Paused); - QCOMPARE(anim->currentLoopTime(), currentTime); - QCOMPARE(spy.count(), 1); - spy.clear(); - - group.resume(); - QCOMPARE(group.state(), QAnimationGroup::Running); - QCOMPARE(group.currentLoopTime(), currentTime); - QCOMPARE(anim->state(), QAnimationGroup::Running); - QCOMPARE(anim->currentLoopTime(), currentTime); - QCOMPARE(spy.count(), 1); -} - -QTEST_MAIN(tst_QSequentialAnimationGroup) -#include "tst_qsequentialanimationgroup.moc" |