Index: views/controls/textfield/textfield_views_model_unittest.cc |
diff --git a/views/controls/textfield/textfield_views_model_unittest.cc b/views/controls/textfield/textfield_views_model_unittest.cc |
index d9d5721711de5f89fc77be8b85d30e1f85b4b7cd..7e2f7e64e8221db8a285d4e5a7eb55467567260d 100644 |
--- a/views/controls/textfield/textfield_views_model_unittest.cc |
+++ b/views/controls/textfield/textfield_views_model_unittest.cc |
@@ -273,14 +273,16 @@ TEST_F(TextfieldViewsModelTest, SetText) { |
model.MoveCursorToEnd(false); |
model.SetText(ASCIIToUTF16("GOODBYE")); |
EXPECT_STR_EQ("GOODBYE", model.text()); |
- EXPECT_EQ(0U, model.cursor_pos()); |
+ // SetText won't reset the cursor posistion. |
+ EXPECT_EQ(5U, model.cursor_pos()); |
model.SelectAll(); |
EXPECT_STR_EQ("GOODBYE", model.GetSelectedText()); |
model.MoveCursorToEnd(false); |
EXPECT_EQ(7U, model.cursor_pos()); |
model.SetText(ASCIIToUTF16("BYE")); |
- EXPECT_EQ(0U, model.cursor_pos()); |
+ // Setting shorter string moves the cursor to the end of the new string. |
+ EXPECT_EQ(3U, model.cursor_pos()); |
EXPECT_EQ(string16(), model.GetSelectedText()); |
model.SetText(ASCIIToUTF16("")); |
EXPECT_EQ(0U, model.cursor_pos()); |
@@ -683,28 +685,35 @@ TEST_F(TextfieldViewsModelTest, UndoRedo_BasicTest) { |
EXPECT_STR_EQ("abc", model.text()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("a", model.text()); |
+ EXPECT_EQ(1U, model.cursor_pos()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("", model.text()); |
+ EXPECT_EQ(0U, model.cursor_pos()); |
// Undoing further shouldn't change the text. |
EXPECT_FALSE(model.Undo()); |
EXPECT_STR_EQ("", model.text()); |
EXPECT_FALSE(model.Undo()); |
EXPECT_STR_EQ("", model.text()); |
+ EXPECT_EQ(0U, model.cursor_pos()); |
// Redoing to the latest text. |
EXPECT_TRUE(model.Redo()); |
EXPECT_STR_EQ("a", model.text()); |
+ EXPECT_EQ(1U, model.cursor_pos()); |
EXPECT_TRUE(model.Redo()); |
EXPECT_STR_EQ("abc", model.text()); |
+ EXPECT_EQ(3U, model.cursor_pos()); |
// Backspace =============================== |
EXPECT_TRUE(model.Backspace()); |
EXPECT_STR_EQ("ab", model.text()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("abc", model.text()); |
+ EXPECT_EQ(3U, model.cursor_pos()); |
EXPECT_TRUE(model.Redo()); |
EXPECT_STR_EQ("ab", model.text()); |
+ EXPECT_EQ(2U, model.cursor_pos()); |
// Continous backspaces are treated as one edit. |
EXPECT_TRUE(model.Backspace()); |
EXPECT_TRUE(model.Backspace()); |
@@ -713,16 +722,20 @@ TEST_F(TextfieldViewsModelTest, UndoRedo_BasicTest) { |
EXPECT_FALSE(model.Backspace()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("ab", model.text()); |
+ EXPECT_EQ(2U, model.cursor_pos()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("abc", model.text()); |
+ EXPECT_EQ(3U, model.cursor_pos()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("a", model.text()); |
+ EXPECT_EQ(1U, model.cursor_pos()); |
// Clear history |
model.ClearEditHistory(); |
EXPECT_FALSE(model.Undo()); |
EXPECT_FALSE(model.Redo()); |
EXPECT_STR_EQ("a", model.text()); |
+ EXPECT_EQ(1U, model.cursor_pos()); |
// Delete =============================== |
model.SetText(ASCIIToUTF16("ABCDE")); |
@@ -735,18 +748,85 @@ TEST_F(TextfieldViewsModelTest, UndoRedo_BasicTest) { |
EXPECT_STR_EQ("BDE", model.text()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("ABDE", model.text()); |
+ EXPECT_EQ(0U, model.cursor_pos()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("ABCDE", model.text()); |
+ EXPECT_EQ(2U, model.cursor_pos()); |
EXPECT_TRUE(model.Redo()); |
EXPECT_STR_EQ("ABDE", model.text()); |
+ EXPECT_EQ(2U, model.cursor_pos()); |
// Continous deletes are treated as one edit. |
EXPECT_TRUE(model.Delete()); |
EXPECT_TRUE(model.Delete()); |
EXPECT_STR_EQ("AB", model.text()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("ABDE", model.text()); |
+ EXPECT_EQ(2U, model.cursor_pos()); |
EXPECT_TRUE(model.Redo()); |
EXPECT_STR_EQ("AB", model.text()); |
+ EXPECT_EQ(2U, model.cursor_pos()); |
+} |
+ |
+TEST_F(TextfieldViewsModelTest, UndoRedo_SetText) { |
+ // This is to test the undo/redo behavior of omnibox. |
+ TextfieldViewsModel model(NULL); |
+ model.InsertChar('w'); |
+ EXPECT_STR_EQ("w", model.text()); |
+ EXPECT_EQ(1U, model.cursor_pos()); |
+ model.SetText(ASCIIToUTF16("www.google.com")); |
+ EXPECT_EQ(1U, model.cursor_pos()); |
+ EXPECT_STR_EQ("www.google.com", model.text()); |
+ model.SelectRange(ui::Range(14, 1)); |
+ model.InsertChar('w'); |
+ EXPECT_STR_EQ("ww", model.text()); |
+ model.SetText(ASCIIToUTF16("www.google.com")); |
+ model.SelectRange(ui::Range(14, 2)); |
+ model.InsertChar('w'); |
+ EXPECT_STR_EQ("www", model.text()); |
+ model.SetText(ASCIIToUTF16("www.google.com")); |
+ model.SelectRange(ui::Range(14, 3)); |
+ model.InsertChar('.'); |
+ EXPECT_STR_EQ("www.", model.text()); |
+ model.SetText(ASCIIToUTF16("www.google.com")); |
+ model.SelectRange(ui::Range(14, 4)); |
+ model.InsertChar('y'); |
+ EXPECT_STR_EQ("www.y", model.text()); |
+ model.SetText(ASCIIToUTF16("www.youtube.com")); |
+ EXPECT_STR_EQ("www.youtube.com", model.text()); |
+ EXPECT_EQ(5U, model.cursor_pos()); |
+ |
+ EXPECT_TRUE(model.Undo()); |
+ EXPECT_STR_EQ("www.google.com", model.text()); |
+ EXPECT_EQ(4U, model.cursor_pos()); |
+ EXPECT_TRUE(model.Undo()); |
+ EXPECT_STR_EQ("www.google.com", model.text()); |
+ EXPECT_EQ(3U, model.cursor_pos()); |
+ EXPECT_TRUE(model.Undo()); |
+ EXPECT_STR_EQ("www.google.com", model.text()); |
+ EXPECT_EQ(2U, model.cursor_pos()); |
+ EXPECT_TRUE(model.Undo()); |
+ EXPECT_STR_EQ("www.google.com", model.text()); |
+ EXPECT_EQ(1U, model.cursor_pos()); |
+ EXPECT_TRUE(model.Undo()); |
+ EXPECT_STR_EQ("", model.text()); |
+ EXPECT_EQ(0U, model.cursor_pos()); |
+ EXPECT_FALSE(model.Undo()); |
+ EXPECT_TRUE(model.Redo()); |
+ EXPECT_STR_EQ("www.google.com", model.text()); |
+ EXPECT_EQ(1U, model.cursor_pos()); |
+ EXPECT_TRUE(model.Redo()); |
+ EXPECT_STR_EQ("www.google.com", model.text()); |
+ EXPECT_EQ(2U, model.cursor_pos()); |
+ EXPECT_TRUE(model.Redo()); |
+ EXPECT_STR_EQ("www.google.com", model.text()); |
+ EXPECT_EQ(3U, model.cursor_pos()); |
+ EXPECT_TRUE(model.Redo()); |
+ EXPECT_STR_EQ("www.google.com", model.text()); |
+ EXPECT_EQ(4U, model.cursor_pos()); |
+ EXPECT_TRUE(model.Redo()); |
+ EXPECT_STR_EQ("www.youtube.com", model.text()); |
+ EXPECT_EQ(5U, model.cursor_pos()); |
+ EXPECT_FALSE(model.Redo()); |
} |
TEST_F(TextfieldViewsModelTest, UndoRedo_CutCopyPasteTest) { |
@@ -758,16 +838,21 @@ TEST_F(TextfieldViewsModelTest, UndoRedo_CutCopyPasteTest) { |
model.MoveCursorTo(3, true); |
model.Cut(); |
EXPECT_STR_EQ("ADE", model.text()); |
+ EXPECT_EQ(1U, model.cursor_pos()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("ABCDE", model.text()); |
+ EXPECT_EQ(3U, model.cursor_pos()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("", model.text()); |
+ EXPECT_EQ(0U, model.cursor_pos()); |
EXPECT_FALSE(model.Undo()); // no more undo |
EXPECT_STR_EQ("", model.text()); |
EXPECT_TRUE(model.Redo()); |
EXPECT_STR_EQ("ABCDE", model.text()); |
+ EXPECT_EQ(0U, model.cursor_pos()); |
EXPECT_TRUE(model.Redo()); |
EXPECT_STR_EQ("ADE", model.text()); |
+ EXPECT_EQ(1U, model.cursor_pos()); |
EXPECT_FALSE(model.Redo()); // no more redo |
EXPECT_STR_EQ("ADE", model.text()); |
@@ -775,72 +860,98 @@ TEST_F(TextfieldViewsModelTest, UndoRedo_CutCopyPasteTest) { |
model.Paste(); |
model.Paste(); |
EXPECT_STR_EQ("ABCBCBCDE", model.text()); |
+ EXPECT_EQ(7U, model.cursor_pos()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("ABCBCDE", model.text()); |
+ EXPECT_EQ(5U, model.cursor_pos()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("ABCDE", model.text()); |
+ EXPECT_EQ(3U, model.cursor_pos()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("ADE", model.text()); |
+ EXPECT_EQ(1U, model.cursor_pos()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("ABCDE", model.text()); |
+ EXPECT_EQ(3U, model.cursor_pos()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("", model.text()); |
+ EXPECT_EQ(0U, model.cursor_pos()); |
EXPECT_FALSE(model.Undo()); |
EXPECT_STR_EQ("", model.text()); |
EXPECT_TRUE(model.Redo()); |
- EXPECT_STR_EQ("ABCDE", model.text()); |
+ EXPECT_STR_EQ("ABCDE", model.text()); // Redoing SetText |
+ EXPECT_EQ(0U, model.cursor_pos()); |
+ |
// Redo |
EXPECT_TRUE(model.Redo()); |
EXPECT_STR_EQ("ADE", model.text()); |
+ EXPECT_EQ(1U, model.cursor_pos()); |
EXPECT_TRUE(model.Redo()); |
EXPECT_STR_EQ("ABCDE", model.text()); |
+ EXPECT_EQ(3U, model.cursor_pos()); |
EXPECT_TRUE(model.Redo()); |
EXPECT_STR_EQ("ABCBCDE", model.text()); |
+ EXPECT_EQ(5U, model.cursor_pos()); |
EXPECT_TRUE(model.Redo()); |
EXPECT_STR_EQ("ABCBCBCDE", model.text()); |
+ EXPECT_EQ(7U, model.cursor_pos()); |
EXPECT_FALSE(model.Redo()); |
// with SelectRange |
model.SelectRange(ui::Range(1, 3)); |
EXPECT_TRUE(model.Cut()); |
EXPECT_STR_EQ("ABCBCDE", model.text()); |
+ EXPECT_EQ(1U, model.cursor_pos()); |
model.SelectRange(ui::Range(1, 1)); |
EXPECT_FALSE(model.Cut()); |
model.MoveCursorToEnd(false); |
EXPECT_TRUE(model.Paste()); |
EXPECT_STR_EQ("ABCBCDEBC", model.text()); |
+ EXPECT_EQ(9U, model.cursor_pos()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("ABCBCDE", model.text()); |
+ EXPECT_EQ(7U, model.cursor_pos()); |
// empty cut shouldn't create an edit. |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("ABCBCBCDE", model.text()); |
+ EXPECT_EQ(3U, model.cursor_pos()); |
// Copy |
ResetModel(&model); |
model.SetText(ASCIIToUTF16("12345")); |
EXPECT_STR_EQ("12345", model.text()); |
+ EXPECT_EQ(0U, model.cursor_pos()); |
model.MoveCursorTo(1, false); |
model.MoveCursorTo(3, true); |
- model.Copy(); |
+ model.Copy(); // Copy "23" |
EXPECT_STR_EQ("12345", model.text()); |
- model.Paste(); |
+ EXPECT_EQ(3U, model.cursor_pos()); |
+ model.Paste(); // Paste "23" into "23". |
EXPECT_STR_EQ("12345", model.text()); |
+ EXPECT_EQ(3U, model.cursor_pos()); |
model.Paste(); |
EXPECT_STR_EQ("1232345", model.text()); |
+ EXPECT_EQ(5U, model.cursor_pos()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("12345", model.text()); |
- EXPECT_FALSE(model.Undo()); // no text change |
+ EXPECT_EQ(3U, model.cursor_pos()); |
+ // TODO(oshima): We need to change the return type from bool to enum. |
+ EXPECT_FALSE(model.Undo()); // No text change. |
EXPECT_STR_EQ("12345", model.text()); |
+ EXPECT_EQ(3U, model.cursor_pos()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("", model.text()); |
EXPECT_FALSE(model.Undo()); |
// Redo |
EXPECT_TRUE(model.Redo()); |
EXPECT_STR_EQ("12345", model.text()); |
- EXPECT_FALSE(model.Redo()); // no text change. |
- EXPECT_STR_EQ("12345", model.text()); |
+ EXPECT_EQ(0U, model.cursor_pos()); |
+ EXPECT_TRUE(model.Redo()); |
+ EXPECT_STR_EQ("12345", model.text()); // For 1st paste |
+ EXPECT_EQ(3U, model.cursor_pos()); |
EXPECT_TRUE(model.Redo()); |
EXPECT_STR_EQ("1232345", model.text()); |
+ EXPECT_EQ(5U, model.cursor_pos()); |
EXPECT_FALSE(model.Redo()); |
EXPECT_STR_EQ("1232345", model.text()); |
@@ -851,8 +962,10 @@ TEST_F(TextfieldViewsModelTest, UndoRedo_CutCopyPasteTest) { |
model.MoveCursorToEnd(false); |
EXPECT_TRUE(model.Paste()); |
EXPECT_STR_EQ("123234523", model.text()); |
+ EXPECT_EQ(9U, model.cursor_pos()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("1232345", model.text()); |
+ EXPECT_EQ(7U, model.cursor_pos()); |
} |
TEST_F(TextfieldViewsModelTest, UndoRedo_CursorTest) { |
@@ -870,41 +983,60 @@ TEST_F(TextfieldViewsModelTest, UndoRedo_CursorTest) { |
EXPECT_STR_EQ("", model.text()); |
EXPECT_TRUE(model.Redo()); |
EXPECT_STR_EQ("ab", model.text()); |
+ EXPECT_EQ(2U, model.cursor_pos()); |
EXPECT_FALSE(model.Redo()); |
} |
void RunInsertReplaceTest(TextfieldViewsModel& model) { |
+ ui::Range r; |
+ model.GetSelectedRange(&r); |
+ bool reverse = r.is_reversed(); |
+ |
model.InsertChar('1'); |
model.InsertChar('2'); |
model.InsertChar('3'); |
EXPECT_STR_EQ("a123d", model.text()); |
+ EXPECT_EQ(4U, model.cursor_pos()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("abcd", model.text()); |
+ EXPECT_EQ(reverse ? 1U : 3U, model.cursor_pos()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("", model.text()); |
+ EXPECT_EQ(0U, model.cursor_pos()); |
EXPECT_FALSE(model.Undo()); |
EXPECT_TRUE(model.Redo()); |
EXPECT_STR_EQ("abcd", model.text()); |
+ EXPECT_EQ(0U, model.cursor_pos()); // By SetText |
EXPECT_TRUE(model.Redo()); |
EXPECT_STR_EQ("a123d", model.text()); |
+ EXPECT_EQ(4U, model.cursor_pos()); |
EXPECT_FALSE(model.Redo()); |
} |
void RunOverwriteReplaceTest(TextfieldViewsModel& model) { |
+ ui::Range r; |
+ model.GetSelectedRange(&r); |
+ bool reverse = r.is_reversed(); |
+ |
model.ReplaceChar('1'); |
model.ReplaceChar('2'); |
model.ReplaceChar('3'); |
model.ReplaceChar('4'); |
EXPECT_STR_EQ("a1234", model.text()); |
+ EXPECT_EQ(5U, model.cursor_pos()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("abcd", model.text()); |
+ EXPECT_EQ(reverse ? 1U : 3U, model.cursor_pos()); |
EXPECT_TRUE(model.Undo()); |
EXPECT_STR_EQ("", model.text()); |
+ EXPECT_EQ(0U, model.cursor_pos()); |
EXPECT_FALSE(model.Undo()); |
EXPECT_TRUE(model.Redo()); |
EXPECT_STR_EQ("abcd", model.text()); |
+ EXPECT_EQ(0U, model.cursor_pos()); |
EXPECT_TRUE(model.Redo()); |
EXPECT_STR_EQ("a1234", model.text()); |
+ EXPECT_EQ(5U, model.cursor_pos()); |
EXPECT_FALSE(model.Redo()); |
} |