Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(312)

Unified Diff: Source/core/css/CSSPrimitiveValueTest.cpp

Issue 1234763007: CSSValue Immediates: Make toCSSPrimitiveValue() return a const reference (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@cssvalue_patch_3_tagged_ptrs_finally
Patch Set: Rebase Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/css/CSSPrimitiveValue.cpp ('k') | Source/core/css/CSSValue.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « Source/core/css/CSSPrimitiveValue.cpp ('k') | Source/core/css/CSSValue.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698