OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "config.h" | 5 #include "config.h" |
6 | 6 |
7 #include "core/css/CSSPrimitiveValue.h" | 7 #include "core/css/CSSPrimitiveValue.h" |
8 | 8 |
9 #include "core/css/CSSValueTestHelper.h" | 9 #include "core/css/CSSValueTestHelper.h" |
10 #include <gtest/gtest.h> | 10 #include <gtest/gtest.h> |
11 #include <strings.h> | 11 #include <strings.h> |
12 | 12 |
13 using namespace blink; | 13 using namespace blink; |
14 | 14 |
15 namespace { | 15 namespace { |
16 | 16 |
17 void clearTaggedPtr(CSSPrimitiveValue::CSSTaggedPtrValue& taggedPtr) | 17 void clearTaggedPtr(CSSPrimitiveValue::CSSTaggedPtrValue& taggedPtr) |
18 { | 18 { |
19 taggedPtr.flag = 0; | 19 taggedPtr.flag = 0; |
20 taggedPtr.type = static_cast<CSSPrimitiveValue::UnitType>(0); | 20 taggedPtr.type = static_cast<CSSPrimitiveValue::UnitType>(0); |
21 taggedPtr.setValue(0.0); | 21 taggedPtr.valueRaw = 0; |
22 } | 22 } |
23 | 23 |
24 TEST(CSSPrimitiveValueTest, CSSPrimitiveValueTest) | 24 TEST(CSSPrimitiveValueTest, CSSPrimitiveDoubleValueTest) |
25 { | 25 { |
26 // 1.0 can be stored in a tagged ptr. | 26 // 1.0 can be stored in a tagged ptr. |
27 CSSPrimitiveValue value = CSSPrimitiveValue::create(1.0, CSSPrimitiveValue::
CSS_INTEGER); | 27 CSSPrimitiveValue value = CSSPrimitiveValue::create(1.0, CSSPrimitiveValue::
CSS_INTEGER); |
28 EXPECT_EQ(1.0, value.getDoubleValue()); | 28 EXPECT_EQ(1.0, value.getDoubleValue()); |
29 EXPECT_EQ("1", value.customCSSText()); | 29 EXPECT_STREQ("1", value.customCSSText().ascii().data()); |
30 EXPECT_TRUE(value.isNumber()); | 30 EXPECT_TRUE(value.isNumber()); |
31 EXPECT_FALSE(value.isAttr()); | 31 EXPECT_FALSE(value.isAttr()); |
32 | 32 |
33 CSSValue cssValue(value); | 33 CSSValue cssValue(value); |
34 EXPECT_TRUE(cssValue.isPrimitiveValue()); | 34 EXPECT_TRUE(cssValue.isPrimitiveValue()); |
35 EXPECT_FALSE(cssValue.isImageValue()); | 35 EXPECT_FALSE(cssValue.isImageValue()); |
36 EXPECT_EQ("1", cssValue.cssText()); | 36 EXPECT_STREQ("1", cssValue.cssText().ascii().data()); |
37 | 37 |
38 // 3.3 cannot be stored in a tagged ptr. | 38 // 3.3 cannot be stored in a tagged ptr. |
39 CSSPrimitiveValue valueInTaggedPtr = CSSPrimitiveValue::create(3.3, CSSPrimi
tiveValue::CSS_NUMBER); | 39 CSSPrimitiveValue valueInTaggedPtr = CSSPrimitiveValue::create(3.3, CSSPrimi
tiveValue::CSS_NUMBER); |
40 EXPECT_EQ(3.3, valueInTaggedPtr.getDoubleValue()); | 40 EXPECT_EQ(3.3, valueInTaggedPtr.getDoubleValue()); |
41 EXPECT_EQ("3.3", valueInTaggedPtr.customCSSText()); | 41 EXPECT_STREQ("3.3", valueInTaggedPtr.customCSSText().ascii().data()); |
42 EXPECT_TRUE(valueInTaggedPtr.isNumber()); | 42 EXPECT_TRUE(valueInTaggedPtr.isNumber()); |
43 EXPECT_FALSE(value.isAttr()); | 43 EXPECT_FALSE(value.isAttr()); |
44 | 44 |
45 CSSValue cssValueWithTaggedPtr(valueInTaggedPtr); | 45 CSSValue cssValueWithTaggedPtr(valueInTaggedPtr); |
46 EXPECT_TRUE(cssValueWithTaggedPtr.isPrimitiveValue()); | 46 EXPECT_TRUE(cssValueWithTaggedPtr.isPrimitiveValue()); |
47 EXPECT_FALSE(cssValueWithTaggedPtr.isImageValue()); | 47 EXPECT_FALSE(cssValueWithTaggedPtr.isImageValue()); |
48 EXPECT_EQ("3.3", cssValueWithTaggedPtr.cssText()); | 48 EXPECT_STREQ("3.3", cssValueWithTaggedPtr.cssText().ascii().data()); |
49 | 49 |
50 EXPECT_FALSE(cssValue.equals(cssValueWithTaggedPtr)); | 50 EXPECT_FALSE(cssValue.equals(cssValueWithTaggedPtr)); |
51 EXPECT_FALSE(cssValueWithTaggedPtr.equals(cssValue)); | 51 EXPECT_FALSE(cssValueWithTaggedPtr.equals(cssValue)); |
52 | 52 |
53 CSSValue cssValueCopy(cssValue); | 53 CSSValue cssValueCopy(cssValue); |
54 EXPECT_TRUE(cssValue.equals(cssValueCopy)); | 54 EXPECT_TRUE(cssValue.equals(cssValueCopy)); |
55 EXPECT_TRUE(cssValueCopy.equals(cssValue)); | 55 EXPECT_TRUE(cssValueCopy.equals(cssValue)); |
56 | 56 |
57 CSSValue cssValueWithTaggedPtrCopy(cssValueWithTaggedPtr); | 57 CSSValue cssValueWithTaggedPtrCopy(cssValueWithTaggedPtr); |
58 EXPECT_TRUE(cssValueWithTaggedPtr.equals(cssValueWithTaggedPtrCopy)); | 58 EXPECT_TRUE(cssValueWithTaggedPtr.equals(cssValueWithTaggedPtrCopy)); |
59 EXPECT_TRUE(cssValueWithTaggedPtrCopy.equals(cssValueWithTaggedPtr)); | 59 EXPECT_TRUE(cssValueWithTaggedPtrCopy.equals(cssValueWithTaggedPtr)); |
60 } | 60 } |
61 | 61 |
| 62 TEST(CSSPrimitiveValueTest, CSSPrimitiveColorValueTest) |
| 63 { |
| 64 // (r, g, b, 0) and (r, g, b, 255) can be stored as a tagged ptr. |
| 65 RGBA32 colorAlpha0 = makeRGBA(5, 0, 15, 0); |
| 66 CSSPrimitiveValue valueAlpha0 = CSSPrimitiveValue::createColor(colorAlpha0); |
| 67 EXPECT_TRUE(valueAlpha0.isRGBColor()); |
| 68 EXPECT_FALSE(valueAlpha0.isNumber()); |
| 69 EXPECT_EQ(5, redChannel(valueAlpha0.getRGBA32Value())); |
| 70 EXPECT_EQ(0, greenChannel(valueAlpha0.getRGBA32Value())); |
| 71 EXPECT_EQ(15, blueChannel(valueAlpha0.getRGBA32Value())); |
| 72 EXPECT_EQ(0, alphaChannel(valueAlpha0.getRGBA32Value())); |
| 73 EXPECT_STREQ("rgba(5, 0, 15, 0)", valueAlpha0.customCSSText().ascii().data()
); |
| 74 |
| 75 RGBA32 colorAlpha255 = makeRGBA(15, 100, 255, 255); |
| 76 CSSPrimitiveValue valueAlpha255 = CSSPrimitiveValue::createColor(colorAlpha2
55); |
| 77 EXPECT_TRUE(valueAlpha255.isRGBColor()); |
| 78 EXPECT_FALSE(valueAlpha255.isNumber()); |
| 79 EXPECT_EQ(15, redChannel(valueAlpha255.getRGBA32Value())); |
| 80 EXPECT_EQ(100, greenChannel(valueAlpha255.getRGBA32Value())); |
| 81 EXPECT_EQ(255, blueChannel(valueAlpha255.getRGBA32Value())); |
| 82 EXPECT_EQ(255, alphaChannel(valueAlpha255.getRGBA32Value())); |
| 83 EXPECT_STREQ("rgb(15, 100, 255)", valueAlpha255.customCSSText().ascii().data
()); |
| 84 |
| 85 // Other alpha values can be stored as a tagged ptr on 64-bit only. |
| 86 RGBA32 colorAlphaOther = makeRGBA(0, 10, 15, 51); |
| 87 CSSPrimitiveValue valueAlphaOther = CSSPrimitiveValue::createColor(colorAlph
aOther); |
| 88 EXPECT_TRUE(valueAlphaOther.isRGBColor()); |
| 89 EXPECT_FALSE(valueAlphaOther.isNumber()); |
| 90 EXPECT_EQ(0, redChannel(valueAlphaOther.getRGBA32Value())); |
| 91 EXPECT_EQ(10, greenChannel(valueAlphaOther.getRGBA32Value())); |
| 92 EXPECT_EQ(15, blueChannel(valueAlphaOther.getRGBA32Value())); |
| 93 EXPECT_EQ(51, alphaChannel(valueAlphaOther.getRGBA32Value())); |
| 94 EXPECT_STREQ("rgba(0, 10, 15, 0.2)", valueAlphaOther.customCSSText().ascii()
.data()); |
| 95 |
| 96 |
| 97 EXPECT_FALSE(CSSValue(valueAlpha0).equals(CSSValue(valueAlpha255))); |
| 98 EXPECT_FALSE(CSSValue(valueAlpha255).equals(CSSValue(valueAlpha0))); |
| 99 EXPECT_FALSE(CSSValue(valueAlphaOther).equals(CSSValue(valueAlpha0))); |
| 100 EXPECT_FALSE(CSSValue(valueAlpha0).equals(CSSValue(valueAlphaOther))); |
| 101 |
| 102 CSSValue cssValueWithTaggedPtrCopy(valueAlpha0); |
| 103 EXPECT_TRUE(CSSValue(valueAlpha0).equals(CSSValue(cssValueWithTaggedPtrCopy)
)); |
| 104 EXPECT_TRUE(CSSValue(cssValueWithTaggedPtrCopy).equals(CSSValue(valueAlpha0)
)); |
| 105 |
| 106 CSSValue cssValueCopy(valueAlphaOther); |
| 107 EXPECT_TRUE(CSSValue(valueAlphaOther).equals(CSSValue(cssValueCopy))); |
| 108 EXPECT_TRUE(CSSValue(cssValueCopy).equals(CSSValue(valueAlphaOther))); |
| 109 } |
| 110 |
| 111 TEST(CSSPrimitiveValueTest, CSSPrimitiveIDValueTest) |
| 112 { |
| 113 // All value and property IDs can be stored as a tagged ptr. |
| 114 CSSPrimitiveValue valueID = CSSPrimitiveValue::createIdentifier(CSSValueRed)
; |
| 115 EXPECT_EQ(CSSPrimitiveValue::CSS_IDENT, valueID.primitiveType()); |
| 116 EXPECT_TRUE(valueID.isValueID()); |
| 117 EXPECT_FALSE(valueID.isNumber()); |
| 118 EXPECT_EQ(CSSValueRed, valueID.getValueID()); |
| 119 EXPECT_STREQ("red", valueID.customCSSText().ascii().data()); |
| 120 |
| 121 CSSPrimitiveValue propertyID = CSSPrimitiveValue::createIdentifier(CSSProper
tyBorder); |
| 122 EXPECT_EQ(CSSPrimitiveValue::CSS_IDENT, propertyID.primitiveType()); |
| 123 EXPECT_FALSE(propertyID.isNumber()); |
| 124 EXPECT_EQ(CSSPropertyBorder, propertyID.getPropertyID()); |
| 125 EXPECT_STREQ("border", propertyID.customCSSText().ascii().data()); |
| 126 } |
| 127 |
62 TEST(CSSPrimitiveValueTest, CSSTaggedPtrValueTest) | 128 TEST(CSSPrimitiveValueTest, CSSTaggedPtrValueTest) |
63 { | 129 { |
64 CSSPrimitiveValue::CSSTaggedPtrValue taggedPtr; | 130 CSSPrimitiveValue::CSSTaggedPtrValue taggedPtr; |
65 clearTaggedPtr(taggedPtr); | 131 clearTaggedPtr(taggedPtr); |
66 | 132 |
67 // Check that all fields can be get/set correctly. | 133 // Check that all fields can be get/set correctly. |
68 EXPECT_EQ(0UL, taggedPtr.flag); | 134 EXPECT_EQ(0UL, taggedPtr.flag); |
69 taggedPtr.flag = 1; | 135 taggedPtr.flag = 1; |
70 EXPECT_EQ(1UL, taggedPtr.flag); | 136 EXPECT_EQ(1UL, taggedPtr.flag); |
71 | 137 |
72 EXPECT_EQ(0UL, taggedPtr.type); | 138 EXPECT_EQ(0UL, taggedPtr.type); |
73 taggedPtr.type = CSSPrimitiveValue::CSS_INTEGER; | 139 taggedPtr.type = CSSPrimitiveValue::CSS_INTEGER; |
74 EXPECT_EQ(CSSPrimitiveValue::CSS_INTEGER, taggedPtr.type); | 140 EXPECT_EQ(CSSPrimitiveValue::CSS_INTEGER, taggedPtr.type); |
75 | 141 |
76 EXPECT_EQ(0UL, taggedPtr.getValue()); | 142 EXPECT_EQ(0UL, taggedPtr.getValue().num); |
77 taggedPtr.setValue(1.0); | 143 CSSPrimitiveValue::CSSPrimitiveValueData data; |
78 EXPECT_EQ(1.0, taggedPtr.getValue()); | 144 data.num = 1.0; |
| 145 taggedPtr.setValue(data, CSSPrimitiveValue::CSS_NUMBER); |
| 146 EXPECT_EQ(1.0, taggedPtr.getValue().num); |
79 | 147 |
80 taggedPtr.flag = 1; | 148 taggedPtr.flag = 1; |
81 taggedPtr.type = CSSPrimitiveValue::CSS_INTEGER; | 149 taggedPtr.type = CSSPrimitiveValue::CSS_INTEGER; |
82 taggedPtr.setValue(1.0); | 150 taggedPtr.setValue(data, CSSPrimitiveValue::CSS_INTEGER); |
83 EXPECT_EQ(1UL, taggedPtr.flag); | 151 EXPECT_EQ(1UL, taggedPtr.flag); |
84 EXPECT_EQ(CSSPrimitiveValue::CSS_INTEGER, taggedPtr.type); | 152 EXPECT_EQ(CSSPrimitiveValue::CSS_INTEGER, taggedPtr.type); |
85 EXPECT_EQ(1.0, taggedPtr.getValue()); | 153 EXPECT_EQ(1.0, taggedPtr.getValue().num); |
86 | 154 |
87 clearTaggedPtr(taggedPtr); | 155 clearTaggedPtr(taggedPtr); |
88 EXPECT_EQ(0UL, taggedPtr.flag); | 156 EXPECT_EQ(0UL, taggedPtr.flag); |
89 EXPECT_EQ(0UL, taggedPtr.type); | 157 EXPECT_EQ(0UL, taggedPtr.type); |
90 EXPECT_EQ(0UL, taggedPtr.getValue()); | 158 EXPECT_EQ(0.0, taggedPtr.getValue().num); |
91 EXPECT_EQ(0UL, *reinterpret_cast<uintptr_t*>(&taggedPtr)); | 159 EXPECT_EQ(0UL, *reinterpret_cast<uintptr_t*>(&taggedPtr)); |
92 } | 160 } |
93 | 161 |
94 TEST(CSSPrimitiveValueTest, FitsWithoutDataLossTest) | 162 TEST(CSSPrimitiveValueTest, FitsWithoutDataLossTest) |
95 { | 163 { |
| 164 CSSPrimitiveValue::CSSPrimitiveValueData data; |
96 // Consistent on 32-bit/64-bit | 165 // Consistent on 32-bit/64-bit |
97 EXPECT_EQ(true, CSSPrimitiveValue::CSSTaggedPtrValue::fitsWithoutDataLoss(1.
0)); | 166 data.num = 1.0; |
98 EXPECT_EQ(false, CSSPrimitiveValue::CSSTaggedPtrValue::fitsWithoutDataLoss(3
.3)); | 167 EXPECT_EQ(true, CSSPrimitiveValue::CSSTaggedPtrValue::canFitWithoutDataLoss(
data, CSSPrimitiveValue::CSS_NUMBER)); |
| 168 data.num = 3.3; |
| 169 EXPECT_EQ(false, CSSPrimitiveValue::CSSTaggedPtrValue::canFitWithoutDataLoss
(data, CSSPrimitiveValue::CSS_NUMBER)); |
99 | 170 |
100 uint64_t trailing1sOnAllPlatforms = 0xf; | 171 uint64_t trailing1sOnAllPlatforms = 0xf; |
101 EXPECT_EQ(false, CSSPrimitiveValue::CSSTaggedPtrValue::fitsWithoutDataLoss(*
reinterpret_cast<double*>(&trailing1sOnAllPlatforms))); | 172 data.num = *reinterpret_cast<double*>(&trailing1sOnAllPlatforms); |
| 173 EXPECT_EQ(false, CSSPrimitiveValue::CSSTaggedPtrValue::canFitWithoutDataLoss
(data, CSSPrimitiveValue::CSS_NUMBER)); |
102 | 174 |
103 // Fits on 64-bit, but not on 32-bit | 175 // Fits on 64-bit, but not on 32-bit |
104 uint64_t trailing1sOn32BitOnly = 0xf00; | 176 uint64_t trailing1sOn32BitOnly = 0xf00; |
| 177 data.num = *reinterpret_cast<double*>(&trailing1sOn32BitOnly); |
105 bool expectToFit; | 178 bool expectToFit; |
106 #if CPU(32BIT) | 179 #if CPU(32BIT) |
107 expectToFit = false; | 180 expectToFit = false; |
108 #elif CPU(64BIT) | 181 #elif CPU(64BIT) |
109 expectToFit = true; | 182 expectToFit = true; |
110 #endif | 183 #endif |
111 EXPECT_EQ(expectToFit, CSSPrimitiveValue::CSSTaggedPtrValue::fitsWithoutData
Loss(*reinterpret_cast<double*>(&trailing1sOn32BitOnly))); | 184 EXPECT_EQ(expectToFit, CSSPrimitiveValue::CSSTaggedPtrValue::canFitWithoutDa
taLoss(data, CSSPrimitiveValue::CSS_NUMBER)); |
112 } | 185 } |
113 | 186 |
114 // Tests that the flag bit is in the least-significant bit. This test is importa
nt | 187 // Tests that the flag bit is in the least-significant bit. This test is importa
nt |
115 // since we implement CSSTaggedPtrValue using bitfields, and the C++ standard sp
ecifies | 188 // since we implement CSSTaggedPtrValue using bitfields, and the C++ standard sp
ecifies |
116 // that bitfield packing behavior is implementation-specific. | 189 // that bitfield packing behavior is implementation-specific. |
117 TEST(CSSPrimitiveValueTest, FlagBitInLSBTest) | 190 TEST(CSSPrimitiveValueTest, FlagBitInLSBTest) |
118 { | 191 { |
119 CSSPrimitiveValue::CSSTaggedPtrValue taggedPtr; | 192 CSSPrimitiveValue::CSSTaggedPtrValue taggedPtr; |
120 clearTaggedPtr(taggedPtr); | 193 clearTaggedPtr(taggedPtr); |
121 | 194 |
122 taggedPtr.flag = 1; | 195 taggedPtr.flag = 1; |
123 EXPECT_EQ(1UL, *reinterpret_cast<uintptr_t*>(&taggedPtr)); | 196 EXPECT_EQ(1UL, *reinterpret_cast<uintptr_t*>(&taggedPtr)); |
124 | 197 |
125 taggedPtr.flag = 0; | 198 taggedPtr.flag = 0; |
126 EXPECT_EQ(0UL, *reinterpret_cast<uintptr_t*>(&taggedPtr)); | 199 EXPECT_EQ(0UL, *reinterpret_cast<uintptr_t*>(&taggedPtr)); |
| 200 |
| 201 // A real pointer should have a 'flag' of 0. |
| 202 int* ptr = new int(); |
| 203 EXPECT_NE(nullptr, ptr); |
| 204 CSSPrimitiveValue::CSSTaggedPtrValue ptrAsTaggedPtr = *reinterpret_cast<CSSP
rimitiveValue::CSSTaggedPtrValue*>(&ptr); |
| 205 EXPECT_EQ(0UL, ptrAsTaggedPtr.flag); |
| 206 delete ptr; |
127 } | 207 } |
128 | 208 |
129 // Test that all valid values for UnitType fit in the UnitType bit field in the | 209 // Test that all valid values for UnitType fit in the UnitType bit field in the |
130 // tagged pointer. | 210 // tagged pointer. |
131 TEST(CSSPrimitiveValueTest, UnitTypeSizeTest) | 211 TEST(CSSPrimitiveValueTest, UnitTypeSizeTest) |
132 { | 212 { |
133 CSSPrimitiveValue::CSSTaggedPtrValue taggedPtr; | 213 CSSPrimitiveValue::CSSTaggedPtrValue taggedPtr; |
134 clearTaggedPtr(taggedPtr); | 214 clearTaggedPtr(taggedPtr); |
135 | 215 |
136 // We can't take the sizeof() of a bitfield. Instead, try set the largest pr
imitive | 216 // We can't take the sizeof() of a bitfield. Instead, try set the largest pr
imitive |
137 // value type we have, and see if we can read it out again. | 217 // value type we have, and see if we can read it out again. |
138 taggedPtr.type = CSSPrimitiveValue::CSS_QEM; | 218 taggedPtr.type = CSSPrimitiveValue::CSS_QEM; |
139 ASSERT_EQ(CSSPrimitiveValue::CSS_QEM, taggedPtr.type); | 219 ASSERT_EQ(CSSPrimitiveValue::CSS_QEM, taggedPtr.type); |
140 } | 220 } |
141 | 221 |
142 | 222 |
143 } // namespace | 223 } // namespace |
OLD | NEW |