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

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

Issue 7841056: fix know issues in RenderText (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: fix a capitalization in break_iterator.h Created 9 years, 3 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
« no previous file with comments | « ui/gfx/render_text_linux.cc ('k') | ui/gfx/render_text_win.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 (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 10
11 namespace gfx { 11 namespace gfx {
12 12
13 class RenderTextTest : public testing::Test { 13 class RenderTextTest : public testing::Test {
14 }; 14 };
15 15
16 TEST_F(RenderTextTest, DefaultStyle) { 16 TEST_F(RenderTextTest, DefaultStyle) {
17 // Defaults to empty text with no styles. 17 // Defaults to empty text with no styles.
18 scoped_ptr<gfx::RenderText> render_text(gfx::RenderText::CreateRenderText()); 18 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText());
19 EXPECT_TRUE(render_text->text().empty()); 19 EXPECT_TRUE(render_text->text().empty());
20 EXPECT_TRUE(render_text->style_ranges().empty()); 20 EXPECT_TRUE(render_text->style_ranges().empty());
21 21
22 // Test that the built-in default style is applied for new text. 22 // Test that the built-in default style is applied for new text.
23 render_text->SetText(ASCIIToUTF16("abc")); 23 render_text->SetText(ASCIIToUTF16("abc"));
24 EXPECT_EQ(1U, render_text->style_ranges().size()); 24 EXPECT_EQ(1U, render_text->style_ranges().size());
25 gfx::StyleRange style; 25 StyleRange style;
26 EXPECT_EQ(style.font.GetFontName(), 26 EXPECT_EQ(style.font.GetFontName(),
27 render_text->style_ranges()[0].font.GetFontName()); 27 render_text->style_ranges()[0].font.GetFontName());
28 EXPECT_EQ(style.foreground, render_text->style_ranges()[0].foreground); 28 EXPECT_EQ(style.foreground, render_text->style_ranges()[0].foreground);
29 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range); 29 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range);
30 EXPECT_EQ(style.strike, render_text->style_ranges()[0].strike); 30 EXPECT_EQ(style.strike, render_text->style_ranges()[0].strike);
31 EXPECT_EQ(style.underline, render_text->style_ranges()[0].underline); 31 EXPECT_EQ(style.underline, render_text->style_ranges()[0].underline);
32 32
33 // Test that clearing the text also clears the styles. 33 // Test that clearing the text also clears the styles.
34 render_text->SetText(string16()); 34 render_text->SetText(string16());
35 EXPECT_TRUE(render_text->text().empty()); 35 EXPECT_TRUE(render_text->text().empty());
36 EXPECT_TRUE(render_text->style_ranges().empty()); 36 EXPECT_TRUE(render_text->style_ranges().empty());
37 } 37 }
38 38
39 TEST_F(RenderTextTest, CustomDefaultStyle) { 39 TEST_F(RenderTextTest, CustomDefaultStyle) {
40 // Test a custom default style. 40 // Test a custom default style.
41 scoped_ptr<gfx::RenderText> render_text(gfx::RenderText::CreateRenderText()); 41 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText());
42 gfx::StyleRange color; 42 StyleRange color;
43 color.foreground = SK_ColorRED; 43 color.foreground = SK_ColorRED;
44 render_text->set_default_style(color); 44 render_text->set_default_style(color);
45 render_text->SetText(ASCIIToUTF16("abc")); 45 render_text->SetText(ASCIIToUTF16("abc"));
46 EXPECT_EQ(1U, render_text->style_ranges().size()); 46 EXPECT_EQ(1U, render_text->style_ranges().size());
47 EXPECT_EQ(color.foreground, render_text->style_ranges()[0].foreground); 47 EXPECT_EQ(color.foreground, render_text->style_ranges()[0].foreground);
48 48
49 // Test that the custom default style persists across clearing text. 49 // Test that the custom default style persists across clearing text.
50 render_text->SetText(string16()); 50 render_text->SetText(string16());
51 EXPECT_TRUE(render_text->style_ranges().empty()); 51 EXPECT_TRUE(render_text->style_ranges().empty());
52 render_text->SetText(ASCIIToUTF16("abc")); 52 render_text->SetText(ASCIIToUTF16("abc"));
53 EXPECT_EQ(1U, render_text->style_ranges().size()); 53 EXPECT_EQ(1U, render_text->style_ranges().size());
54 EXPECT_EQ(color.foreground, render_text->style_ranges()[0].foreground); 54 EXPECT_EQ(color.foreground, render_text->style_ranges()[0].foreground);
55 55
56 // Test ApplyDefaultStyle after setting a new default. 56 // Test ApplyDefaultStyle after setting a new default.
57 gfx::StyleRange strike; 57 StyleRange strike;
58 strike.strike = true; 58 strike.strike = true;
59 render_text->set_default_style(strike); 59 render_text->set_default_style(strike);
60 render_text->ApplyDefaultStyle(); 60 render_text->ApplyDefaultStyle();
61 EXPECT_EQ(1U, render_text->style_ranges().size()); 61 EXPECT_EQ(1U, render_text->style_ranges().size());
62 EXPECT_EQ(true, render_text->style_ranges()[0].strike); 62 EXPECT_EQ(true, render_text->style_ranges()[0].strike);
63 EXPECT_EQ(strike.foreground, render_text->style_ranges()[0].foreground); 63 EXPECT_EQ(strike.foreground, render_text->style_ranges()[0].foreground);
64 } 64 }
65 65
66 TEST_F(RenderTextTest, ApplyStyleRange) { 66 TEST_F(RenderTextTest, ApplyStyleRange) {
67 scoped_ptr<gfx::RenderText> render_text(gfx::RenderText::CreateRenderText()); 67 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText());
68 render_text->SetText(ASCIIToUTF16("01234")); 68 render_text->SetText(ASCIIToUTF16("01234"));
69 EXPECT_EQ(1U, render_text->style_ranges().size()); 69 EXPECT_EQ(1U, render_text->style_ranges().size());
70 70
71 // Test ApplyStyleRange (no-op on empty range). 71 // Test ApplyStyleRange (no-op on empty range).
72 gfx::StyleRange empty; 72 StyleRange empty;
73 empty.range = ui::Range(1, 1); 73 empty.range = ui::Range(1, 1);
74 render_text->ApplyStyleRange(empty); 74 render_text->ApplyStyleRange(empty);
75 EXPECT_EQ(1U, render_text->style_ranges().size()); 75 EXPECT_EQ(1U, render_text->style_ranges().size());
76 76
77 // Test ApplyStyleRange (no-op on invalid range). 77 // Test ApplyStyleRange (no-op on invalid range).
78 gfx::StyleRange invalid; 78 StyleRange invalid;
79 invalid.range = ui::Range::InvalidRange(); 79 invalid.range = ui::Range::InvalidRange();
80 render_text->ApplyStyleRange(invalid); 80 render_text->ApplyStyleRange(invalid);
81 EXPECT_EQ(1U, render_text->style_ranges().size()); 81 EXPECT_EQ(1U, render_text->style_ranges().size());
82 82
83 // Apply a style with a range contained by an existing range. 83 // Apply a style with a range contained by an existing range.
84 gfx::StyleRange underline; 84 StyleRange underline;
85 underline.underline = true; 85 underline.underline = true;
86 underline.range = ui::Range(2, 3); 86 underline.range = ui::Range(2, 3);
87 render_text->ApplyStyleRange(underline); 87 render_text->ApplyStyleRange(underline);
88 EXPECT_EQ(3U, render_text->style_ranges().size()); 88 EXPECT_EQ(3U, render_text->style_ranges().size());
89 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); 89 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range);
90 EXPECT_FALSE(render_text->style_ranges()[0].underline); 90 EXPECT_FALSE(render_text->style_ranges()[0].underline);
91 EXPECT_EQ(ui::Range(2, 3), render_text->style_ranges()[1].range); 91 EXPECT_EQ(ui::Range(2, 3), render_text->style_ranges()[1].range);
92 EXPECT_TRUE(render_text->style_ranges()[1].underline); 92 EXPECT_TRUE(render_text->style_ranges()[1].underline);
93 EXPECT_EQ(ui::Range(3, 5), render_text->style_ranges()[2].range); 93 EXPECT_EQ(ui::Range(3, 5), render_text->style_ranges()[2].range);
94 EXPECT_FALSE(render_text->style_ranges()[2].underline); 94 EXPECT_FALSE(render_text->style_ranges()[2].underline);
95 95
96 // Apply a style with a range equal to another range. 96 // Apply a style with a range equal to another range.
97 gfx::StyleRange color; 97 StyleRange color;
98 color.foreground = SK_ColorWHITE; 98 color.foreground = SK_ColorWHITE;
99 color.range = ui::Range(2, 3); 99 color.range = ui::Range(2, 3);
100 render_text->ApplyStyleRange(color); 100 render_text->ApplyStyleRange(color);
101 EXPECT_EQ(3U, render_text->style_ranges().size()); 101 EXPECT_EQ(3U, render_text->style_ranges().size());
102 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); 102 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range);
103 EXPECT_NE(SK_ColorWHITE, render_text->style_ranges()[0].foreground); 103 EXPECT_NE(SK_ColorWHITE, render_text->style_ranges()[0].foreground);
104 EXPECT_FALSE(render_text->style_ranges()[0].underline); 104 EXPECT_FALSE(render_text->style_ranges()[0].underline);
105 EXPECT_EQ(ui::Range(2, 3), render_text->style_ranges()[1].range); 105 EXPECT_EQ(ui::Range(2, 3), render_text->style_ranges()[1].range);
106 EXPECT_EQ(SK_ColorWHITE, render_text->style_ranges()[1].foreground); 106 EXPECT_EQ(SK_ColorWHITE, render_text->style_ranges()[1].foreground);
107 EXPECT_FALSE(render_text->style_ranges()[1].underline); 107 EXPECT_FALSE(render_text->style_ranges()[1].underline);
108 EXPECT_EQ(ui::Range(3, 5), render_text->style_ranges()[2].range); 108 EXPECT_EQ(ui::Range(3, 5), render_text->style_ranges()[2].range);
109 EXPECT_NE(SK_ColorWHITE, render_text->style_ranges()[2].foreground); 109 EXPECT_NE(SK_ColorWHITE, render_text->style_ranges()[2].foreground);
110 EXPECT_FALSE(render_text->style_ranges()[2].underline); 110 EXPECT_FALSE(render_text->style_ranges()[2].underline);
111 111
112 // Apply a style with a range containing an existing range. 112 // Apply a style with a range containing an existing range.
113 // This new style also overlaps portions of neighboring ranges. 113 // This new style also overlaps portions of neighboring ranges.
114 gfx::StyleRange strike; 114 StyleRange strike;
115 strike.strike = true; 115 strike.strike = true;
116 strike.range = ui::Range(1, 4); 116 strike.range = ui::Range(1, 4);
117 render_text->ApplyStyleRange(strike); 117 render_text->ApplyStyleRange(strike);
118 EXPECT_EQ(3U, render_text->style_ranges().size()); 118 EXPECT_EQ(3U, render_text->style_ranges().size());
119 EXPECT_EQ(ui::Range(0, 1), render_text->style_ranges()[0].range); 119 EXPECT_EQ(ui::Range(0, 1), render_text->style_ranges()[0].range);
120 EXPECT_FALSE(render_text->style_ranges()[0].strike); 120 EXPECT_FALSE(render_text->style_ranges()[0].strike);
121 EXPECT_EQ(ui::Range(1, 4), render_text->style_ranges()[1].range); 121 EXPECT_EQ(ui::Range(1, 4), render_text->style_ranges()[1].range);
122 EXPECT_TRUE(render_text->style_ranges()[1].strike); 122 EXPECT_TRUE(render_text->style_ranges()[1].strike);
123 EXPECT_EQ(ui::Range(4, 5), render_text->style_ranges()[2].range); 123 EXPECT_EQ(ui::Range(4, 5), render_text->style_ranges()[2].range);
124 EXPECT_FALSE(render_text->style_ranges()[2].strike); 124 EXPECT_FALSE(render_text->style_ranges()[2].strike);
125 125
126 // Apply a style overlapping all ranges. 126 // Apply a style overlapping all ranges.
127 gfx::StyleRange strike_underline; 127 StyleRange strike_underline;
128 strike_underline.strike = true; 128 strike_underline.strike = true;
129 strike_underline.underline = true; 129 strike_underline.underline = true;
130 strike_underline.range = ui::Range(0, render_text->text().length()); 130 strike_underline.range = ui::Range(0, render_text->text().length());
131 render_text->ApplyStyleRange(strike_underline); 131 render_text->ApplyStyleRange(strike_underline);
132 EXPECT_EQ(1U, render_text->style_ranges().size()); 132 EXPECT_EQ(1U, render_text->style_ranges().size());
133 EXPECT_EQ(ui::Range(0, 5), render_text->style_ranges()[0].range); 133 EXPECT_EQ(ui::Range(0, 5), render_text->style_ranges()[0].range);
134 EXPECT_TRUE(render_text->style_ranges()[0].underline); 134 EXPECT_TRUE(render_text->style_ranges()[0].underline);
135 EXPECT_TRUE(render_text->style_ranges()[0].strike); 135 EXPECT_TRUE(render_text->style_ranges()[0].strike);
136 136
137 // Apply the default style. 137 // Apply the default style.
138 render_text->ApplyDefaultStyle(); 138 render_text->ApplyDefaultStyle();
139 EXPECT_EQ(1U, render_text->style_ranges().size()); 139 EXPECT_EQ(1U, render_text->style_ranges().size());
140 EXPECT_EQ(ui::Range(0, 5), render_text->style_ranges()[0].range); 140 EXPECT_EQ(ui::Range(0, 5), render_text->style_ranges()[0].range);
141 EXPECT_FALSE(render_text->style_ranges()[0].underline); 141 EXPECT_FALSE(render_text->style_ranges()[0].underline);
142 EXPECT_FALSE(render_text->style_ranges()[0].strike); 142 EXPECT_FALSE(render_text->style_ranges()[0].strike);
143 } 143 }
144 144
145 TEST_F(RenderTextTest, StyleRangesAdjust) { 145 TEST_F(RenderTextTest, StyleRangesAdjust) {
146 // Test that style ranges adjust to the text size. 146 // Test that style ranges adjust to the text size.
147 scoped_ptr<gfx::RenderText> render_text(gfx::RenderText::CreateRenderText()); 147 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText());
148 render_text->SetText(ASCIIToUTF16("abcdef")); 148 render_text->SetText(ASCIIToUTF16("abcdef"));
149 EXPECT_EQ(1U, render_text->style_ranges().size()); 149 EXPECT_EQ(1U, render_text->style_ranges().size());
150 EXPECT_EQ(ui::Range(0, 6), render_text->style_ranges()[0].range); 150 EXPECT_EQ(ui::Range(0, 6), render_text->style_ranges()[0].range);
151 151
152 // Test that the range is clipped to the length of shorter text. 152 // Test that the range is clipped to the length of shorter text.
153 render_text->SetText(ASCIIToUTF16("abc")); 153 render_text->SetText(ASCIIToUTF16("abc"));
154 EXPECT_EQ(1U, render_text->style_ranges().size()); 154 EXPECT_EQ(1U, render_text->style_ranges().size());
155 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range); 155 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range);
156 156
157 // Test that the last range extends to the length of longer text. 157 // Test that the last range extends to the length of longer text.
158 gfx::StyleRange strike; 158 StyleRange strike;
159 strike.strike = true; 159 strike.strike = true;
160 strike.range = ui::Range(2, 3); 160 strike.range = ui::Range(2, 3);
161 render_text->ApplyStyleRange(strike); 161 render_text->ApplyStyleRange(strike);
162 render_text->SetText(ASCIIToUTF16("abcdefghi")); 162 render_text->SetText(ASCIIToUTF16("abcdefghi"));
163 EXPECT_EQ(2U, render_text->style_ranges().size()); 163 EXPECT_EQ(2U, render_text->style_ranges().size());
164 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); 164 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range);
165 EXPECT_EQ(ui::Range(2, 9), render_text->style_ranges()[1].range); 165 EXPECT_EQ(ui::Range(2, 9), render_text->style_ranges()[1].range);
166 EXPECT_TRUE(render_text->style_ranges()[1].strike); 166 EXPECT_TRUE(render_text->style_ranges()[1].strike);
167 167
168 // Test that ranges are removed if they're outside the range of shorter text. 168 // Test that ranges are removed if they're outside the range of shorter text.
169 render_text->SetText(ASCIIToUTF16("ab")); 169 render_text->SetText(ASCIIToUTF16("ab"));
170 EXPECT_EQ(1U, render_text->style_ranges().size()); 170 EXPECT_EQ(1U, render_text->style_ranges().size());
171 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); 171 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range);
172 EXPECT_FALSE(render_text->style_ranges()[0].strike); 172 EXPECT_FALSE(render_text->style_ranges()[0].strike);
173 173
174 // Test that previously removed ranges don't return. 174 // Test that previously removed ranges don't return.
175 render_text->SetText(ASCIIToUTF16("abcdef")); 175 render_text->SetText(ASCIIToUTF16("abcdef"));
176 EXPECT_EQ(1U, render_text->style_ranges().size()); 176 EXPECT_EQ(1U, render_text->style_ranges().size());
177 EXPECT_EQ(ui::Range(0, 6), render_text->style_ranges()[0].range); 177 EXPECT_EQ(ui::Range(0, 6), render_text->style_ranges()[0].range);
178 EXPECT_FALSE(render_text->style_ranges()[0].strike); 178 EXPECT_FALSE(render_text->style_ranges()[0].strike);
179 } 179 }
180 180
181 void RunMoveCursorLeftRightTest(RenderText* render_text,
182 const std::vector<SelectionModel>& expected,
183 bool move_right) {
184 for (int i = 0; i < static_cast<int>(expected.size()); ++i) {
185 SelectionModel sel = expected[i];
186 EXPECT_TRUE(render_text->selection_model().Equals(sel));
187 if (move_right)
188 render_text->MoveCursorRight(CHARACTER_BREAK, false);
189 else
190 render_text->MoveCursorLeft(CHARACTER_BREAK, false);
191 }
192
193 SelectionModel sel = expected[expected.size() - 1];
194 if (move_right)
195 render_text->MoveCursorRight(LINE_BREAK, false);
196 else
197 render_text->MoveCursorLeft(LINE_BREAK, false);
198 EXPECT_TRUE(render_text->selection_model().Equals(sel));
199 }
200
201 TEST_F(RenderTextTest, MoveCursorLeftRightInLtr) {
202 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText());
203
204 // Pure LTR.
205 render_text->SetText(ASCIIToUTF16("abc"));
206 // |expected| saves the expected SelectionModel when moving cursor from left
207 // to right.
208 std::vector<SelectionModel> expected;
209 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING));
210 expected.push_back(SelectionModel(1, 0, SelectionModel::TRAILING));
211 expected.push_back(SelectionModel(2, 1, SelectionModel::TRAILING));
212 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING));
213 // The last element is to test the clamped line ends.
214 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING));
215 RunMoveCursorLeftRightTest(render_text.get(), expected, true);
216
217 expected.clear();
218 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING));
219 expected.push_back(SelectionModel(2, 2, SelectionModel::LEADING));
220 expected.push_back(SelectionModel(1, 1, SelectionModel::LEADING));
221 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING));
222 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING));
223 RunMoveCursorLeftRightTest(render_text.get(), expected, false);
224 }
225
226 TEST_F(RenderTextTest, MoveCursorLeftRightInLtrRtl) {
227 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText());
228 // LTR-RTL
229 render_text->SetText(WideToUTF16(L"abc\x05d0\x05d1\x05d2"));
230 // The last one is the expected END position.
231 std::vector<SelectionModel> expected;
232 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING));
233 expected.push_back(SelectionModel(1, 0, SelectionModel::TRAILING));
234 expected.push_back(SelectionModel(2, 1, SelectionModel::TRAILING));
235 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING));
236 expected.push_back(SelectionModel(5, 5, SelectionModel::LEADING));
237 expected.push_back(SelectionModel(4, 4, SelectionModel::LEADING));
238 expected.push_back(SelectionModel(3, 3, SelectionModel::LEADING));
239 expected.push_back(SelectionModel(6, 3, SelectionModel::LEADING));
240 expected.push_back(SelectionModel(6, 3, SelectionModel::LEADING));
241 RunMoveCursorLeftRightTest(render_text.get(), expected, true);
242
243 expected.clear();
244 expected.push_back(SelectionModel(6, 3, SelectionModel::LEADING));
245 expected.push_back(SelectionModel(4, 3, SelectionModel::TRAILING));
246 expected.push_back(SelectionModel(5, 4, SelectionModel::TRAILING));
247 expected.push_back(SelectionModel(6, 5, SelectionModel::TRAILING));
248 expected.push_back(SelectionModel(2, 2, SelectionModel::LEADING));
249 expected.push_back(SelectionModel(1, 1, SelectionModel::LEADING));
250 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING));
251 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING));
252 RunMoveCursorLeftRightTest(render_text.get(), expected, false);
253 }
254
255 TEST_F(RenderTextTest, MoveCursorLeftRightInLtrRtlLtr) {
256 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText());
257 // LTR-RTL-LTR.
258 render_text->SetText(WideToUTF16(L"a"L"\x05d1"L"b"));
259 std::vector<SelectionModel> expected;
260 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING));
261 expected.push_back(SelectionModel(1, 0, SelectionModel::TRAILING));
262 expected.push_back(SelectionModel(1, 1, SelectionModel::LEADING));
263 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING));
264 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING));
265 RunMoveCursorLeftRightTest(render_text.get(), expected, true);
266
267 expected.clear();
268 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING));
269 expected.push_back(SelectionModel(2, 2, SelectionModel::LEADING));
270 expected.push_back(SelectionModel(2, 1, SelectionModel::TRAILING));
271 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING));
272 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING));
273 RunMoveCursorLeftRightTest(render_text.get(), expected, false);
274 }
275
276 TEST_F(RenderTextTest, MoveCursorLeftRightInRtl) {
277 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText());
278 // Pure RTL.
279 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2"));
280 render_text->MoveCursorRight(LINE_BREAK, false);
281 std::vector<SelectionModel> expected;
282
283 #if defined(OS_LINUX)
284 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING));
285 #else
286 expected.push_back(SelectionModel(3, 0, SelectionModel::LEADING));
287 #endif
288 expected.push_back(SelectionModel(1, 0, SelectionModel::TRAILING));
289 expected.push_back(SelectionModel(2, 1, SelectionModel::TRAILING));
290 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING));
291 #if defined(OS_LINUX)
292 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING));
293 #else
294 expected.push_back(SelectionModel(0, 2, SelectionModel::TRAILING));
295 // TODO(xji): expected (0, 2, TRAILING), actual (3, 0, LEADING).
296 // cursor moves from leftmost to rightmost.
297 // expected.push_back(SelectionModel(0, 2, SelectionModel::TRAILING));
298 #endif
299 RunMoveCursorLeftRightTest(render_text.get(), expected, false);
300
301 expected.clear();
302
303 #if defined(OS_LINUX)
304 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING));
305 #else
306 expected.push_back(SelectionModel(0, 2, SelectionModel::TRAILING));
307 #endif
308 expected.push_back(SelectionModel(2, 2, SelectionModel::LEADING));
309 expected.push_back(SelectionModel(1, 1, SelectionModel::LEADING));
310 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING));
311 #if defined(OS_LINUX)
312 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING));
313 #else
314 expected.push_back(SelectionModel(3, 0, SelectionModel::LEADING));
315 expected.push_back(SelectionModel(3, 0, SelectionModel::LEADING));
316 #endif
317 RunMoveCursorLeftRightTest(render_text.get(), expected, true);
318 }
319
320 TEST_F(RenderTextTest, MoveCursorLeftRightInRtlLtr) {
321 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText());
322 // RTL-LTR
323 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2"L"abc"));
324 render_text->MoveCursorRight(LINE_BREAK, false);
325 std::vector<SelectionModel> expected;
326 #if defined(OS_LINUX)
327 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING));
328 expected.push_back(SelectionModel(1, 0, SelectionModel::TRAILING));
329 expected.push_back(SelectionModel(2, 1, SelectionModel::TRAILING));
330 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING));
331 expected.push_back(SelectionModel(5, 5, SelectionModel::LEADING));
332 expected.push_back(SelectionModel(4, 4, SelectionModel::LEADING));
333 expected.push_back(SelectionModel(3, 3, SelectionModel::LEADING));
334 expected.push_back(SelectionModel(6, 3, SelectionModel::LEADING));
335 expected.push_back(SelectionModel(6, 3, SelectionModel::LEADING));
336 #else
337 expected.push_back(SelectionModel(6, 5, SelectionModel::TRAILING));
338 expected.push_back(SelectionModel(5, 5, SelectionModel::LEADING));
339 expected.push_back(SelectionModel(4, 4, SelectionModel::LEADING));
340 expected.push_back(SelectionModel(3, 3, SelectionModel::LEADING));
341 expected.push_back(SelectionModel(1, 0, SelectionModel::TRAILING));
342 expected.push_back(SelectionModel(2, 1, SelectionModel::TRAILING));
343 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING));
344 expected.push_back(SelectionModel(0, 2, SelectionModel::TRAILING));
345 // TODO(xji): expected (0, 2, TRAILING), actual (3, 0, LEADING).
346 // cursor moves from leftmost to middle.
347 // expected.push_back(SelectionModel(0, 2, SelectionModel::TRAILING));
348 #endif
349
350 RunMoveCursorLeftRightTest(render_text.get(), expected, false);
351
352 expected.clear();
353 #if defined(OS_LINUX)
354 expected.push_back(SelectionModel(6, 3, SelectionModel::LEADING));
355 expected.push_back(SelectionModel(4, 3, SelectionModel::TRAILING));
356 expected.push_back(SelectionModel(5, 4, SelectionModel::TRAILING));
357 expected.push_back(SelectionModel(6, 5, SelectionModel::TRAILING));
358 expected.push_back(SelectionModel(2, 2, SelectionModel::LEADING));
359 expected.push_back(SelectionModel(1, 1, SelectionModel::LEADING));
360 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING));
361 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING));
362 #else
363 expected.push_back(SelectionModel(0, 2, SelectionModel::TRAILING));
364 expected.push_back(SelectionModel(2, 2, SelectionModel::LEADING));
365 expected.push_back(SelectionModel(1, 1, SelectionModel::LEADING));
366 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING));
367 expected.push_back(SelectionModel(4, 3, SelectionModel::TRAILING));
368 expected.push_back(SelectionModel(5, 4, SelectionModel::TRAILING));
369 expected.push_back(SelectionModel(6, 5, SelectionModel::TRAILING));
370 expected.push_back(SelectionModel(6, 5, SelectionModel::TRAILING));
371 #endif
372 RunMoveCursorLeftRightTest(render_text.get(), expected, true);
373 }
374
375 TEST_F(RenderTextTest, MoveCursorLeftRightInRtlLtrRtl) {
376 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText());
377 // RTL-LTR-RTL.
378 render_text->SetText(WideToUTF16(L"\x05d0"L"a"L"\x05d1"));
379 render_text->MoveCursorRight(LINE_BREAK, false);
380 std::vector<SelectionModel> expected;
381 #if defined(OS_LINUX)
382 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING));
383 expected.push_back(SelectionModel(1, 0, SelectionModel::TRAILING));
384 expected.push_back(SelectionModel(1, 1, SelectionModel::LEADING));
385 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING));
386 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING));
387 #else
388 expected.push_back(SelectionModel(3, 2, SelectionModel::LEADING));
389 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING));
390 expected.push_back(SelectionModel(1, 1, SelectionModel::LEADING));
391 expected.push_back(SelectionModel(1, 0, SelectionModel::TRAILING));
392 expected.push_back(SelectionModel(0, 0, SelectionModel::TRAILING));
393 // TODO(xji): expected (0, 0, TRAILING), actual (2, 1, LEADING).
394 // cursor moves from leftmost to middle.
395 // expected.push_back(SelectionModel(0, 0, SelectionModel::TRAILING));
396 #endif
397 RunMoveCursorLeftRightTest(render_text.get(), expected, false);
398
399 expected.clear();
400 #if defined(OS_LINUX)
401 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING));
402 expected.push_back(SelectionModel(2, 2, SelectionModel::LEADING));
403 expected.push_back(SelectionModel(2, 1, SelectionModel::TRAILING));
404 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING));
405 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING));
406 #else
407 expected.push_back(SelectionModel(0, 0, SelectionModel::TRAILING));
408 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING));
409 expected.push_back(SelectionModel(2, 1, SelectionModel::TRAILING));
410 expected.push_back(SelectionModel(2, 2, SelectionModel::LEADING));
411 expected.push_back(SelectionModel(3, 2, SelectionModel::LEADING));
412 expected.push_back(SelectionModel(3, 2, SelectionModel::LEADING));
413 #endif
414 RunMoveCursorLeftRightTest(render_text.get(), expected, true);
415 }
416
417 // TODO(xji): temporarily disable in platform Win since the complex script
418 // characters turned into empty square due to font regression. So, not able
419 // to test 2 characters belong to the same grapheme.
420 #if defined(OS_LINUX)
421 TEST_F(RenderTextTest, MoveCursorLeftRight_ComplexScript) {
422 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText());
423
424 render_text->SetText(WideToUTF16(L"\x0915\x093f\x0915\x094d\x0915"));
425 EXPECT_EQ(0U, render_text->GetCursorPosition());
426 render_text->MoveCursorRight(CHARACTER_BREAK, false);
427 EXPECT_EQ(2U, render_text->GetCursorPosition());
428 render_text->MoveCursorRight(CHARACTER_BREAK, false);
429 EXPECT_EQ(4U, render_text->GetCursorPosition());
430 render_text->MoveCursorRight(CHARACTER_BREAK, false);
431 EXPECT_EQ(5U, render_text->GetCursorPosition());
432 render_text->MoveCursorRight(CHARACTER_BREAK, false);
433 EXPECT_EQ(5U, render_text->GetCursorPosition());
434
435 render_text->MoveCursorLeft(CHARACTER_BREAK, false);
436 EXPECT_EQ(4U, render_text->GetCursorPosition());
437 render_text->MoveCursorLeft(CHARACTER_BREAK, false);
438 EXPECT_EQ(2U, render_text->GetCursorPosition());
439 render_text->MoveCursorLeft(CHARACTER_BREAK, false);
440 EXPECT_EQ(0U, render_text->GetCursorPosition());
441 render_text->MoveCursorLeft(CHARACTER_BREAK, false);
442 EXPECT_EQ(0U, render_text->GetCursorPosition());
443 }
444 #endif
445
446 TEST_F(RenderTextTest, MoveCursorLeftRightWithSelection) {
447 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText());
448 render_text->SetText(WideToUTF16(L"abc\x05d0\x05d1\x05d2"));
449 // Left arrow on select ranging (6, 4).
450 render_text->MoveCursorRight(LINE_BREAK, false);
451 EXPECT_EQ(6U, render_text->GetCursorPosition());
452 render_text->MoveCursorLeft(CHARACTER_BREAK, false);
453 EXPECT_EQ(4U, render_text->GetCursorPosition());
454 render_text->MoveCursorLeft(CHARACTER_BREAK, false);
455 EXPECT_EQ(5U, render_text->GetCursorPosition());
456 render_text->MoveCursorLeft(CHARACTER_BREAK, false);
457 EXPECT_EQ(6U, render_text->GetCursorPosition());
458 render_text->MoveCursorRight(CHARACTER_BREAK, true);
459 EXPECT_EQ(6U, render_text->GetSelectionStart());
460 EXPECT_EQ(5U, render_text->GetCursorPosition());
461 render_text->MoveCursorRight(CHARACTER_BREAK, true);
462 EXPECT_EQ(6U, render_text->GetSelectionStart());
463 EXPECT_EQ(4U, render_text->GetCursorPosition());
464 render_text->MoveCursorLeft(CHARACTER_BREAK, false);
465 EXPECT_EQ(6U, render_text->GetCursorPosition());
466
467 // Right arrow on select ranging (4, 6).
468 render_text->MoveCursorLeft(LINE_BREAK, false);
469 EXPECT_EQ(0U, render_text->GetCursorPosition());
470 render_text->MoveCursorRight(CHARACTER_BREAK, false);
471 EXPECT_EQ(1U, render_text->GetCursorPosition());
472 render_text->MoveCursorRight(CHARACTER_BREAK, false);
473 EXPECT_EQ(2U, render_text->GetCursorPosition());
474 render_text->MoveCursorRight(CHARACTER_BREAK, false);
475 EXPECT_EQ(3U, render_text->GetCursorPosition());
476 render_text->MoveCursorRight(CHARACTER_BREAK, false);
477 EXPECT_EQ(5U, render_text->GetCursorPosition());
478 render_text->MoveCursorRight(CHARACTER_BREAK, false);
479 EXPECT_EQ(4U, render_text->GetCursorPosition());
480 render_text->MoveCursorLeft(CHARACTER_BREAK, true);
481 EXPECT_EQ(4U, render_text->GetSelectionStart());
482 EXPECT_EQ(5U, render_text->GetCursorPosition());
483 render_text->MoveCursorLeft(CHARACTER_BREAK, true);
484 EXPECT_EQ(4U, render_text->GetSelectionStart());
485 EXPECT_EQ(6U, render_text->GetCursorPosition());
486 render_text->MoveCursorRight(CHARACTER_BREAK, false);
487 EXPECT_EQ(4U, render_text->GetCursorPosition());
488 }
489
181 } // namespace gfx 490 } // namespace gfx
OLDNEW
« no previous file with comments | « ui/gfx/render_text_linux.cc ('k') | ui/gfx/render_text_win.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698