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 <vector> | |
6 | |
5 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
6 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
7 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
8 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
9 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
10 #include "ui/base/clipboard/clipboard.h" | 12 #include "ui/base/clipboard/clipboard.h" |
11 #include "ui/base/clipboard/scoped_clipboard_writer.h" | 13 #include "ui/base/clipboard/scoped_clipboard_writer.h" |
12 #include "ui/base/range/range.h" | 14 #include "ui/base/range/range.h" |
13 #include "ui/gfx/render_text.h" | 15 #include "ui/gfx/render_text.h" |
14 #include "views/controls/textfield/textfield.h" | 16 #include "views/controls/textfield/textfield.h" |
15 #include "views/controls/textfield/textfield_views_model.h" | 17 #include "views/controls/textfield/textfield_views_model.h" |
16 #include "views/test/test_views_delegate.h" | 18 #include "views/test/test_views_delegate.h" |
17 #include "views/test/views_test_base.h" | 19 #include "views/test/views_test_base.h" |
18 #include "views/views_delegate.h" | 20 #include "views/views_delegate.h" |
19 | 21 |
22 namespace { | |
23 | |
24 struct WordAndCursor { | |
25 WordAndCursor(const wchar_t* w, size_t c) | |
26 : word(w), | |
27 cursor(c) { | |
28 } | |
msw
2011/09/16 17:39:08
Add a blank line between ctor and members.
xji
2011/09/16 20:29:24
Done.
| |
29 const wchar_t* word; | |
30 size_t cursor; | |
31 }; | |
32 | |
33 } // namespace | |
34 | |
20 namespace views { | 35 namespace views { |
21 | 36 |
22 class TextfieldViewsModelTest : public ViewsTestBase, | 37 class TextfieldViewsModelTest : public ViewsTestBase, |
23 public TextfieldViewsModel::Delegate { | 38 public TextfieldViewsModel::Delegate { |
24 public: | 39 public: |
25 TextfieldViewsModelTest() | 40 TextfieldViewsModelTest() |
26 : ViewsTestBase(), | 41 : ViewsTestBase(), |
27 composition_text_confirmed_or_cleared_(false) { | 42 composition_text_confirmed_or_cleared_(false) { |
28 } | 43 } |
29 | 44 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
76 model.MoveCursorLeft(gfx::LINE_BREAK, false); | 91 model.MoveCursorLeft(gfx::LINE_BREAK, false); |
77 EXPECT_FALSE(model.Backspace()); | 92 EXPECT_FALSE(model.Backspace()); |
78 EXPECT_STR_EQ("HELLORLD", model.GetText()); | 93 EXPECT_STR_EQ("HELLORLD", model.GetText()); |
79 // Move the cursor to the end. delete should fail. | 94 // Move the cursor to the end. delete should fail. |
80 model.MoveCursorRight(gfx::LINE_BREAK, false); | 95 model.MoveCursorRight(gfx::LINE_BREAK, false); |
81 EXPECT_FALSE(model.Delete()); | 96 EXPECT_FALSE(model.Delete()); |
82 EXPECT_STR_EQ("HELLORLD", model.GetText()); | 97 EXPECT_STR_EQ("HELLORLD", model.GetText()); |
83 // but backspace should work. | 98 // but backspace should work. |
84 EXPECT_TRUE(model.Backspace()); | 99 EXPECT_TRUE(model.Backspace()); |
85 EXPECT_STR_EQ("HELLORL", model.GetText()); | 100 EXPECT_STR_EQ("HELLORL", model.GetText()); |
101 | |
102 model.MoveCursorTo(gfx::SelectionModel(5)); | |
103 model.ReplaceText(ASCIIToUTF16(" WOR")); | |
104 EXPECT_STR_EQ("HELLO WORL", model.GetText()); | |
105 } | |
106 | |
107 TEST_F(TextfieldViewsModelTest, EditString_SimpleRTL) { | |
108 TextfieldViewsModel model(NULL); | |
109 // Append two strings. | |
110 model.Append(WideToUTF16(L"\x05d0\x05d1\x05d2")); | |
111 EXPECT_EQ(WideToUTF16(L"\x05d0\x05d1\x05d2"), model.GetText()); | |
112 model.Append(WideToUTF16(L"\x05e0\x05e1\x05e2")); | |
113 EXPECT_EQ(WideToUTF16(L"\x05d0\x05d1\x05d2\x05e0\x05e1\x05e2"), | |
114 model.GetText()); | |
115 | |
116 // Insert 0x05f0. | |
117 model.MoveCursorTo(gfx::SelectionModel(1U)); | |
118 model.InsertChar(0x05f0); | |
119 EXPECT_EQ(WideToUTF16(L"\x05d0\x05f0\x05d1\x05d2\x05e0\x05e1\x05e2"), | |
120 model.GetText()); | |
121 | |
122 // Replace "\x05d1" with "\x05f1". | |
123 model.ReplaceChar(0x05f1); | |
124 EXPECT_EQ(WideToUTF16(L"\x05d0\x05f0\x5f1\x05d2\x05e0\x05e1\x05e2"), | |
125 model.GetText()); | |
126 | |
127 // Delete and backspace. | |
128 EXPECT_EQ(3U, model.GetCursorPosition()); | |
129 EXPECT_TRUE(model.Delete()); | |
130 EXPECT_EQ(WideToUTF16(L"\x05d0\x05f0\x5f1\x05e0\x05e1\x05e2"), | |
131 model.GetText()); | |
132 EXPECT_TRUE(model.Backspace()); | |
133 EXPECT_EQ(2U, model.GetCursorPosition()); | |
134 EXPECT_EQ(WideToUTF16(L"\x05d0\x05f0\x05e0\x05e1\x05e2"), model.GetText()); | |
135 } | |
136 | |
137 TEST_F(TextfieldViewsModelTest, EditString_ComplexScript) { | |
138 TextfieldViewsModel model(NULL); | |
139 // Append two Hindi strings. | |
140 model.Append(WideToUTF16(L"\x0915\x093f\x0915\x094d\x0915")); | |
141 EXPECT_EQ(WideToUTF16(L"\x0915\x093f\x0915\x094d\x0915"), | |
142 model.GetText()); | |
143 model.Append(WideToUTF16(L"\x0915\x094d\x092e\x094d")); | |
144 EXPECT_EQ(WideToUTF16( | |
145 L"\x0915\x093f\x0915\x094d\x0915\x0915\x094d\x092e\x094d"), | |
146 model.GetText()); | |
147 | |
148 // Check it is not able to place cursor in middle of a grapheme. | |
149 // TODO(xji): temporarily disable in platform Win since the complex script | |
150 // characters turned into empty squre due to font regression. So, not able | |
msw
2011/09/16 17:39:08
"squ*a*re" here and elsewhere.
xji
2011/09/16 20:29:24
Done.
| |
151 // to test 2 characters belong to the same grapheme. | |
152 #if defined(OS_LINUX) | |
153 model.MoveCursorTo(gfx::SelectionModel(1U)); | |
154 EXPECT_EQ(0U, model.GetCursorPosition()); | |
155 #endif | |
156 | |
157 model.MoveCursorTo(gfx::SelectionModel(2U)); | |
158 EXPECT_EQ(2U, model.GetCursorPosition()); | |
159 model.InsertChar('a'); | |
160 EXPECT_EQ(WideToUTF16( | |
161 L"\x0915\x093f\x0061\x0915\x094d\x0915\x0915\x094d\x092e\x094d"), | |
162 model.GetText()); | |
163 | |
164 // ReplaceChar will replace the whole grapheme. | |
165 model.ReplaceChar('b'); | |
166 // TODO(xji): temporarily disable in platform Win since the complex script | |
167 // characters turned into empty squre due to font regression. So, not able | |
168 // to test 2 characters belong to the same grapheme. | |
169 #if defined(OS_LINUX) | |
170 EXPECT_EQ(WideToUTF16( | |
171 L"\x0915\x093f\x0061\x0062\x0915\x0915\x094d\x092e\x094d"), | |
172 model.GetText()); | |
173 #endif | |
174 EXPECT_EQ(4U, model.GetCursorPosition()); | |
175 | |
176 // Delete should delete the whole grapheme. | |
177 model.MoveCursorTo(gfx::SelectionModel(0U)); | |
178 // TODO(xji): temporarily disable in platform Win since the complex script | |
179 // characters turned into empty squre due to font regression. So, not able | |
180 // to test 2 characters belong to the same grapheme. | |
181 #if defined(OS_LINUX) | |
182 EXPECT_TRUE(model.Delete()); | |
183 EXPECT_EQ(WideToUTF16(L"\x0061\x0062\x0915\x0915\x094d\x092e\x094d"), | |
184 model.GetText()); | |
185 model.MoveCursorTo(gfx::SelectionModel(model.GetText().length())); | |
186 EXPECT_TRUE(model.Backspace()); | |
187 EXPECT_EQ(WideToUTF16(L"\x0061\x0062\x0915\x0915\x094d\x092e"), | |
188 model.GetText()); | |
189 #endif | |
190 | |
191 // Test cursor position and deletion for Hindi Virama. | |
192 model.SetText(WideToUTF16(L"\x0D38\x0D4D\x0D15\x0D16\x0D2E")); | |
193 model.MoveCursorTo(gfx::SelectionModel(0)); | |
194 EXPECT_EQ(0U, model.GetCursorPosition()); | |
195 | |
196 // TODO(xji): temporarily disable in platform Win since the complex script | |
197 // characters turned into empty squre due to font regression. So, not able | |
198 // to test 2 characters belong to the same grapheme. | |
199 #if defined(OS_LINUX) | |
200 model.MoveCursorTo(gfx::SelectionModel(1)); | |
201 EXPECT_EQ(0U, model.GetCursorPosition()); | |
202 #endif | |
203 | |
204 model.MoveCursorTo(gfx::SelectionModel(2)); | |
205 EXPECT_EQ(2U, model.GetCursorPosition()); | |
206 | |
207 model.MoveCursorTo(gfx::SelectionModel(3)); | |
208 EXPECT_EQ(3U, model.GetCursorPosition()); | |
209 | |
210 model.MoveCursorTo(gfx::SelectionModel(2)); | |
211 | |
212 EXPECT_TRUE(model.Backspace()); | |
213 EXPECT_EQ(WideToUTF16(L"\x0D38\x0D15\x0D16\x0D2E"), model.GetText()); | |
214 | |
215 // Test Delete/Backspace on Hebrew with non-spacing marks. | |
216 // TODO(xji): temporarily disable in platform Win since the complex script | |
217 // characters turned into empty squre due to font regression. So, not able | |
218 // to test 2 characters belong to the same grapheme. | |
219 #if defined(OS_LINUX) | |
220 model.SetText(WideToUTF16(L"\x05d5\x05b7\x05D9\x05B0\x05D4\x05B4\x05D9")); | |
221 model.MoveCursorTo(gfx::SelectionModel(0)); | |
222 EXPECT_TRUE(model.Delete()); | |
223 EXPECT_TRUE(model.Delete()); | |
224 EXPECT_TRUE(model.Delete()); | |
225 EXPECT_TRUE(model.Delete()); | |
226 EXPECT_EQ(WideToUTF16(L""), model.GetText()); | |
227 #endif | |
228 | |
229 // The first 2 characters are not strong directionality characters. | |
230 model.SetText(WideToUTF16(L"\x002C\x0020\x05D1\x05BC\x05B7\x05E9\x05BC")); | |
231 #if defined(OS_WIN) | |
232 model.MoveCursorRight(gfx::LINE_BREAK, false); | |
233 #else | |
234 model.MoveCursorLeft(gfx::LINE_BREAK, false); | |
235 #endif | |
236 EXPECT_TRUE(model.Backspace()); | |
237 EXPECT_EQ(WideToUTF16(L"\x002C\x0020\x05D1\x05BC\x05B7\x05E9"), | |
238 model.GetText()); | |
86 } | 239 } |
87 | 240 |
88 TEST_F(TextfieldViewsModelTest, EmptyString) { | 241 TEST_F(TextfieldViewsModelTest, EmptyString) { |
89 TextfieldViewsModel model(NULL); | 242 TextfieldViewsModel model(NULL); |
90 EXPECT_EQ(string16(), model.GetText()); | 243 EXPECT_EQ(string16(), model.GetText()); |
91 EXPECT_EQ(string16(), model.GetSelectedText()); | 244 EXPECT_EQ(string16(), model.GetSelectedText()); |
92 EXPECT_EQ(string16(), model.GetVisibleText()); | 245 EXPECT_EQ(string16(), model.GetVisibleText()); |
93 | 246 |
94 model.MoveCursorLeft(gfx::CHARACTER_BREAK, true); | 247 model.MoveCursorLeft(gfx::CHARACTER_BREAK, true); |
95 EXPECT_EQ(0U, model.GetCursorPosition()); | 248 EXPECT_EQ(0U, model.GetCursorPosition()); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
136 | 289 |
137 // Select all and move cursor | 290 // Select all and move cursor |
138 model.SelectAll(); | 291 model.SelectAll(); |
139 model.MoveCursorLeft(gfx::CHARACTER_BREAK, false); | 292 model.MoveCursorLeft(gfx::CHARACTER_BREAK, false); |
140 EXPECT_EQ(0U, model.GetCursorPosition()); | 293 EXPECT_EQ(0U, model.GetCursorPosition()); |
141 model.SelectAll(); | 294 model.SelectAll(); |
142 model.MoveCursorRight(gfx::CHARACTER_BREAK, false); | 295 model.MoveCursorRight(gfx::CHARACTER_BREAK, false); |
143 EXPECT_EQ(5U, model.GetCursorPosition()); | 296 EXPECT_EQ(5U, model.GetCursorPosition()); |
144 } | 297 } |
145 | 298 |
299 TEST_F(TextfieldViewsModelTest, Selection_BidiWithNonSpacingMarks) { | |
300 // Selection is a logical operation. And it should work with the arrow | |
301 // keys doing visual movements, while the selection is logical between | |
302 // the (logical) start and end points. Selection is simply defined as | |
303 // the portion of text between the logical positions of the start and end | |
304 // caret positions. | |
305 TextfieldViewsModel model(NULL); | |
306 // TODO(xji): temporarily disable in platform Win since the complex script | |
307 // characters turned into empty squre due to font regression. So, not able | |
308 // to test 2 characters belong to the same grapheme. | |
309 #if defined(OS_LINUX) | |
310 model.Append(WideToUTF16( | |
311 L"abc\x05E9\x05BC\x05C1\x05B8\x05E0\x05B8"L"def")); | |
312 model.MoveCursorRight(gfx::CHARACTER_BREAK, false); | |
313 model.MoveCursorRight(gfx::CHARACTER_BREAK, false); | |
314 | |
315 model.MoveCursorRight(gfx::CHARACTER_BREAK, true); | |
316 EXPECT_EQ(2U, model.render_text()->GetSelectionStart()); | |
317 EXPECT_EQ(3U, model.GetCursorPosition()); | |
318 EXPECT_EQ(WideToUTF16(L"c"), model.GetSelectedText()); | |
319 | |
320 model.MoveCursorRight(gfx::CHARACTER_BREAK, true); | |
321 EXPECT_EQ(2U, model.render_text()->GetSelectionStart()); | |
322 EXPECT_EQ(7U, model.GetCursorPosition()); | |
323 EXPECT_EQ(WideToUTF16(L"c\x05E9\x05BC\x05C1\x05B8"), | |
324 model.GetSelectedText()); | |
325 | |
326 model.MoveCursorRight(gfx::CHARACTER_BREAK, true); | |
327 EXPECT_EQ(2U, model.render_text()->GetSelectionStart()); | |
328 EXPECT_EQ(3U, model.GetCursorPosition()); | |
329 EXPECT_EQ(WideToUTF16(L"c"), model.GetSelectedText()); | |
330 | |
331 model.MoveCursorRight(gfx::CHARACTER_BREAK, true); | |
332 EXPECT_EQ(2U, model.render_text()->GetSelectionStart()); | |
333 EXPECT_EQ(10U, model.GetCursorPosition()); | |
334 EXPECT_EQ(WideToUTF16(L"c\x05E9\x05BC\x05C1\x05B8\x05E0\x05B8"L"d"), | |
335 model.GetSelectedText()); | |
336 | |
337 model.ClearSelection(); | |
338 EXPECT_EQ(string16(), model.GetSelectedText()); | |
339 model.SelectAll(); | |
340 EXPECT_EQ(WideToUTF16(L"abc\x05E9\x05BC\x05C1\x05B8\x05E0\x05B8"L"def"), | |
341 model.GetSelectedText()); | |
342 #endif | |
343 | |
344 // In case of "aBc", this test shows how to select "aB" or "Bc", assume 'B' is | |
345 // an RTL character. | |
346 model.SetText(WideToUTF16(L"a\x05E9"L"b")); | |
347 model.MoveCursorTo(gfx::SelectionModel(0)); | |
348 model.MoveCursorRight(gfx::CHARACTER_BREAK, true); | |
349 EXPECT_EQ(WideToUTF16(L"a"), model.GetSelectedText()); | |
350 | |
351 model.MoveCursorRight(gfx::CHARACTER_BREAK, true); | |
352 EXPECT_EQ(WideToUTF16(L"a"), model.GetSelectedText()); | |
353 | |
354 model.MoveCursorRight(gfx::CHARACTER_BREAK, true); | |
355 EXPECT_EQ(WideToUTF16(L"a\x05E9"L"b"), model.GetSelectedText()); | |
356 | |
357 model.MoveCursorRight(gfx::CHARACTER_BREAK, false); | |
358 EXPECT_EQ(3U, model.GetCursorPosition()); | |
359 model.MoveCursorLeft(gfx::CHARACTER_BREAK, true); | |
360 EXPECT_EQ(WideToUTF16(L"b"), model.GetSelectedText()); | |
361 | |
362 model.MoveCursorLeft(gfx::CHARACTER_BREAK, true); | |
363 EXPECT_EQ(WideToUTF16(L"b"), model.GetSelectedText()); | |
364 | |
365 model.MoveCursorLeft(gfx::CHARACTER_BREAK, true); | |
366 EXPECT_EQ(WideToUTF16(L"a\x05E9"L"b"), model.GetSelectedText()); | |
367 | |
368 model.MoveCursorLeft(gfx::LINE_BREAK, false); | |
369 model.MoveCursorRight(gfx::CHARACTER_BREAK, true); | |
370 model.MoveCursorRight(gfx::CHARACTER_BREAK, true); | |
371 model.MoveCursorLeft(gfx::CHARACTER_BREAK, true); | |
372 EXPECT_EQ(WideToUTF16(L"a\x05E9"), model.GetSelectedText()); | |
373 | |
374 model.MoveCursorRight(gfx::LINE_BREAK, false); | |
375 model.MoveCursorLeft(gfx::CHARACTER_BREAK, true); | |
376 model.MoveCursorLeft(gfx::CHARACTER_BREAK, true); | |
377 model.MoveCursorRight(gfx::CHARACTER_BREAK, true); | |
378 EXPECT_EQ(WideToUTF16(L"\x05E9"L"b"), model.GetSelectedText()); | |
379 | |
380 model.ClearSelection(); | |
381 EXPECT_EQ(string16(), model.GetSelectedText()); | |
382 model.SelectAll(); | |
383 EXPECT_EQ(WideToUTF16(L"a\x05E9"L"b"), model.GetSelectedText()); | |
384 } | |
385 | |
146 TEST_F(TextfieldViewsModelTest, SelectionAndEdit) { | 386 TEST_F(TextfieldViewsModelTest, SelectionAndEdit) { |
147 TextfieldViewsModel model(NULL); | 387 TextfieldViewsModel model(NULL); |
148 model.Append(ASCIIToUTF16("HELLO")); | 388 model.Append(ASCIIToUTF16("HELLO")); |
149 model.MoveCursorRight(gfx::CHARACTER_BREAK, false); | 389 model.MoveCursorRight(gfx::CHARACTER_BREAK, false); |
150 model.MoveCursorRight(gfx::CHARACTER_BREAK, true); | 390 model.MoveCursorRight(gfx::CHARACTER_BREAK, true); |
151 model.MoveCursorRight(gfx::CHARACTER_BREAK, true); // select "EL" | 391 model.MoveCursorRight(gfx::CHARACTER_BREAK, true); // select "EL" |
152 EXPECT_TRUE(model.Backspace()); | 392 EXPECT_TRUE(model.Backspace()); |
153 EXPECT_STR_EQ("HLO", model.GetText()); | 393 EXPECT_STR_EQ("HLO", model.GetText()); |
154 | 394 |
155 model.Append(ASCIIToUTF16("ILL")); | 395 model.Append(ASCIIToUTF16("ILL")); |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
307 model.MoveCursorRight(gfx::LINE_BREAK, false); | 547 model.MoveCursorRight(gfx::LINE_BREAK, false); |
308 model.MoveCursorLeft(gfx::WORD_BREAK, true); | 548 model.MoveCursorLeft(gfx::WORD_BREAK, true); |
309 EXPECT_TRUE(model.Paste()); | 549 EXPECT_TRUE(model.Paste()); |
310 clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &clipboard_text); | 550 clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &clipboard_text); |
311 EXPECT_STR_EQ("HELLO HELLO WORLD", clipboard_text); | 551 EXPECT_STR_EQ("HELLO HELLO WORLD", clipboard_text); |
312 EXPECT_STR_EQ("HELLO HELLO HELLO HELLO WORLD", model.GetText()); | 552 EXPECT_STR_EQ("HELLO HELLO HELLO HELLO WORLD", model.GetText()); |
313 EXPECT_EQ(29U, model.GetCursorPosition()); | 553 EXPECT_EQ(29U, model.GetCursorPosition()); |
314 } | 554 } |
315 | 555 |
316 void SelectWordTestVerifier(TextfieldViewsModel &model, | 556 void SelectWordTestVerifier(TextfieldViewsModel &model, |
317 const std::string &expected_selected_string, size_t expected_cursor_pos) { | 557 const string16 &expected_selected_string, size_t expected_cursor_pos) { |
318 EXPECT_STR_EQ(expected_selected_string, model.GetSelectedText()); | 558 EXPECT_EQ(expected_selected_string, model.GetSelectedText()); |
319 EXPECT_EQ(expected_cursor_pos, model.GetCursorPosition()); | 559 EXPECT_EQ(expected_cursor_pos, model.GetCursorPosition()); |
320 } | 560 } |
321 | 561 |
322 TEST_F(TextfieldViewsModelTest, SelectWordTest) { | 562 TEST_F(TextfieldViewsModelTest, SelectWordTest) { |
323 TextfieldViewsModel model(NULL); | 563 TextfieldViewsModel model(NULL); |
324 model.Append(ASCIIToUTF16(" HELLO !! WO RLD ")); | 564 model.Append(ASCIIToUTF16(" HELLO !! WO RLD ")); |
325 | 565 |
326 // Test when cursor is at the beginning. | 566 // Test when cursor is at the beginning. |
327 model.MoveCursorLeft(gfx::LINE_BREAK, false); | 567 model.MoveCursorLeft(gfx::LINE_BREAK, false); |
328 model.SelectWord(); | 568 model.SelectWord(); |
329 SelectWordTestVerifier(model, " ", 2U); | 569 SelectWordTestVerifier(model, ASCIIToUTF16(" "), 2U); |
330 | 570 |
331 // Test when cursor is at the beginning of a word. | 571 // Test when cursor is at the beginning of a word. |
332 gfx::SelectionModel selection(2U); | 572 gfx::SelectionModel selection(2U); |
333 model.MoveCursorTo(selection); | 573 model.MoveCursorTo(selection); |
334 model.SelectWord(); | 574 model.SelectWord(); |
335 SelectWordTestVerifier(model, "HELLO", 7U); | 575 SelectWordTestVerifier(model, ASCIIToUTF16("HELLO"), 7U); |
336 | 576 |
337 // Test when cursor is at the end of a word. | 577 // Test when cursor is at the end of a word. |
338 selection = gfx::SelectionModel(15U); | 578 selection = gfx::SelectionModel(15U); |
339 model.MoveCursorTo(selection); | 579 model.MoveCursorTo(selection); |
340 model.SelectWord(); | 580 model.SelectWord(); |
341 SelectWordTestVerifier(model, "WO", 15U); | 581 SelectWordTestVerifier(model, ASCIIToUTF16(" "), 20U); |
342 | 582 |
343 // Test when cursor is somewhere in a non-alph-numeric fragment. | 583 // Test when cursor is somewhere in a non-alpha-numeric fragment. |
344 for (size_t cursor_pos = 8; cursor_pos < 13U; cursor_pos++) { | 584 for (size_t cursor_pos = 8; cursor_pos < 13U; cursor_pos++) { |
345 selection = gfx::SelectionModel(cursor_pos); | 585 selection = gfx::SelectionModel(cursor_pos); |
346 model.MoveCursorTo(selection); | 586 model.MoveCursorTo(selection); |
347 model.SelectWord(); | 587 model.SelectWord(); |
348 SelectWordTestVerifier(model, " !! ", 13U); | 588 SelectWordTestVerifier(model, ASCIIToUTF16(" !! "), 13U); |
349 } | 589 } |
350 | 590 |
351 // Test when cursor is somewhere in a whitespace fragment. | 591 // Test when cursor is somewhere in a whitespace fragment. |
352 selection = gfx::SelectionModel(17U); | 592 selection = gfx::SelectionModel(17U); |
353 model.MoveCursorTo(selection); | 593 model.MoveCursorTo(selection); |
354 model.SelectWord(); | 594 model.SelectWord(); |
355 SelectWordTestVerifier(model, " ", 20U); | 595 SelectWordTestVerifier(model, ASCIIToUTF16(" "), 20U); |
356 | 596 |
357 // Test when cursor is at the end. | 597 // Test when cursor is at the end. |
358 model.MoveCursorRight(gfx::LINE_BREAK, false); | 598 model.MoveCursorRight(gfx::LINE_BREAK, false); |
359 model.SelectWord(); | 599 model.SelectWord(); |
360 SelectWordTestVerifier(model, " ", 24U); | 600 SelectWordTestVerifier(model, ASCIIToUTF16(" "), 24U); |
361 } | 601 } |
362 | 602 |
603 // TODO(xji): temporarily disable in platform Win since the complex script | |
604 // characters and Chinese characters are turned into empty squre due to font | |
605 // regression. | |
606 #if defined(OS_LINUX) | |
607 TEST_F(TextfieldViewsModelTest, SelectWordTest_MixScripts) { | |
608 TextfieldViewsModel model(NULL); | |
609 std::vector<WordAndCursor> word_and_cursor; | |
610 word_and_cursor.push_back(WordAndCursor(L"a\x05d0", 2)); | |
611 word_and_cursor.push_back(WordAndCursor(L"a\x05d0", 2)); | |
612 word_and_cursor.push_back(WordAndCursor(L"\x05d1\x05d2", 5)); | |
613 word_and_cursor.push_back(WordAndCursor(L"\x05d1\x05d2", 5)); | |
614 word_and_cursor.push_back(WordAndCursor(L" ", 3)); | |
615 word_and_cursor.push_back(WordAndCursor(L"a\x05d0", 2)); | |
616 word_and_cursor.push_back(WordAndCursor(L"\x0915\x094d\x0915", 9)); | |
617 word_and_cursor.push_back(WordAndCursor(L"\x0915\x094d\x0915", 9)); | |
618 word_and_cursor.push_back(WordAndCursor(L" ", 10)); | |
619 word_and_cursor.push_back(WordAndCursor(L"\x4E2D\x56FD", 12)); | |
620 word_and_cursor.push_back(WordAndCursor(L"\x4E2D\x56FD", 12)); | |
621 word_and_cursor.push_back(WordAndCursor(L"\x82B1", 13)); | |
622 word_and_cursor.push_back(WordAndCursor(L"\x5929", 14)); | |
623 | |
624 // The text consists of Ascii, Hebrew, Hindi with Virama sign, and Chinese. | |
625 model.SetText(WideToUTF16(L"a\x05d0 \x05d1\x05d2 \x0915\x094d\x0915 " | |
626 L"\x4E2D\x56FD\x82B1\x5929")); | |
627 for (size_t i = 0; i < word_and_cursor.size(); ++i) { | |
628 model.MoveCursorLeft(gfx::LINE_BREAK, false); | |
629 for (size_t j = 0; j < i; ++j) | |
630 model.MoveCursorRight(gfx::CHARACTER_BREAK, false); | |
631 model.SelectWord(); | |
632 SelectWordTestVerifier(model, WideToUTF16(word_and_cursor[i].word), | |
633 word_and_cursor[i].cursor); | |
634 } | |
635 } | |
636 #endif | |
637 | |
363 TEST_F(TextfieldViewsModelTest, RangeTest) { | 638 TEST_F(TextfieldViewsModelTest, RangeTest) { |
364 TextfieldViewsModel model(NULL); | 639 TextfieldViewsModel model(NULL); |
365 model.Append(ASCIIToUTF16("HELLO WORLD")); | 640 model.Append(ASCIIToUTF16("HELLO WORLD")); |
366 model.MoveCursorLeft(gfx::LINE_BREAK, false); | 641 model.MoveCursorLeft(gfx::LINE_BREAK, false); |
367 ui::Range range; | 642 ui::Range range; |
368 model.GetSelectedRange(&range); | 643 model.GetSelectedRange(&range); |
369 EXPECT_TRUE(range.is_empty()); | 644 EXPECT_TRUE(range.is_empty()); |
370 EXPECT_EQ(0U, range.start()); | 645 EXPECT_EQ(0U, range.start()); |
371 EXPECT_EQ(0U, range.end()); | 646 EXPECT_EQ(0U, range.end()); |
372 | 647 |
(...skipping 762 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1135 EXPECT_TRUE(model.Undo()); | 1410 EXPECT_TRUE(model.Undo()); |
1136 EXPECT_STR_EQ("ABCDE", model.GetText()); | 1411 EXPECT_STR_EQ("ABCDE", model.GetText()); |
1137 EXPECT_TRUE(model.Redo()); | 1412 EXPECT_TRUE(model.Redo()); |
1138 EXPECT_STR_EQ("1234", model.GetText()); | 1413 EXPECT_STR_EQ("1234", model.GetText()); |
1139 EXPECT_FALSE(model.Redo()); | 1414 EXPECT_FALSE(model.Redo()); |
1140 | 1415 |
1141 // TODO(oshima): We need MockInputMethod to test the behavior with IME. | 1416 // TODO(oshima): We need MockInputMethod to test the behavior with IME. |
1142 } | 1417 } |
1143 | 1418 |
1144 } // namespace views | 1419 } // namespace views |
OLD | NEW |