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 int num_of_selection_entry, | |
184 bool move_right) { | |
185 for (int i = 0; i <= num_of_selection_entry; ++i) { | |
msw
2011/09/14 02:43:48
num_of_selection_entry is no longer needed, you ca
xji
2011/09/15 23:38:13
Done.
| |
186 int index = std::min(i, num_of_selection_entry - 1); | |
187 SelectionModel sel = expected[index]; | |
188 EXPECT_TRUE(render_text->selection_model().Equals(sel)); | |
189 | |
190 if (move_right) | |
191 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
192 else | |
193 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
194 } | |
195 | |
196 SelectionModel sel = expected[num_of_selection_entry - 1]; | |
msw
2011/09/14 02:43:48
I'm confused why you have this section of code in
xji
2011/09/15 23:38:13
The above loop checks move by character.
This one
msw
2011/09/16 17:39:08
Ah, I missed that, thanks.
| |
197 if (move_right) | |
198 render_text->MoveCursorRight(LINE_BREAK, false); | |
199 else | |
200 render_text->MoveCursorLeft(LINE_BREAK, false); | |
201 EXPECT_TRUE(render_text->selection_model().Equals(sel)); | |
202 } | |
203 | |
204 TEST_F(RenderTextTest, MoveCursorLeftRight) { | |
msw
2011/09/14 02:43:48
You should split this test up for each different t
xji
2011/09/15 23:38:13
Done.
| |
205 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | |
206 | |
207 // Pure LTR. | |
208 render_text->SetText(ASCIIToUTF16("abc")); | |
209 // left_to_right saves the expected SelectionModel when moving cursor | |
msw
2011/09/14 02:43:48
|left_to_right| is now |ltr|.
xji
2011/09/15 23:38:13
Done.
| |
210 // from left to right. | |
211 std::vector<SelectionModel> ltr; | |
212 ltr.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
213 ltr.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | |
214 ltr.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | |
215 ltr.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
msw
2011/09/14 02:43:48
As an example of my above suggestions to check the
xji
2011/09/15 23:38:13
Done.
| |
216 RunMoveCursorLeftRightTest(render_text.get(), ltr, ltr.size(), true); | |
217 | |
218 std::vector<SelectionModel> rtl; | |
219 rtl.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
220 rtl.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | |
221 rtl.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | |
222 rtl.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
msw
2011/09/14 02:43:48
similarly, add an extra (0,0,leading).
xji
2011/09/15 23:38:13
Done.
| |
223 RunMoveCursorLeftRightTest(render_text.get(), rtl, rtl.size(), false); | |
224 | |
225 // Pure RTL. | |
226 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2")); | |
227 rtl.clear(); | |
228 rtl.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
229 rtl.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | |
230 rtl.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | |
231 rtl.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
232 RunMoveCursorLeftRightTest(render_text.get(), rtl, rtl.size(), false); | |
233 | |
234 ltr.clear(); | |
235 ltr.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
236 ltr.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | |
237 ltr.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | |
238 ltr.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
239 RunMoveCursorLeftRightTest(render_text.get(), ltr, ltr.size(), true); | |
240 | |
241 // LTR-RTL | |
242 render_text->SetText(WideToUTF16(L"abc\x05d0\x05d1\x05d2")); | |
243 // The last one is the expected END position. | |
244 rtl.clear(); | |
msw
2011/09/14 02:43:48
This isn't necessarily important, but you flipped
xji
2011/09/15 23:38:13
Done.
| |
245 rtl.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
246 rtl.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | |
247 rtl.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | |
248 rtl.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
249 rtl.push_back(SelectionModel(5, 5, SelectionModel::LEADING)); | |
250 rtl.push_back(SelectionModel(4, 4, SelectionModel::LEADING)); | |
251 rtl.push_back(SelectionModel(3, 3, SelectionModel::LEADING)); | |
252 rtl.push_back(SelectionModel(6, 3, SelectionModel::LEADING)); | |
253 RunMoveCursorLeftRightTest(render_text.get(), rtl, rtl.size(), true); | |
254 | |
255 ltr.clear(); | |
256 ltr.push_back(SelectionModel(6, 3, SelectionModel::LEADING)); | |
257 ltr.push_back(SelectionModel(4, 3, SelectionModel::TRAILING)); | |
258 ltr.push_back(SelectionModel(5, 4, SelectionModel::TRAILING)); | |
259 ltr.push_back(SelectionModel(6, 5, SelectionModel::TRAILING)); | |
260 ltr.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | |
261 ltr.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | |
262 ltr.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
263 RunMoveCursorLeftRightTest(render_text.get(), ltr, ltr.size(), false); | |
264 | |
265 // RTL-LTR | |
266 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2"L"abc")); | |
267 rtl.clear(); | |
268 rtl.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
269 rtl.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | |
270 rtl.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | |
271 rtl.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
272 rtl.push_back(SelectionModel(5, 5, SelectionModel::LEADING)); | |
273 rtl.push_back(SelectionModel(4, 4, SelectionModel::LEADING)); | |
274 rtl.push_back(SelectionModel(3, 3, SelectionModel::LEADING)); | |
275 rtl.push_back(SelectionModel(6, 3, SelectionModel::LEADING)); | |
276 RunMoveCursorLeftRightTest(render_text.get(), rtl, rtl.size(), false); | |
277 | |
278 ltr.clear(); | |
279 ltr.push_back(SelectionModel(6, 3, SelectionModel::LEADING)); | |
280 ltr.push_back(SelectionModel(4, 3, SelectionModel::TRAILING)); | |
281 ltr.push_back(SelectionModel(5, 4, SelectionModel::TRAILING)); | |
282 ltr.push_back(SelectionModel(6, 5, SelectionModel::TRAILING)); | |
283 ltr.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | |
284 ltr.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | |
285 ltr.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
286 RunMoveCursorLeftRightTest(render_text.get(), ltr, ltr.size(), true); | |
287 | |
288 // LTR-RTL-LTR. | |
289 render_text->SetText(WideToUTF16(L"a"L"\x05d1"L"b")); | |
290 ltr.clear(); | |
291 ltr.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
292 ltr.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | |
293 ltr.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | |
294 ltr.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
295 RunMoveCursorLeftRightTest(render_text.get(), ltr, ltr.size(), true); | |
296 | |
297 rtl.clear(); | |
298 rtl.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
299 rtl.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | |
300 rtl.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | |
301 rtl.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
302 RunMoveCursorLeftRightTest(render_text.get(), rtl, rtl.size(), false); | |
303 | |
304 // RTL-LTR-RTL. | |
305 render_text->SetText(WideToUTF16(L"\x05d0"L"a"L"\x05d1")); | |
306 rtl.clear(); | |
307 rtl.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
308 rtl.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | |
309 rtl.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | |
310 rtl.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
311 RunMoveCursorLeftRightTest(render_text.get(), rtl, rtl.size(), false); | |
312 | |
313 ltr.clear(); | |
314 ltr.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
315 ltr.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | |
316 ltr.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | |
317 ltr.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
318 RunMoveCursorLeftRightTest(render_text.get(), ltr, ltr.size(), true); | |
319 } | |
320 | |
321 TEST_F(RenderTextTest, MoveCursorLeftRight_ComplexScript) { | |
322 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | |
323 | |
324 render_text->SetText(WideToUTF16(L"\x0915\x093f\x0915\x094d\x0915")); | |
325 EXPECT_EQ(0U, render_text->GetCursorPosition()); | |
326 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
327 EXPECT_EQ(2U, render_text->GetCursorPosition()); | |
328 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
329 EXPECT_EQ(4U, render_text->GetCursorPosition()); | |
330 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
331 EXPECT_EQ(5U, render_text->GetCursorPosition()); | |
332 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
333 EXPECT_EQ(5U, render_text->GetCursorPosition()); | |
334 | |
335 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
336 EXPECT_EQ(4U, render_text->GetCursorPosition()); | |
337 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
338 EXPECT_EQ(2U, render_text->GetCursorPosition()); | |
339 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
340 EXPECT_EQ(0U, render_text->GetCursorPosition()); | |
341 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
342 EXPECT_EQ(0U, render_text->GetCursorPosition()); | |
343 } | |
344 | |
345 TEST_F(RenderTextTest, MoveCursorLeftRightWithSelection) { | |
346 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | |
347 render_text->SetText(WideToUTF16(L"abc\x05d0\x05d1\x05d2")); | |
348 // Left arrow on select ranging (6, 4). | |
349 render_text->MoveCursorRight(LINE_BREAK, false); | |
350 EXPECT_EQ(6U, render_text->GetCursorPosition()); | |
351 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
352 EXPECT_EQ(4U, render_text->GetCursorPosition()); | |
353 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
354 EXPECT_EQ(5U, render_text->GetCursorPosition()); | |
355 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
356 EXPECT_EQ(6U, render_text->GetCursorPosition()); | |
357 render_text->MoveCursorRight(CHARACTER_BREAK, true); | |
358 EXPECT_EQ(6U, render_text->GetSelectionStart()); | |
359 EXPECT_EQ(5U, render_text->GetCursorPosition()); | |
360 render_text->MoveCursorRight(CHARACTER_BREAK, true); | |
361 EXPECT_EQ(6U, render_text->GetSelectionStart()); | |
362 EXPECT_EQ(4U, render_text->GetCursorPosition()); | |
363 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
364 EXPECT_EQ(6U, render_text->GetCursorPosition()); | |
365 | |
366 // Right arrow on select ranging (4, 6). | |
367 render_text->MoveCursorLeft(LINE_BREAK, false); | |
368 EXPECT_EQ(0U, render_text->GetCursorPosition()); | |
369 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
370 EXPECT_EQ(1U, render_text->GetCursorPosition()); | |
371 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
372 EXPECT_EQ(2U, render_text->GetCursorPosition()); | |
373 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
374 EXPECT_EQ(3U, render_text->GetCursorPosition()); | |
375 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
376 EXPECT_EQ(5U, render_text->GetCursorPosition()); | |
377 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
378 EXPECT_EQ(4U, render_text->GetCursorPosition()); | |
379 render_text->MoveCursorLeft(CHARACTER_BREAK, true); | |
380 EXPECT_EQ(4U, render_text->GetSelectionStart()); | |
381 EXPECT_EQ(5U, render_text->GetCursorPosition()); | |
382 render_text->MoveCursorLeft(CHARACTER_BREAK, true); | |
383 EXPECT_EQ(4U, render_text->GetSelectionStart()); | |
384 EXPECT_EQ(6U, render_text->GetCursorPosition()); | |
385 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
386 EXPECT_EQ(4U, render_text->GetCursorPosition()); | |
387 } | |
388 | |
181 } // namespace gfx | 389 } // namespace gfx |
OLD | NEW |