Index: Source/core/css/CSSPrimitiveValueTest.cpp |
diff --git a/Source/core/css/CSSPrimitiveValueTest.cpp b/Source/core/css/CSSPrimitiveValueTest.cpp |
index 7a063cb8885f98dee0558eca4f71ad1a575ee3bc..5dba3799f531250040c9a9dab722277ef15a907b 100644 |
--- a/Source/core/css/CSSPrimitiveValueTest.cpp |
+++ b/Source/core/css/CSSPrimitiveValueTest.cpp |
@@ -18,34 +18,34 @@ void clearTaggedPtr(CSSPrimitiveValue::CSSTaggedPtrValue& taggedPtr) |
{ |
taggedPtr.flag = 0; |
taggedPtr.type = static_cast<CSSPrimitiveValue::UnitType>(0); |
- taggedPtr.setValue(0.0); |
+ taggedPtr.valueRaw = 0; |
} |
-TEST(CSSPrimitiveValueTest, CSSPrimitiveValueTest) |
+TEST(CSSPrimitiveValueTest, CSSPrimitiveDoubleValueTest) |
{ |
// 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_STREQ("1", value.customCSSText().ascii().data()); |
EXPECT_TRUE(value.isNumber()); |
EXPECT_FALSE(value.isAttr()); |
CSSValue cssValue(value); |
EXPECT_TRUE(cssValue.isPrimitiveValue()); |
EXPECT_FALSE(cssValue.isImageValue()); |
- EXPECT_EQ("1", cssValue.cssText()); |
+ EXPECT_STREQ("1", cssValue.cssText().ascii().data()); |
// 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_STREQ("3.3", valueInTaggedPtr.customCSSText().ascii().data()); |
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_STREQ("3.3", cssValueWithTaggedPtr.cssText().ascii().data()); |
EXPECT_FALSE(cssValue.equals(cssValueWithTaggedPtr)); |
EXPECT_FALSE(cssValueWithTaggedPtr.equals(cssValue)); |
@@ -59,6 +59,72 @@ TEST(CSSPrimitiveValueTest, CSSPrimitiveValueTest) |
EXPECT_TRUE(cssValueWithTaggedPtrCopy.equals(cssValueWithTaggedPtr)); |
} |
+TEST(CSSPrimitiveValueTest, CSSPrimitiveColorValueTest) |
+{ |
+ // (r, g, b, 0) and (r, g, b, 255) can be stored as a tagged ptr. |
+ RGBA32 colorAlpha0 = makeRGBA(5, 0, 15, 0); |
+ CSSPrimitiveValue valueAlpha0 = CSSPrimitiveValue::createColor(colorAlpha0); |
+ EXPECT_TRUE(valueAlpha0.isRGBColor()); |
+ EXPECT_FALSE(valueAlpha0.isNumber()); |
+ EXPECT_EQ(5, redChannel(valueAlpha0.getRGBA32Value())); |
+ EXPECT_EQ(0, greenChannel(valueAlpha0.getRGBA32Value())); |
+ EXPECT_EQ(15, blueChannel(valueAlpha0.getRGBA32Value())); |
+ EXPECT_EQ(0, alphaChannel(valueAlpha0.getRGBA32Value())); |
+ EXPECT_STREQ("rgba(5, 0, 15, 0)", valueAlpha0.customCSSText().ascii().data()); |
+ |
+ RGBA32 colorAlpha255 = makeRGBA(15, 100, 255, 255); |
+ CSSPrimitiveValue valueAlpha255 = CSSPrimitiveValue::createColor(colorAlpha255); |
+ EXPECT_TRUE(valueAlpha255.isRGBColor()); |
+ EXPECT_FALSE(valueAlpha255.isNumber()); |
+ EXPECT_EQ(15, redChannel(valueAlpha255.getRGBA32Value())); |
+ EXPECT_EQ(100, greenChannel(valueAlpha255.getRGBA32Value())); |
+ EXPECT_EQ(255, blueChannel(valueAlpha255.getRGBA32Value())); |
+ EXPECT_EQ(255, alphaChannel(valueAlpha255.getRGBA32Value())); |
+ EXPECT_STREQ("rgb(15, 100, 255)", valueAlpha255.customCSSText().ascii().data()); |
+ |
+ // Other alpha values can be stored as a tagged ptr on 64-bit only. |
+ RGBA32 colorAlphaOther = makeRGBA(0, 10, 15, 51); |
+ CSSPrimitiveValue valueAlphaOther = CSSPrimitiveValue::createColor(colorAlphaOther); |
+ EXPECT_TRUE(valueAlphaOther.isRGBColor()); |
+ EXPECT_FALSE(valueAlphaOther.isNumber()); |
+ EXPECT_EQ(0, redChannel(valueAlphaOther.getRGBA32Value())); |
+ EXPECT_EQ(10, greenChannel(valueAlphaOther.getRGBA32Value())); |
+ EXPECT_EQ(15, blueChannel(valueAlphaOther.getRGBA32Value())); |
+ EXPECT_EQ(51, alphaChannel(valueAlphaOther.getRGBA32Value())); |
+ EXPECT_STREQ("rgba(0, 10, 15, 0.2)", valueAlphaOther.customCSSText().ascii().data()); |
+ |
+ |
+ EXPECT_FALSE(CSSValue(valueAlpha0).equals(CSSValue(valueAlpha255))); |
+ EXPECT_FALSE(CSSValue(valueAlpha255).equals(CSSValue(valueAlpha0))); |
+ EXPECT_FALSE(CSSValue(valueAlphaOther).equals(CSSValue(valueAlpha0))); |
+ EXPECT_FALSE(CSSValue(valueAlpha0).equals(CSSValue(valueAlphaOther))); |
+ |
+ CSSValue cssValueWithTaggedPtrCopy(valueAlpha0); |
+ EXPECT_TRUE(CSSValue(valueAlpha0).equals(CSSValue(cssValueWithTaggedPtrCopy))); |
+ EXPECT_TRUE(CSSValue(cssValueWithTaggedPtrCopy).equals(CSSValue(valueAlpha0))); |
+ |
+ CSSValue cssValueCopy(valueAlphaOther); |
+ EXPECT_TRUE(CSSValue(valueAlphaOther).equals(CSSValue(cssValueCopy))); |
+ EXPECT_TRUE(CSSValue(cssValueCopy).equals(CSSValue(valueAlphaOther))); |
+} |
+ |
+TEST(CSSPrimitiveValueTest, CSSPrimitiveIDValueTest) |
+{ |
+ // All value and property IDs can be stored as a tagged ptr. |
+ CSSPrimitiveValue valueID = CSSPrimitiveValue::createIdentifier(CSSValueRed); |
+ EXPECT_EQ(CSSPrimitiveValue::CSS_IDENT, valueID.primitiveType()); |
+ EXPECT_TRUE(valueID.isValueID()); |
+ EXPECT_FALSE(valueID.isNumber()); |
+ EXPECT_EQ(CSSValueRed, valueID.getValueID()); |
+ EXPECT_STREQ("red", valueID.customCSSText().ascii().data()); |
+ |
+ CSSPrimitiveValue propertyID = CSSPrimitiveValue::createIdentifier(CSSPropertyBorder); |
+ EXPECT_EQ(CSSPrimitiveValue::CSS_IDENT, propertyID.primitiveType()); |
+ EXPECT_FALSE(propertyID.isNumber()); |
+ EXPECT_EQ(CSSPropertyBorder, propertyID.getPropertyID()); |
+ EXPECT_STREQ("border", propertyID.customCSSText().ascii().data()); |
+} |
+ |
TEST(CSSPrimitiveValueTest, CSSTaggedPtrValueTest) |
{ |
CSSPrimitiveValue::CSSTaggedPtrValue taggedPtr; |
@@ -73,42 +139,49 @@ TEST(CSSPrimitiveValueTest, CSSTaggedPtrValueTest) |
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()); |
+ EXPECT_EQ(0UL, taggedPtr.getValue().num); |
+ CSSPrimitiveValue::CSSPrimitiveValueData data; |
+ data.num = 1.0; |
+ taggedPtr.setValue(data, CSSPrimitiveValue::CSS_NUMBER); |
+ EXPECT_EQ(1.0, taggedPtr.getValue().num); |
taggedPtr.flag = 1; |
taggedPtr.type = CSSPrimitiveValue::CSS_INTEGER; |
- taggedPtr.setValue(1.0); |
+ taggedPtr.setValue(data, CSSPrimitiveValue::CSS_INTEGER); |
EXPECT_EQ(1UL, taggedPtr.flag); |
EXPECT_EQ(CSSPrimitiveValue::CSS_INTEGER, taggedPtr.type); |
- EXPECT_EQ(1.0, taggedPtr.getValue()); |
+ EXPECT_EQ(1.0, taggedPtr.getValue().num); |
clearTaggedPtr(taggedPtr); |
EXPECT_EQ(0UL, taggedPtr.flag); |
EXPECT_EQ(0UL, taggedPtr.type); |
- EXPECT_EQ(0UL, taggedPtr.getValue()); |
+ EXPECT_EQ(0.0, taggedPtr.getValue().num); |
EXPECT_EQ(0UL, *reinterpret_cast<uintptr_t*>(&taggedPtr)); |
} |
TEST(CSSPrimitiveValueTest, FitsWithoutDataLossTest) |
{ |
+ CSSPrimitiveValue::CSSPrimitiveValueData data; |
// Consistent on 32-bit/64-bit |
- EXPECT_EQ(true, CSSPrimitiveValue::CSSTaggedPtrValue::fitsWithoutDataLoss(1.0)); |
- EXPECT_EQ(false, CSSPrimitiveValue::CSSTaggedPtrValue::fitsWithoutDataLoss(3.3)); |
+ data.num = 1.0; |
+ EXPECT_EQ(true, CSSPrimitiveValue::CSSTaggedPtrValue::canFitWithoutDataLoss(data, CSSPrimitiveValue::CSS_NUMBER)); |
+ data.num = 3.3; |
+ EXPECT_EQ(false, CSSPrimitiveValue::CSSTaggedPtrValue::canFitWithoutDataLoss(data, CSSPrimitiveValue::CSS_NUMBER)); |
uint64_t trailing1sOnAllPlatforms = 0xf; |
- EXPECT_EQ(false, CSSPrimitiveValue::CSSTaggedPtrValue::fitsWithoutDataLoss(*reinterpret_cast<double*>(&trailing1sOnAllPlatforms))); |
+ data.num = *reinterpret_cast<double*>(&trailing1sOnAllPlatforms); |
+ EXPECT_EQ(false, CSSPrimitiveValue::CSSTaggedPtrValue::canFitWithoutDataLoss(data, CSSPrimitiveValue::CSS_NUMBER)); |
// Fits on 64-bit, but not on 32-bit |
uint64_t trailing1sOn32BitOnly = 0xf00; |
+ data.num = *reinterpret_cast<double*>(&trailing1sOn32BitOnly); |
bool expectToFit; |
#if CPU(32BIT) |
expectToFit = false; |
#elif CPU(64BIT) |
expectToFit = true; |
#endif |
- EXPECT_EQ(expectToFit, CSSPrimitiveValue::CSSTaggedPtrValue::fitsWithoutDataLoss(*reinterpret_cast<double*>(&trailing1sOn32BitOnly))); |
+ EXPECT_EQ(expectToFit, CSSPrimitiveValue::CSSTaggedPtrValue::canFitWithoutDataLoss(data, CSSPrimitiveValue::CSS_NUMBER)); |
} |
// Tests that the flag bit is in the least-significant bit. This test is important |
@@ -124,6 +197,13 @@ TEST(CSSPrimitiveValueTest, FlagBitInLSBTest) |
taggedPtr.flag = 0; |
EXPECT_EQ(0UL, *reinterpret_cast<uintptr_t*>(&taggedPtr)); |
+ |
+ // A real pointer should have a 'flag' of 0. |
+ int* ptr = new int(); |
+ EXPECT_NE(nullptr, ptr); |
+ CSSPrimitiveValue::CSSTaggedPtrValue ptrAsTaggedPtr = *reinterpret_cast<CSSPrimitiveValue::CSSTaggedPtrValue*>(&ptr); |
+ EXPECT_EQ(0UL, ptrAsTaggedPtr.flag); |
+ delete ptr; |
} |
// Test that all valid values for UnitType fit in the UnitType bit field in the |