151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)/*
251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * Copyright (c) 2013, Google Inc. All rights reserved.
351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) *
451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * modification, are permitted provided that the following conditions are
651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * met:
751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) *
851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) *     * Redistributions of source code must retain the above copyright
951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * notice, this list of conditions and the following disclaimer.
1051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) *     * Redistributions in binary form must reproduce the above
1151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
1251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * in the documentation and/or other materials provided with the
1351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * distribution.
1451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
1551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * contributors may be used to endorse or promote products derived from
1651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * this software without specific prior written permission.
1751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) *
1851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) */
3051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
3151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "config.h"
3251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
3351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/animation/CompositorAnimations.h"
3451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
3551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/animation/CompositorAnimationsImpl.h"
3651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/animation/CompositorAnimationsTestHelper.h"
37197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/animation/animatable/AnimatableDouble.h"
38197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/animation/animatable/AnimatableFilterOperations.h"
39197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/animation/animatable/AnimatableTransform.h"
40197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/animation/animatable/AnimatableValueTestHelper.h"
41197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "platform/geometry/FloatBox.h"
4251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/geometry/IntSize.h"
43a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/FilterOperations.h"
4451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/transforms/TransformOperations.h"
4551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/transforms/TranslateTransformOperation.h"
469e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "public/platform/WebCompositorAnimation.h"
4751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "wtf/HashFunctions.h"
4851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "wtf/OwnPtr.h"
4951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "wtf/PassOwnPtr.h"
5051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "wtf/PassRefPtr.h"
5151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "wtf/RefPtr.h"
5251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
5351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include <gmock/gmock.h>
5451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include <gtest/gtest.h>
5551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
56c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
5751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
5851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)using ::testing::CloneToPassOwnPtr;
5951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)using ::testing::ExpectationSet;
6051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)using ::testing::Ref;
6151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)using ::testing::Return;
6251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)using ::testing::_;
6351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
6451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)class AnimationCompositorAnimationsTest : public AnimationCompositorAnimationsTestBase {
6551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)protected:
6651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    RefPtr<TimingFunction> m_linearTimingFunction;
6751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    RefPtr<TimingFunction> m_cubicEaseTimingFunction;
6851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    RefPtr<TimingFunction> m_cubicCustomTimingFunction;
6951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    RefPtr<TimingFunction> m_stepTimingFunction;
7051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
7151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    Timing m_timing;
7251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    CompositorAnimationsImpl::CompositorTiming m_compositorTiming;
73a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    OwnPtrWillBePersistent<AnimatableValueKeyframeVector> m_keyframeVector2;
74a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBePersistent<AnimatableValueKeyframeEffectModel> m_keyframeAnimationEffect2;
75a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    OwnPtrWillBePersistent<AnimatableValueKeyframeVector> m_keyframeVector5;
76a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBePersistent<AnimatableValueKeyframeEffectModel> m_keyframeAnimationEffect5;
7751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
7851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    virtual void SetUp()
7951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
8051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        AnimationCompositorAnimationsTestBase::SetUp();
8151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
82f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        m_linearTimingFunction = LinearTimingFunction::shared();
8351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_cubicEaseTimingFunction = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::Ease);
8451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_cubicCustomTimingFunction = CubicBezierTimingFunction::create(1, 2, 3, 4);
857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_stepTimingFunction = StepsTimingFunction::create(1, StepsTimingFunction::End);
8651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
8751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_timing = createCompositableTiming();
8851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_compositorTiming = CompositorAnimationsImpl::CompositorTiming();
8951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        // Make sure the CompositableTiming is really compositable, otherwise
9051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        // most other tests will fail.
9151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        ASSERT(convertTimingForCompositor(m_timing, m_compositorTiming));
9251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
9351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_keyframeVector2 = createCompositableFloatKeyframeVector(2);
94a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        m_keyframeAnimationEffect2 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector2);
95a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
9651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_keyframeVector5 = createCompositableFloatKeyframeVector(5);
97a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        m_keyframeAnimationEffect5 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector5);
9851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
9951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
10051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)public:
10151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
10251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    bool convertTimingForCompositor(const Timing& t, CompositorAnimationsImpl::CompositorTiming& out)
10351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
1047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return CompositorAnimationsImpl::convertTimingForCompositor(t, 0, out, 1);
10551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
106a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    bool isCandidateForAnimationOnCompositor(const Timing& timing, const AnimationEffect& effect)
10751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
1087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return CompositorAnimations::instance()->isCandidateForAnimationOnCompositor(timing, effect, 1);
10951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
1109e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    void getAnimationOnCompositor(Timing& timing, AnimatableValueKeyframeEffectModel& effect, Vector<OwnPtr<WebCompositorAnimation> >& animations)
11151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
1127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return getAnimationOnCompositor(timing, effect, animations, 1);
1137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void getAnimationOnCompositor(Timing& timing, AnimatableValueKeyframeEffectModel& effect, Vector<OwnPtr<WebCompositorAnimation> >& animations, double playerPlaybackRate)
1157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {
1167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return CompositorAnimationsImpl::getAnimationOnCompositor(timing, std::numeric_limits<double>::quiet_NaN(), 0, effect, animations, playerPlaybackRate);
11751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
118197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    bool getAnimationBounds(FloatBox& boundingBox, const AnimationEffect& effect, double minValue, double maxValue)
119197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
120197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return CompositorAnimations::instance()->getAnimatedBoundingBox(boundingBox, effect, minValue, maxValue);
121197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
12251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
123a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    bool duplicateSingleKeyframeAndTestIsCandidateOnResult(AnimatableValueKeyframe* frame)
124a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    {
125a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        EXPECT_EQ(frame->offset(), 0);
126a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        AnimatableValueKeyframeVector frames;
127a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        RefPtrWillBeRawPtr<Keyframe> second = frame->cloneWithOffset(1);
128a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
129a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        frames.append(frame);
130a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        frames.append(toAnimatableValueKeyframe(second.get()));
131a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return isCandidateForAnimationOnCompositor(m_timing, *AnimatableValueKeyframeEffectModel::create(frames).get());
132a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
133a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
13451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // -------------------------------------------------------------------
13551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
13651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    Timing createCompositableTiming()
13751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
13851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        Timing timing;
13951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        timing.startDelay = 0;
14051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        timing.fillMode = Timing::FillModeNone;
14151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        timing.iterationStart = 0;
14251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        timing.iterationCount = 1;
14351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        timing.iterationDuration = 1.0;
14451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        timing.playbackRate = 1.0;
14551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        timing.direction = Timing::PlaybackDirectionNormal;
14651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        ASSERT(m_linearTimingFunction);
14751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        timing.timingFunction = m_linearTimingFunction;
14851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return timing;
14951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
15051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
151a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    PassRefPtrWillBeRawPtr<AnimatableValueKeyframe> createReplaceOpKeyframe(CSSPropertyID id, AnimatableValue* value, double offset = 0)
15251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
153a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        RefPtrWillBeRawPtr<AnimatableValueKeyframe> keyframe = AnimatableValueKeyframe::create();
15451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        keyframe->setPropertyValue(id, value);
15551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        keyframe->setComposite(AnimationEffect::CompositeReplace);
15651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        keyframe->setOffset(offset);
157f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        keyframe->setEasing(LinearTimingFunction::shared());
15851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return keyframe;
15951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
16051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
161a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    PassRefPtrWillBeRawPtr<AnimatableValueKeyframe> createDefaultKeyframe(CSSPropertyID id, AnimationEffect::CompositeOperation op, double offset = 0)
16251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
16307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        RefPtrWillBeRawPtr<AnimatableValue> value = nullptr;
164aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (id == CSSPropertyTransform)
16551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            value = AnimatableTransform::create(TransformOperations());
16651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        else
16751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            value = AnimatableDouble::create(10.0);
16851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
169a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        RefPtrWillBeRawPtr<AnimatableValueKeyframe> keyframe = createReplaceOpKeyframe(id, value.get(), offset);
17051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        keyframe->setComposite(op);
17151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return keyframe;
17251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
17351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
174a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    PassOwnPtrWillBeRawPtr<AnimatableValueKeyframeVector> createCompositableFloatKeyframeVector(size_t n)
17551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
17651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        Vector<double> values;
17751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        for (size_t i = 0; i < n; i++) {
17851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            values.append(static_cast<double>(i));
17951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        }
18051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return createCompositableFloatKeyframeVector(values);
18151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
18251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
183a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    PassOwnPtrWillBeRawPtr<AnimatableValueKeyframeVector> createCompositableFloatKeyframeVector(Vector<double>& values)
18451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
185a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        OwnPtrWillBeRawPtr<AnimatableValueKeyframeVector> frames = adoptPtrWillBeNoop(new AnimatableValueKeyframeVector);
18651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        for (size_t i = 0; i < values.size(); i++) {
18751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            double offset = 1.0 / (values.size() - 1) * i;
18807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            RefPtrWillBeRawPtr<AnimatableDouble> value = AnimatableDouble::create(values[i]);
189d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            frames->append(createReplaceOpKeyframe(CSSPropertyOpacity, value.get(), offset).get());
19051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        }
191d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return frames.release();
19251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
19351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
194197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    PassOwnPtrWillBeRawPtr<AnimatableValueKeyframeVector> createCompositableTransformKeyframeVector(const Vector<TransformOperations>& values)
195197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
196197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        OwnPtrWillBeRawPtr<AnimatableValueKeyframeVector> frames = adoptPtrWillBeNoop(new AnimatableValueKeyframeVector);
197197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        for (size_t i = 0; i < values.size(); ++i) {
198197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            double offset = 1.0f / (values.size() - 1) * i;
199197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            RefPtrWillBeRawPtr<AnimatableTransform> value = AnimatableTransform::create(values[i]);
200197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            frames->append(createReplaceOpKeyframe(CSSPropertyTransform, value.get(), offset).get());
201197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
202197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return frames.release();
203197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
204197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
205a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    PassRefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> createKeyframeEffectModel(PassRefPtrWillBeRawPtr<AnimatableValueKeyframe> prpFrom, PassRefPtrWillBeRawPtr<AnimatableValueKeyframe> prpTo, PassRefPtrWillBeRawPtr<AnimatableValueKeyframe> prpC = nullptr, PassRefPtrWillBeRawPtr<AnimatableValueKeyframe> prpD = nullptr)
20651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
207a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        RefPtrWillBeRawPtr<AnimatableValueKeyframe> from = prpFrom;
208a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        RefPtrWillBeRawPtr<AnimatableValueKeyframe> to = prpTo;
209a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        RefPtrWillBeRawPtr<AnimatableValueKeyframe> c = prpC;
210a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        RefPtrWillBeRawPtr<AnimatableValueKeyframe> d = prpD;
21151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
21251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        EXPECT_EQ(from->offset(), 0);
213a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        AnimatableValueKeyframeVector frames;
21451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        frames.append(from);
21551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        EXPECT_LE(from->offset(), to->offset());
21651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        frames.append(to);
21751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (c) {
21851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            EXPECT_LE(to->offset(), c->offset());
21951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            frames.append(c);
22051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        }
22151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (d) {
22251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            frames.append(d);
22351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            EXPECT_LE(c->offset(), d->offset());
22451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            EXPECT_EQ(d->offset(), 1.0);
22551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        } else {
22651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            EXPECT_EQ(to->offset(), 1.0);
22751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        }
22851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (!HasFatalFailure()) {
229a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            return AnimatableValueKeyframeEffectModel::create(frames);
23051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        }
23107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return nullptr;
23251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
23351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
23451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)};
23551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
23651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)// -----------------------------------------------------------------------
23751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)// -----------------------------------------------------------------------
23851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
239a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorKeyframeMultipleCSSProperties)
24051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
241a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<AnimatableValueKeyframe> keyframeGoodMultiple = createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace);
242aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    keyframeGoodMultiple->setPropertyValue(CSSPropertyTransform, AnimatableTransform::create(TransformOperations()).get());
243a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    EXPECT_TRUE(duplicateSingleKeyframeAndTestIsCandidateOnResult(keyframeGoodMultiple.get()));
24451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
245a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<AnimatableValueKeyframe> keyframeBadMultipleID = createDefaultKeyframe(CSSPropertyColor, AnimationEffect::CompositeReplace);
24609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    keyframeBadMultipleID->setPropertyValue(CSSPropertyOpacity, AnimatableDouble::create(10.0).get());
247a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    EXPECT_FALSE(duplicateSingleKeyframeAndTestIsCandidateOnResult(keyframeBadMultipleID.get()));
24851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
24951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
250a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, isNotCandidateForCompositorAnimationTransformDependsOnBoxSize)
251a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
252a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TransformOperations ops;
2539e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    ops.operations().append(TranslateTransformOperation::create(Length(2, Fixed), Length(2, Fixed), TransformOperation::TranslateX));
254a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<AnimatableValueKeyframe> goodKeyframe = createReplaceOpKeyframe(CSSPropertyTransform, AnimatableTransform::create(ops).get());
255a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    EXPECT_TRUE(duplicateSingleKeyframeAndTestIsCandidateOnResult(goodKeyframe.get()));
256a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
2579e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    ops.operations().append(TranslateTransformOperation::create(Length(50, Percent), Length(2, Fixed), TransformOperation::TranslateX));
258a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<AnimatableValueKeyframe> badKeyframe = createReplaceOpKeyframe(CSSPropertyTransform, AnimatableTransform::create(ops).get());
259a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    EXPECT_FALSE(duplicateSingleKeyframeAndTestIsCandidateOnResult(badKeyframe.get()));
260a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
26109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    TransformOperations ops2;
2629e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    Length calcLength = Length(100, Percent).blend(Length(100, Fixed), 0.5, ValueRangeAll);
2639e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    ops2.operations().append(TranslateTransformOperation::create(calcLength, Length(0, Fixed), TransformOperation::TranslateX));
264a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<AnimatableValueKeyframe> badKeyframe2 = createReplaceOpKeyframe(CSSPropertyTransform, AnimatableTransform::create(ops2).get());
265a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    EXPECT_FALSE(duplicateSingleKeyframeAndTestIsCandidateOnResult(badKeyframe2.get()));
26651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
26751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
26809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorKeyframeEffectModelMultipleFramesOkay)
26951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
270a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    AnimatableValueKeyframeVector framesSame;
27151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    framesSame.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.0).get());
27251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    framesSame.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 1.0).get());
273a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *AnimatableValueKeyframeEffectModel::create(framesSame).get()));
27451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
275a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    AnimatableValueKeyframeVector framesMixed;
27651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    framesMixed.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.0).get());
277aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    framesMixed.append(createDefaultKeyframe(CSSPropertyTransform, AnimationEffect::CompositeReplace, 1.0).get());
278a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *AnimatableValueKeyframeEffectModel::create(framesMixed).get()));
27951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
28051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
28109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorKeyframeEffectModel)
28251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
283a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    AnimatableValueKeyframeVector framesSame;
28451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    framesSame.append(createDefaultKeyframe(CSSPropertyColor, AnimationEffect::CompositeReplace, 0.0).get());
28551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    framesSame.append(createDefaultKeyframe(CSSPropertyColor, AnimationEffect::CompositeReplace, 1.0).get());
286a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *AnimatableValueKeyframeEffectModel::create(framesSame).get()));
28751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
288a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    AnimatableValueKeyframeVector framesMixedProperties;
28951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    framesMixedProperties.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.0).get());
29051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    framesMixedProperties.append(createDefaultKeyframe(CSSPropertyColor, AnimationEffect::CompositeReplace, 1.0).get());
291a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *AnimatableValueKeyframeEffectModel::create(framesMixedProperties).get()));
29251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
29351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
294197021e6b966cfb06891637935ef33fff06433d1Ben MurdochTEST_F(AnimationCompositorAnimationsTest, AnimatedBoundingBox)
295197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
296197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    Vector<TransformOperations> transformVector;
297197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    transformVector.append(TransformOperations());
2989e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    transformVector.last().operations().append(TranslateTransformOperation::create(Length(0, Fixed), Length(0, Fixed), 0.0, TransformOperation::Translate3D));
299197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    transformVector.append(TransformOperations());
3009e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    transformVector.last().operations().append(TranslateTransformOperation::create(Length(200, Fixed), Length(200, Fixed), 0.0, TransformOperation::Translate3D));
301197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    OwnPtrWillBePersistent<AnimatableValueKeyframeVector> frames = createCompositableTransformKeyframeVector(transformVector);
302197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    FloatBox bounds;
303197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    EXPECT_TRUE(getAnimationBounds(bounds, *AnimatableValueKeyframeEffectModel::create(*frames).get(), 0, 1));
304197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    EXPECT_EQ(FloatBox(0.0f, 0.f, 0.0f, 200.0f, 200.0f, 0.0f), bounds);
305197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    bounds = FloatBox();
306197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    EXPECT_TRUE(getAnimationBounds(bounds, *AnimatableValueKeyframeEffectModel::create(*frames).get(), -1, 1));
307197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    EXPECT_EQ(FloatBox(-200.0f, -200.0, 0.0, 400.0f, 400.0f, 0.0f), bounds);
308197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    transformVector.append(TransformOperations());
3099e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    transformVector.last().operations().append(TranslateTransformOperation::create(Length(-300, Fixed), Length(-400, Fixed), 1.0f, TransformOperation::Translate3D));
310197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    bounds = FloatBox();
311197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    frames = createCompositableTransformKeyframeVector(transformVector);
312197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    EXPECT_TRUE(getAnimationBounds(bounds, *AnimatableValueKeyframeEffectModel::create(*frames).get(), 0, 1));
313197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    EXPECT_EQ(FloatBox(-300.0f, -400.f, 0.0f, 500.0f, 600.0f, 1.0f), bounds);
314197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    bounds = FloatBox();
315197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    EXPECT_TRUE(getAnimationBounds(bounds, *AnimatableValueKeyframeEffectModel::create(*frames).get(), -1, 2));
316197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    EXPECT_EQ(FloatBox(-1300.0f, -1600.f, 0.0f, 1500.0f, 1800.0f, 3.0f), bounds);
317197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
318197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
31951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorStartDelay)
32051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
32151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationDuration = 20.0;
32251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
32351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.startDelay = 2.0;
324a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
325a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_DOUBLE_EQ(-2.0, m_compositorTiming.scaledTimeOffset);
32651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
32751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.startDelay = -2.0;
32851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
329a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_DOUBLE_EQ(2.0, m_compositorTiming.scaledTimeOffset);
33051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
33151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
33251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorIterationStart)
33351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
33451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationStart = 2.2;
3357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
33651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
33751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
33851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorIterationCount)
33951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
34051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationCount = 5.0;
34151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
34251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(5, m_compositorTiming.adjustedIterationCount);
34351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
34451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationCount = 5.5;
3459e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
3469e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    EXPECT_EQ(5.5, m_compositorTiming.adjustedIterationCount);
34751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
34851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // EXPECT_DEATH tests are flaky on Android.
349197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT) && !OS(ANDROID)
35051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationCount = -1;
35151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_DEATH(convertTimingForCompositor(m_timing, m_compositorTiming), "");
35251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#endif
35351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
35451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationCount = std::numeric_limits<double>::infinity();
35551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
35651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(-1, m_compositorTiming.adjustedIterationCount);
35751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
35851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationCount = std::numeric_limits<double>::infinity();
35951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationDuration = 5.0;
36051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.startDelay = -6.0;
36151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
362a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_DOUBLE_EQ(6.0, m_compositorTiming.scaledTimeOffset);
36351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(-1, m_compositorTiming.adjustedIterationCount);
36451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
36551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
36651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorIterationsAndStartDelay)
36751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
36851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationCount = 4.0;
36951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationDuration = 5.0;
37051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
371a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_timing.startDelay = 6.0;
37251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
373a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_DOUBLE_EQ(-6.0, m_compositorTiming.scaledTimeOffset);
374a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_DOUBLE_EQ(4.0, m_compositorTiming.adjustedIterationCount);
37551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
37651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.startDelay = -6.0;
377a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
378a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_DOUBLE_EQ(6.0, m_compositorTiming.scaledTimeOffset);
379a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_DOUBLE_EQ(4.0, m_compositorTiming.adjustedIterationCount);
38051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
381a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_timing.startDelay = 21.0;
38251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_FALSE(convertTimingForCompositor(m_timing, m_compositorTiming));
38351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
38451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
38551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorPlaybackRate)
38651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
3877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_timing.playbackRate = 1.0;
3887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
3897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_DOUBLE_EQ(1.0, m_compositorTiming.playbackRate);
39051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
3917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_timing.playbackRate = -2.3;
3927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
3937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_DOUBLE_EQ(-2.3, m_compositorTiming.playbackRate);
39451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
3957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_timing.playbackRate = 1.6;
3967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
3977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_DOUBLE_EQ(1.6, m_compositorTiming.playbackRate);
39851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
39951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
40051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorDirection)
40151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
4027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_timing.direction = Timing::PlaybackDirectionNormal;
4037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
4047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_EQ(m_compositorTiming.direction, Timing::PlaybackDirectionNormal);
4057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
40651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.direction = Timing::PlaybackDirectionAlternate;
40751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
4087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_EQ(m_compositorTiming.direction, Timing::PlaybackDirectionAlternate);
40951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
41051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.direction = Timing::PlaybackDirectionAlternateReverse;
41151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
4127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_EQ(m_compositorTiming.direction, Timing::PlaybackDirectionAlternateReverse);
41351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
41451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.direction = Timing::PlaybackDirectionReverse;
41551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
4167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_EQ(m_compositorTiming.direction, Timing::PlaybackDirectionReverse);
41751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
41851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
41951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorDirectionIterationsAndStartDelay)
42051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
42151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.direction = Timing::PlaybackDirectionAlternate;
42251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationCount = 4.0;
42351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationDuration = 5.0;
42451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.startDelay = -6.0;
42551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
426a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_DOUBLE_EQ(6.0, m_compositorTiming.scaledTimeOffset);
427a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_EQ(4, m_compositorTiming.adjustedIterationCount);
4287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_EQ(m_compositorTiming.direction, Timing::PlaybackDirectionAlternate);
42951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
43051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.direction = Timing::PlaybackDirectionAlternate;
43151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationCount = 4.0;
43251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationDuration = 5.0;
43351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.startDelay = -11.0;
43451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
435a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_DOUBLE_EQ(11.0, m_compositorTiming.scaledTimeOffset);
436a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_EQ(4, m_compositorTiming.adjustedIterationCount);
4377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_EQ(m_compositorTiming.direction, Timing::PlaybackDirectionAlternate);
43851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
43951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.direction = Timing::PlaybackDirectionAlternateReverse;
44051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationCount = 4.0;
44151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationDuration = 5.0;
44251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.startDelay = -6.0;
44351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
444a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_DOUBLE_EQ(6.0, m_compositorTiming.scaledTimeOffset);
445a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_EQ(4, m_compositorTiming.adjustedIterationCount);
4467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_EQ(m_compositorTiming.direction, Timing::PlaybackDirectionAlternateReverse);
44751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
44851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.direction = Timing::PlaybackDirectionAlternateReverse;
44951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationCount = 4.0;
45051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationDuration = 5.0;
45151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.startDelay = -11.0;
45251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
453a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_DOUBLE_EQ(11.0, m_compositorTiming.scaledTimeOffset);
454a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_EQ(4, m_compositorTiming.adjustedIterationCount);
4557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_EQ(m_compositorTiming.direction, Timing::PlaybackDirectionAlternateReverse);
45651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
45751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
458a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingTimingFunctionPassThru)
45951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
46051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.timingFunction = m_stepTimingFunction;
461a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
46251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
46351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
464a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionLinear)
46551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
466a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_timing.timingFunction = m_linearTimingFunction;
467a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
468a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
46951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
47051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
471a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionCubic)
47251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
473a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_timing.timingFunction = m_cubicEaseTimingFunction;
4747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
475a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
47651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
477a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_timing.timingFunction = m_cubicCustomTimingFunction;
4787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
479a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
48051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
48151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
482a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionSteps)
48351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
484a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_timing.timingFunction = m_stepTimingFunction;
485a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
486a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
48751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
48851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
489a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionChainedLinear)
49051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
491a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
492a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
49351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
49451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
4957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciTEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorNonLinearTimingFunctionOnFirstFrame)
4967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
4977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_timing.timingFunction = m_cubicEaseTimingFunction;
4987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
4997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
5007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
5017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    (*m_keyframeVector2)[0]->setEasing(m_cubicEaseTimingFunction.get());
5027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_keyframeAnimationEffect2 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector2);
5037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
5047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
5057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
506a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionChainedCubicMatchingOffsets)
50751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
508d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector2)[0]->setEasing(m_cubicEaseTimingFunction.get());
509a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_keyframeAnimationEffect2 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector2);
510a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
51151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
512d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector2)[0]->setEasing(m_cubicCustomTimingFunction.get());
513a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_keyframeAnimationEffect2 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector2);
514a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
51551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
516d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector5)[0]->setEasing(m_cubicEaseTimingFunction.get());
517d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector5)[1]->setEasing(m_cubicCustomTimingFunction.get());
518d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector5)[2]->setEasing(m_cubicCustomTimingFunction.get());
519d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector5)[3]->setEasing(m_cubicCustomTimingFunction.get());
520a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_keyframeAnimationEffect5 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector5);
521a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
52251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
52351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
524a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionMixedGood)
52551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
526d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector5)[0]->setEasing(m_linearTimingFunction.get());
527d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector5)[1]->setEasing(m_cubicEaseTimingFunction.get());
528d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector5)[2]->setEasing(m_cubicEaseTimingFunction.get());
529d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector5)[3]->setEasing(m_linearTimingFunction.get());
530a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_keyframeAnimationEffect5 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector5);
531a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
53251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
53351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
534a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionWithStepNotOkay)
53551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
536d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector2)[0]->setEasing(m_stepTimingFunction.get());
537a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_keyframeAnimationEffect2 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector2);
538a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
53951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
540d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector5)[0]->setEasing(m_stepTimingFunction.get());
541d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector5)[1]->setEasing(m_linearTimingFunction.get());
542d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector5)[2]->setEasing(m_cubicEaseTimingFunction.get());
543d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector5)[3]->setEasing(m_linearTimingFunction.get());
544a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_keyframeAnimationEffect5 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector5);
545a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
54651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
547d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector5)[0]->setEasing(m_linearTimingFunction.get());
548d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector5)[1]->setEasing(m_stepTimingFunction.get());
549d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector5)[2]->setEasing(m_cubicEaseTimingFunction.get());
550d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector5)[3]->setEasing(m_linearTimingFunction.get());
551a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_keyframeAnimationEffect5 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector5);
552a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
55351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
554d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector5)[0]->setEasing(m_linearTimingFunction.get());
555d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector5)[1]->setEasing(m_cubicEaseTimingFunction.get());
556d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector5)[2]->setEasing(m_cubicEaseTimingFunction.get());
557d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    (*m_keyframeVector5)[3]->setEasing(m_stepTimingFunction.get());
558a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_keyframeAnimationEffect5 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector5);
559a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
56051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
56151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
562a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositor)
56351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
56451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    Timing linearTiming(createCompositableTiming());
56551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
566a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    AnimatableValueKeyframeVector basicFramesVector;
56751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    basicFramesVector.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.0).get());
56851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    basicFramesVector.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 1.0).get());
56951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
570a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    AnimatableValueKeyframeVector nonBasicFramesVector;
57151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    nonBasicFramesVector.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.0).get());
57251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    nonBasicFramesVector.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.5).get());
57351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    nonBasicFramesVector.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 1.0).get());
57451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
575d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    basicFramesVector[0]->setEasing(m_linearTimingFunction.get());
576a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> basicFrames = AnimatableValueKeyframeEffectModel::create(basicFramesVector).get();
577d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    EXPECT_TRUE(isCandidateForAnimationOnCompositor(linearTiming, *basicFrames.get()));
578d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
579d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    basicFramesVector[0]->setEasing(CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseIn));
580a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    basicFrames = AnimatableValueKeyframeEffectModel::create(basicFramesVector).get();
581d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    EXPECT_TRUE(isCandidateForAnimationOnCompositor(linearTiming, *basicFrames.get()));
582d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
583d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    nonBasicFramesVector[0]->setEasing(m_linearTimingFunction.get());
584d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    nonBasicFramesVector[1]->setEasing(CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseIn));
585a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> nonBasicFrames = AnimatableValueKeyframeEffectModel::create(nonBasicFramesVector).get();
5867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_TRUE(CompositorAnimations::instance()->isCandidateForAnimationOnCompositor(linearTiming, *nonBasicFrames.get(), 1));
58751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
58851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
58951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)// -----------------------------------------------------------------------
59051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)// -----------------------------------------------------------------------
59151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
59251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, createSimpleOpacityAnimation)
59351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
59451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Animation to convert
595a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = createKeyframeEffectModel(
59651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
59751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
59851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // --
59951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
60051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    WebCompositorSupportMock mockCompositor;
60151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
60251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Curve is created
6039e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    WebFloatAnimationCurveMock* mockCurvePtr = new WebFloatAnimationCurveMock;
60451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ExpectationSet usesMockCurve;
60551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
60651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .WillOnce(Return(mockCurvePtr));
60751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
6089e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.0, 2.0), WebCompositorAnimationCurve::TimingFunctionTypeLinear));
6099e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(1.0, 5.0)));
61051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
61151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Create animation
6129e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    WebCompositorAnimationMock* mockAnimationPtr = new WebCompositorAnimationMock(WebCompositorAnimation::TargetPropertyOpacity);
61351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ExpectationSet usesMockAnimation;
61451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
6159e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), WebCompositorAnimation::TargetPropertyOpacity, _))
61651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .WillOnce(Return(mockAnimationPtr));
61751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
61851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(1));
61951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0));
6207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setDirection(blink::WebCompositorAnimation::DirectionNormal));
6217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setPlaybackRate(1));
62251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
62351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_CALL(*mockAnimationPtr, delete_())
62451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .Times(1)
62551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .After(usesMockAnimation);
62651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_CALL(*mockCurvePtr, delete_())
62751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .Times(1)
62851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .After(usesMockCurve);
62951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
63051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Go!
63151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setCompositorForTesting(mockCompositor);
6329e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    Vector<OwnPtr<WebCompositorAnimation> > result;
63351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    getAnimationOnCompositor(m_timing, *effect.get(), result);
63451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(1U, result.size());
63551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    result[0].clear();
63651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
63751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
63851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, createSimpleOpacityAnimationDuration)
63951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
64051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Animation to convert
641a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = createKeyframeEffectModel(
64251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
64351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
64451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
64551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationDuration = 10.0;
64651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // --
64751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
64851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    WebCompositorSupportMock mockCompositor;
64951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
65051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Curve is created
6519e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    WebFloatAnimationCurveMock* mockCurvePtr = new WebFloatAnimationCurveMock;
65251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ExpectationSet usesMockCurve;
65351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
65451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .WillOnce(Return(mockCurvePtr));
65551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
6569e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.0, 2.0), WebCompositorAnimationCurve::TimingFunctionTypeLinear));
6579e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(10.0, 5.0)));
65851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
65951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Create animation
6609e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    WebCompositorAnimationMock* mockAnimationPtr = new WebCompositorAnimationMock(WebCompositorAnimation::TargetPropertyOpacity);
66151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ExpectationSet usesMockAnimation;
66251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
6639e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), WebCompositorAnimation::TargetPropertyOpacity, _))
66451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .WillOnce(Return(mockAnimationPtr));
66551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
66651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(1));
66751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0));
6687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setDirection(blink::WebCompositorAnimation::DirectionNormal));
6697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setPlaybackRate(1));
67051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
67151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_CALL(*mockAnimationPtr, delete_())
67251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .Times(1)
67351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .After(usesMockAnimation);
67451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_CALL(*mockCurvePtr, delete_())
67551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .Times(1)
67651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .After(usesMockCurve);
67751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
67851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Go!
67951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setCompositorForTesting(mockCompositor);
6809e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    Vector<OwnPtr<WebCompositorAnimation> > result;
68151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    getAnimationOnCompositor(m_timing, *effect.get(), result);
68251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(1U, result.size());
68351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    result[0].clear();
68451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
68551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
68651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, createMultipleKeyframeOpacityAnimationLinear)
68751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
68851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Animation to convert
689a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = createKeyframeEffectModel(
69051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
69151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(-1.0).get(), 0.25),
69251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(20.0).get(), 0.5),
69351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
69451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
69551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationCount = 5;
69651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.direction = Timing::PlaybackDirectionAlternate;
6977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_timing.playbackRate = 2.0;
69851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // --
69951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
70051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    WebCompositorSupportMock mockCompositor;
70151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
70251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Curve is created
7039e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    WebFloatAnimationCurveMock* mockCurvePtr = new WebFloatAnimationCurveMock();
70451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ExpectationSet usesMockCurve;
70551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
70651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
70751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .WillOnce(Return(mockCurvePtr));
70851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
7099e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.0, 2.0), WebCompositorAnimationCurve::TimingFunctionTypeLinear));
7109e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.25, -1.0), WebCompositorAnimationCurve::TimingFunctionTypeLinear));
7119e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.5, 20.0), WebCompositorAnimationCurve::TimingFunctionTypeLinear));
7129e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(1.0, 5.0)));
71351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
71451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Animation is created
7159e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    WebCompositorAnimationMock* mockAnimationPtr = new WebCompositorAnimationMock(WebCompositorAnimation::TargetPropertyOpacity);
71651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ExpectationSet usesMockAnimation;
71751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
7189e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), WebCompositorAnimation::TargetPropertyOpacity, _))
71951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .WillOnce(Return(mockAnimationPtr));
72051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
72151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(5));
72251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0));
7237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setDirection(blink::WebCompositorAnimation::DirectionAlternate));
7247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setPlaybackRate(2.0));
72551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
72651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_CALL(*mockAnimationPtr, delete_())
72751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .Times(1)
72851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .After(usesMockAnimation);
72951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_CALL(*mockCurvePtr, delete_())
73051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .Times(1)
73151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .After(usesMockCurve);
73251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
73351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Go!
73451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setCompositorForTesting(mockCompositor);
7359e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    Vector<OwnPtr<WebCompositorAnimation> > result;
73651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    getAnimationOnCompositor(m_timing, *effect.get(), result);
73751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(1U, result.size());
73851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    result[0].clear();
73951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
74051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
741a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, createSimpleOpacityAnimationStartDelay)
74251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
74351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Animation to convert
744a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = createKeyframeEffectModel(
74551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
74651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
74751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
74851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationCount = 5.0;
74951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationDuration = 1.75;
750a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_timing.startDelay = 3.25;
75151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // --
75251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
75351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    WebCompositorSupportMock mockCompositor;
75451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
75551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Curve is created
7569e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    WebFloatAnimationCurveMock* mockCurvePtr = new WebFloatAnimationCurveMock;
75751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ExpectationSet usesMockCurve;
75851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
75951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .WillOnce(Return(mockCurvePtr));
76051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
7619e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.0, 2.0), WebCompositorAnimationCurve::TimingFunctionTypeLinear));
7629e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(1.75, 5.0)));
76351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
76451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Create animation
7659e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    WebCompositorAnimationMock* mockAnimationPtr = new WebCompositorAnimationMock(WebCompositorAnimation::TargetPropertyOpacity);
76651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ExpectationSet usesMockAnimation;
76751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
7689e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), WebCompositorAnimation::TargetPropertyOpacity, _))
76951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .WillOnce(Return(mockAnimationPtr));
77051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
771a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(5));
772a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(-3.25));
7737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setDirection(blink::WebCompositorAnimation::DirectionNormal));
7747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setPlaybackRate(1));
77551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
77651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_CALL(*mockAnimationPtr, delete_())
77751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .Times(1)
77851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .After(usesMockAnimation);
77951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_CALL(*mockCurvePtr, delete_())
78051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .Times(1)
78151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .After(usesMockCurve);
78251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
78351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Go!
78451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setCompositorForTesting(mockCompositor);
7859e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    Vector<OwnPtr<WebCompositorAnimation> > result;
78651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    getAnimationOnCompositor(m_timing, *effect.get(), result);
78751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(1U, result.size());
78851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    result[0].clear();
78951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
79051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
79151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, createMultipleKeyframeOpacityAnimationChained)
79251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
79351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Animation to convert
794a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    AnimatableValueKeyframeVector frames;
795d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frames.append(createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0));
796d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frames.append(createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(-1.0).get(), 0.25));
797d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frames.append(createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(20.0).get(), 0.5));
798d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frames.append(createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
799d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frames[0]->setEasing(m_cubicEaseTimingFunction.get());
800d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frames[1]->setEasing(m_linearTimingFunction.get());
801d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frames[2]->setEasing(m_cubicCustomTimingFunction.get());
802a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(frames);
803d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
804d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_timing.timingFunction = m_linearTimingFunction.get();
80551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationDuration = 2.0;
80651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationCount = 10;
80751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.direction = Timing::PlaybackDirectionAlternate;
80851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // --
80951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
81051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    WebCompositorSupportMock mockCompositor;
81151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
81251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Curve is created
8139e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    WebFloatAnimationCurveMock* mockCurvePtr = new WebFloatAnimationCurveMock();
81451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ExpectationSet usesMockCurve;
81551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
81651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
81751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .WillOnce(Return(mockCurvePtr));
81851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
8199e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.0, 2.0), WebCompositorAnimationCurve::TimingFunctionTypeEase));
8209e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.5, -1.0), WebCompositorAnimationCurve::TimingFunctionTypeLinear));
8219e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(1.0, 20.0), 1.0, 2.0, 3.0, 4.0));
8229e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(2.0, 5.0)));
82351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
82451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Animation is created
8259e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    WebCompositorAnimationMock* mockAnimationPtr = new WebCompositorAnimationMock(WebCompositorAnimation::TargetPropertyOpacity);
82651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ExpectationSet usesMockAnimation;
82751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
8289e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), WebCompositorAnimation::TargetPropertyOpacity, _))
82951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .WillOnce(Return(mockAnimationPtr));
83051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
83151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(10));
83251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0));
8337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setDirection(blink::WebCompositorAnimation::DirectionAlternate));
8347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setPlaybackRate(1));
83551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
83651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_CALL(*mockAnimationPtr, delete_())
83751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .Times(1)
83851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .After(usesMockAnimation);
83951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_CALL(*mockCurvePtr, delete_())
84051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .Times(1)
84151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .After(usesMockCurve);
84251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
84351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Go!
84451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setCompositorForTesting(mockCompositor);
8459e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    Vector<OwnPtr<WebCompositorAnimation> > result;
84651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    getAnimationOnCompositor(m_timing, *effect.get(), result);
84751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(1U, result.size());
84851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    result[0].clear();
84951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
85051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
85151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, createReversedOpacityAnimation)
85251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
85351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    RefPtr<TimingFunction> cubicEasyFlipTimingFunction = CubicBezierTimingFunction::create(0.0, 0.0, 0.0, 1.0);
85451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
855d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Animation to convert
856a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    AnimatableValueKeyframeVector frames;
857d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frames.append(createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0));
858d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frames.append(createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(-1.0).get(), 0.25));
859d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frames.append(createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(20.0).get(), 0.5));
860d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frames.append(createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
861d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frames[0]->setEasing(CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseIn));
862d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frames[1]->setEasing(m_linearTimingFunction.get());
863d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frames[2]->setEasing(cubicEasyFlipTimingFunction.get());
864a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(frames);
865d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
866d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_timing.timingFunction = m_linearTimingFunction.get();
86751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationCount = 10;
86851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.direction = Timing::PlaybackDirectionAlternateReverse;
86951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // --
87051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
87151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    WebCompositorSupportMock mockCompositor;
87251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
87351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Curve is created
8749e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    WebFloatAnimationCurveMock* mockCurvePtr = new WebFloatAnimationCurveMock();
87551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ExpectationSet usesMockCurve;
87651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
87751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
87851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .WillOnce(Return(mockCurvePtr));
87951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
8807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.0, 2.0), blink::WebCompositorAnimationCurve::TimingFunctionTypeEaseIn));
8817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.25, -1.0), blink::WebCompositorAnimationCurve::TimingFunctionTypeLinear));
8827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.5, 20.0), 0.0, 0.0, 0.0, 1.0));
8837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(1.0, 5.0)));
88451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
88551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Create the animation
8869e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    WebCompositorAnimationMock* mockAnimationPtr = new WebCompositorAnimationMock(WebCompositorAnimation::TargetPropertyOpacity);
88751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ExpectationSet usesMockAnimation;
88851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
8899e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), WebCompositorAnimation::TargetPropertyOpacity, _))
89051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .WillOnce(Return(mockAnimationPtr));
89151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
89251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(10));
89351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0));
8947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setDirection(blink::WebCompositorAnimation::DirectionAlternateReverse));
8957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setPlaybackRate(1));
89651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
89751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_CALL(*mockAnimationPtr, delete_())
89851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .Times(1)
89951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .After(usesMockAnimation);
90051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_CALL(*mockCurvePtr, delete_())
90151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .Times(1)
90251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .After(usesMockCurve);
90351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
90451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Go!
90551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setCompositorForTesting(mockCompositor);
9069e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    Vector<OwnPtr<WebCompositorAnimation> > result;
90751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    getAnimationOnCompositor(m_timing, *effect.get(), result);
90851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(1U, result.size());
90951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    result[0].clear();
91051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
91151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
91251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)TEST_F(AnimationCompositorAnimationsTest, createReversedOpacityAnimationNegativeStartDelay)
91351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
91451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Animation to convert
915a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = createKeyframeEffectModel(
91651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
91751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
91851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
91951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.iterationCount = 5.0;
920a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_timing.iterationDuration = 1.5;
92151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.startDelay = -3;
92251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_timing.direction = Timing::PlaybackDirectionAlternateReverse;
92351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // --
92451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
92551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    WebCompositorSupportMock mockCompositor;
92651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
92751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Curve is created
9289e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    WebFloatAnimationCurveMock* mockCurvePtr = new WebFloatAnimationCurveMock;
92951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ExpectationSet usesMockCurve;
93051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
93151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .WillOnce(Return(mockCurvePtr));
93251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
9337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.0, 2.0), blink::WebCompositorAnimationCurve::TimingFunctionTypeLinear));
9347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(1.5, 5.0)));
93551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
93651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Create animation
9379e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    WebCompositorAnimationMock* mockAnimationPtr = new WebCompositorAnimationMock(WebCompositorAnimation::TargetPropertyOpacity);
93851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ExpectationSet usesMockAnimation;
93951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
9409e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), WebCompositorAnimation::TargetPropertyOpacity, _))
94151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .WillOnce(Return(mockAnimationPtr));
94251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
943a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(5));
944a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(3.0));
9457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setDirection(blink::WebCompositorAnimation::DirectionAlternateReverse));
9467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setPlaybackRate(1));
94751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
94851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_CALL(*mockAnimationPtr, delete_())
94951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .Times(1)
95051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .After(usesMockAnimation);
95151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_CALL(*mockCurvePtr, delete_())
95251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .Times(1)
95351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        .After(usesMockCurve);
95451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
95551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Go!
95651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setCompositorForTesting(mockCompositor);
9579e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    Vector<OwnPtr<WebCompositorAnimation> > result;
95851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    getAnimationOnCompositor(m_timing, *effect.get(), result);
95951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(1U, result.size());
96051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    result[0].clear();
96151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
96251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
9637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciTEST_F(AnimationCompositorAnimationsTest, createSimpleOpacityAnimationPlaybackRates)
9647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
9657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Animation to convert
9667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = createKeyframeEffectModel(
9677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
9687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
9697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
9707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_timing.playbackRate = 2;
9717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // --
9727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
9737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WebCompositorSupportMock mockCompositor;
9747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
9757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Curve is created
9767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WebFloatAnimationCurveMock* mockCurvePtr = new WebFloatAnimationCurveMock;
9777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ExpectationSet usesMockCurve;
9787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
9797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        .WillOnce(Return(mockCurvePtr));
9807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
9817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.0, 2.0), WebCompositorAnimationCurve::TimingFunctionTypeLinear));
9827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(1.0, 5.0)));
9837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
9847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Create animation
9857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WebCompositorAnimationMock* mockAnimationPtr = new WebCompositorAnimationMock(WebCompositorAnimation::TargetPropertyOpacity);
9867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ExpectationSet usesMockAnimation;
9877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
9887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), WebCompositorAnimation::TargetPropertyOpacity, _))
9897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        .WillOnce(Return(mockAnimationPtr));
9907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
9917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(1));
9927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0));
9937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setDirection(blink::WebCompositorAnimation::DirectionNormal));
9947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setPlaybackRate(-3));
9957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
9967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_CALL(*mockAnimationPtr, delete_())
9977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        .Times(1)
9987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        .After(usesMockAnimation);
9997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_CALL(*mockCurvePtr, delete_())
10007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        .Times(1)
10017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        .After(usesMockCurve);
10027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
10037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Go!
10047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setCompositorForTesting(mockCompositor);
10057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    Vector<OwnPtr<WebCompositorAnimation> > result;
10067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Set player plaback rate also
10077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    getAnimationOnCompositor(m_timing, *effect.get(), result, -1.5);
10087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_EQ(1U, result.size());
10097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    result[0].clear();
10107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
10117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
10127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciTEST_F(AnimationCompositorAnimationsTest, createSimpleOpacityAnimationFillModeNone)
10137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
10147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Animation to convert
10157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = createKeyframeEffectModel(
10167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
10177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
10187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
10197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_timing.fillMode = Timing::FillModeNone;
10207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
10217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WebCompositorSupportMock mockCompositor;
10227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
10237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Curve is created
10247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WebFloatAnimationCurveMock* mockCurvePtr = new WebFloatAnimationCurveMock;
10257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ExpectationSet usesMockCurve;
10267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
10277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        .WillOnce(Return(mockCurvePtr));
10287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
10297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.0, 2.0), WebCompositorAnimationCurve::TimingFunctionTypeLinear));
10307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(1.0, 5.0)));
10317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
10327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Create animation
10337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WebCompositorAnimationMock* mockAnimationPtr = new WebCompositorAnimationMock(WebCompositorAnimation::TargetPropertyOpacity);
10347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ExpectationSet usesMockAnimation;
10357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
10367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), WebCompositorAnimation::TargetPropertyOpacity, _))
10377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        .WillOnce(Return(mockAnimationPtr));
10387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
10397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(1));
10407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0));
10417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setDirection(blink::WebCompositorAnimation::DirectionNormal));
10427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setPlaybackRate(1));
10437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setFillMode(blink::WebCompositorAnimation::FillModeNone));
10447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
10457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_CALL(*mockAnimationPtr, delete_())
10467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        .Times(1)
10477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        .After(usesMockAnimation);
10487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_CALL(*mockCurvePtr, delete_())
10497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        .Times(1)
10507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        .After(usesMockCurve);
10517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
10527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Go!
10537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setCompositorForTesting(mockCompositor);
10547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    Vector<OwnPtr<WebCompositorAnimation> > result;
10557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    getAnimationOnCompositor(m_timing, *effect.get(), result);
10567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_EQ(1U, result.size());
10577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    result[0].clear();
10587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
10597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
10607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciTEST_F(AnimationCompositorAnimationsTest, createSimpleOpacityAnimationFillModeAuto)
10617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
10627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Animation to convert
10637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = createKeyframeEffectModel(
10647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
10657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
10667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
10677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_timing.fillMode = Timing::FillModeAuto;
10687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
10697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WebCompositorSupportMock mockCompositor;
10707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
10717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Curve is created
10727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WebFloatAnimationCurveMock* mockCurvePtr = new WebFloatAnimationCurveMock;
10737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ExpectationSet usesMockCurve;
10747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
10757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        .WillOnce(Return(mockCurvePtr));
10767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
10777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.0, 2.0), WebCompositorAnimationCurve::TimingFunctionTypeLinear));
10787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(1.0, 5.0)));
10797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
10807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Create animation
10817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WebCompositorAnimationMock* mockAnimationPtr = new WebCompositorAnimationMock(WebCompositorAnimation::TargetPropertyOpacity);
10827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ExpectationSet usesMockAnimation;
10837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
10847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), WebCompositorAnimation::TargetPropertyOpacity, _))
10857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        .WillOnce(Return(mockAnimationPtr));
10867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
10877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(1));
10887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0));
10897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setDirection(blink::WebCompositorAnimation::DirectionNormal));
10907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setPlaybackRate(1));
10917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setFillMode(blink::WebCompositorAnimation::FillModeNone));
10927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
10937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_CALL(*mockAnimationPtr, delete_())
10947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        .Times(1)
10957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        .After(usesMockAnimation);
10967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_CALL(*mockCurvePtr, delete_())
10977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        .Times(1)
10987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        .After(usesMockCurve);
10997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
11007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Go!
11017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setCompositorForTesting(mockCompositor);
11027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    Vector<OwnPtr<WebCompositorAnimation> > result;
11037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    getAnimationOnCompositor(m_timing, *effect.get(), result);
11047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_EQ(1U, result.size());
11057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    result[0].clear();
11067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
110751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
1108c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
1109