#ifndef CompositorAnimationsTestHelper_h
#define CompositorAnimationsTestHelper_h
#include "core/animation/CompositorAnimations.h"
#include "public/platform/Platform.h"
#include "public/platform/WebCompositorSupport.h"
#include "public/platform/WebFloatAnimationCurve.h"
#include "public/platform/WebFloatKeyframe.h"
#include "wtf/PassOwnPtr.h"
#include <gmock/gmock.h>
#include <gtest/gtest.h>
namespace testing {
template<typename T>
PassOwnPtr<T> CloneToPassOwnPtr(T& o)
{
return adoptPtr(new T(o));
}
}
namespace blink {
inline bool operator==(const WebFloatKeyframe& a, const WebFloatKeyframe& b)
{
return a.time == b.time && a.value == b.value;
}
inline void PrintTo(const WebFloatKeyframe& frame, ::std::ostream* os)
{
*os << "WebFloatKeyframe@" << &frame << "(" << frame.time << ", " << frame.value << ")";
}
class WebAnimationMock : public blink::WebAnimation {
private:
blink::WebAnimation::TargetProperty m_property;
public:
WebAnimationMock(blink::WebAnimation::TargetProperty p) : m_property(p) { }
virtual blink::WebAnimation::TargetProperty targetProperty() const { return m_property; };
MOCK_METHOD0(id, int());
MOCK_CONST_METHOD0(iterations, int());
MOCK_METHOD1(setIterations, void(int));
MOCK_CONST_METHOD0(startTime, double());
MOCK_METHOD1(setStartTime, void(double));
MOCK_CONST_METHOD0(timeOffset, double());
MOCK_METHOD1(setTimeOffset, void(double));
MOCK_CONST_METHOD0(alternatesDirection, bool());
MOCK_METHOD1(setAlternatesDirection, void(bool));
MOCK_METHOD0(delete_, void());
~WebAnimationMock() { delete_(); }
};
template<typename CurveType, blink::WebAnimationCurve::AnimationCurveType CurveId, typename KeyframeType>
class WebAnimationCurveMock : public CurveType {
public:
MOCK_METHOD1_T(add, void(const KeyframeType&));
MOCK_METHOD2_T(add, void(const KeyframeType&, blink::WebAnimationCurve::TimingFunctionType));
MOCK_METHOD5_T(add, void(const KeyframeType&, double, double, double, double));
MOCK_CONST_METHOD1_T(getValue, float(double));
virtual blink::WebAnimationCurve::AnimationCurveType type() const { return CurveId; };
MOCK_METHOD0(delete_, void());
~WebAnimationCurveMock() { delete_(); }
};
typedef WebAnimationCurveMock<blink::WebFloatAnimationCurve, blink::WebAnimationCurve::AnimationCurveTypeFloat, blink::WebFloatKeyframe> WebFloatAnimationCurveMock;
}
namespace WebCore {
class AnimationCompositorAnimationsTestBase : public ::testing::Test {
public:
AnimationCompositorAnimationsTestBase() : m_proxyPlatform(&m_mockCompositor) { };
class WebCompositorSupportMock : public blink::WebCompositorSupport {
public:
MOCK_METHOD3(createAnimation, blink::WebAnimation*(const blink::WebAnimationCurve& curve, blink::WebAnimation::TargetProperty target, int animationId));
MOCK_METHOD0(createFloatAnimationCurve, blink::WebFloatAnimationCurve*());
};
private:
class PlatformProxy : public blink::Platform {
public:
PlatformProxy(WebCompositorSupportMock** compositor) : m_compositor(compositor) { }
virtual void cryptographicallyRandomValues(unsigned char* buffer, size_t length) { ASSERT_NOT_REACHED(); }
private:
WebCompositorSupportMock** m_compositor;
virtual blink::WebCompositorSupport* compositorSupport() OVERRIDE { return *m_compositor; }
};
WebCompositorSupportMock* m_mockCompositor;
PlatformProxy m_proxyPlatform;
protected:
blink::Platform* m_platform;
virtual void SetUp()
{
m_mockCompositor = 0;
m_platform = blink::Platform::current();
blink::Platform::initialize(&m_proxyPlatform);
}
virtual void TearDown()
{
blink::Platform::initialize(m_platform);
}
void setCompositorForTesting(WebCompositorSupportMock& mock)
{
ASSERT(!m_mockCompositor);
m_mockCompositor = &mock;
}
};
}
#endif