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

Side by Side Diff: ui/gfx/render_text_unittest.cc

Issue 11535014: Replace StyleRange with BreakList; update RenderText, etc. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Simplify OmniboxResultView; Rename StyleBreak; cleanup. Created 7 years, 11 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "ui/gfx/render_text.h" 5 #include "ui/gfx/render_text.h"
6 6
7 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "base/utf_string_conversions.h" 8 #include "base/utf_string_conversions.h"
9 #include "testing/gtest/include/gtest/gtest.h" 9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "ui/gfx/text_constants.h" 10 #include "ui/gfx/text_constants.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 // Override the current locale/direction. 43 // Override the current locale/direction.
44 base::i18n::SetICUDefaultLocale(rtl ? "he" : "en"); 44 base::i18n::SetICUDefaultLocale(rtl ? "he" : "en");
45 #if defined(TOOLKIT_GTK) 45 #if defined(TOOLKIT_GTK)
46 // Do the same for GTK, which does not rely on the ICU default locale. 46 // Do the same for GTK, which does not rely on the ICU default locale.
47 gtk_widget_set_default_direction(rtl ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR); 47 gtk_widget_set_default_direction(rtl ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR);
48 #endif 48 #endif
49 EXPECT_EQ(rtl, base::i18n::IsRTL()); 49 EXPECT_EQ(rtl, base::i18n::IsRTL());
50 } 50 }
51 #endif 51 #endif
52 52
53 // Return true if there is only one break, and it has the supplied |value|.
54 template<class T>
55 bool BreakEquals(const std::vector<std::pair<size_t, T> >& breaks, T value) {
56 return breaks.size() == 1 && breaks[0] == std::pair<size_t, T>(0, value);
57 }
58
59 // Return true if |breaks| matches |expected|.
60 template<class T>
61 bool BreaksEqual(const std::vector<std::pair<size_t, T> >& breaks,
62 const std::vector<std::pair<size_t, T> >& expected) {
63 if (breaks.size() != expected.size())
64 return false;
65 for (size_t i = 0; i < breaks.size(); ++i)
66 if (breaks[i] != expected[i])
67 return false;
68 return true;
69 }
70
53 } // namespace 71 } // namespace
54 72
55 class RenderTextTest : public testing::Test { 73 class RenderTextTest : public testing::Test {
56 }; 74 };
57 75
58 TEST_F(RenderTextTest, DefaultStyle) { 76 TEST_F(RenderTextTest, DefaultStyle) {
59 // Defaults to empty text with no styles. 77 // Check the default styles applied to new instances and adjusted text.
60 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 78 scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
61 EXPECT_TRUE(render_text->text().empty()); 79 EXPECT_TRUE(render_text->text().empty());
62 EXPECT_TRUE(render_text->style_ranges().empty()); 80 const wchar_t* const cases[] = { kWeak, kLtr, L"Hello", kRtl, L"", L"" };
63 81 for (size_t i = 0; i < arraysize(cases); ++i) {
64 // Test that the built-in default style is applied for new text. 82 EXPECT_TRUE(BreakEquals(render_text->colors(), SK_ColorBLACK));
65 render_text->SetText(ASCIIToUTF16("abc")); 83 for (size_t style = 0; style < NUM_TEXT_STYLES; ++style) {
66 EXPECT_EQ(1U, render_text->style_ranges().size()); 84 TextStyle value = static_cast<TextStyle>(style);
67 StyleRange style; 85 EXPECT_TRUE(BreakEquals(render_text->styles(value), false));
68 EXPECT_EQ(style.foreground, render_text->style_ranges()[0].foreground); 86 }
69 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range); 87 render_text->SetText(WideToUTF16(cases[i]));
70 EXPECT_EQ(style.strike, render_text->style_ranges()[0].strike); 88 }
71 EXPECT_EQ(style.underline, render_text->style_ranges()[0].underline); 89 }
72 90
73 // Test that clearing the text also clears the styles. 91 TEST_F(RenderTextTest, SetColorAndStyle) {
74 render_text->SetText(string16()); 92 // Ensure custom default styles persist across setting and clearing text.
75 EXPECT_TRUE(render_text->text().empty()); 93 scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
76 EXPECT_TRUE(render_text->style_ranges().empty()); 94 const SkColor color = SK_ColorRED;
77 } 95 render_text->SetColor(color);
78 96 render_text->SetStyle(BOLD, true);
79 TEST_F(RenderTextTest, CustomDefaultStyle) { 97 render_text->SetStyle(UNDERLINE, false);
80 // Test a custom default style. 98 const wchar_t* const cases[] = { kWeak, kLtr, L"Hello", kRtl, L"", L"" };
81 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 99 for (size_t i = 0; i < arraysize(cases); ++i) {
82 StyleRange color; 100 EXPECT_TRUE(BreakEquals(render_text->colors(), color));
83 color.foreground = SK_ColorRED; 101 EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), true));
84 render_text->set_default_style(color); 102 EXPECT_TRUE(BreakEquals(render_text->styles(UNDERLINE), false));
85 render_text->SetText(ASCIIToUTF16("abc")); 103 render_text->SetText(WideToUTF16(cases[i]));
86 EXPECT_EQ(1U, render_text->style_ranges().size()); 104
87 EXPECT_EQ(color.foreground, render_text->style_ranges()[0].foreground); 105 // Ensure custom default styles can be applied after text has been set.
88 106 if (i == 1)
89 // Test that the custom default style persists across clearing text. 107 render_text->SetStyle(STRIKE, true);
90 render_text->SetText(string16()); 108 if (i >= 1)
91 EXPECT_TRUE(render_text->style_ranges().empty()); 109 EXPECT_TRUE(BreakEquals(render_text->styles(STRIKE), true));
92 render_text->SetText(ASCIIToUTF16("abc")); 110 }
93 EXPECT_EQ(1U, render_text->style_ranges().size()); 111 }
94 EXPECT_EQ(color.foreground, render_text->style_ranges()[0].foreground); 112
95 113 TEST_F(RenderTextTest, ApplyInvalidOrEmptyRange) {
96 // Test ApplyDefaultStyle after setting a new default. 114 scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
97 StyleRange strike; 115 render_text->SetText(ASCIIToUTF16("012345678"));
98 strike.strike = true; 116
99 render_text->set_default_style(strike); 117 // Ensure ApplyStyle and ApplyColor no-op on empty ranges.
100 render_text->ApplyDefaultStyle(); 118 ui::Range empty_range = ui::Range(1, 1);
101 EXPECT_EQ(1U, render_text->style_ranges().size()); 119 const SkColor color = SK_ColorBLACK;
102 EXPECT_TRUE(render_text->style_ranges()[0].strike); 120 render_text->ApplyColor(SK_ColorRED, empty_range);
103 EXPECT_EQ(strike.foreground, render_text->style_ranges()[0].foreground); 121 EXPECT_TRUE(BreakEquals(render_text->colors(), color));
104 } 122 render_text->ApplyStyle(BOLD, true, empty_range);
105 123 EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), false));
106 TEST_F(RenderTextTest, ApplyStyleRange) { 124
107 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 125 // Ensure ApplyStyle and ApplyColor no-op on invalid ranges.
126 ui::Range invalid_range = ui::Range::InvalidRange();
127 render_text->ApplyColor(SK_ColorRED, invalid_range);
128 EXPECT_TRUE(BreakEquals(render_text->colors(), color));
129 render_text->ApplyStyle(BOLD, true, invalid_range);
130 EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), false));
131 }
132
133 TEST_F(RenderTextTest, ApplyStyle) {
134 scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
135 render_text->SetText(ASCIIToUTF16("012345678"));
136
137 // Apply a style to a valid range, check breaks; repeating should be no-op.
138 StyleBreaks expected;
139 expected.push_back(StyleBreak(0, false));
140 expected.push_back(StyleBreak(2, true));
141 expected.push_back(StyleBreak(3, false));
142 for (size_t i = 0; i < 2; ++i) {
143 render_text->ApplyStyle(BOLD, true, ui::Range(2, 3));
144 EXPECT_TRUE(BreaksEqual(render_text->styles(BOLD), expected));
145 }
146
147 // Ensure setting a style overrides the ranged style.
148 render_text->SetStyle(BOLD, false);
149 EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), false));
150
151 // Ensure applying a style that is already applied has no effect.
152 render_text->ApplyStyle(BOLD, false, ui::Range(0, 2));
153 render_text->ApplyStyle(BOLD, false, ui::Range(3, 6));
154 render_text->ApplyStyle(BOLD, false, ui::Range(7, 9));
155 EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), false));
156
157 // Ensure applying an identical neighboring style merges the ranges.
158 render_text->ApplyStyle(BOLD, true, ui::Range(0, 3));
159 render_text->ApplyStyle(BOLD, true, ui::Range(3, 6));
160 render_text->ApplyStyle(BOLD, true, ui::Range(6, 9));
161 EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), true));
162
163 // Ensure applying a style with the same range overrides the ranged style.
164 render_text->ApplyStyle(BOLD, false, ui::Range(2, 3));
165 render_text->ApplyStyle(BOLD, true, ui::Range(2, 3));
166 EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), true));
167
168 // Ensure applying a style with a containing range overrides the ranged style.
169 render_text->ApplyStyle(BOLD, false, ui::Range(0, 1));
170 render_text->ApplyStyle(BOLD, false, ui::Range(2, 3));
171 render_text->ApplyStyle(BOLD, true, ui::Range(0, 3));
172 EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), true));
173 render_text->ApplyStyle(BOLD, false, ui::Range(4, 5));
174 render_text->ApplyStyle(BOLD, false, ui::Range(6, 7));
175 render_text->ApplyStyle(BOLD, false, ui::Range(8, 9));
176 render_text->ApplyStyle(BOLD, true, ui::Range(4, 9));
177 EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), true));
178
179 // Ensure applying various overlapping styles yields the intended results.
180 render_text->ApplyStyle(BOLD, false, ui::Range(1, 4));
181 render_text->ApplyStyle(BOLD, false, ui::Range(5, 8));
182 render_text->ApplyStyle(BOLD, true, ui::Range(0, 2));
183 render_text->ApplyStyle(BOLD, true, ui::Range(3, 6));
184 render_text->ApplyStyle(BOLD, true, ui::Range(7, 9));
185 StyleBreaks overlap;
186 overlap.push_back(StyleBreak(0, true));
187 overlap.push_back(StyleBreak(2, false));
188 overlap.push_back(StyleBreak(3, true));
189 overlap.push_back(StyleBreak(6, false));
190 overlap.push_back(StyleBreak(7, true));
191 EXPECT_TRUE(BreaksEqual(render_text->styles(BOLD), overlap));
192 }
193
194 TEST_F(RenderTextTest, ResizeStyle) {
195 // Ensure styles adjust to accomodate text length changes.
196 scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
197 render_text->SetText(ASCIIToUTF16("012345678"));
198 render_text->ApplyStyle(BOLD, true, ui::Range(0, 2));
199 render_text->ApplyStyle(BOLD, true, ui::Range(3, 6));
200 render_text->ApplyStyle(BOLD, true, ui::Range(7, 9));
201
202 StyleBreaks expected;
203 expected.push_back(StyleBreak(0, true));
204 expected.push_back(StyleBreak(2, false));
205 expected.push_back(StyleBreak(3, true));
206 expected.push_back(StyleBreak(6, false));
207 expected.push_back(StyleBreak(7, true));
208 EXPECT_TRUE(BreaksEqual(render_text->styles(BOLD), expected));
209
210 // Truncating the text should trim any corresponding breaks.
211 render_text->SetText(ASCIIToUTF16("0123456"));
212 expected.resize(4);
213 EXPECT_TRUE(BreaksEqual(render_text->styles(BOLD), expected));
108 render_text->SetText(ASCIIToUTF16("01234")); 214 render_text->SetText(ASCIIToUTF16("01234"));
109 EXPECT_EQ(1U, render_text->style_ranges().size()); 215 expected.resize(3);
110 216 EXPECT_TRUE(BreaksEqual(render_text->styles(BOLD), expected));
111 // Test ApplyStyleRange (no-op on empty range). 217
112 StyleRange empty; 218 // Appending text should extend the terminal styles without changing breaks.
113 empty.range = ui::Range(1, 1); 219 render_text->SetText(ASCIIToUTF16("012345678"));
114 render_text->ApplyStyleRange(empty); 220 EXPECT_TRUE(BreaksEqual(render_text->styles(BOLD), expected));
115 EXPECT_EQ(1U, render_text->style_ranges().size()); 221 }
116 222
117 // Test ApplyStyleRange (no-op on invalid range). 223 TEST_F(RenderTextTest, ApplyColor) {
118 StyleRange invalid; 224 scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
119 invalid.range = ui::Range::InvalidRange(); 225 render_text->SetText(ASCIIToUTF16("012345678"));
120 render_text->ApplyStyleRange(invalid); 226
121 EXPECT_EQ(1U, render_text->style_ranges().size()); 227 // Apply a color to a valid range, check breaks; repeating should be no-op.
122 228 ui::Range valid_range = ui::Range(2, 3);
123 // Apply a style with a range contained by an existing range. 229 ColorBreaks expected;
124 StyleRange underline; 230 expected.push_back(ColorBreak(0, SK_ColorBLACK));
125 underline.underline = true; 231 expected.push_back(ColorBreak(2, SK_ColorRED));
126 underline.range = ui::Range(2, 3); 232 expected.push_back(ColorBreak(3, SK_ColorBLACK));
127 render_text->ApplyStyleRange(underline); 233 for (size_t i = 0; i < 2; ++i) {
128 EXPECT_EQ(3U, render_text->style_ranges().size()); 234 render_text->ApplyColor(SK_ColorRED, valid_range);
129 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); 235 EXPECT_TRUE(BreaksEqual(render_text->colors(), expected));
130 EXPECT_FALSE(render_text->style_ranges()[0].underline); 236 }
131 EXPECT_EQ(ui::Range(2, 3), render_text->style_ranges()[1].range); 237
132 EXPECT_TRUE(render_text->style_ranges()[1].underline); 238 // Ensure setting a color overrides the ranged color.
133 EXPECT_EQ(ui::Range(3, 5), render_text->style_ranges()[2].range); 239 render_text->SetColor(SK_ColorBLUE);
134 EXPECT_FALSE(render_text->style_ranges()[2].underline); 240 EXPECT_TRUE(BreakEquals(render_text->colors(), SK_ColorBLUE));
135 241
136 // Apply a style with a range equal to another range. 242 // Ensure applying a color that is already applied has no effect.
137 StyleRange color; 243 render_text->ApplyColor(SK_ColorBLUE, ui::Range(0, 2));
138 color.foreground = SK_ColorWHITE; 244 render_text->ApplyColor(SK_ColorBLUE, ui::Range(3, 6));
139 color.range = ui::Range(2, 3); 245 render_text->ApplyColor( SK_ColorBLUE, ui::Range(7, 9));
140 render_text->ApplyStyleRange(color); 246 EXPECT_TRUE(BreakEquals(render_text->colors(), SK_ColorBLUE));
141 EXPECT_EQ(3U, render_text->style_ranges().size()); 247
142 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); 248 // Ensure applying an identical neighboring color merges the ranges.
143 EXPECT_NE(SK_ColorWHITE, render_text->style_ranges()[0].foreground); 249 render_text->ApplyColor(SK_ColorRED, ui::Range(0, 3));
144 EXPECT_FALSE(render_text->style_ranges()[0].underline); 250 render_text->ApplyColor(SK_ColorRED, ui::Range(3, 6));
145 EXPECT_EQ(ui::Range(2, 3), render_text->style_ranges()[1].range); 251 render_text->ApplyColor(SK_ColorRED, ui::Range(6, 9));
146 EXPECT_EQ(SK_ColorWHITE, render_text->style_ranges()[1].foreground); 252 EXPECT_TRUE(BreakEquals(render_text->colors(), SK_ColorRED));
147 EXPECT_FALSE(render_text->style_ranges()[1].underline); 253
148 EXPECT_EQ(ui::Range(3, 5), render_text->style_ranges()[2].range); 254 // Ensure applying a color with the same range overrides the ranged color.
149 EXPECT_NE(SK_ColorWHITE, render_text->style_ranges()[2].foreground); 255 render_text->ApplyColor(SK_ColorGREEN, ui::Range(2, 3));
150 EXPECT_FALSE(render_text->style_ranges()[2].underline); 256 render_text->ApplyColor(SK_ColorRED, ui::Range(2, 3));
151 257 EXPECT_TRUE(BreakEquals(render_text->colors(), SK_ColorRED));
152 // Apply a style with a range containing an existing range. 258
153 // This new style also overlaps portions of neighboring ranges. 259 // Ensure applying a color with a containing range overrides the ranged color.
154 StyleRange strike; 260 render_text->ApplyColor(SK_ColorGREEN, ui::Range(0, 1));
155 strike.strike = true; 261 render_text->ApplyColor(SK_ColorGREEN, ui::Range(2, 3));
156 strike.range = ui::Range(1, 4); 262 render_text->ApplyColor(SK_ColorRED, ui::Range(0, 3));
157 render_text->ApplyStyleRange(strike); 263 EXPECT_TRUE(BreakEquals(render_text->colors(), SK_ColorRED));
158 EXPECT_EQ(3U, render_text->style_ranges().size()); 264 render_text->ApplyColor(SK_ColorGREEN, ui::Range(4, 5));
159 EXPECT_EQ(ui::Range(0, 1), render_text->style_ranges()[0].range); 265 render_text->ApplyColor(SK_ColorGREEN, ui::Range(6, 7));
160 EXPECT_FALSE(render_text->style_ranges()[0].strike); 266 render_text->ApplyColor(SK_ColorGREEN, ui::Range(8, 9));
161 EXPECT_EQ(ui::Range(1, 4), render_text->style_ranges()[1].range); 267 render_text->ApplyColor(SK_ColorRED, ui::Range(4, 9));
162 EXPECT_TRUE(render_text->style_ranges()[1].strike); 268 EXPECT_TRUE(BreakEquals(render_text->colors(), SK_ColorRED));
163 EXPECT_EQ(ui::Range(4, 5), render_text->style_ranges()[2].range); 269
164 EXPECT_FALSE(render_text->style_ranges()[2].strike); 270 // Ensure applying various overlapping colors yields the intended results.
165 271 render_text->ApplyColor(SK_ColorGREEN, ui::Range(1, 4));
166 // Apply a style overlapping all ranges. 272 render_text->ApplyColor(SK_ColorGREEN, ui::Range(5, 8));
167 StyleRange strike_underline; 273 render_text->ApplyColor(SK_ColorBLUE, ui::Range(0, 2));
168 strike_underline.strike = true; 274 render_text->ApplyColor(SK_ColorBLUE, ui::Range(3, 6));
169 strike_underline.underline = true; 275 render_text->ApplyColor(SK_ColorBLUE, ui::Range(7, 9));
170 strike_underline.range = ui::Range(0, render_text->text().length()); 276 ColorBreaks overlap;
171 render_text->ApplyStyleRange(strike_underline); 277 overlap.push_back(ColorBreak(0, SK_ColorBLUE));
172 EXPECT_EQ(1U, render_text->style_ranges().size()); 278 overlap.push_back(ColorBreak(2, SK_ColorGREEN));
173 EXPECT_EQ(ui::Range(0, 5), render_text->style_ranges()[0].range); 279 overlap.push_back(ColorBreak(3, SK_ColorBLUE));
174 EXPECT_TRUE(render_text->style_ranges()[0].underline); 280 overlap.push_back(ColorBreak(6, SK_ColorGREEN));
175 EXPECT_TRUE(render_text->style_ranges()[0].strike); 281 overlap.push_back(ColorBreak(7, SK_ColorBLUE));
176 282 EXPECT_TRUE(BreaksEqual(render_text->colors(), overlap));
177 // Apply the default style.
178 render_text->ApplyDefaultStyle();
179 EXPECT_EQ(1U, render_text->style_ranges().size());
180 EXPECT_EQ(ui::Range(0, 5), render_text->style_ranges()[0].range);
181 EXPECT_FALSE(render_text->style_ranges()[0].underline);
182 EXPECT_FALSE(render_text->style_ranges()[0].strike);
183
184 // Apply new style range that contains the 2nd last old style range.
185 render_text->SetText(ASCIIToUTF16("abcdefghi"));
186 underline.range = ui::Range(0, 3);
187 render_text->ApplyStyleRange(underline);
188 color.range = ui::Range(3, 6);
189 render_text->ApplyStyleRange(color);
190 strike.range = ui::Range(6, 9);
191 render_text->ApplyStyleRange(strike);
192 EXPECT_EQ(3U, render_text->style_ranges().size());
193
194 color.foreground = SK_ColorRED;
195 color.range = ui::Range(2, 8);
196 render_text->ApplyStyleRange(color);
197 EXPECT_EQ(3U, render_text->style_ranges().size());
198 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range);
199 EXPECT_TRUE(render_text->style_ranges()[0].underline);
200 EXPECT_EQ(ui::Range(2, 8), render_text->style_ranges()[1].range);
201 EXPECT_EQ(SK_ColorRED, render_text->style_ranges()[1].foreground);
202 EXPECT_EQ(ui::Range(8, 9), render_text->style_ranges()[2].range);
203 EXPECT_TRUE(render_text->style_ranges()[2].strike);
204
205 // Apply new style range that contains multiple old style ranges.
206 render_text->SetText(ASCIIToUTF16("abcdefghiopq"));
207 underline.range = ui::Range(0, 3);
208 render_text->ApplyStyleRange(underline);
209 color.range = ui::Range(3, 6);
210 render_text->ApplyStyleRange(color);
211 strike.range = ui::Range(6, 9);
212 render_text->ApplyStyleRange(strike);
213 strike_underline.range = ui::Range(9, 12);
214 render_text->ApplyStyleRange(strike_underline);
215 EXPECT_EQ(4U, render_text->style_ranges().size());
216
217 color.foreground = SK_ColorRED;
218 color.range = ui::Range(2, 10);
219 render_text->ApplyStyleRange(color);
220 EXPECT_EQ(3U, render_text->style_ranges().size());
221 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range);
222 EXPECT_TRUE(render_text->style_ranges()[0].underline);
223 EXPECT_EQ(ui::Range(2, 10), render_text->style_ranges()[1].range);
224 EXPECT_EQ(SK_ColorRED, render_text->style_ranges()[1].foreground);
225 EXPECT_EQ(ui::Range(10, 12), render_text->style_ranges()[2].range);
226 EXPECT_TRUE(render_text->style_ranges()[2].underline);
227 EXPECT_TRUE(render_text->style_ranges()[2].strike);
228 }
229
230 static void SetTextWith2ExtraStyles(RenderText* render_text) {
231 render_text->SetText(ASCIIToUTF16("abcdefghi"));
232
233 StyleRange strike;
234 strike.strike = true;
235 strike.range = ui::Range(0, 3);
236 render_text->ApplyStyleRange(strike);
237
238 StyleRange underline;
239 underline.underline = true;
240 underline.range = ui::Range(3, 6);
241 render_text->ApplyStyleRange(underline);
242 }
243
244 TEST_F(RenderTextTest, StyleRangesAdjust) {
245 // Test that style ranges adjust to the text size.
246 scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
247 render_text->SetText(ASCIIToUTF16("abcdef"));
248 EXPECT_EQ(1U, render_text->style_ranges().size());
249 EXPECT_EQ(ui::Range(0, 6), render_text->style_ranges()[0].range);
250
251 // Test that the range is clipped to the length of shorter text.
252 render_text->SetText(ASCIIToUTF16("abc"));
253 EXPECT_EQ(1U, render_text->style_ranges().size());
254 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range);
255
256 // Test that the last range extends to the length of longer text.
257 StyleRange strike;
258 strike.strike = true;
259 strike.range = ui::Range(2, 3);
260 render_text->ApplyStyleRange(strike);
261 render_text->SetText(ASCIIToUTF16("abcdefghi"));
262 EXPECT_EQ(2U, render_text->style_ranges().size());
263 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range);
264 EXPECT_EQ(ui::Range(2, 9), render_text->style_ranges()[1].range);
265 EXPECT_TRUE(render_text->style_ranges()[1].strike);
266
267 // Test that ranges are removed if they're outside the range of shorter text.
268 render_text->SetText(ASCIIToUTF16("ab"));
269 EXPECT_EQ(1U, render_text->style_ranges().size());
270 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range);
271 EXPECT_FALSE(render_text->style_ranges()[0].strike);
272
273 // Test that previously removed ranges don't return.
274 render_text->SetText(ASCIIToUTF16("abcdef"));
275 EXPECT_EQ(1U, render_text->style_ranges().size());
276 EXPECT_EQ(ui::Range(0, 6), render_text->style_ranges()[0].range);
277 EXPECT_FALSE(render_text->style_ranges()[0].strike);
278
279 // Test that ranges are removed correctly if they are outside the range of
280 // shorter text.
281 SetTextWith2ExtraStyles(render_text.get());
282 EXPECT_EQ(3U, render_text->style_ranges().size());
283
284 render_text->SetText(ASCIIToUTF16("abcdefg"));
285 EXPECT_EQ(3U, render_text->style_ranges().size());
286 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range);
287 EXPECT_EQ(ui::Range(3, 6), render_text->style_ranges()[1].range);
288 EXPECT_EQ(ui::Range(6, 7), render_text->style_ranges()[2].range);
289
290 SetTextWith2ExtraStyles(render_text.get());
291 EXPECT_EQ(3U, render_text->style_ranges().size());
292
293 render_text->SetText(ASCIIToUTF16("abcdef"));
294 EXPECT_EQ(2U, render_text->style_ranges().size());
295 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range);
296 EXPECT_EQ(ui::Range(3, 6), render_text->style_ranges()[1].range);
297
298 SetTextWith2ExtraStyles(render_text.get());
299 EXPECT_EQ(3U, render_text->style_ranges().size());
300
301 render_text->SetText(ASCIIToUTF16("abcde"));
302 EXPECT_EQ(2U, render_text->style_ranges().size());
303 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range);
304 EXPECT_EQ(ui::Range(3, 5), render_text->style_ranges()[1].range);
305
306 SetTextWith2ExtraStyles(render_text.get());
307 EXPECT_EQ(3U, render_text->style_ranges().size());
308
309 render_text->SetText(ASCIIToUTF16("abc"));
310 EXPECT_EQ(1U, render_text->style_ranges().size());
311 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range);
312
313 SetTextWith2ExtraStyles(render_text.get());
314 EXPECT_EQ(3U, render_text->style_ranges().size());
315
316 render_text->SetText(ASCIIToUTF16("a"));
317 EXPECT_EQ(1U, render_text->style_ranges().size());
318 EXPECT_EQ(ui::Range(0, 1), render_text->style_ranges()[0].range);
319 } 283 }
320 284
321 // TODO(asvitkine): Cursor movements tests disabled on Mac because RenderTextMac 285 // TODO(asvitkine): Cursor movements tests disabled on Mac because RenderTextMac
322 // does not implement this yet. http://crbug.com/131618 286 // does not implement this yet. http://crbug.com/131618
323 #if !defined(OS_MACOSX) 287 #if !defined(OS_MACOSX)
324 void TestVisualCursorMotionInObscuredField(RenderText* render_text, 288 void TestVisualCursorMotionInObscuredField(RenderText* render_text,
325 const string16& text, 289 const string16& text,
326 bool select) { 290 bool select) {
327 ASSERT_TRUE(render_text->obscured()); 291 ASSERT_TRUE(render_text->obscured());
328 render_text->SetText(text); 292 render_text->SetText(text);
(...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after
1044 } 1008 }
1045 1009
1046 TEST_F(RenderTextTest, StringSizeBoldWidth) { 1010 TEST_F(RenderTextTest, StringSizeBoldWidth) {
1047 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1011 scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
1048 render_text->SetText(UTF8ToUTF16("Hello World")); 1012 render_text->SetText(UTF8ToUTF16("Hello World"));
1049 1013
1050 const int plain_width = render_text->GetStringSize().width(); 1014 const int plain_width = render_text->GetStringSize().width();
1051 EXPECT_GT(plain_width, 0); 1015 EXPECT_GT(plain_width, 0);
1052 1016
1053 // Apply a bold style and check that the new width is greater. 1017 // Apply a bold style and check that the new width is greater.
1054 StyleRange bold; 1018 render_text->SetStyle(gfx::BOLD, true);
1055 bold.font_style |= Font::BOLD;
1056 render_text->set_default_style(bold);
1057 render_text->ApplyDefaultStyle();
1058
1059 const int bold_width = render_text->GetStringSize().width(); 1019 const int bold_width = render_text->GetStringSize().width();
1060 EXPECT_GT(bold_width, plain_width); 1020 EXPECT_GT(bold_width, plain_width);
1061 1021
1062 // Now, apply a plain style over the first word only. 1022 // Now, apply a plain style over the first word only.
1063 StyleRange plain; 1023 render_text->ApplyStyle(gfx::BOLD, false, ui::Range(0, 5));
Alexei Svitkine (slow) 2013/01/22 19:20:21 This should be NORMAL, not BOLD.
msw 2013/01/22 22:27:24 No, BOLD is the style that being changed to false.
1064 plain.font_style = Font::NORMAL;
1065 plain.range = ui::Range(0, 5);
1066 render_text->ApplyStyleRange(plain);
1067
1068 const int plain_bold_width = render_text->GetStringSize().width(); 1024 const int plain_bold_width = render_text->GetStringSize().width();
1069 EXPECT_GT(plain_bold_width, plain_width); 1025 EXPECT_GT(plain_bold_width, plain_width);
1070 EXPECT_LT(plain_bold_width, bold_width); 1026 EXPECT_LT(plain_bold_width, bold_width);
1071 } 1027 }
1072 1028
1073 TEST_F(RenderTextTest, StringSizeHeight) { 1029 TEST_F(RenderTextTest, StringSizeHeight) {
1074 struct { 1030 string16 cases[] = {
1075 string16 text; 1031 WideToUTF16(L"Hello World!"), // English
1076 } cases[] = { 1032 WideToUTF16(L"\x6328\x62f6"), // Japanese
1077 { WideToUTF16(L"Hello World!") }, // English 1033 WideToUTF16(L"\x0915\x093f"), // Hindi
1078 { WideToUTF16(L"\x6328\x62f6") }, // Japanese 1034 WideToUTF16(L"\x05e0\x05b8"), // Hebrew
1079 { WideToUTF16(L"\x0915\x093f") }, // Hindi
1080 { WideToUTF16(L"\x05e0\x05b8") }, // Hebrew
1081 }; 1035 };
1082 1036
1083 Font default_font; 1037 Font default_font;
1084 Font larger_font = default_font.DeriveFont(24, default_font.GetStyle()); 1038 Font larger_font = default_font.DeriveFont(24, default_font.GetStyle());
1085 EXPECT_GT(larger_font.GetHeight(), default_font.GetHeight()); 1039 EXPECT_GT(larger_font.GetHeight(), default_font.GetHeight());
1086 1040
1087 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) { 1041 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) {
1088 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1042 scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
1089 render_text->SetFont(default_font); 1043 render_text->SetFont(default_font);
1090 render_text->SetText(cases[i].text); 1044 render_text->SetText(cases[i]);
1091 1045
1092 const int height1 = render_text->GetStringSize().height(); 1046 const int height1 = render_text->GetStringSize().height();
1093 EXPECT_GT(height1, 0); 1047 EXPECT_GT(height1, 0);
1094 1048
1095 // Check that setting the larger font increases the height. 1049 // Check that setting the larger font increases the height.
1096 render_text->SetFont(larger_font); 1050 render_text->SetFont(larger_font);
1097 const int height2 = render_text->GetStringSize().height(); 1051 const int height2 = render_text->GetStringSize().height();
1098 EXPECT_GT(height2, height1); 1052 EXPECT_GT(height2, height1);
1099 } 1053 }
1100 } 1054 }
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
1345 EXPECT_EQ(render_text->display_rect().width() - width - 1, 1299 EXPECT_EQ(render_text->display_rect().width() - width - 1,
1346 render_text->GetUpdatedCursorBounds().x()); 1300 render_text->GetUpdatedCursorBounds().x());
1347 1301
1348 // Reset the application default text direction to LTR. 1302 // Reset the application default text direction to LTR.
1349 SetRTL(was_rtl); 1303 SetRTL(was_rtl);
1350 EXPECT_EQ(was_rtl, base::i18n::IsRTL()); 1304 EXPECT_EQ(was_rtl, base::i18n::IsRTL());
1351 } 1305 }
1352 #endif // !defined(OS_MACOSX) 1306 #endif // !defined(OS_MACOSX)
1353 1307
1354 } // namespace gfx 1308 } // namespace gfx
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698