blob: ecbf79516f69617c7535650de4721defde1555d8 [file] [edit]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "config.h"
#include "core/animation/LengthBoxStyleInterpolation.h"
#include "core/animation/LengthStyleInterpolation.h"
#include "core/css/CSSPrimitiveValue.h"
#include "core/css/CSSQuadValue.h"
#include "core/css/StylePropertySet.h"
#include <gtest/gtest.h>
namespace blink {
class AnimationLengthBoxStyleInterpolationTest : public ::testing::Test {
protected:
static PassOwnPtr<InterpolableValue> lengthBoxToInterpolableValue(const CSSValue& value)
{
return LengthBoxStyleInterpolation::lengthBoxtoInterpolableValue(value, value, false);
}
static PassRefPtrWillBeRawPtr<CSSValue> interpolableValueToLengthBox(InterpolableValue* value, const CSSValue& start, const CSSValue& end)
{
return LengthBoxStyleInterpolation::interpolableValueToLengthBox(value, start, end);
}
static PassRefPtrWillBeRawPtr<CSSValue> roundTrip(PassRefPtrWillBeRawPtr<CSSValue> value)
{
return interpolableValueToLengthBox(lengthBoxToInterpolableValue(*value).get(), *value, *value);
}
static void testQuadValue(RefPtrWillBeRawPtr<CSSValue> value, double left, double right, double top, double bottom, CSSPrimitiveValue::UnitType unitType)
{
EXPECT_TRUE(value->isQuadValue());
RefPtrWillBeRawPtr<CSSQuadValue> rect = toCSSQuadValue(value.get());
EXPECT_EQ(rect->left()->getDoubleValue(), left);
EXPECT_EQ(rect->right()->getDoubleValue(), right);
EXPECT_EQ(rect->top()->getDoubleValue(), top);
EXPECT_EQ(rect->bottom()->getDoubleValue(), bottom);
EXPECT_EQ(unitType, rect->left()->typeWithCalcResolved());
EXPECT_EQ(unitType, rect->right()->typeWithCalcResolved());
EXPECT_EQ(unitType, rect->top()->typeWithCalcResolved());
EXPECT_EQ(unitType, rect->bottom()->typeWithCalcResolved());
}
};
TEST_F(AnimationLengthBoxStyleInterpolationTest, ZeroLengthBox)
{
RefPtrWillBeRawPtr<CSSPrimitiveValue> left = CSSPrimitiveValue::create(0, CSSPrimitiveValue::UnitType::Pixels);
RefPtrWillBeRawPtr<CSSPrimitiveValue> right = CSSPrimitiveValue::create(0, CSSPrimitiveValue::UnitType::Pixels);
RefPtrWillBeRawPtr<CSSPrimitiveValue> top = CSSPrimitiveValue::create(0, CSSPrimitiveValue::UnitType::Pixels);
RefPtrWillBeRawPtr<CSSPrimitiveValue> bottom = CSSPrimitiveValue::create(0, CSSPrimitiveValue::UnitType::Pixels);
RefPtrWillBeRawPtr<CSSValue> value = roundTrip(CSSQuadValue::create(top, right, bottom, left, CSSQuadValue::SerializeAsRect));
testQuadValue(value, 0, 0, 0, 0, CSSPrimitiveValue::UnitType::Pixels);
RefPtrWillBeRawPtr<CSSPrimitiveValue> leftEms = CSSPrimitiveValue::create(0, CSSPrimitiveValue::UnitType::Ems);
RefPtrWillBeRawPtr<CSSPrimitiveValue> rightEms = CSSPrimitiveValue::create(0, CSSPrimitiveValue::UnitType::Ems);
RefPtrWillBeRawPtr<CSSPrimitiveValue> topEms = CSSPrimitiveValue::create(0, CSSPrimitiveValue::UnitType::Ems);
RefPtrWillBeRawPtr<CSSPrimitiveValue> bottomEms = CSSPrimitiveValue::create(0, CSSPrimitiveValue::UnitType::Ems);
value = roundTrip(CSSQuadValue::create(topEms.release(), rightEms.release(), bottomEms.release(), leftEms.release(), CSSQuadValue::SerializeAsRect));
testQuadValue(value, 0, 0, 0, 0, CSSPrimitiveValue::UnitType::Ems);
}
TEST_F(AnimationLengthBoxStyleInterpolationTest, SingleUnitBox)
{
RefPtrWillBeRawPtr<CSSPrimitiveValue> leftPx = CSSPrimitiveValue::create(10, CSSPrimitiveValue::UnitType::Pixels);
RefPtrWillBeRawPtr<CSSPrimitiveValue> rightPx = CSSPrimitiveValue::create(10, CSSPrimitiveValue::UnitType::Pixels);
RefPtrWillBeRawPtr<CSSPrimitiveValue> topPx = CSSPrimitiveValue::create(10, CSSPrimitiveValue::UnitType::Pixels);
RefPtrWillBeRawPtr<CSSPrimitiveValue> bottomPx = CSSPrimitiveValue::create(10, CSSPrimitiveValue::UnitType::Pixels);
RefPtrWillBeRawPtr<CSSValue> value = roundTrip(CSSQuadValue::create(topPx.release(), rightPx.release(), bottomPx.release(), leftPx.release(), CSSQuadValue::SerializeAsRect));
testQuadValue(value, 10, 10, 10, 10, CSSPrimitiveValue::UnitType::Pixels);
RefPtrWillBeRawPtr<CSSPrimitiveValue> leftPer = CSSPrimitiveValue::create(30, CSSPrimitiveValue::UnitType::Percentage);
RefPtrWillBeRawPtr<CSSPrimitiveValue> rightPer = CSSPrimitiveValue::create(30, CSSPrimitiveValue::UnitType::Percentage);
RefPtrWillBeRawPtr<CSSPrimitiveValue> topPer = CSSPrimitiveValue::create(30, CSSPrimitiveValue::UnitType::Percentage);
RefPtrWillBeRawPtr<CSSPrimitiveValue> bottomPer = CSSPrimitiveValue::create(30, CSSPrimitiveValue::UnitType::Percentage);
value = roundTrip(CSSQuadValue::create(topPer.release(), rightPer.release(), bottomPer.release(), leftPer.release(), CSSQuadValue::SerializeAsRect));
testQuadValue(value, 30, 30, 30, 30, CSSPrimitiveValue::UnitType::Percentage);
RefPtrWillBeRawPtr<CSSPrimitiveValue> leftEms = CSSPrimitiveValue::create(-10, CSSPrimitiveValue::UnitType::Ems);
RefPtrWillBeRawPtr<CSSPrimitiveValue> rightEms = CSSPrimitiveValue::create(-10, CSSPrimitiveValue::UnitType::Ems);
RefPtrWillBeRawPtr<CSSPrimitiveValue> topEms = CSSPrimitiveValue::create(-10, CSSPrimitiveValue::UnitType::Ems);
RefPtrWillBeRawPtr<CSSPrimitiveValue> bottomEms = CSSPrimitiveValue::create(-10, CSSPrimitiveValue::UnitType::Ems);
value = roundTrip(CSSQuadValue::create(topEms.release(), rightEms.release(), bottomEms.release(), leftEms.release(), CSSQuadValue::SerializeAsRect));
testQuadValue(value, -10, -10, -10, -10, CSSPrimitiveValue::UnitType::Ems);
}
TEST_F(AnimationLengthBoxStyleInterpolationTest, MultipleValues)
{
RefPtrWillBeRawPtr<CSSPrimitiveValue> leftPx = CSSPrimitiveValue::create(10, CSSPrimitiveValue::UnitType::Pixels);
RefPtrWillBeRawPtr<CSSPrimitiveValue> rightPx = CSSPrimitiveValue::create(0, CSSPrimitiveValue::UnitType::Pixels);
RefPtrWillBeRawPtr<CSSPrimitiveValue> topPx = CSSPrimitiveValue::create(20, CSSPrimitiveValue::UnitType::Pixels);
RefPtrWillBeRawPtr<CSSPrimitiveValue> bottomPx = CSSPrimitiveValue::create(40, CSSPrimitiveValue::UnitType::Pixels);
RefPtrWillBeRawPtr<CSSValue> value = roundTrip(CSSQuadValue::create(topPx.release(), rightPx.release(), bottomPx.release(), leftPx.release(), CSSQuadValue::SerializeAsRect));
testQuadValue(value, 10, 0, 20, 40, CSSPrimitiveValue::UnitType::Pixels);
RefPtrWillBeRawPtr<CSSPrimitiveValue> leftPer = CSSPrimitiveValue::create(30, CSSPrimitiveValue::UnitType::Percentage);
RefPtrWillBeRawPtr<CSSPrimitiveValue> rightPer = CSSPrimitiveValue::create(-30, CSSPrimitiveValue::UnitType::Percentage);
RefPtrWillBeRawPtr<CSSPrimitiveValue> topPer = CSSPrimitiveValue::create(30, CSSPrimitiveValue::UnitType::Percentage);
RefPtrWillBeRawPtr<CSSPrimitiveValue> bottomPer = CSSPrimitiveValue::create(-30, CSSPrimitiveValue::UnitType::Percentage);
value = roundTrip(CSSQuadValue::create(topPer.release(), rightPer.release(), bottomPer.release(), leftPer.release(), CSSQuadValue::SerializeAsRect));
testQuadValue(value, 30, -30, 30, -30, CSSPrimitiveValue::UnitType::Percentage);
}
}