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 "base/auto_reset.h" | 5 #include "base/auto_reset.h" |
6 #include "base/memory/scoped_ptr.h" | 6 #include "base/memory/scoped_ptr.h" |
7 #include "base/message_loop.h" | 7 #include "base/message_loop.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 #include "ui/base/clipboard/clipboard.h" | 10 #include "ui/base/clipboard/clipboard.h" |
11 #include "ui/base/clipboard/scoped_clipboard_writer.h" | 11 #include "ui/base/clipboard/scoped_clipboard_writer.h" |
12 #include "ui/base/range/range.h" | 12 #include "ui/base/range/range.h" |
13 #include "views/controls/textfield/text_style.h" | |
14 #include "views/controls/textfield/textfield.h" | 13 #include "views/controls/textfield/textfield.h" |
15 #include "views/controls/textfield/textfield_views_model.h" | 14 #include "views/controls/textfield/textfield_views_model.h" |
16 #include "views/test/test_views_delegate.h" | 15 #include "views/test/test_views_delegate.h" |
17 #include "views/test/views_test_base.h" | 16 #include "views/test/views_test_base.h" |
18 #include "views/views_delegate.h" | 17 #include "views/views_delegate.h" |
19 | 18 |
20 namespace views { | 19 namespace views { |
21 | 20 |
22 #include "views/test/views_test_base.h" | |
23 | |
24 class TextfieldViewsModelTest : public ViewsTestBase, | 21 class TextfieldViewsModelTest : public ViewsTestBase, |
25 public TextfieldViewsModel::Delegate { | 22 public TextfieldViewsModel::Delegate { |
26 public: | 23 public: |
27 TextfieldViewsModelTest() | 24 TextfieldViewsModelTest() |
28 : ViewsTestBase(), | 25 : ViewsTestBase(), |
29 composition_text_confirmed_or_cleared_(false) { | 26 composition_text_confirmed_or_cleared_(false) { |
30 } | 27 } |
31 | 28 |
32 virtual void OnCompositionTextConfirmedOrCleared() { | 29 virtual void OnCompositionTextConfirmedOrCleared() { |
33 composition_text_confirmed_or_cleared_ = true; | 30 composition_text_confirmed_or_cleared_ = true; |
34 } | 31 } |
35 | 32 |
36 protected: | 33 protected: |
37 void ResetModel(TextfieldViewsModel* model) const { | 34 void ResetModel(TextfieldViewsModel* model) const { |
38 model->SetText(ASCIIToUTF16("")); | 35 model->SetText(ASCIIToUTF16("")); |
39 model->ClearEditHistory(); | 36 model->ClearEditHistory(); |
40 } | 37 } |
41 | 38 |
42 bool composition_text_confirmed_or_cleared_; | 39 bool composition_text_confirmed_or_cleared_; |
43 | 40 |
44 private: | 41 private: |
45 DISALLOW_COPY_AND_ASSIGN(TextfieldViewsModelTest); | 42 DISALLOW_COPY_AND_ASSIGN(TextfieldViewsModelTest); |
46 }; | 43 }; |
47 | 44 |
48 #define EXPECT_STR_EQ(ascii, utf16) \ | 45 #define EXPECT_STR_EQ(ascii, utf16) \ |
49 EXPECT_EQ(ASCIIToWide(ascii), UTF16ToWide(utf16)) | 46 EXPECT_EQ(ASCIIToWide(ascii), UTF16ToWide(utf16)) |
50 | |
51 TEST_F(TextfieldViewsModelTest, EditString) { | 47 TEST_F(TextfieldViewsModelTest, EditString) { |
52 TextfieldViewsModel model(NULL); | 48 TextfieldViewsModel model(NULL); |
53 // append two strings | 49 // append two strings |
54 model.Append(ASCIIToUTF16("HILL")); | 50 model.Append(ASCIIToUTF16("HILL")); |
55 EXPECT_STR_EQ("HILL", model.text()); | 51 EXPECT_STR_EQ("HILL", model.GetText()); |
56 model.Append(ASCIIToUTF16("WORLD")); | 52 model.Append(ASCIIToUTF16("WORLD")); |
57 EXPECT_STR_EQ("HILLWORLD", model.text()); | 53 EXPECT_STR_EQ("HILLWORLD", model.GetText()); |
58 | 54 |
59 // Insert "E" to make hello | 55 // Insert "E" to make hello |
60 model.MoveCursorRight(false); | 56 model.MoveCursorRight(false); |
61 model.InsertChar('E'); | 57 model.InsertChar('E'); |
62 EXPECT_STR_EQ("HEILLWORLD", model.text()); | 58 EXPECT_STR_EQ("HEILLWORLD", model.GetText()); |
63 // Replace "I" with "L" | 59 // Replace "I" with "L" |
64 model.ReplaceChar('L'); | 60 model.ReplaceChar('L'); |
65 EXPECT_STR_EQ("HELLLWORLD", model.text()); | 61 EXPECT_STR_EQ("HELLLWORLD", model.GetText()); |
66 model.ReplaceChar('L'); | 62 model.ReplaceChar('L'); |
67 model.ReplaceChar('O'); | 63 model.ReplaceChar('O'); |
68 EXPECT_STR_EQ("HELLOWORLD", model.text()); | 64 EXPECT_STR_EQ("HELLOWORLD", model.GetText()); |
69 | 65 |
70 // Delete 6th char "W", then delete 5th char O" | 66 // Delete 6th char "W", then delete 5th char O" |
71 EXPECT_EQ(5U, model.cursor_pos()); | 67 EXPECT_EQ(5U, model.GetCursorPosition()); |
72 EXPECT_TRUE(model.Delete()); | 68 EXPECT_TRUE(model.Delete()); |
73 EXPECT_STR_EQ("HELLOORLD", model.text()); | 69 EXPECT_STR_EQ("HELLOORLD", model.GetText()); |
74 EXPECT_TRUE(model.Backspace()); | 70 EXPECT_TRUE(model.Backspace()); |
75 EXPECT_EQ(4U, model.cursor_pos()); | 71 EXPECT_EQ(4U, model.GetCursorPosition()); |
76 EXPECT_STR_EQ("HELLORLD", model.text()); | 72 EXPECT_STR_EQ("HELLORLD", model.GetText()); |
77 | 73 |
78 // Move the cursor to start. backspace should fail. | 74 // Move the cursor to start. backspace should fail. |
79 model.MoveCursorToHome(false); | 75 model.MoveCursorToLeftEnd(false); |
80 EXPECT_FALSE(model.Backspace()); | 76 EXPECT_FALSE(model.Backspace()); |
81 EXPECT_STR_EQ("HELLORLD", model.text()); | 77 EXPECT_STR_EQ("HELLORLD", model.GetText()); |
82 // Move the cursor to the end. delete should fail. | 78 // Move the cursor to the end. delete should fail. |
83 model.MoveCursorToEnd(false); | 79 model.MoveCursorToRightEnd(false); |
84 EXPECT_FALSE(model.Delete()); | 80 EXPECT_FALSE(model.Delete()); |
85 EXPECT_STR_EQ("HELLORLD", model.text()); | 81 EXPECT_STR_EQ("HELLORLD", model.GetText()); |
86 // but backspace should work. | 82 // but backspace should work. |
87 EXPECT_TRUE(model.Backspace()); | 83 EXPECT_TRUE(model.Backspace()); |
88 EXPECT_STR_EQ("HELLORL", model.text()); | 84 EXPECT_STR_EQ("HELLORL", model.GetText()); |
89 } | 85 } |
90 | 86 |
91 TEST_F(TextfieldViewsModelTest, EmptyString) { | 87 TEST_F(TextfieldViewsModelTest, EmptyString) { |
92 TextfieldViewsModel model(NULL); | 88 TextfieldViewsModel model(NULL); |
93 EXPECT_EQ(string16(), model.text()); | 89 EXPECT_EQ(string16(), model.GetText()); |
94 EXPECT_EQ(string16(), model.GetSelectedText()); | 90 EXPECT_EQ(string16(), model.GetSelectedText()); |
95 EXPECT_EQ(string16(), model.GetVisibleText()); | 91 EXPECT_EQ(string16(), model.GetVisibleText()); |
96 | 92 |
97 model.MoveCursorLeft(true); | 93 model.MoveCursorLeft(true); |
98 EXPECT_EQ(0U, model.cursor_pos()); | 94 EXPECT_EQ(0U, model.GetCursorPosition()); |
99 model.MoveCursorRight(true); | 95 model.MoveCursorRight(true); |
100 EXPECT_EQ(0U, model.cursor_pos()); | 96 EXPECT_EQ(0U, model.GetCursorPosition()); |
101 | 97 |
102 EXPECT_EQ(string16(), model.GetSelectedText()); | 98 EXPECT_EQ(string16(), model.GetSelectedText()); |
103 | 99 |
104 EXPECT_FALSE(model.Delete()); | 100 EXPECT_FALSE(model.Delete()); |
105 EXPECT_FALSE(model.Backspace()); | 101 EXPECT_FALSE(model.Backspace()); |
106 } | 102 } |
107 | 103 |
108 TEST_F(TextfieldViewsModelTest, Selection) { | 104 TEST_F(TextfieldViewsModelTest, Selection) { |
109 TextfieldViewsModel model(NULL); | 105 TextfieldViewsModel model(NULL); |
110 model.Append(ASCIIToUTF16("HELLO")); | 106 model.Append(ASCIIToUTF16("HELLO")); |
111 model.MoveCursorRight(false); | 107 model.MoveCursorRight(false); |
112 model.MoveCursorRight(true); | 108 model.MoveCursorRight(true); |
113 EXPECT_STR_EQ("E", model.GetSelectedText()); | 109 EXPECT_STR_EQ("E", model.GetSelectedText()); |
114 model.MoveCursorRight(true); | 110 model.MoveCursorRight(true); |
115 EXPECT_STR_EQ("EL", model.GetSelectedText()); | 111 EXPECT_STR_EQ("EL", model.GetSelectedText()); |
116 | 112 |
117 model.MoveCursorToHome(true); | 113 model.MoveCursorToLeftEnd(true); |
118 EXPECT_STR_EQ("H", model.GetSelectedText()); | 114 EXPECT_STR_EQ("H", model.GetSelectedText()); |
119 model.MoveCursorToEnd(true); | 115 model.MoveCursorToRightEnd(true); |
120 EXPECT_STR_EQ("ELLO", model.GetSelectedText()); | 116 EXPECT_STR_EQ("ELLO", model.GetSelectedText()); |
121 model.ClearSelection(); | 117 model.ClearSelection(); |
122 EXPECT_EQ(string16(), model.GetSelectedText()); | 118 EXPECT_EQ(string16(), model.GetSelectedText()); |
123 model.SelectAll(); | 119 model.SelectAll(); |
124 EXPECT_STR_EQ("HELLO", model.GetSelectedText()); | 120 EXPECT_STR_EQ("HELLO", model.GetSelectedText()); |
125 // SelectAll should select towards the end. | 121 // SelectAll should select towards the end. |
126 ui::Range range; | 122 ui::Range range; |
127 model.GetSelectedRange(&range); | 123 model.GetSelectedRange(&range); |
128 EXPECT_EQ(0U, range.start()); | 124 EXPECT_EQ(0U, range.start()); |
129 EXPECT_EQ(5U, range.end()); | 125 EXPECT_EQ(5U, range.end()); |
130 | 126 |
131 // Select and move cursor | 127 // Select and move cursor |
132 model.MoveCursorTo(1U, false); | 128 model.MoveCursorTo(1U, false); |
133 model.MoveCursorTo(3U, true); | 129 model.MoveCursorTo(3U, true); |
134 EXPECT_STR_EQ("EL", model.GetSelectedText()); | 130 EXPECT_STR_EQ("EL", model.GetSelectedText()); |
135 model.MoveCursorLeft(false); | 131 model.MoveCursorLeft(false); |
136 EXPECT_EQ(1U, model.cursor_pos()); | 132 EXPECT_EQ(1U, model.GetCursorPosition()); |
137 model.MoveCursorTo(1U, false); | 133 model.MoveCursorTo(1U, false); |
138 model.MoveCursorTo(3U, true); | 134 model.MoveCursorTo(3U, true); |
139 model.MoveCursorRight(false); | 135 model.MoveCursorRight(false); |
140 EXPECT_EQ(3U, model.cursor_pos()); | 136 EXPECT_EQ(3U, model.GetCursorPosition()); |
141 | 137 |
142 // Select all and move cursor | 138 // Select all and move cursor |
143 model.SelectAll(); | 139 model.SelectAll(); |
144 model.MoveCursorLeft(false); | 140 model.MoveCursorLeft(false); |
145 EXPECT_EQ(0U, model.cursor_pos()); | 141 EXPECT_EQ(0U, model.GetCursorPosition()); |
146 model.SelectAll(); | 142 model.SelectAll(); |
147 model.MoveCursorRight(false); | 143 model.MoveCursorRight(false); |
148 EXPECT_EQ(5U, model.cursor_pos()); | 144 EXPECT_EQ(5U, model.GetCursorPosition()); |
149 } | 145 } |
150 | 146 |
151 TEST_F(TextfieldViewsModelTest, SelectionAndEdit) { | 147 TEST_F(TextfieldViewsModelTest, SelectionAndEdit) { |
152 TextfieldViewsModel model(NULL); | 148 TextfieldViewsModel model(NULL); |
153 model.Append(ASCIIToUTF16("HELLO")); | 149 model.Append(ASCIIToUTF16("HELLO")); |
154 model.MoveCursorRight(false); | 150 model.MoveCursorRight(false); |
155 model.MoveCursorRight(true); | 151 model.MoveCursorRight(true); |
156 model.MoveCursorRight(true); // select "EL" | 152 model.MoveCursorRight(true); // select "EL" |
157 EXPECT_TRUE(model.Backspace()); | 153 EXPECT_TRUE(model.Backspace()); |
158 EXPECT_STR_EQ("HLO", model.text()); | 154 EXPECT_STR_EQ("HLO", model.GetText()); |
159 | 155 |
160 model.Append(ASCIIToUTF16("ILL")); | 156 model.Append(ASCIIToUTF16("ILL")); |
161 model.MoveCursorRight(true); | 157 model.MoveCursorRight(true); |
162 model.MoveCursorRight(true); // select "LO" | 158 model.MoveCursorRight(true); // select "LO" |
163 EXPECT_TRUE(model.Delete()); | 159 EXPECT_TRUE(model.Delete()); |
164 EXPECT_STR_EQ("HILL", model.text()); | 160 EXPECT_STR_EQ("HILL", model.GetText()); |
165 EXPECT_EQ(1U, model.cursor_pos()); | 161 EXPECT_EQ(1U, model.GetCursorPosition()); |
166 model.MoveCursorRight(true); // select "I" | 162 model.MoveCursorRight(true); // select "I" |
167 model.InsertChar('E'); | 163 model.InsertChar('E'); |
168 EXPECT_STR_EQ("HELL", model.text()); | 164 EXPECT_STR_EQ("HELL", model.GetText()); |
169 model.MoveCursorToHome(false); | 165 model.MoveCursorToLeftEnd(false); |
170 model.MoveCursorRight(true); // select "H" | 166 model.MoveCursorRight(true); // select "H" |
171 model.ReplaceChar('B'); | 167 model.ReplaceChar('B'); |
172 EXPECT_STR_EQ("BELL", model.text()); | 168 EXPECT_STR_EQ("BELL", model.GetText()); |
173 model.MoveCursorToEnd(false); | 169 model.MoveCursorToRightEnd(false); |
174 model.MoveCursorLeft(true); | 170 model.MoveCursorLeft(true); |
175 model.MoveCursorLeft(true); // select ">LL" | 171 model.MoveCursorLeft(true); // select ">LL" |
176 model.ReplaceChar('E'); | 172 model.ReplaceChar('E'); |
177 EXPECT_STR_EQ("BEE", model.text()); | 173 EXPECT_STR_EQ("BEE", model.GetText()); |
178 } | 174 } |
179 | 175 |
180 TEST_F(TextfieldViewsModelTest, Password) { | 176 TEST_F(TextfieldViewsModelTest, Password) { |
181 TextfieldViewsModel model(NULL); | 177 TextfieldViewsModel model(NULL); |
182 model.set_is_password(true); | 178 model.set_is_password(true); |
183 model.Append(ASCIIToUTF16("HELLO")); | 179 model.Append(ASCIIToUTF16("HELLO")); |
184 EXPECT_STR_EQ("*****", model.GetVisibleText()); | 180 EXPECT_STR_EQ("*****", model.GetVisibleText()); |
185 EXPECT_STR_EQ("HELLO", model.text()); | 181 EXPECT_STR_EQ("HELLO", model.GetText()); |
186 EXPECT_TRUE(model.Delete()); | 182 EXPECT_TRUE(model.Delete()); |
187 | 183 |
188 EXPECT_STR_EQ("****", model.GetVisibleText()); | 184 EXPECT_STR_EQ("****", model.GetVisibleText()); |
189 EXPECT_STR_EQ("ELLO", model.text()); | 185 EXPECT_STR_EQ("ELLO", model.GetText()); |
190 EXPECT_EQ(0U, model.cursor_pos()); | 186 EXPECT_EQ(0U, model.GetCursorPosition()); |
191 | 187 |
192 model.SelectAll(); | 188 model.SelectAll(); |
193 EXPECT_STR_EQ("ELLO", model.GetSelectedText()); | 189 EXPECT_STR_EQ("ELLO", model.GetSelectedText()); |
194 EXPECT_EQ(4U, model.cursor_pos()); | 190 EXPECT_EQ(4U, model.GetCursorPosition()); |
195 | 191 |
196 model.InsertChar('X'); | 192 model.InsertChar('X'); |
197 EXPECT_STR_EQ("*", model.GetVisibleText()); | 193 EXPECT_STR_EQ("*", model.GetVisibleText()); |
198 EXPECT_STR_EQ("X", model.text()); | 194 EXPECT_STR_EQ("X", model.GetText()); |
199 } | 195 } |
200 | 196 |
201 TEST_F(TextfieldViewsModelTest, Word) { | 197 TEST_F(TextfieldViewsModelTest, Word) { |
202 TextfieldViewsModel model(NULL); | 198 TextfieldViewsModel model(NULL); |
203 model.Append( | 199 model.Append( |
204 ASCIIToUTF16("The answer to Life, the Universe, and Everything")); | 200 ASCIIToUTF16("The answer to Life, the Universe, and Everything")); |
205 model.MoveCursorToNextWord(false); | 201 model.MoveCursorRightByWord(false); |
206 EXPECT_EQ(3U, model.cursor_pos()); | 202 EXPECT_EQ(3U, model.GetCursorPosition()); |
207 model.MoveCursorToNextWord(false); | 203 model.MoveCursorRightByWord(false); |
208 EXPECT_EQ(10U, model.cursor_pos()); | 204 EXPECT_EQ(10U, model.GetCursorPosition()); |
209 model.MoveCursorToNextWord(false); | 205 model.MoveCursorRightByWord(false); |
210 model.MoveCursorToNextWord(false); | 206 model.MoveCursorRightByWord(false); |
211 EXPECT_EQ(18U, model.cursor_pos()); | 207 EXPECT_EQ(18U, model.GetCursorPosition()); |
212 | 208 |
213 // Should passes the non word char ',' | 209 // Should passes the non word char ',' |
214 model.MoveCursorToNextWord(true); | 210 model.MoveCursorRightByWord(true); |
215 EXPECT_EQ(23U, model.cursor_pos()); | 211 EXPECT_EQ(23U, model.GetCursorPosition()); |
216 EXPECT_STR_EQ(", the", model.GetSelectedText()); | 212 EXPECT_STR_EQ(", the", model.GetSelectedText()); |
217 | 213 |
218 // Move to the end. | 214 // Move to the end. |
219 model.MoveCursorToNextWord(true); | 215 model.MoveCursorRightByWord(true); |
220 model.MoveCursorToNextWord(true); | 216 model.MoveCursorRightByWord(true); |
221 model.MoveCursorToNextWord(true); | 217 model.MoveCursorRightByWord(true); |
222 EXPECT_STR_EQ(", the Universe, and Everything", model.GetSelectedText()); | 218 EXPECT_STR_EQ(", the Universe, and Everything", model.GetSelectedText()); |
223 // Should be safe to go next word at the end. | 219 // Should be safe to go next word at the end. |
224 model.MoveCursorToNextWord(true); | 220 model.MoveCursorRightByWord(true); |
225 EXPECT_STR_EQ(", the Universe, and Everything", model.GetSelectedText()); | 221 EXPECT_STR_EQ(", the Universe, and Everything", model.GetSelectedText()); |
226 model.InsertChar('2'); | 222 model.InsertChar('2'); |
227 EXPECT_EQ(19U, model.cursor_pos()); | 223 EXPECT_EQ(19U, model.GetCursorPosition()); |
228 | 224 |
229 // Now backwards. | 225 // Now backwards. |
230 model.MoveCursorLeft(false); // leave 2. | 226 model.MoveCursorLeft(false); // leave 2. |
231 model.MoveCursorToPreviousWord(true); | 227 model.MoveCursorLeftByWord(true); |
232 EXPECT_EQ(14U, model.cursor_pos()); | 228 EXPECT_EQ(14U, model.GetCursorPosition()); |
233 EXPECT_STR_EQ("Life", model.GetSelectedText()); | 229 EXPECT_STR_EQ("Life", model.GetSelectedText()); |
234 model.MoveCursorToPreviousWord(true); | 230 model.MoveCursorLeftByWord(true); |
235 EXPECT_STR_EQ("to Life", model.GetSelectedText()); | 231 EXPECT_STR_EQ("to Life", model.GetSelectedText()); |
236 model.MoveCursorToPreviousWord(true); | 232 model.MoveCursorLeftByWord(true); |
237 model.MoveCursorToPreviousWord(true); | 233 model.MoveCursorLeftByWord(true); |
238 model.MoveCursorToPreviousWord(true); // Select to the begining. | 234 model.MoveCursorLeftByWord(true); // Select to the begining. |
239 EXPECT_STR_EQ("The answer to Life", model.GetSelectedText()); | 235 EXPECT_STR_EQ("The answer to Life", model.GetSelectedText()); |
240 // Should be safe to go pervious word at the begining. | 236 // Should be safe to go pervious word at the begining. |
241 model.MoveCursorToPreviousWord(true); | 237 model.MoveCursorLeftByWord(true); |
242 EXPECT_STR_EQ("The answer to Life", model.GetSelectedText()); | 238 EXPECT_STR_EQ("The answer to Life", model.GetSelectedText()); |
243 model.ReplaceChar('4'); | 239 model.ReplaceChar('4'); |
244 EXPECT_EQ(string16(), model.GetSelectedText()); | 240 EXPECT_EQ(string16(), model.GetSelectedText()); |
245 EXPECT_STR_EQ("42", model.GetVisibleText()); | 241 EXPECT_STR_EQ("42", model.GetVisibleText()); |
246 } | 242 } |
247 | 243 |
248 TEST_F(TextfieldViewsModelTest, TextFragment) { | |
249 TextfieldViewsModel model(NULL); | |
250 TextfieldViewsModel::TextFragments fragments; | |
251 // Empty string has no fragment. | |
252 model.GetFragments(&fragments); | |
253 EXPECT_EQ(0U, fragments.size()); | |
254 | |
255 // Some string | |
256 model.Append(ASCIIToUTF16("Hello world")); | |
257 model.GetFragments(&fragments); | |
258 EXPECT_EQ(1U, fragments.size()); | |
259 EXPECT_EQ(0U, fragments[0].range.start()); | |
260 EXPECT_EQ(11U, fragments[0].range.end()); | |
261 | |
262 // Selection won't change fragment. | |
263 model.MoveCursorToNextWord(true); | |
264 model.GetFragments(&fragments); | |
265 EXPECT_EQ(1U, fragments.size()); | |
266 EXPECT_EQ(0U, fragments[0].range.start()); | |
267 EXPECT_EQ(11U, fragments[0].range.end()); | |
268 } | |
269 | |
270 TEST_F(TextfieldViewsModelTest, SetText) { | 244 TEST_F(TextfieldViewsModelTest, SetText) { |
271 TextfieldViewsModel model(NULL); | 245 TextfieldViewsModel model(NULL); |
272 model.Append(ASCIIToUTF16("HELLO")); | 246 model.Append(ASCIIToUTF16("HELLO")); |
273 model.MoveCursorToEnd(false); | 247 model.MoveCursorToRightEnd(false); |
274 model.SetText(ASCIIToUTF16("GOODBYE")); | 248 model.SetText(ASCIIToUTF16("GOODBYE")); |
275 EXPECT_STR_EQ("GOODBYE", model.text()); | 249 EXPECT_STR_EQ("GOODBYE", model.GetText()); |
276 // SetText won't reset the cursor posistion. | 250 // SetText won't reset the cursor posistion. |
277 EXPECT_EQ(5U, model.cursor_pos()); | 251 EXPECT_EQ(5U, model.GetCursorPosition()); |
278 model.SelectAll(); | 252 model.SelectAll(); |
279 EXPECT_STR_EQ("GOODBYE", model.GetSelectedText()); | 253 EXPECT_STR_EQ("GOODBYE", model.GetSelectedText()); |
280 model.MoveCursorToEnd(false); | 254 model.MoveCursorToRightEnd(false); |
281 EXPECT_EQ(7U, model.cursor_pos()); | 255 EXPECT_EQ(7U, model.GetCursorPosition()); |
282 | 256 |
283 model.SetText(ASCIIToUTF16("BYE")); | 257 model.SetText(ASCIIToUTF16("BYE")); |
284 // Setting shorter string moves the cursor to the end of the new string. | 258 // Setting shorter string moves the cursor to the end of the new string. |
285 EXPECT_EQ(3U, model.cursor_pos()); | 259 EXPECT_EQ(3U, model.GetCursorPosition()); |
286 EXPECT_EQ(string16(), model.GetSelectedText()); | 260 EXPECT_EQ(string16(), model.GetSelectedText()); |
287 model.SetText(ASCIIToUTF16("")); | 261 model.SetText(ASCIIToUTF16("")); |
288 EXPECT_EQ(0U, model.cursor_pos()); | 262 EXPECT_EQ(0U, model.GetCursorPosition()); |
289 } | 263 } |
290 | 264 |
291 TEST_F(TextfieldViewsModelTest, Clipboard) { | 265 TEST_F(TextfieldViewsModelTest, Clipboard) { |
292 ui::Clipboard* clipboard | 266 ui::Clipboard* clipboard |
293 = views::ViewsDelegate::views_delegate->GetClipboard(); | 267 = views::ViewsDelegate::views_delegate->GetClipboard(); |
294 string16 initial_clipboard_text; | 268 string16 initial_clipboard_text; |
295 clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &initial_clipboard_text); | 269 clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &initial_clipboard_text); |
296 string16 clipboard_text; | 270 string16 clipboard_text; |
297 TextfieldViewsModel model(NULL); | 271 TextfieldViewsModel model(NULL); |
298 model.Append(ASCIIToUTF16("HELLO WORLD")); | 272 model.Append(ASCIIToUTF16("HELLO WORLD")); |
299 model.MoveCursorToEnd(false); | 273 model.MoveCursorToRightEnd(false); |
300 | 274 |
301 // Test for cut: Empty selection. | 275 // Test for cut: Empty selection. |
302 EXPECT_FALSE(model.Cut()); | 276 EXPECT_FALSE(model.Cut()); |
303 clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &clipboard_text); | 277 clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &clipboard_text); |
304 EXPECT_STR_EQ(UTF16ToUTF8(initial_clipboard_text), clipboard_text); | 278 EXPECT_STR_EQ(UTF16ToUTF8(initial_clipboard_text), clipboard_text); |
305 EXPECT_STR_EQ("HELLO WORLD", model.text()); | 279 EXPECT_STR_EQ("HELLO WORLD", model.GetText()); |
306 EXPECT_EQ(11U, model.cursor_pos()); | 280 EXPECT_EQ(11U, model.GetCursorPosition()); |
307 | 281 |
308 // Test for cut: Non-empty selection. | 282 // Test for cut: Non-empty selection. |
309 model.MoveCursorToPreviousWord(true); | 283 model.MoveCursorLeftByWord(true); |
310 EXPECT_TRUE(model.Cut()); | 284 EXPECT_TRUE(model.Cut()); |
311 clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &clipboard_text); | 285 clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &clipboard_text); |
312 EXPECT_STR_EQ("WORLD", clipboard_text); | 286 EXPECT_STR_EQ("WORLD", clipboard_text); |
313 EXPECT_STR_EQ("HELLO ", model.text()); | 287 EXPECT_STR_EQ("HELLO ", model.GetText()); |
314 EXPECT_EQ(6U, model.cursor_pos()); | 288 EXPECT_EQ(6U, model.GetCursorPosition()); |
315 | 289 |
316 // Test for copy: Empty selection. | 290 // Test for copy: Empty selection. |
317 model.Copy(); | 291 model.Copy(); |
318 clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &clipboard_text); | 292 clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &clipboard_text); |
319 EXPECT_STR_EQ("WORLD", clipboard_text); | 293 EXPECT_STR_EQ("WORLD", clipboard_text); |
320 EXPECT_STR_EQ("HELLO ", model.text()); | 294 EXPECT_STR_EQ("HELLO ", model.GetText()); |
321 EXPECT_EQ(6U, model.cursor_pos()); | 295 EXPECT_EQ(6U, model.GetCursorPosition()); |
322 | 296 |
323 // Test for copy: Non-empty selection. | 297 // Test for copy: Non-empty selection. |
324 model.Append(ASCIIToUTF16("HELLO WORLD")); | 298 model.Append(ASCIIToUTF16("HELLO WORLD")); |
325 model.SelectAll(); | 299 model.SelectAll(); |
326 model.Copy(); | 300 model.Copy(); |
327 clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &clipboard_text); | 301 clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &clipboard_text); |
328 EXPECT_STR_EQ("HELLO HELLO WORLD", clipboard_text); | 302 EXPECT_STR_EQ("HELLO HELLO WORLD", clipboard_text); |
329 EXPECT_STR_EQ("HELLO HELLO WORLD", model.text()); | 303 EXPECT_STR_EQ("HELLO HELLO WORLD", model.GetText()); |
330 EXPECT_EQ(17U, model.cursor_pos()); | 304 EXPECT_EQ(17U, model.GetCursorPosition()); |
331 | 305 |
332 // Test for paste. | 306 // Test for paste. |
333 model.ClearSelection(); | 307 model.ClearSelection(); |
334 model.MoveCursorToEnd(false); | 308 model.MoveCursorToRightEnd(false); |
335 model.MoveCursorToPreviousWord(true); | 309 model.MoveCursorLeftByWord(true); |
336 EXPECT_TRUE(model.Paste()); | 310 EXPECT_TRUE(model.Paste()); |
337 clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &clipboard_text); | 311 clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &clipboard_text); |
338 EXPECT_STR_EQ("HELLO HELLO WORLD", clipboard_text); | 312 EXPECT_STR_EQ("HELLO HELLO WORLD", clipboard_text); |
339 EXPECT_STR_EQ("HELLO HELLO HELLO HELLO WORLD", model.text()); | 313 EXPECT_STR_EQ("HELLO HELLO HELLO HELLO WORLD", model.GetText()); |
340 EXPECT_EQ(29U, model.cursor_pos()); | 314 EXPECT_EQ(29U, model.GetCursorPosition()); |
341 } | 315 } |
342 | 316 |
343 void SelectWordTestVerifier(TextfieldViewsModel &model, | 317 void SelectWordTestVerifier(TextfieldViewsModel &model, |
344 const std::string &expected_selected_string, size_t expected_cursor_pos) { | 318 const std::string &expected_selected_string, size_t expected_cursor_pos) { |
345 EXPECT_STR_EQ(expected_selected_string, model.GetSelectedText()); | 319 EXPECT_STR_EQ(expected_selected_string, model.GetSelectedText()); |
346 EXPECT_EQ(expected_cursor_pos, model.cursor_pos()); | 320 EXPECT_EQ(expected_cursor_pos, model.GetCursorPosition()); |
347 } | 321 } |
348 | 322 |
349 TEST_F(TextfieldViewsModelTest, SelectWordTest) { | 323 TEST_F(TextfieldViewsModelTest, SelectWordTest) { |
350 TextfieldViewsModel model(NULL); | 324 TextfieldViewsModel model(NULL); |
351 model.Append(ASCIIToUTF16(" HELLO !! WO RLD ")); | 325 model.Append(ASCIIToUTF16(" HELLO !! WO RLD ")); |
352 | 326 |
353 // Test when cursor is at the beginning. | 327 // Test when cursor is at the beginning. |
354 model.MoveCursorToHome(false); | 328 model.MoveCursorToLeftEnd(false); |
355 model.SelectWord(); | 329 model.SelectWord(); |
356 SelectWordTestVerifier(model, " ", 2U); | 330 SelectWordTestVerifier(model, " ", 2U); |
357 | 331 |
358 // Test when cursor is at the beginning of a word. | 332 // Test when cursor is at the beginning of a word. |
359 model.MoveCursorTo(2U, false); | 333 model.MoveCursorTo(2U, false); |
360 model.SelectWord(); | 334 model.SelectWord(); |
361 SelectWordTestVerifier(model, "HELLO", 7U); | 335 SelectWordTestVerifier(model, "HELLO", 7U); |
362 | 336 |
363 // Test when cursor is at the end of a word. | 337 // Test when cursor is at the end of a word. |
364 model.MoveCursorTo(15U, false); | 338 model.MoveCursorTo(15U, false); |
365 model.SelectWord(); | 339 model.SelectWord(); |
366 SelectWordTestVerifier(model, "WO", 15U); | 340 SelectWordTestVerifier(model, "WO", 15U); |
367 | 341 |
368 // Test when cursor is somewhere in a non-alph-numeric fragment. | 342 // Test when cursor is somewhere in a non-alph-numeric fragment. |
369 for (size_t cursor_pos = 8; cursor_pos < 13U; cursor_pos++) { | 343 for (size_t cursor_pos = 8; cursor_pos < 13U; cursor_pos++) { |
370 model.MoveCursorTo(cursor_pos, false); | 344 model.MoveCursorTo(cursor_pos, false); |
371 model.SelectWord(); | 345 model.SelectWord(); |
372 SelectWordTestVerifier(model, " !! ", 13U); | 346 SelectWordTestVerifier(model, " !! ", 13U); |
373 } | 347 } |
374 | 348 |
375 // Test when cursor is somewhere in a whitespace fragment. | 349 // Test when cursor is somewhere in a whitespace fragment. |
376 model.MoveCursorTo(17U, false); | 350 model.MoveCursorTo(17U, false); |
377 model.SelectWord(); | 351 model.SelectWord(); |
378 SelectWordTestVerifier(model, " ", 20U); | 352 SelectWordTestVerifier(model, " ", 20U); |
379 | 353 |
380 // Test when cursor is at the end. | 354 // Test when cursor is at the end. |
381 model.MoveCursorToEnd(false); | 355 model.MoveCursorToRightEnd(false); |
382 model.SelectWord(); | 356 model.SelectWord(); |
383 SelectWordTestVerifier(model, " ", 24U); | 357 SelectWordTestVerifier(model, " ", 24U); |
384 } | 358 } |
385 | 359 |
386 TEST_F(TextfieldViewsModelTest, RangeTest) { | 360 TEST_F(TextfieldViewsModelTest, RangeTest) { |
387 TextfieldViewsModel model(NULL); | 361 TextfieldViewsModel model(NULL); |
388 model.Append(ASCIIToUTF16("HELLO WORLD")); | 362 model.Append(ASCIIToUTF16("HELLO WORLD")); |
389 model.MoveCursorToHome(false); | 363 model.MoveCursorToLeftEnd(false); |
390 ui::Range range; | 364 ui::Range range; |
391 model.GetSelectedRange(&range); | 365 model.GetSelectedRange(&range); |
392 EXPECT_TRUE(range.is_empty()); | 366 EXPECT_TRUE(range.is_empty()); |
393 EXPECT_EQ(0U, range.start()); | 367 EXPECT_EQ(0U, range.start()); |
394 EXPECT_EQ(0U, range.end()); | 368 EXPECT_EQ(0U, range.end()); |
395 | 369 |
396 model.MoveCursorToNextWord(true); | 370 model.MoveCursorRightByWord(true); |
397 model.GetSelectedRange(&range); | 371 model.GetSelectedRange(&range); |
398 EXPECT_FALSE(range.is_empty()); | 372 EXPECT_FALSE(range.is_empty()); |
399 EXPECT_FALSE(range.is_reversed()); | 373 EXPECT_FALSE(range.is_reversed()); |
400 EXPECT_EQ(0U, range.start()); | 374 EXPECT_EQ(0U, range.start()); |
401 EXPECT_EQ(5U, range.end()); | 375 EXPECT_EQ(5U, range.end()); |
402 | 376 |
403 model.MoveCursorLeft(true); | 377 model.MoveCursorLeft(true); |
404 model.GetSelectedRange(&range); | 378 model.GetSelectedRange(&range); |
405 EXPECT_FALSE(range.is_empty()); | 379 EXPECT_FALSE(range.is_empty()); |
406 EXPECT_EQ(0U, range.start()); | 380 EXPECT_EQ(0U, range.start()); |
407 EXPECT_EQ(4U, range.end()); | 381 EXPECT_EQ(4U, range.end()); |
408 | 382 |
409 model.MoveCursorToPreviousWord(true); | 383 model.MoveCursorLeftByWord(true); |
410 model.GetSelectedRange(&range); | 384 model.GetSelectedRange(&range); |
411 EXPECT_TRUE(range.is_empty()); | 385 EXPECT_TRUE(range.is_empty()); |
412 EXPECT_EQ(0U, range.start()); | 386 EXPECT_EQ(0U, range.start()); |
413 EXPECT_EQ(0U, range.end()); | 387 EXPECT_EQ(0U, range.end()); |
414 | 388 |
415 // now from the end. | 389 // now from the end. |
416 model.MoveCursorToEnd(false); | 390 model.MoveCursorToRightEnd(false); |
417 model.GetSelectedRange(&range); | 391 model.GetSelectedRange(&range); |
418 EXPECT_TRUE(range.is_empty()); | 392 EXPECT_TRUE(range.is_empty()); |
419 EXPECT_EQ(11U, range.start()); | 393 EXPECT_EQ(11U, range.start()); |
420 EXPECT_EQ(11U, range.end()); | 394 EXPECT_EQ(11U, range.end()); |
421 | 395 |
422 model.MoveCursorToPreviousWord(true); | 396 model.MoveCursorLeftByWord(true); |
423 model.GetSelectedRange(&range); | 397 model.GetSelectedRange(&range); |
424 EXPECT_FALSE(range.is_empty()); | 398 EXPECT_FALSE(range.is_empty()); |
425 EXPECT_TRUE(range.is_reversed()); | 399 EXPECT_TRUE(range.is_reversed()); |
426 EXPECT_EQ(11U, range.start()); | 400 EXPECT_EQ(11U, range.start()); |
427 EXPECT_EQ(6U, range.end()); | 401 EXPECT_EQ(6U, range.end()); |
428 | 402 |
429 model.MoveCursorRight(true); | 403 model.MoveCursorRight(true); |
430 model.GetSelectedRange(&range); | 404 model.GetSelectedRange(&range); |
431 EXPECT_FALSE(range.is_empty()); | 405 EXPECT_FALSE(range.is_empty()); |
432 EXPECT_TRUE(range.is_reversed()); | 406 EXPECT_TRUE(range.is_reversed()); |
433 EXPECT_EQ(11U, range.start()); | 407 EXPECT_EQ(11U, range.start()); |
434 EXPECT_EQ(7U, range.end()); | 408 EXPECT_EQ(7U, range.end()); |
435 | 409 |
436 model.MoveCursorToNextWord(true); | 410 model.MoveCursorRightByWord(true); |
437 model.GetSelectedRange(&range); | 411 model.GetSelectedRange(&range); |
438 EXPECT_TRUE(range.is_empty()); | 412 EXPECT_TRUE(range.is_empty()); |
439 EXPECT_EQ(11U, range.start()); | 413 EXPECT_EQ(11U, range.start()); |
440 EXPECT_EQ(11U, range.end()); | 414 EXPECT_EQ(11U, range.end()); |
441 | 415 |
442 // Select All | 416 // Select All |
443 model.MoveCursorToHome(true); | 417 model.MoveCursorToLeftEnd(true); |
444 model.GetSelectedRange(&range); | 418 model.GetSelectedRange(&range); |
445 EXPECT_FALSE(range.is_empty()); | 419 EXPECT_FALSE(range.is_empty()); |
446 EXPECT_TRUE(range.is_reversed()); | 420 EXPECT_TRUE(range.is_reversed()); |
447 EXPECT_EQ(11U, range.start()); | 421 EXPECT_EQ(11U, range.start()); |
448 EXPECT_EQ(0U, range.end()); | 422 EXPECT_EQ(0U, range.end()); |
449 } | 423 } |
450 | 424 |
451 TEST_F(TextfieldViewsModelTest, SelectRangeTest) { | 425 TEST_F(TextfieldViewsModelTest, SelectRangeTest) { |
452 TextfieldViewsModel model(NULL); | 426 TextfieldViewsModel model(NULL); |
453 model.Append(ASCIIToUTF16("HELLO WORLD")); | 427 model.Append(ASCIIToUTF16("HELLO WORLD")); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
490 EXPECT_TRUE(range.is_empty()); | 464 EXPECT_TRUE(range.is_empty()); |
491 model.SelectRange(range); | 465 model.SelectRange(range); |
492 EXPECT_TRUE(model.GetSelectedText().empty()); | 466 EXPECT_TRUE(model.GetSelectedText().empty()); |
493 } | 467 } |
494 | 468 |
495 TEST_F(TextfieldViewsModelTest, CompositionTextTest) { | 469 TEST_F(TextfieldViewsModelTest, CompositionTextTest) { |
496 TextfieldViewsModel model(this); | 470 TextfieldViewsModel model(this); |
497 model.Append(ASCIIToUTF16("1234590")); | 471 model.Append(ASCIIToUTF16("1234590")); |
498 model.SelectRange(ui::Range(5, 5)); | 472 model.SelectRange(ui::Range(5, 5)); |
499 EXPECT_FALSE(model.HasSelection()); | 473 EXPECT_FALSE(model.HasSelection()); |
500 EXPECT_EQ(5U, model.cursor_pos()); | 474 EXPECT_EQ(5U, model.GetCursorPosition()); |
501 | 475 |
502 ui::Range range; | 476 ui::Range range; |
503 model.GetTextRange(&range); | 477 model.GetTextRange(&range); |
504 EXPECT_EQ(0U, range.start()); | 478 EXPECT_EQ(0U, range.start()); |
505 EXPECT_EQ(7U, range.end()); | 479 EXPECT_EQ(7U, range.end()); |
506 | 480 |
507 ui::CompositionText composition; | 481 ui::CompositionText composition; |
508 composition.text = ASCIIToUTF16("678"); | 482 composition.text = ASCIIToUTF16("678"); |
509 composition.underlines.push_back(ui::CompositionUnderline(0, 3, 0, false)); | 483 composition.underlines.push_back(ui::CompositionUnderline(0, 3, 0, false)); |
510 composition.selection = ui::Range(2, 3); | 484 composition.selection = ui::Range(2, 3); |
511 model.SetCompositionText(composition); | 485 model.SetCompositionText(composition); |
512 EXPECT_TRUE(model.HasCompositionText()); | 486 EXPECT_TRUE(model.HasCompositionText()); |
513 EXPECT_TRUE(model.HasSelection()); | 487 EXPECT_TRUE(model.HasSelection()); |
514 | 488 |
515 model.GetTextRange(&range); | 489 model.GetTextRange(&range); |
516 EXPECT_EQ(10U, range.end()); | 490 EXPECT_EQ(10U, range.end()); |
517 EXPECT_STR_EQ("1234567890", model.text()); | 491 EXPECT_STR_EQ("1234567890", model.GetText()); |
518 | 492 |
519 model.GetCompositionTextRange(&range); | 493 model.GetCompositionTextRange(&range); |
520 EXPECT_EQ(5U, range.start()); | 494 EXPECT_EQ(5U, range.start()); |
521 EXPECT_EQ(8U, range.end()); | 495 EXPECT_EQ(8U, range.end()); |
522 // composition text | 496 // composition text |
523 EXPECT_STR_EQ("456", model.GetTextFromRange(ui::Range(3, 6))); | 497 EXPECT_STR_EQ("456", model.GetTextFromRange(ui::Range(3, 6))); |
524 | 498 |
525 model.GetSelectedRange(&range); | 499 model.GetSelectedRange(&range); |
526 EXPECT_EQ(7U, range.start()); | 500 EXPECT_EQ(7U, range.start()); |
527 EXPECT_EQ(8U, range.end()); | 501 EXPECT_EQ(8U, range.end()); |
528 EXPECT_STR_EQ("8", model.GetSelectedText()); | 502 EXPECT_STR_EQ("8", model.GetSelectedText()); |
529 | 503 |
530 TextfieldViewsModel::TextFragments fragments; | 504 // TODO(msw): Test composition style? |
531 model.GetFragments(&fragments); | |
532 EXPECT_EQ(3U, fragments.size()); | |
533 EXPECT_EQ(0U, fragments[0].range.start()); | |
534 EXPECT_EQ(5U, fragments[0].range.end()); | |
535 EXPECT_FALSE(fragments[0].style->underline()); | |
536 | |
537 EXPECT_EQ(5U, fragments[1].range.start()); | |
538 EXPECT_EQ(8U, fragments[1].range.end()); | |
539 EXPECT_TRUE(fragments[1].style->underline()); | |
540 | |
541 EXPECT_EQ(8U, fragments[2].range.start()); | |
542 EXPECT_EQ(10U, fragments[2].range.end()); | |
543 EXPECT_FALSE(fragments[2].style->underline()); | |
544 | 505 |
545 EXPECT_FALSE(composition_text_confirmed_or_cleared_); | 506 EXPECT_FALSE(composition_text_confirmed_or_cleared_); |
546 model.CancelCompositionText(); | 507 model.CancelCompositionText(); |
547 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 508 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
548 composition_text_confirmed_or_cleared_ = false; | 509 composition_text_confirmed_or_cleared_ = false; |
549 EXPECT_FALSE(model.HasCompositionText()); | 510 EXPECT_FALSE(model.HasCompositionText()); |
550 EXPECT_FALSE(model.HasSelection()); | 511 EXPECT_FALSE(model.HasSelection()); |
551 EXPECT_EQ(5U, model.cursor_pos()); | 512 EXPECT_EQ(5U, model.GetCursorPosition()); |
552 | 513 |
553 model.SetCompositionText(composition); | 514 model.SetCompositionText(composition); |
554 EXPECT_STR_EQ("1234567890", model.text()); | 515 EXPECT_STR_EQ("1234567890", model.GetText()); |
555 EXPECT_TRUE(model.SetText(ASCIIToUTF16("1234567890"))); | 516 EXPECT_TRUE(model.SetText(ASCIIToUTF16("1234567890"))); |
556 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 517 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
557 composition_text_confirmed_or_cleared_ = false; | 518 composition_text_confirmed_or_cleared_ = false; |
558 model.MoveCursorToEnd(false); | 519 model.MoveCursorToRightEnd(false); |
559 | 520 |
560 model.SetCompositionText(composition); | 521 model.SetCompositionText(composition); |
561 EXPECT_STR_EQ("1234567890678", model.text()); | 522 EXPECT_STR_EQ("1234567890678", model.GetText()); |
562 | 523 |
563 model.InsertText(UTF8ToUTF16("-")); | 524 model.InsertText(UTF8ToUTF16("-")); |
564 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 525 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
565 composition_text_confirmed_or_cleared_ = false; | 526 composition_text_confirmed_or_cleared_ = false; |
566 EXPECT_STR_EQ("1234567890-", model.text()); | 527 EXPECT_STR_EQ("1234567890-", model.GetText()); |
567 EXPECT_FALSE(model.HasCompositionText()); | 528 EXPECT_FALSE(model.HasCompositionText()); |
568 EXPECT_FALSE(model.HasSelection()); | 529 EXPECT_FALSE(model.HasSelection()); |
569 | 530 |
570 model.MoveCursorLeft(true); | 531 model.MoveCursorLeft(true); |
571 EXPECT_STR_EQ("-", model.GetSelectedText()); | 532 EXPECT_STR_EQ("-", model.GetSelectedText()); |
572 model.SetCompositionText(composition); | 533 model.SetCompositionText(composition); |
573 EXPECT_STR_EQ("1234567890678", model.text()); | 534 EXPECT_STR_EQ("1234567890678", model.GetText()); |
574 | 535 |
575 model.ReplaceText(UTF8ToUTF16("-")); | 536 model.ReplaceText(UTF8ToUTF16("-")); |
576 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 537 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
577 composition_text_confirmed_or_cleared_ = false; | 538 composition_text_confirmed_or_cleared_ = false; |
578 EXPECT_STR_EQ("1234567890-", model.text()); | 539 EXPECT_STR_EQ("1234567890-", model.GetText()); |
579 EXPECT_FALSE(model.HasCompositionText()); | 540 EXPECT_FALSE(model.HasCompositionText()); |
580 EXPECT_FALSE(model.HasSelection()); | 541 EXPECT_FALSE(model.HasSelection()); |
581 | 542 |
582 model.SetCompositionText(composition); | 543 model.SetCompositionText(composition); |
583 model.Append(UTF8ToUTF16("-")); | 544 model.Append(UTF8ToUTF16("-")); |
584 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 545 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
585 composition_text_confirmed_or_cleared_ = false; | 546 composition_text_confirmed_or_cleared_ = false; |
586 EXPECT_STR_EQ("1234567890-678-", model.text()); | 547 EXPECT_STR_EQ("1234567890-678-", model.GetText()); |
587 | 548 |
588 model.SetCompositionText(composition); | 549 model.SetCompositionText(composition); |
589 model.Delete(); | 550 model.Delete(); |
590 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 551 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
591 composition_text_confirmed_or_cleared_ = false; | 552 composition_text_confirmed_or_cleared_ = false; |
592 EXPECT_STR_EQ("1234567890-678-", model.text()); | 553 EXPECT_STR_EQ("1234567890-678-", model.GetText()); |
593 | 554 |
594 model.SetCompositionText(composition); | 555 model.SetCompositionText(composition); |
595 model.Backspace(); | 556 model.Backspace(); |
596 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 557 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
597 composition_text_confirmed_or_cleared_ = false; | 558 composition_text_confirmed_or_cleared_ = false; |
598 EXPECT_STR_EQ("1234567890-678-", model.text()); | 559 EXPECT_STR_EQ("1234567890-678-", model.GetText()); |
599 | 560 |
600 model.SetText(string16()); | 561 model.SetText(string16()); |
601 model.SetCompositionText(composition); | 562 model.SetCompositionText(composition); |
602 model.MoveCursorLeft(false); | 563 model.MoveCursorLeft(false); |
603 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 564 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
604 composition_text_confirmed_or_cleared_ = false; | 565 composition_text_confirmed_or_cleared_ = false; |
605 EXPECT_STR_EQ("678", model.text()); | 566 EXPECT_STR_EQ("678", model.GetText()); |
606 EXPECT_EQ(2U, model.cursor_pos()); | 567 EXPECT_EQ(2U, model.GetCursorPosition()); |
607 | 568 |
608 model.SetCompositionText(composition); | 569 model.SetCompositionText(composition); |
609 model.MoveCursorRight(false); | 570 model.MoveCursorRight(false); |
610 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 571 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
611 composition_text_confirmed_or_cleared_ = false; | 572 composition_text_confirmed_or_cleared_ = false; |
612 EXPECT_STR_EQ("676788", model.text()); | 573 EXPECT_STR_EQ("676788", model.GetText()); |
613 EXPECT_EQ(6U, model.cursor_pos()); | 574 EXPECT_EQ(6U, model.GetCursorPosition()); |
614 | 575 |
615 model.SetCompositionText(composition); | 576 model.SetCompositionText(composition); |
616 model.MoveCursorToPreviousWord(false); | 577 model.MoveCursorLeftByWord(false); |
617 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 578 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
618 composition_text_confirmed_or_cleared_ = false; | 579 composition_text_confirmed_or_cleared_ = false; |
619 EXPECT_STR_EQ("676788678", model.text()); | 580 EXPECT_STR_EQ("676788678", model.GetText()); |
620 | 581 |
621 model.SetText(string16()); | 582 model.SetText(string16()); |
622 model.SetCompositionText(composition); | 583 model.SetCompositionText(composition); |
623 model.MoveCursorToNextWord(false); | 584 model.MoveCursorRightByWord(false); |
624 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 585 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
625 composition_text_confirmed_or_cleared_ = false; | 586 composition_text_confirmed_or_cleared_ = false; |
626 | 587 |
627 model.SetCompositionText(composition); | 588 model.SetCompositionText(composition); |
628 model.MoveCursorToHome(true); | 589 model.MoveCursorToLeftEnd(true); |
629 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 590 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
630 composition_text_confirmed_or_cleared_ = false; | 591 composition_text_confirmed_or_cleared_ = false; |
631 EXPECT_STR_EQ("678678", model.text()); | 592 EXPECT_STR_EQ("678678", model.GetText()); |
632 | 593 |
633 model.SetCompositionText(composition); | 594 model.SetCompositionText(composition); |
634 model.MoveCursorToEnd(false); | 595 model.MoveCursorToRightEnd(false); |
635 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 596 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
636 composition_text_confirmed_or_cleared_ = false; | 597 composition_text_confirmed_or_cleared_ = false; |
637 EXPECT_STR_EQ("678", model.text()); | 598 EXPECT_STR_EQ("678", model.GetText()); |
638 | 599 |
639 model.SetCompositionText(composition); | 600 model.SetCompositionText(composition); |
640 model.MoveCursorTo(0, true); | 601 model.MoveCursorTo(0, true); |
641 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 602 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
642 composition_text_confirmed_or_cleared_ = false; | 603 composition_text_confirmed_or_cleared_ = false; |
643 EXPECT_STR_EQ("678678", model.text()); | 604 EXPECT_STR_EQ("678678", model.GetText()); |
644 | 605 |
645 model.SetCompositionText(composition); | 606 model.SetCompositionText(composition); |
646 model.SelectRange(ui::Range(0, 3)); | 607 model.SelectRange(ui::Range(0, 3)); |
647 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 608 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
648 composition_text_confirmed_or_cleared_ = false; | 609 composition_text_confirmed_or_cleared_ = false; |
649 EXPECT_STR_EQ("678", model.text()); | 610 EXPECT_STR_EQ("678", model.GetText()); |
650 | 611 |
651 model.SetCompositionText(composition); | 612 model.SetCompositionText(composition); |
652 model.SelectAll(); | 613 model.SelectAll(); |
653 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 614 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
654 composition_text_confirmed_or_cleared_ = false; | 615 composition_text_confirmed_or_cleared_ = false; |
655 EXPECT_STR_EQ("678", model.text()); | 616 EXPECT_STR_EQ("678", model.GetText()); |
656 | 617 |
657 model.SetCompositionText(composition); | 618 model.SetCompositionText(composition); |
658 model.SelectWord(); | 619 model.SelectWord(); |
659 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 620 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
660 composition_text_confirmed_or_cleared_ = false; | 621 composition_text_confirmed_or_cleared_ = false; |
661 EXPECT_STR_EQ("678", model.text()); | 622 EXPECT_STR_EQ("678", model.GetText()); |
662 | 623 |
663 model.SetCompositionText(composition); | 624 model.SetCompositionText(composition); |
664 model.ClearSelection(); | 625 model.ClearSelection(); |
665 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 626 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
666 composition_text_confirmed_or_cleared_ = false; | 627 composition_text_confirmed_or_cleared_ = false; |
667 | 628 |
668 model.SetCompositionText(composition); | 629 model.SetCompositionText(composition); |
669 EXPECT_FALSE(model.Cut()); | 630 EXPECT_FALSE(model.Cut()); |
670 EXPECT_FALSE(composition_text_confirmed_or_cleared_); | 631 EXPECT_FALSE(composition_text_confirmed_or_cleared_); |
671 } | 632 } |
672 | 633 |
673 TEST_F(TextfieldViewsModelTest, UndoRedo_BasicTest) { | 634 TEST_F(TextfieldViewsModelTest, UndoRedo_BasicTest) { |
674 TextfieldViewsModel model(NULL); | 635 TextfieldViewsModel model(NULL); |
675 model.InsertChar('a'); | 636 model.InsertChar('a'); |
676 EXPECT_FALSE(model.Redo()); // nothing to redo | 637 EXPECT_FALSE(model.Redo()); // nothing to redo |
677 EXPECT_TRUE(model.Undo()); | 638 EXPECT_TRUE(model.Undo()); |
678 EXPECT_STR_EQ("", model.text()); | 639 EXPECT_STR_EQ("", model.GetText()); |
679 EXPECT_TRUE(model.Redo()); | 640 EXPECT_TRUE(model.Redo()); |
680 EXPECT_STR_EQ("a", model.text()); | 641 EXPECT_STR_EQ("a", model.GetText()); |
681 | 642 |
682 // Continuous inserts are treated as one edit. | 643 // Continuous inserts are treated as one edit. |
683 model.InsertChar('b'); | 644 model.InsertChar('b'); |
684 model.InsertChar('c'); | 645 model.InsertChar('c'); |
685 EXPECT_STR_EQ("abc", model.text()); | 646 EXPECT_STR_EQ("abc", model.GetText()); |
686 EXPECT_TRUE(model.Undo()); | 647 EXPECT_TRUE(model.Undo()); |
687 EXPECT_STR_EQ("a", model.text()); | 648 EXPECT_STR_EQ("a", model.GetText()); |
688 EXPECT_EQ(1U, model.cursor_pos()); | 649 EXPECT_EQ(1U, model.GetCursorPosition()); |
689 EXPECT_TRUE(model.Undo()); | 650 EXPECT_TRUE(model.Undo()); |
690 EXPECT_STR_EQ("", model.text()); | 651 EXPECT_STR_EQ("", model.GetText()); |
691 EXPECT_EQ(0U, model.cursor_pos()); | 652 EXPECT_EQ(0U, model.GetCursorPosition()); |
692 | 653 |
693 // Undoing further shouldn't change the text. | 654 // Undoing further shouldn't change the text. |
694 EXPECT_FALSE(model.Undo()); | 655 EXPECT_FALSE(model.Undo()); |
695 EXPECT_STR_EQ("", model.text()); | 656 EXPECT_STR_EQ("", model.GetText()); |
696 EXPECT_FALSE(model.Undo()); | 657 EXPECT_FALSE(model.Undo()); |
697 EXPECT_STR_EQ("", model.text()); | 658 EXPECT_STR_EQ("", model.GetText()); |
698 EXPECT_EQ(0U, model.cursor_pos()); | 659 EXPECT_EQ(0U, model.GetCursorPosition()); |
699 | 660 |
700 // Redoing to the latest text. | 661 // Redoing to the latest text. |
701 EXPECT_TRUE(model.Redo()); | 662 EXPECT_TRUE(model.Redo()); |
702 EXPECT_STR_EQ("a", model.text()); | 663 EXPECT_STR_EQ("a", model.GetText()); |
703 EXPECT_EQ(1U, model.cursor_pos()); | 664 EXPECT_EQ(1U, model.GetCursorPosition()); |
704 EXPECT_TRUE(model.Redo()); | 665 EXPECT_TRUE(model.Redo()); |
705 EXPECT_STR_EQ("abc", model.text()); | 666 EXPECT_STR_EQ("abc", model.GetText()); |
706 EXPECT_EQ(3U, model.cursor_pos()); | 667 EXPECT_EQ(3U, model.GetCursorPosition()); |
707 | 668 |
708 // Backspace =============================== | 669 // Backspace =============================== |
709 EXPECT_TRUE(model.Backspace()); | 670 EXPECT_TRUE(model.Backspace()); |
710 EXPECT_STR_EQ("ab", model.text()); | 671 EXPECT_STR_EQ("ab", model.GetText()); |
711 EXPECT_TRUE(model.Undo()); | 672 EXPECT_TRUE(model.Undo()); |
712 EXPECT_STR_EQ("abc", model.text()); | 673 EXPECT_STR_EQ("abc", model.GetText()); |
713 EXPECT_EQ(3U, model.cursor_pos()); | 674 EXPECT_EQ(3U, model.GetCursorPosition()); |
714 EXPECT_TRUE(model.Redo()); | 675 EXPECT_TRUE(model.Redo()); |
715 EXPECT_STR_EQ("ab", model.text()); | 676 EXPECT_STR_EQ("ab", model.GetText()); |
716 EXPECT_EQ(2U, model.cursor_pos()); | 677 EXPECT_EQ(2U, model.GetCursorPosition()); |
717 // Continous backspaces are treated as one edit. | 678 // Continous backspaces are treated as one edit. |
718 EXPECT_TRUE(model.Backspace()); | 679 EXPECT_TRUE(model.Backspace()); |
719 EXPECT_TRUE(model.Backspace()); | 680 EXPECT_TRUE(model.Backspace()); |
720 EXPECT_STR_EQ("", model.text()); | 681 EXPECT_STR_EQ("", model.GetText()); |
721 // Extra backspace shouldn't affect the history. | 682 // Extra backspace shouldn't affect the history. |
722 EXPECT_FALSE(model.Backspace()); | 683 EXPECT_FALSE(model.Backspace()); |
723 EXPECT_TRUE(model.Undo()); | 684 EXPECT_TRUE(model.Undo()); |
724 EXPECT_STR_EQ("ab", model.text()); | 685 EXPECT_STR_EQ("ab", model.GetText()); |
725 EXPECT_EQ(2U, model.cursor_pos()); | 686 EXPECT_EQ(2U, model.GetCursorPosition()); |
726 EXPECT_TRUE(model.Undo()); | 687 EXPECT_TRUE(model.Undo()); |
727 EXPECT_STR_EQ("abc", model.text()); | 688 EXPECT_STR_EQ("abc", model.GetText()); |
728 EXPECT_EQ(3U, model.cursor_pos()); | 689 EXPECT_EQ(3U, model.GetCursorPosition()); |
729 EXPECT_TRUE(model.Undo()); | 690 EXPECT_TRUE(model.Undo()); |
730 EXPECT_STR_EQ("a", model.text()); | 691 EXPECT_STR_EQ("a", model.GetText()); |
731 EXPECT_EQ(1U, model.cursor_pos()); | 692 EXPECT_EQ(1U, model.GetCursorPosition()); |
732 | 693 |
733 // Clear history | 694 // Clear history |
734 model.ClearEditHistory(); | 695 model.ClearEditHistory(); |
735 EXPECT_FALSE(model.Undo()); | 696 EXPECT_FALSE(model.Undo()); |
736 EXPECT_FALSE(model.Redo()); | 697 EXPECT_FALSE(model.Redo()); |
737 EXPECT_STR_EQ("a", model.text()); | 698 EXPECT_STR_EQ("a", model.GetText()); |
738 EXPECT_EQ(1U, model.cursor_pos()); | 699 EXPECT_EQ(1U, model.GetCursorPosition()); |
739 | 700 |
740 // Delete =============================== | 701 // Delete =============================== |
741 model.SetText(ASCIIToUTF16("ABCDE")); | 702 model.SetText(ASCIIToUTF16("ABCDE")); |
742 model.ClearEditHistory(); | 703 model.ClearEditHistory(); |
743 model.MoveCursorTo(2, false); | 704 model.MoveCursorTo(2, false); |
744 EXPECT_TRUE(model.Delete()); | 705 EXPECT_TRUE(model.Delete()); |
745 EXPECT_STR_EQ("ABDE", model.text()); | 706 EXPECT_STR_EQ("ABDE", model.GetText()); |
746 model.MoveCursorToHome(false); | 707 model.MoveCursorToLeftEnd(false); |
747 EXPECT_TRUE(model.Delete()); | 708 EXPECT_TRUE(model.Delete()); |
748 EXPECT_STR_EQ("BDE", model.text()); | 709 EXPECT_STR_EQ("BDE", model.GetText()); |
749 EXPECT_TRUE(model.Undo()); | 710 EXPECT_TRUE(model.Undo()); |
750 EXPECT_STR_EQ("ABDE", model.text()); | 711 EXPECT_STR_EQ("ABDE", model.GetText()); |
751 EXPECT_EQ(0U, model.cursor_pos()); | 712 EXPECT_EQ(0U, model.GetCursorPosition()); |
752 EXPECT_TRUE(model.Undo()); | 713 EXPECT_TRUE(model.Undo()); |
753 EXPECT_STR_EQ("ABCDE", model.text()); | 714 EXPECT_STR_EQ("ABCDE", model.GetText()); |
754 EXPECT_EQ(2U, model.cursor_pos()); | 715 EXPECT_EQ(2U, model.GetCursorPosition()); |
755 EXPECT_TRUE(model.Redo()); | 716 EXPECT_TRUE(model.Redo()); |
756 EXPECT_STR_EQ("ABDE", model.text()); | 717 EXPECT_STR_EQ("ABDE", model.GetText()); |
757 EXPECT_EQ(2U, model.cursor_pos()); | 718 EXPECT_EQ(2U, model.GetCursorPosition()); |
758 // Continous deletes are treated as one edit. | 719 // Continous deletes are treated as one edit. |
759 EXPECT_TRUE(model.Delete()); | 720 EXPECT_TRUE(model.Delete()); |
760 EXPECT_TRUE(model.Delete()); | 721 EXPECT_TRUE(model.Delete()); |
761 EXPECT_STR_EQ("AB", model.text()); | 722 EXPECT_STR_EQ("AB", model.GetText()); |
762 EXPECT_TRUE(model.Undo()); | 723 EXPECT_TRUE(model.Undo()); |
763 EXPECT_STR_EQ("ABDE", model.text()); | 724 EXPECT_STR_EQ("ABDE", model.GetText()); |
764 EXPECT_EQ(2U, model.cursor_pos()); | 725 EXPECT_EQ(2U, model.GetCursorPosition()); |
765 EXPECT_TRUE(model.Redo()); | 726 EXPECT_TRUE(model.Redo()); |
766 EXPECT_STR_EQ("AB", model.text()); | 727 EXPECT_STR_EQ("AB", model.GetText()); |
767 EXPECT_EQ(2U, model.cursor_pos()); | 728 EXPECT_EQ(2U, model.GetCursorPosition()); |
768 } | 729 } |
769 | 730 |
770 TEST_F(TextfieldViewsModelTest, UndoRedo_SetText) { | 731 TEST_F(TextfieldViewsModelTest, UndoRedo_SetText) { |
771 // This is to test the undo/redo behavior of omnibox. | 732 // This is to test the undo/redo behavior of omnibox. |
772 TextfieldViewsModel model(NULL); | 733 TextfieldViewsModel model(NULL); |
773 model.InsertChar('w'); | 734 model.InsertChar('w'); |
774 EXPECT_STR_EQ("w", model.text()); | 735 EXPECT_STR_EQ("w", model.GetText()); |
775 EXPECT_EQ(1U, model.cursor_pos()); | 736 EXPECT_EQ(1U, model.GetCursorPosition()); |
776 model.SetText(ASCIIToUTF16("www.google.com")); | 737 model.SetText(ASCIIToUTF16("www.google.com")); |
777 EXPECT_EQ(1U, model.cursor_pos()); | 738 EXPECT_EQ(1U, model.GetCursorPosition()); |
778 EXPECT_STR_EQ("www.google.com", model.text()); | 739 EXPECT_STR_EQ("www.google.com", model.GetText()); |
779 model.SelectRange(ui::Range(14, 1)); | 740 model.SelectRange(ui::Range(14, 1)); |
780 model.InsertChar('w'); | 741 model.InsertChar('w'); |
781 EXPECT_STR_EQ("ww", model.text()); | 742 EXPECT_STR_EQ("ww", model.GetText()); |
782 model.SetText(ASCIIToUTF16("www.google.com")); | 743 model.SetText(ASCIIToUTF16("www.google.com")); |
783 model.SelectRange(ui::Range(14, 2)); | 744 model.SelectRange(ui::Range(14, 2)); |
784 model.InsertChar('w'); | 745 model.InsertChar('w'); |
785 EXPECT_STR_EQ("www", model.text()); | 746 EXPECT_STR_EQ("www", model.GetText()); |
786 model.SetText(ASCIIToUTF16("www.google.com")); | 747 model.SetText(ASCIIToUTF16("www.google.com")); |
787 model.SelectRange(ui::Range(14, 3)); | 748 model.SelectRange(ui::Range(14, 3)); |
788 model.InsertChar('.'); | 749 model.InsertChar('.'); |
789 EXPECT_STR_EQ("www.", model.text()); | 750 EXPECT_STR_EQ("www.", model.GetText()); |
790 model.SetText(ASCIIToUTF16("www.google.com")); | 751 model.SetText(ASCIIToUTF16("www.google.com")); |
791 model.SelectRange(ui::Range(14, 4)); | 752 model.SelectRange(ui::Range(14, 4)); |
792 model.InsertChar('y'); | 753 model.InsertChar('y'); |
793 EXPECT_STR_EQ("www.y", model.text()); | 754 EXPECT_STR_EQ("www.y", model.GetText()); |
794 model.SetText(ASCIIToUTF16("www.youtube.com")); | 755 model.SetText(ASCIIToUTF16("www.youtube.com")); |
795 EXPECT_STR_EQ("www.youtube.com", model.text()); | 756 EXPECT_STR_EQ("www.youtube.com", model.GetText()); |
796 EXPECT_EQ(5U, model.cursor_pos()); | 757 EXPECT_EQ(5U, model.GetCursorPosition()); |
797 | 758 |
798 EXPECT_TRUE(model.Undo()); | 759 EXPECT_TRUE(model.Undo()); |
799 EXPECT_STR_EQ("www.google.com", model.text()); | 760 EXPECT_STR_EQ("www.google.com", model.GetText()); |
800 EXPECT_EQ(4U, model.cursor_pos()); | 761 EXPECT_EQ(4U, model.GetCursorPosition()); |
801 EXPECT_TRUE(model.Undo()); | 762 EXPECT_TRUE(model.Undo()); |
802 EXPECT_STR_EQ("www.google.com", model.text()); | 763 EXPECT_STR_EQ("www.google.com", model.GetText()); |
803 EXPECT_EQ(3U, model.cursor_pos()); | 764 EXPECT_EQ(3U, model.GetCursorPosition()); |
804 EXPECT_TRUE(model.Undo()); | 765 EXPECT_TRUE(model.Undo()); |
805 EXPECT_STR_EQ("www.google.com", model.text()); | 766 EXPECT_STR_EQ("www.google.com", model.GetText()); |
806 EXPECT_EQ(2U, model.cursor_pos()); | 767 EXPECT_EQ(2U, model.GetCursorPosition()); |
807 EXPECT_TRUE(model.Undo()); | 768 EXPECT_TRUE(model.Undo()); |
808 EXPECT_STR_EQ("www.google.com", model.text()); | 769 EXPECT_STR_EQ("www.google.com", model.GetText()); |
809 EXPECT_EQ(1U, model.cursor_pos()); | 770 EXPECT_EQ(1U, model.GetCursorPosition()); |
810 EXPECT_TRUE(model.Undo()); | 771 EXPECT_TRUE(model.Undo()); |
811 EXPECT_STR_EQ("", model.text()); | 772 EXPECT_STR_EQ("", model.GetText()); |
812 EXPECT_EQ(0U, model.cursor_pos()); | 773 EXPECT_EQ(0U, model.GetCursorPosition()); |
813 EXPECT_FALSE(model.Undo()); | 774 EXPECT_FALSE(model.Undo()); |
814 EXPECT_TRUE(model.Redo()); | 775 EXPECT_TRUE(model.Redo()); |
815 EXPECT_STR_EQ("www.google.com", model.text()); | 776 EXPECT_STR_EQ("www.google.com", model.GetText()); |
816 EXPECT_EQ(1U, model.cursor_pos()); | 777 EXPECT_EQ(1U, model.GetCursorPosition()); |
817 EXPECT_TRUE(model.Redo()); | 778 EXPECT_TRUE(model.Redo()); |
818 EXPECT_STR_EQ("www.google.com", model.text()); | 779 EXPECT_STR_EQ("www.google.com", model.GetText()); |
819 EXPECT_EQ(2U, model.cursor_pos()); | 780 EXPECT_EQ(2U, model.GetCursorPosition()); |
820 EXPECT_TRUE(model.Redo()); | 781 EXPECT_TRUE(model.Redo()); |
821 EXPECT_STR_EQ("www.google.com", model.text()); | 782 EXPECT_STR_EQ("www.google.com", model.GetText()); |
822 EXPECT_EQ(3U, model.cursor_pos()); | 783 EXPECT_EQ(3U, model.GetCursorPosition()); |
823 EXPECT_TRUE(model.Redo()); | 784 EXPECT_TRUE(model.Redo()); |
824 EXPECT_STR_EQ("www.google.com", model.text()); | 785 EXPECT_STR_EQ("www.google.com", model.GetText()); |
825 EXPECT_EQ(4U, model.cursor_pos()); | 786 EXPECT_EQ(4U, model.GetCursorPosition()); |
826 EXPECT_TRUE(model.Redo()); | 787 EXPECT_TRUE(model.Redo()); |
827 EXPECT_STR_EQ("www.youtube.com", model.text()); | 788 EXPECT_STR_EQ("www.youtube.com", model.GetText()); |
828 EXPECT_EQ(5U, model.cursor_pos()); | 789 EXPECT_EQ(5U, model.GetCursorPosition()); |
829 EXPECT_FALSE(model.Redo()); | 790 EXPECT_FALSE(model.Redo()); |
830 } | 791 } |
831 | 792 |
832 TEST_F(TextfieldViewsModelTest, UndoRedo_CutCopyPasteTest) { | 793 TEST_F(TextfieldViewsModelTest, UndoRedo_CutCopyPasteTest) { |
833 TextfieldViewsModel model(NULL); | 794 TextfieldViewsModel model(NULL); |
834 model.SetText(ASCIIToUTF16("ABCDE")); | 795 model.SetText(ASCIIToUTF16("ABCDE")); |
835 EXPECT_FALSE(model.Redo()); // nothing to redo | 796 EXPECT_FALSE(model.Redo()); // nothing to redo |
836 // Cut | 797 // Cut |
837 model.MoveCursorTo(1, false); | 798 model.MoveCursorTo(1, false); |
838 model.MoveCursorTo(3, true); | 799 model.MoveCursorTo(3, true); |
839 model.Cut(); | 800 model.Cut(); |
840 EXPECT_STR_EQ("ADE", model.text()); | 801 EXPECT_STR_EQ("ADE", model.GetText()); |
841 EXPECT_EQ(1U, model.cursor_pos()); | 802 EXPECT_EQ(1U, model.GetCursorPosition()); |
842 EXPECT_TRUE(model.Undo()); | 803 EXPECT_TRUE(model.Undo()); |
843 EXPECT_STR_EQ("ABCDE", model.text()); | 804 EXPECT_STR_EQ("ABCDE", model.GetText()); |
844 EXPECT_EQ(3U, model.cursor_pos()); | 805 EXPECT_EQ(3U, model.GetCursorPosition()); |
845 EXPECT_TRUE(model.Undo()); | 806 EXPECT_TRUE(model.Undo()); |
846 EXPECT_STR_EQ("", model.text()); | 807 EXPECT_STR_EQ("", model.GetText()); |
847 EXPECT_EQ(0U, model.cursor_pos()); | 808 EXPECT_EQ(0U, model.GetCursorPosition()); |
848 EXPECT_FALSE(model.Undo()); // no more undo | 809 EXPECT_FALSE(model.Undo()); // no more undo |
849 EXPECT_STR_EQ("", model.text()); | 810 EXPECT_STR_EQ("", model.GetText()); |
850 EXPECT_TRUE(model.Redo()); | 811 EXPECT_TRUE(model.Redo()); |
851 EXPECT_STR_EQ("ABCDE", model.text()); | 812 EXPECT_STR_EQ("ABCDE", model.GetText()); |
852 EXPECT_EQ(0U, model.cursor_pos()); | 813 EXPECT_EQ(0U, model.GetCursorPosition()); |
853 EXPECT_TRUE(model.Redo()); | 814 EXPECT_TRUE(model.Redo()); |
854 EXPECT_STR_EQ("ADE", model.text()); | 815 EXPECT_STR_EQ("ADE", model.GetText()); |
855 EXPECT_EQ(1U, model.cursor_pos()); | 816 EXPECT_EQ(1U, model.GetCursorPosition()); |
856 EXPECT_FALSE(model.Redo()); // no more redo | 817 EXPECT_FALSE(model.Redo()); // no more redo |
857 EXPECT_STR_EQ("ADE", model.text()); | 818 EXPECT_STR_EQ("ADE", model.GetText()); |
858 | 819 |
859 model.Paste(); | 820 model.Paste(); |
860 model.Paste(); | 821 model.Paste(); |
861 model.Paste(); | 822 model.Paste(); |
862 EXPECT_STR_EQ("ABCBCBCDE", model.text()); | 823 EXPECT_STR_EQ("ABCBCBCDE", model.GetText()); |
863 EXPECT_EQ(7U, model.cursor_pos()); | 824 EXPECT_EQ(7U, model.GetCursorPosition()); |
864 EXPECT_TRUE(model.Undo()); | 825 EXPECT_TRUE(model.Undo()); |
865 EXPECT_STR_EQ("ABCBCDE", model.text()); | 826 EXPECT_STR_EQ("ABCBCDE", model.GetText()); |
866 EXPECT_EQ(5U, model.cursor_pos()); | 827 EXPECT_EQ(5U, model.GetCursorPosition()); |
867 EXPECT_TRUE(model.Undo()); | 828 EXPECT_TRUE(model.Undo()); |
868 EXPECT_STR_EQ("ABCDE", model.text()); | 829 EXPECT_STR_EQ("ABCDE", model.GetText()); |
869 EXPECT_EQ(3U, model.cursor_pos()); | 830 EXPECT_EQ(3U, model.GetCursorPosition()); |
870 EXPECT_TRUE(model.Undo()); | 831 EXPECT_TRUE(model.Undo()); |
871 EXPECT_STR_EQ("ADE", model.text()); | 832 EXPECT_STR_EQ("ADE", model.GetText()); |
872 EXPECT_EQ(1U, model.cursor_pos()); | 833 EXPECT_EQ(1U, model.GetCursorPosition()); |
873 EXPECT_TRUE(model.Undo()); | 834 EXPECT_TRUE(model.Undo()); |
874 EXPECT_STR_EQ("ABCDE", model.text()); | 835 EXPECT_STR_EQ("ABCDE", model.GetText()); |
875 EXPECT_EQ(3U, model.cursor_pos()); | 836 EXPECT_EQ(3U, model.GetCursorPosition()); |
876 EXPECT_TRUE(model.Undo()); | 837 EXPECT_TRUE(model.Undo()); |
877 EXPECT_STR_EQ("", model.text()); | 838 EXPECT_STR_EQ("", model.GetText()); |
878 EXPECT_EQ(0U, model.cursor_pos()); | 839 EXPECT_EQ(0U, model.GetCursorPosition()); |
879 EXPECT_FALSE(model.Undo()); | 840 EXPECT_FALSE(model.Undo()); |
880 EXPECT_STR_EQ("", model.text()); | 841 EXPECT_STR_EQ("", model.GetText()); |
881 EXPECT_TRUE(model.Redo()); | 842 EXPECT_TRUE(model.Redo()); |
882 EXPECT_STR_EQ("ABCDE", model.text()); // Redoing SetText | 843 EXPECT_STR_EQ("ABCDE", model.GetText()); // Redoing SetText |
883 EXPECT_EQ(0U, model.cursor_pos()); | 844 EXPECT_EQ(0U, model.GetCursorPosition()); |
884 | 845 |
885 // Redo | 846 // Redo |
886 EXPECT_TRUE(model.Redo()); | 847 EXPECT_TRUE(model.Redo()); |
887 EXPECT_STR_EQ("ADE", model.text()); | 848 EXPECT_STR_EQ("ADE", model.GetText()); |
888 EXPECT_EQ(1U, model.cursor_pos()); | 849 EXPECT_EQ(1U, model.GetCursorPosition()); |
889 EXPECT_TRUE(model.Redo()); | 850 EXPECT_TRUE(model.Redo()); |
890 EXPECT_STR_EQ("ABCDE", model.text()); | 851 EXPECT_STR_EQ("ABCDE", model.GetText()); |
891 EXPECT_EQ(3U, model.cursor_pos()); | 852 EXPECT_EQ(3U, model.GetCursorPosition()); |
892 EXPECT_TRUE(model.Redo()); | 853 EXPECT_TRUE(model.Redo()); |
893 EXPECT_STR_EQ("ABCBCDE", model.text()); | 854 EXPECT_STR_EQ("ABCBCDE", model.GetText()); |
894 EXPECT_EQ(5U, model.cursor_pos()); | 855 EXPECT_EQ(5U, model.GetCursorPosition()); |
895 EXPECT_TRUE(model.Redo()); | 856 EXPECT_TRUE(model.Redo()); |
896 EXPECT_STR_EQ("ABCBCBCDE", model.text()); | 857 EXPECT_STR_EQ("ABCBCBCDE", model.GetText()); |
897 EXPECT_EQ(7U, model.cursor_pos()); | 858 EXPECT_EQ(7U, model.GetCursorPosition()); |
898 EXPECT_FALSE(model.Redo()); | 859 EXPECT_FALSE(model.Redo()); |
899 | 860 |
900 // with SelectRange | 861 // with SelectRange |
901 model.SelectRange(ui::Range(1, 3)); | 862 model.SelectRange(ui::Range(1, 3)); |
902 EXPECT_TRUE(model.Cut()); | 863 EXPECT_TRUE(model.Cut()); |
903 EXPECT_STR_EQ("ABCBCDE", model.text()); | 864 EXPECT_STR_EQ("ABCBCDE", model.GetText()); |
904 EXPECT_EQ(1U, model.cursor_pos()); | 865 EXPECT_EQ(1U, model.GetCursorPosition()); |
905 model.SelectRange(ui::Range(1, 1)); | 866 model.SelectRange(ui::Range(1, 1)); |
906 EXPECT_FALSE(model.Cut()); | 867 EXPECT_FALSE(model.Cut()); |
907 model.MoveCursorToEnd(false); | 868 model.MoveCursorToRightEnd(false); |
908 EXPECT_TRUE(model.Paste()); | 869 EXPECT_TRUE(model.Paste()); |
909 EXPECT_STR_EQ("ABCBCDEBC", model.text()); | 870 EXPECT_STR_EQ("ABCBCDEBC", model.GetText()); |
910 EXPECT_EQ(9U, model.cursor_pos()); | 871 EXPECT_EQ(9U, model.GetCursorPosition()); |
911 EXPECT_TRUE(model.Undo()); | 872 EXPECT_TRUE(model.Undo()); |
912 EXPECT_STR_EQ("ABCBCDE", model.text()); | 873 EXPECT_STR_EQ("ABCBCDE", model.GetText()); |
913 EXPECT_EQ(7U, model.cursor_pos()); | 874 EXPECT_EQ(7U, model.GetCursorPosition()); |
914 // empty cut shouldn't create an edit. | 875 // empty cut shouldn't create an edit. |
915 EXPECT_TRUE(model.Undo()); | 876 EXPECT_TRUE(model.Undo()); |
916 EXPECT_STR_EQ("ABCBCBCDE", model.text()); | 877 EXPECT_STR_EQ("ABCBCBCDE", model.GetText()); |
917 EXPECT_EQ(3U, model.cursor_pos()); | 878 EXPECT_EQ(3U, model.GetCursorPosition()); |
918 | 879 |
919 // Copy | 880 // Copy |
920 ResetModel(&model); | 881 ResetModel(&model); |
921 model.SetText(ASCIIToUTF16("12345")); | 882 model.SetText(ASCIIToUTF16("12345")); |
922 EXPECT_STR_EQ("12345", model.text()); | 883 EXPECT_STR_EQ("12345", model.GetText()); |
923 EXPECT_EQ(0U, model.cursor_pos()); | 884 EXPECT_EQ(0U, model.GetCursorPosition()); |
924 model.MoveCursorTo(1, false); | 885 model.MoveCursorTo(1, false); |
925 model.MoveCursorTo(3, true); | 886 model.MoveCursorTo(3, true); |
926 model.Copy(); // Copy "23" | 887 model.Copy(); // Copy "23" |
927 EXPECT_STR_EQ("12345", model.text()); | 888 EXPECT_STR_EQ("12345", model.GetText()); |
928 EXPECT_EQ(3U, model.cursor_pos()); | 889 EXPECT_EQ(3U, model.GetCursorPosition()); |
929 model.Paste(); // Paste "23" into "23". | 890 model.Paste(); // Paste "23" into "23". |
930 EXPECT_STR_EQ("12345", model.text()); | 891 EXPECT_STR_EQ("12345", model.GetText()); |
931 EXPECT_EQ(3U, model.cursor_pos()); | 892 EXPECT_EQ(3U, model.GetCursorPosition()); |
932 model.Paste(); | 893 model.Paste(); |
933 EXPECT_STR_EQ("1232345", model.text()); | 894 EXPECT_STR_EQ("1232345", model.GetText()); |
934 EXPECT_EQ(5U, model.cursor_pos()); | 895 EXPECT_EQ(5U, model.GetCursorPosition()); |
935 EXPECT_TRUE(model.Undo()); | 896 EXPECT_TRUE(model.Undo()); |
936 EXPECT_STR_EQ("12345", model.text()); | 897 EXPECT_STR_EQ("12345", model.GetText()); |
937 EXPECT_EQ(3U, model.cursor_pos()); | 898 EXPECT_EQ(3U, model.GetCursorPosition()); |
938 // TODO(oshima): We need to change the return type from bool to enum. | 899 // TODO(oshima): We need to change the return type from bool to enum. |
939 EXPECT_FALSE(model.Undo()); // No text change. | 900 EXPECT_FALSE(model.Undo()); // No text change. |
940 EXPECT_STR_EQ("12345", model.text()); | 901 EXPECT_STR_EQ("12345", model.GetText()); |
941 EXPECT_EQ(3U, model.cursor_pos()); | 902 EXPECT_EQ(3U, model.GetCursorPosition()); |
942 EXPECT_TRUE(model.Undo()); | 903 EXPECT_TRUE(model.Undo()); |
943 EXPECT_STR_EQ("", model.text()); | 904 EXPECT_STR_EQ("", model.GetText()); |
944 EXPECT_FALSE(model.Undo()); | 905 EXPECT_FALSE(model.Undo()); |
945 // Redo | 906 // Redo |
946 EXPECT_TRUE(model.Redo()); | 907 EXPECT_TRUE(model.Redo()); |
947 EXPECT_STR_EQ("12345", model.text()); | 908 EXPECT_STR_EQ("12345", model.GetText()); |
948 EXPECT_EQ(0U, model.cursor_pos()); | 909 EXPECT_EQ(0U, model.GetCursorPosition()); |
949 EXPECT_TRUE(model.Redo()); | 910 EXPECT_TRUE(model.Redo()); |
950 EXPECT_STR_EQ("12345", model.text()); // For 1st paste | 911 EXPECT_STR_EQ("12345", model.GetText()); // For 1st paste |
951 EXPECT_EQ(3U, model.cursor_pos()); | 912 EXPECT_EQ(3U, model.GetCursorPosition()); |
952 EXPECT_TRUE(model.Redo()); | 913 EXPECT_TRUE(model.Redo()); |
953 EXPECT_STR_EQ("1232345", model.text()); | 914 EXPECT_STR_EQ("1232345", model.GetText()); |
954 EXPECT_EQ(5U, model.cursor_pos()); | 915 EXPECT_EQ(5U, model.GetCursorPosition()); |
955 EXPECT_FALSE(model.Redo()); | 916 EXPECT_FALSE(model.Redo()); |
956 EXPECT_STR_EQ("1232345", model.text()); | 917 EXPECT_STR_EQ("1232345", model.GetText()); |
957 | 918 |
958 // with SelectRange | 919 // with SelectRange |
959 model.SelectRange(ui::Range(1, 3)); | 920 model.SelectRange(ui::Range(1, 3)); |
960 model.Copy(); | 921 model.Copy(); |
961 EXPECT_STR_EQ("1232345", model.text()); | 922 EXPECT_STR_EQ("1232345", model.GetText()); |
962 model.MoveCursorToEnd(false); | 923 model.MoveCursorToRightEnd(false); |
963 EXPECT_TRUE(model.Paste()); | 924 EXPECT_TRUE(model.Paste()); |
964 EXPECT_STR_EQ("123234523", model.text()); | 925 EXPECT_STR_EQ("123234523", model.GetText()); |
965 EXPECT_EQ(9U, model.cursor_pos()); | 926 EXPECT_EQ(9U, model.GetCursorPosition()); |
966 EXPECT_TRUE(model.Undo()); | 927 EXPECT_TRUE(model.Undo()); |
967 EXPECT_STR_EQ("1232345", model.text()); | 928 EXPECT_STR_EQ("1232345", model.GetText()); |
968 EXPECT_EQ(7U, model.cursor_pos()); | 929 EXPECT_EQ(7U, model.GetCursorPosition()); |
969 } | 930 } |
970 | 931 |
971 TEST_F(TextfieldViewsModelTest, UndoRedo_CursorTest) { | 932 TEST_F(TextfieldViewsModelTest, UndoRedo_CursorTest) { |
972 TextfieldViewsModel model(NULL); | 933 TextfieldViewsModel model(NULL); |
973 model.InsertChar('a'); | 934 model.InsertChar('a'); |
974 model.MoveCursorLeft(false); | 935 model.MoveCursorLeft(false); |
975 model.MoveCursorRight(false); | 936 model.MoveCursorRight(false); |
976 model.InsertChar('b'); | 937 model.InsertChar('b'); |
977 // Moving cursor shoudln't create a new edit. | 938 // Moving cursor shoudln't create a new edit. |
978 EXPECT_STR_EQ("ab", model.text()); | 939 EXPECT_STR_EQ("ab", model.GetText()); |
979 EXPECT_FALSE(model.Redo()); | 940 EXPECT_FALSE(model.Redo()); |
980 EXPECT_TRUE(model.Undo()); | 941 EXPECT_TRUE(model.Undo()); |
981 EXPECT_STR_EQ("", model.text()); | 942 EXPECT_STR_EQ("", model.GetText()); |
982 EXPECT_FALSE(model.Undo()); | 943 EXPECT_FALSE(model.Undo()); |
983 EXPECT_STR_EQ("", model.text()); | 944 EXPECT_STR_EQ("", model.GetText()); |
984 EXPECT_TRUE(model.Redo()); | 945 EXPECT_TRUE(model.Redo()); |
985 EXPECT_STR_EQ("ab", model.text()); | 946 EXPECT_STR_EQ("ab", model.GetText()); |
986 EXPECT_EQ(2U, model.cursor_pos()); | 947 EXPECT_EQ(2U, model.GetCursorPosition()); |
987 EXPECT_FALSE(model.Redo()); | 948 EXPECT_FALSE(model.Redo()); |
988 } | 949 } |
989 | 950 |
990 void RunInsertReplaceTest(TextfieldViewsModel& model) { | 951 void RunInsertReplaceTest(TextfieldViewsModel& model) { |
991 ui::Range r; | 952 ui::Range r; |
992 model.GetSelectedRange(&r); | 953 model.GetSelectedRange(&r); |
993 bool reverse = r.is_reversed(); | 954 bool reverse = r.is_reversed(); |
994 | 955 |
995 model.InsertChar('1'); | 956 model.InsertChar('1'); |
996 model.InsertChar('2'); | 957 model.InsertChar('2'); |
997 model.InsertChar('3'); | 958 model.InsertChar('3'); |
998 EXPECT_STR_EQ("a123d", model.text()); | 959 EXPECT_STR_EQ("a123d", model.GetText()); |
999 EXPECT_EQ(4U, model.cursor_pos()); | 960 EXPECT_EQ(4U, model.GetCursorPosition()); |
1000 EXPECT_TRUE(model.Undo()); | 961 EXPECT_TRUE(model.Undo()); |
1001 EXPECT_STR_EQ("abcd", model.text()); | 962 EXPECT_STR_EQ("abcd", model.GetText()); |
1002 EXPECT_EQ(reverse ? 1U : 3U, model.cursor_pos()); | 963 EXPECT_EQ(reverse ? 1U : 3U, model.GetCursorPosition()); |
1003 EXPECT_TRUE(model.Undo()); | 964 EXPECT_TRUE(model.Undo()); |
1004 EXPECT_STR_EQ("", model.text()); | 965 EXPECT_STR_EQ("", model.GetText()); |
1005 EXPECT_EQ(0U, model.cursor_pos()); | 966 EXPECT_EQ(0U, model.GetCursorPosition()); |
1006 EXPECT_FALSE(model.Undo()); | 967 EXPECT_FALSE(model.Undo()); |
1007 EXPECT_TRUE(model.Redo()); | 968 EXPECT_TRUE(model.Redo()); |
1008 EXPECT_STR_EQ("abcd", model.text()); | 969 EXPECT_STR_EQ("abcd", model.GetText()); |
1009 EXPECT_EQ(0U, model.cursor_pos()); // By SetText | 970 EXPECT_EQ(0U, model.GetCursorPosition()); // By SetText |
1010 EXPECT_TRUE(model.Redo()); | 971 EXPECT_TRUE(model.Redo()); |
1011 EXPECT_STR_EQ("a123d", model.text()); | 972 EXPECT_STR_EQ("a123d", model.GetText()); |
1012 EXPECT_EQ(4U, model.cursor_pos()); | 973 EXPECT_EQ(4U, model.GetCursorPosition()); |
1013 EXPECT_FALSE(model.Redo()); | 974 EXPECT_FALSE(model.Redo()); |
1014 } | 975 } |
1015 | 976 |
1016 void RunOverwriteReplaceTest(TextfieldViewsModel& model) { | 977 void RunOverwriteReplaceTest(TextfieldViewsModel& model) { |
1017 ui::Range r; | 978 ui::Range r; |
1018 model.GetSelectedRange(&r); | 979 model.GetSelectedRange(&r); |
1019 bool reverse = r.is_reversed(); | 980 bool reverse = r.is_reversed(); |
1020 | 981 |
1021 model.ReplaceChar('1'); | 982 model.ReplaceChar('1'); |
1022 model.ReplaceChar('2'); | 983 model.ReplaceChar('2'); |
1023 model.ReplaceChar('3'); | 984 model.ReplaceChar('3'); |
1024 model.ReplaceChar('4'); | 985 model.ReplaceChar('4'); |
1025 EXPECT_STR_EQ("a1234", model.text()); | 986 EXPECT_STR_EQ("a1234", model.GetText()); |
1026 EXPECT_EQ(5U, model.cursor_pos()); | 987 EXPECT_EQ(5U, model.GetCursorPosition()); |
1027 EXPECT_TRUE(model.Undo()); | 988 EXPECT_TRUE(model.Undo()); |
1028 EXPECT_STR_EQ("abcd", model.text()); | 989 EXPECT_STR_EQ("abcd", model.GetText()); |
1029 EXPECT_EQ(reverse ? 1U : 3U, model.cursor_pos()); | 990 EXPECT_EQ(reverse ? 1U : 3U, model.GetCursorPosition()); |
1030 EXPECT_TRUE(model.Undo()); | 991 EXPECT_TRUE(model.Undo()); |
1031 EXPECT_STR_EQ("", model.text()); | 992 EXPECT_STR_EQ("", model.GetText()); |
1032 EXPECT_EQ(0U, model.cursor_pos()); | 993 EXPECT_EQ(0U, model.GetCursorPosition()); |
1033 EXPECT_FALSE(model.Undo()); | 994 EXPECT_FALSE(model.Undo()); |
1034 EXPECT_TRUE(model.Redo()); | 995 EXPECT_TRUE(model.Redo()); |
1035 EXPECT_STR_EQ("abcd", model.text()); | 996 EXPECT_STR_EQ("abcd", model.GetText()); |
1036 EXPECT_EQ(0U, model.cursor_pos()); | 997 EXPECT_EQ(0U, model.GetCursorPosition()); |
1037 EXPECT_TRUE(model.Redo()); | 998 EXPECT_TRUE(model.Redo()); |
1038 EXPECT_STR_EQ("a1234", model.text()); | 999 EXPECT_STR_EQ("a1234", model.GetText()); |
1039 EXPECT_EQ(5U, model.cursor_pos()); | 1000 EXPECT_EQ(5U, model.GetCursorPosition()); |
1040 EXPECT_FALSE(model.Redo()); | 1001 EXPECT_FALSE(model.Redo()); |
1041 } | 1002 } |
1042 | 1003 |
1043 TEST_F(TextfieldViewsModelTest, UndoRedo_ReplaceTest) { | 1004 TEST_F(TextfieldViewsModelTest, UndoRedo_ReplaceTest) { |
1044 // By Cursor | 1005 // By Cursor |
1045 { | 1006 { |
1046 SCOPED_TRACE("forward & insert by cursor"); | 1007 SCOPED_TRACE("forward & insert by cursor"); |
1047 TextfieldViewsModel model(NULL); | 1008 TextfieldViewsModel model(NULL); |
1048 model.SetText(ASCIIToUTF16("abcd")); | 1009 model.SetText(ASCIIToUTF16("abcd")); |
1049 model.MoveCursorTo(1, false); | 1010 model.MoveCursorTo(1, false); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1107 | 1068 |
1108 TEST_F(TextfieldViewsModelTest, UndoRedo_CompositionText) { | 1069 TEST_F(TextfieldViewsModelTest, UndoRedo_CompositionText) { |
1109 TextfieldViewsModel model(NULL); | 1070 TextfieldViewsModel model(NULL); |
1110 | 1071 |
1111 ui::CompositionText composition; | 1072 ui::CompositionText composition; |
1112 composition.text = ASCIIToUTF16("abc"); | 1073 composition.text = ASCIIToUTF16("abc"); |
1113 composition.underlines.push_back(ui::CompositionUnderline(0, 3, 0, false)); | 1074 composition.underlines.push_back(ui::CompositionUnderline(0, 3, 0, false)); |
1114 composition.selection = ui::Range(2, 3); | 1075 composition.selection = ui::Range(2, 3); |
1115 | 1076 |
1116 model.SetText(ASCIIToUTF16("ABCDE")); | 1077 model.SetText(ASCIIToUTF16("ABCDE")); |
1117 model.MoveCursorToEnd(false); | 1078 model.MoveCursorToRightEnd(false); |
1118 model.InsertChar('x'); | 1079 model.InsertChar('x'); |
1119 EXPECT_STR_EQ("ABCDEx", model.text()); | 1080 EXPECT_STR_EQ("ABCDEx", model.GetText()); |
1120 EXPECT_TRUE(model.Undo()); // set composition should forget undone edit. | 1081 EXPECT_TRUE(model.Undo()); // set composition should forget undone edit. |
1121 model.SetCompositionText(composition); | 1082 model.SetCompositionText(composition); |
1122 EXPECT_TRUE(model.HasCompositionText()); | 1083 EXPECT_TRUE(model.HasCompositionText()); |
1123 EXPECT_TRUE(model.HasSelection()); | 1084 EXPECT_TRUE(model.HasSelection()); |
1124 EXPECT_STR_EQ("ABCDEabc", model.text()); | 1085 EXPECT_STR_EQ("ABCDEabc", model.GetText()); |
1125 | 1086 |
1126 // Accepting composition | 1087 // Accepting composition |
1127 model.ConfirmCompositionText(); | 1088 model.ConfirmCompositionText(); |
1128 EXPECT_STR_EQ("ABCDEabc", model.text()); | 1089 EXPECT_STR_EQ("ABCDEabc", model.GetText()); |
1129 EXPECT_TRUE(model.Undo()); | 1090 EXPECT_TRUE(model.Undo()); |
1130 EXPECT_STR_EQ("ABCDE", model.text()); | 1091 EXPECT_STR_EQ("ABCDE", model.GetText()); |
1131 EXPECT_TRUE(model.Undo()); | 1092 EXPECT_TRUE(model.Undo()); |
1132 EXPECT_STR_EQ("", model.text()); | 1093 EXPECT_STR_EQ("", model.GetText()); |
1133 EXPECT_TRUE(model.Redo()); | 1094 EXPECT_TRUE(model.Redo()); |
1134 EXPECT_STR_EQ("ABCDE", model.text()); | 1095 EXPECT_STR_EQ("ABCDE", model.GetText()); |
1135 EXPECT_TRUE(model.Redo()); | 1096 EXPECT_TRUE(model.Redo()); |
1136 EXPECT_STR_EQ("ABCDEabc", model.text()); | 1097 EXPECT_STR_EQ("ABCDEabc", model.GetText()); |
1137 EXPECT_FALSE(model.Redo()); | 1098 EXPECT_FALSE(model.Redo()); |
1138 | 1099 |
1139 // Canceling composition | 1100 // Canceling composition |
1140 model.MoveCursorToHome(false); | 1101 model.MoveCursorToLeftEnd(false); |
1141 model.SetCompositionText(composition); | 1102 model.SetCompositionText(composition); |
1142 EXPECT_STR_EQ("abcABCDEabc", model.text()); | 1103 EXPECT_STR_EQ("abcABCDEabc", model.GetText()); |
1143 model.CancelCompositionText(); | 1104 model.CancelCompositionText(); |
1144 EXPECT_STR_EQ("ABCDEabc", model.text()); | 1105 EXPECT_STR_EQ("ABCDEabc", model.GetText()); |
1145 EXPECT_FALSE(model.Redo()); | 1106 EXPECT_FALSE(model.Redo()); |
1146 EXPECT_STR_EQ("ABCDEabc", model.text()); | 1107 EXPECT_STR_EQ("ABCDEabc", model.GetText()); |
1147 EXPECT_TRUE(model.Undo()); | 1108 EXPECT_TRUE(model.Undo()); |
1148 EXPECT_STR_EQ("ABCDE", model.text()); | 1109 EXPECT_STR_EQ("ABCDE", model.GetText()); |
1149 EXPECT_TRUE(model.Redo()); | 1110 EXPECT_TRUE(model.Redo()); |
1150 EXPECT_STR_EQ("ABCDEabc", model.text()); | 1111 EXPECT_STR_EQ("ABCDEabc", model.GetText()); |
1151 EXPECT_FALSE(model.Redo()); | 1112 EXPECT_FALSE(model.Redo()); |
1152 | 1113 |
1153 // SetText with the same text as the result. | 1114 // SetText with the same text as the result. |
1154 ResetModel(&model); | 1115 ResetModel(&model); |
1155 model.SetText(ASCIIToUTF16("ABCDE")); | 1116 model.SetText(ASCIIToUTF16("ABCDE")); |
1156 model.MoveCursorToEnd(false); | 1117 model.MoveCursorToRightEnd(false); |
1157 model.SetCompositionText(composition); | 1118 model.SetCompositionText(composition); |
1158 EXPECT_STR_EQ("ABCDEabc", model.text()); | 1119 EXPECT_STR_EQ("ABCDEabc", model.GetText()); |
1159 model.SetText(ASCIIToUTF16("ABCDEabc")); | 1120 model.SetText(ASCIIToUTF16("ABCDEabc")); |
1160 EXPECT_STR_EQ("ABCDEabc", model.text()); | 1121 EXPECT_STR_EQ("ABCDEabc", model.GetText()); |
1161 EXPECT_TRUE(model.Undo()); | 1122 EXPECT_TRUE(model.Undo()); |
1162 EXPECT_STR_EQ("ABCDE", model.text()); | 1123 EXPECT_STR_EQ("ABCDE", model.GetText()); |
1163 EXPECT_TRUE(model.Redo()); | 1124 EXPECT_TRUE(model.Redo()); |
1164 EXPECT_STR_EQ("ABCDEabc", model.text()); | 1125 EXPECT_STR_EQ("ABCDEabc", model.GetText()); |
1165 EXPECT_FALSE(model.Redo()); | 1126 EXPECT_FALSE(model.Redo()); |
1166 | 1127 |
1167 // SetText with the different text than the result should not | 1128 // SetText with the different text than the result should not |
1168 // remember composition text. | 1129 // remember composition text. |
1169 ResetModel(&model); | 1130 ResetModel(&model); |
1170 model.SetText(ASCIIToUTF16("ABCDE")); | 1131 model.SetText(ASCIIToUTF16("ABCDE")); |
1171 model.MoveCursorToEnd(false); | 1132 model.MoveCursorToRightEnd(false); |
1172 model.SetCompositionText(composition); | 1133 model.SetCompositionText(composition); |
1173 EXPECT_STR_EQ("ABCDEabc", model.text()); | 1134 EXPECT_STR_EQ("ABCDEabc", model.GetText()); |
1174 model.SetText(ASCIIToUTF16("1234")); | 1135 model.SetText(ASCIIToUTF16("1234")); |
1175 EXPECT_STR_EQ("1234", model.text()); | 1136 EXPECT_STR_EQ("1234", model.GetText()); |
1176 EXPECT_TRUE(model.Undo()); | 1137 EXPECT_TRUE(model.Undo()); |
1177 EXPECT_STR_EQ("ABCDE", model.text()); | 1138 EXPECT_STR_EQ("ABCDE", model.GetText()); |
1178 EXPECT_TRUE(model.Redo()); | 1139 EXPECT_TRUE(model.Redo()); |
1179 EXPECT_STR_EQ("1234", model.text()); | 1140 EXPECT_STR_EQ("1234", model.GetText()); |
1180 EXPECT_FALSE(model.Redo()); | 1141 EXPECT_FALSE(model.Redo()); |
1181 | 1142 |
1182 // TODO(oshima): We need MockInputMethod to test the behavior with IME. | 1143 // TODO(oshima): We need MockInputMethod to test the behavior with IME. |
1183 } | 1144 } |
1184 | 1145 |
1185 TEST_F(TextfieldViewsModelTest, TextStyleTest) { | |
1186 const SkColor black = 0xFF000000; // black is default text color. | |
1187 const SkColor white = 0xFFFFFFFF; | |
1188 TextfieldViewsModel model(NULL); | |
1189 TextStyle* color = model.CreateTextStyle(); | |
1190 color->set_foreground(white); | |
1191 TextStyle* underline = model.CreateTextStyle(); | |
1192 underline->set_underline(true); | |
1193 underline->set_foreground(white); | |
1194 TextStyle* strike = model.CreateTextStyle(); | |
1195 strike->set_strike(true); | |
1196 strike->set_foreground(white); | |
1197 | |
1198 // Case 1: No overlaps | |
1199 model.ApplyTextStyle(color, ui::Range(1, 3)); | |
1200 model.ApplyTextStyle(underline, ui::Range(5, 6)); | |
1201 | |
1202 TextfieldViewsModel::TextFragments fragments; | |
1203 model.GetFragments(&fragments); | |
1204 // Styles with empty string simply returns an empty fragments. | |
1205 EXPECT_EQ(0U, fragments.size()); | |
1206 | |
1207 // 1st style only. | |
1208 model.SetText(ASCIIToUTF16("01234")); // SetText doesn't change styles. | |
1209 model.GetFragments(&fragments); | |
1210 EXPECT_EQ(3U, fragments.size()); | |
1211 EXPECT_EQ(0U, fragments[0].range.start()); | |
1212 EXPECT_EQ(1U, fragments[0].range.end()); | |
1213 EXPECT_EQ(black, fragments[0].style->foreground()); | |
1214 | |
1215 EXPECT_EQ(1U, fragments[1].range.start()); | |
1216 EXPECT_EQ(3U, fragments[1].range.end()); | |
1217 EXPECT_EQ(color, fragments[1].style); | |
1218 | |
1219 EXPECT_EQ(3U, fragments[2].range.start()); | |
1220 EXPECT_EQ(5U, fragments[2].range.end()); | |
1221 EXPECT_EQ(black, fragments[2].style->foreground()); | |
1222 | |
1223 // Clear styles | |
1224 model.ClearAllTextStyles(); | |
1225 model.GetFragments(&fragments); | |
1226 EXPECT_EQ(1U, fragments.size()); | |
1227 EXPECT_EQ(0U, fragments[0].range.start()); | |
1228 EXPECT_EQ(5U, fragments[0].range.end()); | |
1229 EXPECT_EQ(black, fragments[0].style->foreground()); | |
1230 | |
1231 // Case 2: Overlaps on left and on right | |
1232 model.ApplyTextStyle(color, ui::Range(1, 3)); | |
1233 model.ApplyTextStyle(strike, ui::Range(6, 8)); | |
1234 model.ApplyTextStyle(underline, ui::Range(2, 7)); | |
1235 | |
1236 // With short string | |
1237 model.SetText(ASCIIToUTF16("0")); | |
1238 model.GetFragments(&fragments); | |
1239 EXPECT_EQ(1U, fragments.size()); | |
1240 EXPECT_EQ(0U, fragments[0].range.start()); | |
1241 EXPECT_EQ(1U, fragments[0].range.end()); | |
1242 EXPECT_EQ(black, fragments[0].style->foreground()); | |
1243 | |
1244 // With mid-length string | |
1245 model.SetText(ASCIIToUTF16("0123")); | |
1246 model.GetFragments(&fragments); | |
1247 EXPECT_EQ(3U, fragments.size()); | |
1248 EXPECT_EQ(0U, fragments[0].range.start()); | |
1249 EXPECT_EQ(1U, fragments[0].range.end()); | |
1250 EXPECT_EQ(black, fragments[0].style->foreground()); | |
1251 | |
1252 EXPECT_EQ(1U, fragments[1].range.start()); | |
1253 EXPECT_EQ(2U, fragments[1].range.end()); | |
1254 EXPECT_EQ(color, fragments[1].style); | |
1255 | |
1256 EXPECT_EQ(2U, fragments[2].range.start()); | |
1257 EXPECT_EQ(4U, fragments[2].range.end()); | |
1258 EXPECT_EQ(underline, fragments[2].style); | |
1259 | |
1260 // With long (longer than styles) string | |
1261 model.SetText(ASCIIToUTF16("0123456789")); | |
1262 model.GetFragments(&fragments); | |
1263 EXPECT_EQ(5U, fragments.size()); | |
1264 EXPECT_EQ(0U, fragments[0].range.start()); | |
1265 EXPECT_EQ(1U, fragments[0].range.end()); | |
1266 EXPECT_EQ(black, fragments[0].style->foreground()); | |
1267 | |
1268 EXPECT_EQ(1U, fragments[1].range.start()); | |
1269 EXPECT_EQ(2U, fragments[1].range.end()); | |
1270 EXPECT_EQ(color, fragments[1].style); | |
1271 | |
1272 EXPECT_EQ(2U, fragments[2].range.start()); | |
1273 EXPECT_EQ(7U, fragments[2].range.end()); | |
1274 EXPECT_EQ(underline, fragments[2].style); | |
1275 | |
1276 EXPECT_EQ(7U, fragments[3].range.start()); | |
1277 EXPECT_EQ(8U, fragments[3].range.end()); | |
1278 EXPECT_EQ(strike, fragments[3].style); | |
1279 | |
1280 EXPECT_EQ(8U, fragments[4].range.start()); | |
1281 EXPECT_EQ(10U, fragments[4].range.end()); | |
1282 EXPECT_EQ(black, fragments[4].style->foreground()); | |
1283 | |
1284 model.ClearAllTextStyles(); | |
1285 | |
1286 // Case 3: The underline style splits the color style underneath. | |
1287 model.ApplyTextStyle(color, ui::Range(0, 15)); | |
1288 model.ApplyTextStyle(underline, ui::Range(5, 6)); | |
1289 model.GetFragments(&fragments); | |
1290 EXPECT_EQ(3U, fragments.size()); | |
1291 EXPECT_EQ(0U, fragments[0].range.start()); | |
1292 EXPECT_EQ(5U, fragments[0].range.end()); | |
1293 EXPECT_EQ(color, fragments[0].style); | |
1294 | |
1295 EXPECT_EQ(5U, fragments[1].range.start()); | |
1296 EXPECT_EQ(6U, fragments[1].range.end()); | |
1297 EXPECT_EQ(underline, fragments[1].style); | |
1298 | |
1299 EXPECT_EQ(6U, fragments[2].range.start()); | |
1300 EXPECT_EQ(10U, fragments[2].range.end()); | |
1301 EXPECT_EQ(color, fragments[2].style); | |
1302 | |
1303 model.ClearAllTextStyles(); | |
1304 | |
1305 // Case 4: The underline style moves the color style underneath. | |
1306 model.ApplyTextStyle(color, ui::Range(0, 15)); | |
1307 model.ApplyTextStyle(underline, ui::Range(0, 6)); | |
1308 model.GetFragments(&fragments); | |
1309 EXPECT_EQ(2U, fragments.size()); | |
1310 EXPECT_EQ(0U, fragments[0].range.start()); | |
1311 EXPECT_EQ(6U, fragments[0].range.end()); | |
1312 EXPECT_EQ(underline, fragments[0].style); | |
1313 | |
1314 EXPECT_EQ(6U, fragments[1].range.start()); | |
1315 EXPECT_EQ(10U, fragments[1].range.end()); | |
1316 EXPECT_EQ(color, fragments[1].style); | |
1317 | |
1318 model.ClearAllTextStyles(); | |
1319 | |
1320 model.ApplyTextStyle(color, ui::Range(0, 10)); | |
1321 model.ApplyTextStyle(underline, ui::Range(6, 10)); | |
1322 model.GetFragments(&fragments); | |
1323 EXPECT_EQ(2U, fragments.size()); | |
1324 EXPECT_EQ(0U, fragments[0].range.start()); | |
1325 EXPECT_EQ(6U, fragments[0].range.end()); | |
1326 EXPECT_EQ(color, fragments[0].style); | |
1327 | |
1328 EXPECT_EQ(6U, fragments[1].range.start()); | |
1329 EXPECT_EQ(10U, fragments[1].range.end()); | |
1330 EXPECT_EQ(underline, fragments[1].style); | |
1331 | |
1332 model.ClearAllTextStyles(); | |
1333 // Case 5: The strike style hides the unerline style underneath. | |
1334 model.ApplyTextStyle(color, ui::Range(0, 15)); | |
1335 model.ApplyTextStyle(underline, ui::Range(0, 6)); | |
1336 model.ApplyTextStyle(strike, ui::Range(4, 7)); | |
1337 model.GetFragments(&fragments); | |
1338 EXPECT_EQ(3U, fragments.size()); | |
1339 EXPECT_EQ(0U, fragments[0].range.start()); | |
1340 EXPECT_EQ(4U, fragments[0].range.end()); | |
1341 EXPECT_EQ(underline, fragments[0].style); | |
1342 | |
1343 EXPECT_EQ(4U, fragments[1].range.start()); | |
1344 EXPECT_EQ(7U, fragments[1].range.end()); | |
1345 EXPECT_EQ(strike, fragments[1].style); | |
1346 | |
1347 EXPECT_EQ(7U, fragments[2].range.start()); | |
1348 EXPECT_EQ(10U, fragments[2].range.end()); | |
1349 EXPECT_EQ(color, fragments[2].style); | |
1350 | |
1351 // Case 6: Reversed range. | |
1352 model.ClearAllTextStyles(); | |
1353 model.ApplyTextStyle(color, ui::Range(3, 1)); | |
1354 model.ApplyTextStyle(underline, ui::Range(6, 4)); | |
1355 model.ApplyTextStyle(strike, ui::Range(5, 2)); | |
1356 model.GetFragments(&fragments); | |
1357 EXPECT_EQ(5U, fragments.size()); | |
1358 | |
1359 EXPECT_EQ(0U, fragments[0].range.start()); | |
1360 EXPECT_EQ(1U, fragments[0].range.end()); | |
1361 EXPECT_EQ(black, fragments[0].style->foreground()); | |
1362 | |
1363 EXPECT_EQ(1U, fragments[1].range.start()); | |
1364 EXPECT_EQ(2U, fragments[1].range.end()); | |
1365 EXPECT_EQ(color, fragments[1].style); | |
1366 | |
1367 EXPECT_EQ(2U, fragments[2].range.start()); | |
1368 EXPECT_EQ(5U, fragments[2].range.end()); | |
1369 EXPECT_EQ(strike, fragments[2].style); | |
1370 | |
1371 EXPECT_EQ(5U, fragments[3].range.start()); | |
1372 EXPECT_EQ(6U, fragments[3].range.end()); | |
1373 EXPECT_EQ(underline, fragments[3].style); | |
1374 | |
1375 EXPECT_EQ(6U, fragments[4].range.start()); | |
1376 EXPECT_EQ(10U, fragments[4].range.end()); | |
1377 EXPECT_EQ(black, fragments[4].style->foreground()); | |
1378 | |
1379 // Case 7: empty / invald range | |
1380 model.ClearAllTextStyles(); | |
1381 model.ApplyTextStyle(color, ui::Range(0, 0)); | |
1382 model.ApplyTextStyle(underline, ui::Range(4, 4)); | |
1383 ui::Range invalid = ui::Range(0, 2).Intersect(ui::Range(3, 4)); | |
1384 ASSERT_FALSE(invalid.IsValid()); | |
1385 | |
1386 model.ApplyTextStyle(strike, invalid); | |
1387 model.GetFragments(&fragments); | |
1388 EXPECT_EQ(1U, fragments.size()); | |
1389 | |
1390 EXPECT_EQ(0U, fragments[0].range.start()); | |
1391 EXPECT_EQ(10U, fragments[0].range.end()); | |
1392 EXPECT_EQ(black, fragments[0].style->foreground()); | |
1393 } | |
1394 | |
1395 } // namespace views | 1146 } // namespace views |
OLD | NEW |