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 // |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 |
OLD | NEW |