| Index: Source/core/css/CSSPrimitiveValueTest.cpp
|
| diff --git a/Source/core/css/CSSPrimitiveValueTest.cpp b/Source/core/css/CSSPrimitiveValueTest.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7a063cb8885f98dee0558eca4f71ad1a575ee3bc
|
| --- /dev/null
|
| +++ b/Source/core/css/CSSPrimitiveValueTest.cpp
|
| @@ -0,0 +1,143 @@
|
| +// Copyright 2015 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/css/CSSPrimitiveValue.h"
|
| +
|
| +#include "core/css/CSSValueTestHelper.h"
|
| +#include <gtest/gtest.h>
|
| +#include <strings.h>
|
| +
|
| +using namespace blink;
|
| +
|
| +namespace {
|
| +
|
| +void clearTaggedPtr(CSSPrimitiveValue::CSSTaggedPtrValue& taggedPtr)
|
| +{
|
| + taggedPtr.flag = 0;
|
| + taggedPtr.type = static_cast<CSSPrimitiveValue::UnitType>(0);
|
| + taggedPtr.setValue(0.0);
|
| +}
|
| +
|
| +TEST(CSSPrimitiveValueTest, CSSPrimitiveValueTest)
|
| +{
|
| + // 1.0 can be stored in a tagged ptr.
|
| + CSSPrimitiveValue value = CSSPrimitiveValue::create(1.0, CSSPrimitiveValue::CSS_INTEGER);
|
| + EXPECT_EQ(1.0, value.getDoubleValue());
|
| + EXPECT_EQ("1", value.customCSSText());
|
| + EXPECT_TRUE(value.isNumber());
|
| + EXPECT_FALSE(value.isAttr());
|
| +
|
| + CSSValue cssValue(value);
|
| + EXPECT_TRUE(cssValue.isPrimitiveValue());
|
| + EXPECT_FALSE(cssValue.isImageValue());
|
| + EXPECT_EQ("1", cssValue.cssText());
|
| +
|
| + // 3.3 cannot be stored in a tagged ptr.
|
| + CSSPrimitiveValue valueInTaggedPtr = CSSPrimitiveValue::create(3.3, CSSPrimitiveValue::CSS_NUMBER);
|
| + EXPECT_EQ(3.3, valueInTaggedPtr.getDoubleValue());
|
| + EXPECT_EQ("3.3", valueInTaggedPtr.customCSSText());
|
| + EXPECT_TRUE(valueInTaggedPtr.isNumber());
|
| + EXPECT_FALSE(value.isAttr());
|
| +
|
| + CSSValue cssValueWithTaggedPtr(valueInTaggedPtr);
|
| + EXPECT_TRUE(cssValueWithTaggedPtr.isPrimitiveValue());
|
| + EXPECT_FALSE(cssValueWithTaggedPtr.isImageValue());
|
| + EXPECT_EQ("3.3", cssValueWithTaggedPtr.cssText());
|
| +
|
| + EXPECT_FALSE(cssValue.equals(cssValueWithTaggedPtr));
|
| + EXPECT_FALSE(cssValueWithTaggedPtr.equals(cssValue));
|
| +
|
| + CSSValue cssValueCopy(cssValue);
|
| + EXPECT_TRUE(cssValue.equals(cssValueCopy));
|
| + EXPECT_TRUE(cssValueCopy.equals(cssValue));
|
| +
|
| + CSSValue cssValueWithTaggedPtrCopy(cssValueWithTaggedPtr);
|
| + EXPECT_TRUE(cssValueWithTaggedPtr.equals(cssValueWithTaggedPtrCopy));
|
| + EXPECT_TRUE(cssValueWithTaggedPtrCopy.equals(cssValueWithTaggedPtr));
|
| +}
|
| +
|
| +TEST(CSSPrimitiveValueTest, CSSTaggedPtrValueTest)
|
| +{
|
| + CSSPrimitiveValue::CSSTaggedPtrValue taggedPtr;
|
| + clearTaggedPtr(taggedPtr);
|
| +
|
| + // Check that all fields can be get/set correctly.
|
| + EXPECT_EQ(0UL, taggedPtr.flag);
|
| + taggedPtr.flag = 1;
|
| + EXPECT_EQ(1UL, taggedPtr.flag);
|
| +
|
| + EXPECT_EQ(0UL, taggedPtr.type);
|
| + taggedPtr.type = CSSPrimitiveValue::CSS_INTEGER;
|
| + EXPECT_EQ(CSSPrimitiveValue::CSS_INTEGER, taggedPtr.type);
|
| +
|
| + EXPECT_EQ(0UL, taggedPtr.getValue());
|
| + taggedPtr.setValue(1.0);
|
| + EXPECT_EQ(1.0, taggedPtr.getValue());
|
| +
|
| + taggedPtr.flag = 1;
|
| + taggedPtr.type = CSSPrimitiveValue::CSS_INTEGER;
|
| + taggedPtr.setValue(1.0);
|
| + EXPECT_EQ(1UL, taggedPtr.flag);
|
| + EXPECT_EQ(CSSPrimitiveValue::CSS_INTEGER, taggedPtr.type);
|
| + EXPECT_EQ(1.0, taggedPtr.getValue());
|
| +
|
| + clearTaggedPtr(taggedPtr);
|
| + EXPECT_EQ(0UL, taggedPtr.flag);
|
| + EXPECT_EQ(0UL, taggedPtr.type);
|
| + EXPECT_EQ(0UL, taggedPtr.getValue());
|
| + EXPECT_EQ(0UL, *reinterpret_cast<uintptr_t*>(&taggedPtr));
|
| +}
|
| +
|
| +TEST(CSSPrimitiveValueTest, FitsWithoutDataLossTest)
|
| +{
|
| + // Consistent on 32-bit/64-bit
|
| + EXPECT_EQ(true, CSSPrimitiveValue::CSSTaggedPtrValue::fitsWithoutDataLoss(1.0));
|
| + EXPECT_EQ(false, CSSPrimitiveValue::CSSTaggedPtrValue::fitsWithoutDataLoss(3.3));
|
| +
|
| + uint64_t trailing1sOnAllPlatforms = 0xf;
|
| + EXPECT_EQ(false, CSSPrimitiveValue::CSSTaggedPtrValue::fitsWithoutDataLoss(*reinterpret_cast<double*>(&trailing1sOnAllPlatforms)));
|
| +
|
| + // Fits on 64-bit, but not on 32-bit
|
| + uint64_t trailing1sOn32BitOnly = 0xf00;
|
| + bool expectToFit;
|
| +#if CPU(32BIT)
|
| + expectToFit = false;
|
| +#elif CPU(64BIT)
|
| + expectToFit = true;
|
| +#endif
|
| + EXPECT_EQ(expectToFit, CSSPrimitiveValue::CSSTaggedPtrValue::fitsWithoutDataLoss(*reinterpret_cast<double*>(&trailing1sOn32BitOnly)));
|
| +}
|
| +
|
| +// Tests that the flag bit is in the least-significant bit. This test is important
|
| +// since we implement CSSTaggedPtrValue using bitfields, and the C++ standard specifies
|
| +// that bitfield packing behavior is implementation-specific.
|
| +TEST(CSSPrimitiveValueTest, FlagBitInLSBTest)
|
| +{
|
| + CSSPrimitiveValue::CSSTaggedPtrValue taggedPtr;
|
| + clearTaggedPtr(taggedPtr);
|
| +
|
| + taggedPtr.flag = 1;
|
| + EXPECT_EQ(1UL, *reinterpret_cast<uintptr_t*>(&taggedPtr));
|
| +
|
| + taggedPtr.flag = 0;
|
| + EXPECT_EQ(0UL, *reinterpret_cast<uintptr_t*>(&taggedPtr));
|
| +}
|
| +
|
| +// Test that all valid values for UnitType fit in the UnitType bit field in the
|
| +// tagged pointer.
|
| +TEST(CSSPrimitiveValueTest, UnitTypeSizeTest)
|
| +{
|
| + CSSPrimitiveValue::CSSTaggedPtrValue taggedPtr;
|
| + clearTaggedPtr(taggedPtr);
|
| +
|
| + // We can't take the sizeof() of a bitfield. Instead, try set the largest primitive
|
| + // value type we have, and see if we can read it out again.
|
| + taggedPtr.type = CSSPrimitiveValue::CSS_QEM;
|
| + ASSERT_EQ(CSSPrimitiveValue::CSS_QEM, taggedPtr.type);
|
| +}
|
| +
|
| +
|
| +} // namespace
|
|
|