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

Side by Side 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, 4 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 unified diff | Download patch
« no previous file with comments | « Source/core/css/CSSPrimitiveValue.cpp ('k') | Source/core/css/CSSValue.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
OLDNEW
« 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