OLD | NEW |
---|---|
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 // ltr saves the expected SelectionModel when moving cursor from left to | |
msw
2011/09/16 17:39:08
|ltr| doesn't exist anymore. Perhaps just write "S
xji
2011/09/16 20:29:24
Done.
| |
207 // 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 // TODO(xji): temporarily disable in platform Win. | |
msw
2011/09/16 17:39:08
Do you need to disable before landing? Is this TOD
xji
2011/09/16 20:29:24
The TODO is old.
| |
277 TEST_F(RenderTextTest, MoveCursorLeftRightInRtl) { | |
278 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | |
279 // Pure RTL. | |
280 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2")); | |
281 render_text->MoveCursorRight(LINE_BREAK, false); | |
282 std::vector<SelectionModel> expected; | |
283 | |
284 #if defined(OS_LINUX) | |
285 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
286 #else | |
287 expected.push_back(SelectionModel(3, 0, SelectionModel::LEADING)); | |
288 #endif | |
289 expected.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | |
290 expected.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | |
291 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
292 #if defined(OS_LINUX) | |
293 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
294 #else | |
295 expected.push_back(SelectionModel(0, 2, SelectionModel::TRAILING)); | |
296 // TODO(xji): expected (0, 2, TRAILING), actual (3, 0, LEADING). | |
297 // cursor moves from leftmost to rightmost. | |
298 // expected.push_back(SelectionModel(0, 2, SelectionModel::TRAILING)); | |
msw
2011/09/16 17:39:08
Did you mean to leave this commented line of code
xji
2011/09/16 20:29:24
I'd prefer to leave it here.
It's the expected res
| |
299 #endif | |
300 RunMoveCursorLeftRightTest(render_text.get(), expected, false); | |
301 | |
302 expected.clear(); | |
303 | |
304 #if defined(OS_LINUX) | |
305 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
306 #else | |
307 expected.push_back(SelectionModel(0, 2, SelectionModel::TRAILING)); | |
308 #endif | |
309 expected.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | |
310 expected.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | |
311 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
312 #if defined(OS_LINUX) | |
313 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
314 #else | |
315 expected.push_back(SelectionModel(3, 0, SelectionModel::LEADING)); | |
316 expected.push_back(SelectionModel(3, 0, SelectionModel::LEADING)); | |
317 #endif | |
318 RunMoveCursorLeftRightTest(render_text.get(), expected, true); | |
319 } | |
320 | |
321 TEST_F(RenderTextTest, MoveCursorLeftRightInRtlLtr) { | |
322 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | |
323 // RTL-LTR | |
324 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2"L"abc")); | |
325 render_text->MoveCursorRight(LINE_BREAK, false); | |
326 std::vector<SelectionModel> expected; | |
327 #if defined(OS_LINUX) | |
328 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
329 expected.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | |
330 expected.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | |
331 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
332 expected.push_back(SelectionModel(5, 5, SelectionModel::LEADING)); | |
333 expected.push_back(SelectionModel(4, 4, SelectionModel::LEADING)); | |
334 expected.push_back(SelectionModel(3, 3, SelectionModel::LEADING)); | |
335 expected.push_back(SelectionModel(6, 3, SelectionModel::LEADING)); | |
336 expected.push_back(SelectionModel(6, 3, SelectionModel::LEADING)); | |
337 #else | |
338 expected.push_back(SelectionModel(6, 5, SelectionModel::TRAILING)); | |
339 expected.push_back(SelectionModel(5, 5, SelectionModel::LEADING)); | |
340 expected.push_back(SelectionModel(4, 4, SelectionModel::LEADING)); | |
341 expected.push_back(SelectionModel(3, 3, SelectionModel::LEADING)); | |
342 expected.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | |
343 expected.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | |
344 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
345 expected.push_back(SelectionModel(0, 2, SelectionModel::TRAILING)); | |
346 // TODO(xji): expected (0, 2, TRAILING), actual (3, 0, LEADING). | |
347 // cursor moves from leftmost to middle. | |
348 // expected.push_back(SelectionModel(4, 3, SelectionModel::TRAILING)); | |
msw
2011/09/16 17:39:08
4,3,T doesn't match your expected or actual, did y
xji
2011/09/16 20:29:24
You right, should be (0, 2, t)
| |
349 #endif | |
350 | |
351 RunMoveCursorLeftRightTest(render_text.get(), expected, false); | |
352 | |
353 expected.clear(); | |
354 #if defined(OS_LINUX) | |
355 expected.push_back(SelectionModel(6, 3, SelectionModel::LEADING)); | |
356 expected.push_back(SelectionModel(4, 3, SelectionModel::TRAILING)); | |
357 expected.push_back(SelectionModel(5, 4, SelectionModel::TRAILING)); | |
358 expected.push_back(SelectionModel(6, 5, SelectionModel::TRAILING)); | |
359 expected.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | |
360 expected.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | |
361 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
362 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
363 #else | |
364 expected.push_back(SelectionModel(0, 2, SelectionModel::TRAILING)); | |
365 expected.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | |
366 expected.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | |
367 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
368 expected.push_back(SelectionModel(4, 3, SelectionModel::TRAILING)); | |
369 expected.push_back(SelectionModel(5, 4, SelectionModel::TRAILING)); | |
370 expected.push_back(SelectionModel(6, 5, SelectionModel::TRAILING)); | |
371 expected.push_back(SelectionModel(6, 5, SelectionModel::TRAILING)); | |
372 #endif | |
373 RunMoveCursorLeftRightTest(render_text.get(), expected, true); | |
374 } | |
375 | |
376 TEST_F(RenderTextTest, MoveCursorLeftRightInRtlLtrRtl) { | |
377 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | |
378 // RTL-LTR-RTL. | |
379 render_text->SetText(WideToUTF16(L"\x05d0"L"a"L"\x05d1")); | |
380 render_text->MoveCursorRight(LINE_BREAK, false); | |
381 std::vector<SelectionModel> expected; | |
382 #if defined(OS_LINUX) | |
383 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
384 expected.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | |
385 expected.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | |
386 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
387 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
388 #else | |
389 expected.push_back(SelectionModel(3, 2, SelectionModel::LEADING)); | |
390 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
391 expected.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | |
392 expected.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | |
393 expected.push_back(SelectionModel(0, 0, SelectionModel::TRAILING)); | |
394 // TODO(xji): expected (0, 0, TRAILING), actual (2, 1, LEADING). | |
395 // cursor moves from leftmost to middle. | |
396 // expected.push_back(SelectionModel(0, 0, SelectionModel::TRAILING)); | |
397 #endif | |
398 RunMoveCursorLeftRightTest(render_text.get(), expected, false); | |
399 | |
400 expected.clear(); | |
401 #if defined(OS_LINUX) | |
402 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
403 expected.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | |
404 expected.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | |
405 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
406 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
407 #else | |
408 expected.push_back(SelectionModel(0, 0, SelectionModel::TRAILING)); | |
409 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
410 expected.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | |
411 expected.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | |
412 expected.push_back(SelectionModel(3, 2, SelectionModel::LEADING)); | |
413 expected.push_back(SelectionModel(3, 2, SelectionModel::LEADING)); | |
414 #endif | |
415 RunMoveCursorLeftRightTest(render_text.get(), expected, true); | |
416 } | |
417 | |
418 // TODO(xji): temporarily disable in platform Win since the complex script | |
419 // characters turned into empty squre due to font regression. So, not able | |
msw
2011/09/16 17:39:08
"squ*a*re", yeah, we need font fallback.
xji
2011/09/16 20:29:24
Done.
| |
420 // to test 2 characters belong to the same grapheme. | |
421 #if defined(OS_LINUX) | |
422 TEST_F(RenderTextTest, MoveCursorLeftRight_ComplexScript) { | |
423 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | |
424 | |
425 render_text->SetText(WideToUTF16(L"\x0915\x093f\x0915\x094d\x0915")); | |
426 EXPECT_EQ(0U, render_text->GetCursorPosition()); | |
427 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
428 EXPECT_EQ(2U, render_text->GetCursorPosition()); | |
429 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
430 EXPECT_EQ(4U, render_text->GetCursorPosition()); | |
431 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
432 EXPECT_EQ(5U, render_text->GetCursorPosition()); | |
433 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
434 EXPECT_EQ(5U, render_text->GetCursorPosition()); | |
435 | |
436 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
437 EXPECT_EQ(4U, render_text->GetCursorPosition()); | |
438 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
439 EXPECT_EQ(2U, render_text->GetCursorPosition()); | |
440 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
441 EXPECT_EQ(0U, render_text->GetCursorPosition()); | |
442 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
443 EXPECT_EQ(0U, render_text->GetCursorPosition()); | |
444 } | |
445 #endif | |
446 | |
447 TEST_F(RenderTextTest, MoveCursorLeftRightWithSelection) { | |
448 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | |
449 render_text->SetText(WideToUTF16(L"abc\x05d0\x05d1\x05d2")); | |
450 // Left arrow on select ranging (6, 4). | |
451 render_text->MoveCursorRight(LINE_BREAK, false); | |
452 EXPECT_EQ(6U, render_text->GetCursorPosition()); | |
453 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
454 EXPECT_EQ(4U, render_text->GetCursorPosition()); | |
455 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
456 EXPECT_EQ(5U, render_text->GetCursorPosition()); | |
457 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
458 EXPECT_EQ(6U, render_text->GetCursorPosition()); | |
459 render_text->MoveCursorRight(CHARACTER_BREAK, true); | |
460 EXPECT_EQ(6U, render_text->GetSelectionStart()); | |
461 EXPECT_EQ(5U, render_text->GetCursorPosition()); | |
462 render_text->MoveCursorRight(CHARACTER_BREAK, true); | |
463 EXPECT_EQ(6U, render_text->GetSelectionStart()); | |
464 EXPECT_EQ(4U, render_text->GetCursorPosition()); | |
465 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
466 EXPECT_EQ(6U, render_text->GetCursorPosition()); | |
467 | |
468 // Right arrow on select ranging (4, 6). | |
469 render_text->MoveCursorLeft(LINE_BREAK, false); | |
470 EXPECT_EQ(0U, render_text->GetCursorPosition()); | |
471 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
472 EXPECT_EQ(1U, render_text->GetCursorPosition()); | |
473 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
474 EXPECT_EQ(2U, render_text->GetCursorPosition()); | |
475 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
476 EXPECT_EQ(3U, render_text->GetCursorPosition()); | |
477 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
478 EXPECT_EQ(5U, render_text->GetCursorPosition()); | |
479 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
480 EXPECT_EQ(4U, render_text->GetCursorPosition()); | |
481 render_text->MoveCursorLeft(CHARACTER_BREAK, true); | |
482 EXPECT_EQ(4U, render_text->GetSelectionStart()); | |
483 EXPECT_EQ(5U, render_text->GetCursorPosition()); | |
484 render_text->MoveCursorLeft(CHARACTER_BREAK, true); | |
485 EXPECT_EQ(4U, render_text->GetSelectionStart()); | |
486 EXPECT_EQ(6U, render_text->GetCursorPosition()); | |
487 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
488 EXPECT_EQ(4U, render_text->GetCursorPosition()); | |
489 } | |
490 | |
181 } // namespace gfx | 491 } // namespace gfx |
OLD | NEW |