Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: ui/views/controls/textfield/textfield_model_unittest.cc

Issue 1989893005: Undo selection. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/views/controls/textfield/textfield_model.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/views/controls/textfield/textfield_model.h" 5 #include "ui/views/controls/textfield/textfield_model.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <vector> 10 #include <vector>
(...skipping 25 matching lines...) Expand all
36 WordAndCursor(const wchar_t* w, size_t c) : word(w), cursor(c) {} 36 WordAndCursor(const wchar_t* w, size_t c) : word(w), cursor(c) {}
37 37
38 const wchar_t* word; 38 const wchar_t* word;
39 size_t cursor; 39 size_t cursor;
40 }; 40 };
41 41
42 void MoveCursorTo(views::TextfieldModel& model, size_t pos) { 42 void MoveCursorTo(views::TextfieldModel& model, size_t pos) {
43 model.MoveCursorTo(gfx::SelectionModel(pos, gfx::CURSOR_FORWARD)); 43 model.MoveCursorTo(gfx::SelectionModel(pos, gfx::CURSOR_FORWARD));
44 } 44 }
45 45
46 gfx::Range GetSelectedRange(const views::TextfieldModel& model) {
47 return model.render_text()->selection();
48 }
49
46 } // namespace 50 } // namespace
47 51
48 namespace views { 52 namespace views {
49 53
50 class TextfieldModelTest : public ViewsTestBase, 54 class TextfieldModelTest : public ViewsTestBase,
51 public TextfieldModel::Delegate { 55 public TextfieldModel::Delegate {
52 public: 56 public:
53 TextfieldModelTest() 57 TextfieldModelTest()
54 : ViewsTestBase(), 58 : ViewsTestBase(),
55 composition_text_confirmed_or_cleared_(false) { 59 composition_text_confirmed_or_cleared_(false) {
(...skipping 944 matching lines...) Expand 10 before | Expand all | Expand 10 after
1000 EXPECT_STR_EQ("", model.text()); 1004 EXPECT_STR_EQ("", model.text());
1001 EXPECT_TRUE(model.Redo()); 1005 EXPECT_TRUE(model.Redo());
1002 EXPECT_STR_EQ("a", model.text()); 1006 EXPECT_STR_EQ("a", model.text());
1003 1007
1004 // Continuous inserts are treated as one edit. 1008 // Continuous inserts are treated as one edit.
1005 model.InsertChar('b'); 1009 model.InsertChar('b');
1006 model.InsertChar('c'); 1010 model.InsertChar('c');
1007 EXPECT_STR_EQ("abc", model.text()); 1011 EXPECT_STR_EQ("abc", model.text());
1008 EXPECT_TRUE(model.Undo()); 1012 EXPECT_TRUE(model.Undo());
1009 EXPECT_STR_EQ("a", model.text()); 1013 EXPECT_STR_EQ("a", model.text());
1010 EXPECT_EQ(1U, model.GetCursorPosition()); 1014 EXPECT_EQ(gfx::Range(1), GetSelectedRange(model));
1011 EXPECT_TRUE(model.Undo()); 1015 EXPECT_TRUE(model.Undo());
1012 EXPECT_STR_EQ("", model.text()); 1016 EXPECT_STR_EQ("", model.text());
1013 EXPECT_EQ(0U, model.GetCursorPosition()); 1017 EXPECT_EQ(gfx::Range(0), GetSelectedRange(model));
1014 1018
1015 // Undoing further shouldn't change the text. 1019 // Undoing further shouldn't change the text.
1016 EXPECT_FALSE(model.Undo()); 1020 EXPECT_FALSE(model.Undo());
1017 EXPECT_STR_EQ("", model.text()); 1021 EXPECT_STR_EQ("", model.text());
1018 EXPECT_FALSE(model.Undo()); 1022 EXPECT_FALSE(model.Undo());
1019 EXPECT_STR_EQ("", model.text()); 1023 EXPECT_STR_EQ("", model.text());
1020 EXPECT_EQ(0U, model.GetCursorPosition()); 1024 EXPECT_EQ(gfx::Range(0), GetSelectedRange(model));
1021 1025
1022 // Redoing to the latest text. 1026 // Redoing to the latest text.
1023 EXPECT_TRUE(model.Redo()); 1027 EXPECT_TRUE(model.Redo());
1024 EXPECT_STR_EQ("a", model.text()); 1028 EXPECT_STR_EQ("a", model.text());
1025 EXPECT_EQ(1U, model.GetCursorPosition()); 1029 EXPECT_EQ(gfx::Range(1), GetSelectedRange(model));
1026 EXPECT_TRUE(model.Redo()); 1030 EXPECT_TRUE(model.Redo());
1027 EXPECT_STR_EQ("abc", model.text()); 1031 EXPECT_STR_EQ("abc", model.text());
1028 EXPECT_EQ(3U, model.GetCursorPosition()); 1032 EXPECT_EQ(gfx::Range(3), GetSelectedRange(model));
1029 1033
1030 // Backspace =============================== 1034 // Backspace ===============================
1031 EXPECT_TRUE(model.Backspace()); 1035 EXPECT_TRUE(model.Backspace());
1032 EXPECT_STR_EQ("ab", model.text()); 1036 EXPECT_STR_EQ("ab", model.text());
1033 EXPECT_TRUE(model.Undo()); 1037 EXPECT_TRUE(model.Undo());
1034 EXPECT_STR_EQ("abc", model.text()); 1038 EXPECT_STR_EQ("abc", model.text());
1035 EXPECT_EQ(3U, model.GetCursorPosition()); 1039 EXPECT_EQ(gfx::Range(3,2), GetSelectedRange(model));
1036 EXPECT_TRUE(model.Redo()); 1040 EXPECT_TRUE(model.Redo());
1037 EXPECT_STR_EQ("ab", model.text()); 1041 EXPECT_STR_EQ("ab", model.text());
1038 EXPECT_EQ(2U, model.GetCursorPosition()); 1042 EXPECT_EQ(gfx::Range(2), GetSelectedRange(model));
1039 // Continous backspaces are treated as one edit. 1043 // Continous backspaces are treated as one edit.
1040 EXPECT_TRUE(model.Backspace()); 1044 EXPECT_TRUE(model.Backspace());
1041 EXPECT_TRUE(model.Backspace()); 1045 EXPECT_TRUE(model.Backspace());
1042 EXPECT_STR_EQ("", model.text()); 1046 EXPECT_STR_EQ("", model.text());
1043 // Extra backspace shouldn't affect the history. 1047 // Extra backspace shouldn't affect the history.
1044 EXPECT_FALSE(model.Backspace()); 1048 EXPECT_FALSE(model.Backspace());
1045 EXPECT_TRUE(model.Undo()); 1049 EXPECT_TRUE(model.Undo());
1046 EXPECT_STR_EQ("ab", model.text()); 1050 EXPECT_STR_EQ("ab", model.text());
1047 EXPECT_EQ(2U, model.GetCursorPosition()); 1051 EXPECT_EQ(gfx::Range(2,0), GetSelectedRange(model));
1048 EXPECT_TRUE(model.Undo()); 1052 EXPECT_TRUE(model.Undo());
1049 EXPECT_STR_EQ("abc", model.text()); 1053 EXPECT_STR_EQ("abc", model.text());
1050 EXPECT_EQ(3U, model.GetCursorPosition()); 1054 EXPECT_EQ(gfx::Range(3,2), GetSelectedRange(model));
1051 EXPECT_TRUE(model.Undo()); 1055 EXPECT_TRUE(model.Undo());
1052 EXPECT_STR_EQ("a", model.text()); 1056 EXPECT_STR_EQ("a", model.text());
1053 EXPECT_EQ(1U, model.GetCursorPosition()); 1057 EXPECT_EQ(gfx::Range(1), GetSelectedRange(model));
1054 1058
1055 // Clear history 1059 // Clear history
1056 model.ClearEditHistory(); 1060 model.ClearEditHistory();
1057 EXPECT_FALSE(model.Undo()); 1061 EXPECT_FALSE(model.Undo());
1058 EXPECT_FALSE(model.Redo()); 1062 EXPECT_FALSE(model.Redo());
1059 EXPECT_STR_EQ("a", model.text()); 1063 EXPECT_STR_EQ("a", model.text());
1060 EXPECT_EQ(1U, model.GetCursorPosition()); 1064 EXPECT_EQ(gfx::Range(1), GetSelectedRange(model));
1061 1065
1062 // Delete =============================== 1066 // Delete ===============================
1063 model.SetText(base::ASCIIToUTF16("ABCDE")); 1067 model.SetText(base::ASCIIToUTF16("ABCDE"));
1064 model.ClearEditHistory(); 1068 model.ClearEditHistory();
1065 MoveCursorTo(model, 2); 1069 MoveCursorTo(model, 2);
1066 EXPECT_TRUE(model.Delete()); 1070 EXPECT_TRUE(model.Delete());
1067 EXPECT_STR_EQ("ABDE", model.text()); 1071 EXPECT_STR_EQ("ABDE", model.text());
1068 model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_LEFT, false); 1072 model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_LEFT, false);
1069 EXPECT_TRUE(model.Delete()); 1073 EXPECT_TRUE(model.Delete());
1070 EXPECT_STR_EQ("BDE", model.text()); 1074 EXPECT_STR_EQ("BDE", model.text());
1071 EXPECT_TRUE(model.Undo()); 1075 EXPECT_TRUE(model.Undo());
1072 EXPECT_STR_EQ("ABDE", model.text()); 1076 EXPECT_STR_EQ("ABDE", model.text());
1073 EXPECT_EQ(0U, model.GetCursorPosition()); 1077 EXPECT_EQ(gfx::Range(0, 1), GetSelectedRange(model));
1074 EXPECT_TRUE(model.Undo()); 1078 EXPECT_TRUE(model.Undo());
1075 EXPECT_STR_EQ("ABCDE", model.text()); 1079 EXPECT_STR_EQ("ABCDE", model.text());
1076 EXPECT_EQ(2U, model.GetCursorPosition()); 1080 EXPECT_EQ(gfx::Range(2,3), GetSelectedRange(model));
1077 EXPECT_TRUE(model.Redo()); 1081 EXPECT_TRUE(model.Redo());
1078 EXPECT_STR_EQ("ABDE", model.text()); 1082 EXPECT_STR_EQ("ABDE", model.text());
1079 EXPECT_EQ(2U, model.GetCursorPosition()); 1083 EXPECT_EQ(gfx::Range(2), GetSelectedRange(model));
1080 // Continous deletes are treated as one edit. 1084 // Continous deletes are treated as one edit.
1081 EXPECT_TRUE(model.Delete()); 1085 EXPECT_TRUE(model.Delete());
1082 EXPECT_TRUE(model.Delete()); 1086 EXPECT_TRUE(model.Delete());
1083 EXPECT_STR_EQ("AB", model.text()); 1087 EXPECT_STR_EQ("AB", model.text());
1084 EXPECT_TRUE(model.Undo()); 1088 EXPECT_TRUE(model.Undo());
1085 EXPECT_STR_EQ("ABDE", model.text()); 1089 EXPECT_STR_EQ("ABDE", model.text());
1086 EXPECT_EQ(2U, model.GetCursorPosition()); 1090 EXPECT_EQ(gfx::Range(2,4), GetSelectedRange(model));
1087 EXPECT_TRUE(model.Redo()); 1091 EXPECT_TRUE(model.Redo());
1088 EXPECT_STR_EQ("AB", model.text()); 1092 EXPECT_STR_EQ("AB", model.text());
1089 EXPECT_EQ(2U, model.GetCursorPosition()); 1093 EXPECT_EQ(gfx::Range(2), GetSelectedRange(model));
1090 } 1094 }
1091 1095
1092 TEST_F(TextfieldModelTest, UndoRedo_SetText) { 1096 TEST_F(TextfieldModelTest, UndoRedo_SetText) {
1093 // This is to test the undo/redo behavior of omnibox. 1097 // This is to test the undo/redo behavior of omnibox.
1094 TextfieldModel model(NULL); 1098 TextfieldModel model(NULL);
1095 model.InsertChar('w'); 1099 model.InsertChar('w');
1096 EXPECT_STR_EQ("w", model.text()); 1100 EXPECT_STR_EQ("w", model.text());
1097 EXPECT_EQ(1U, model.GetCursorPosition()); 1101 EXPECT_EQ(gfx::Range(1), GetSelectedRange(model));
1098 model.SetText(base::ASCIIToUTF16("www.google.com")); 1102 model.SetText(base::ASCIIToUTF16("www.google.com"));
1099 EXPECT_EQ(14U, model.GetCursorPosition()); 1103 EXPECT_EQ(gfx::Range(14U), GetSelectedRange(model));
1100 EXPECT_STR_EQ("www.google.com", model.text()); 1104 EXPECT_STR_EQ("www.google.com", model.text());
1101 model.SelectRange(gfx::Range(14, 1)); 1105 model.SelectRange(gfx::Range(14, 1));
1102 model.InsertChar('w'); 1106 model.InsertChar('w');
1103 EXPECT_STR_EQ("ww", model.text()); 1107 EXPECT_STR_EQ("ww", model.text());
1104 model.SetText(base::ASCIIToUTF16("www.google.com")); 1108 model.SetText(base::ASCIIToUTF16("www.google.com"));
1105 model.SelectRange(gfx::Range(14, 2)); 1109 model.SelectRange(gfx::Range(14, 2));
1106 model.InsertChar('w'); 1110 model.InsertChar('w');
1107 EXPECT_STR_EQ("www", model.text()); 1111 EXPECT_STR_EQ("www", model.text());
1108 model.SetText(base::ASCIIToUTF16("www.google.com")); 1112 model.SetText(base::ASCIIToUTF16("www.google.com"));
1109 model.SelectRange(gfx::Range(14, 3)); 1113 model.SelectRange(gfx::Range(14, 3));
1110 model.InsertChar('.'); 1114 model.InsertChar('.');
1111 EXPECT_STR_EQ("www.", model.text()); 1115 EXPECT_STR_EQ("www.", model.text());
1112 model.SetText(base::ASCIIToUTF16("www.google.com")); 1116 model.SetText(base::ASCIIToUTF16("www.google.com"));
1113 model.SelectRange(gfx::Range(14, 4)); 1117 model.SelectRange(gfx::Range(14, 4));
1114 model.InsertChar('y'); 1118 model.InsertChar('y');
1115 EXPECT_STR_EQ("www.y", model.text()); 1119 EXPECT_STR_EQ("www.y", model.text());
1116 model.SetText(base::ASCIIToUTF16("www.youtube.com")); 1120 model.SetText(base::ASCIIToUTF16("www.youtube.com"));
1117 EXPECT_STR_EQ("www.youtube.com", model.text()); 1121 EXPECT_STR_EQ("www.youtube.com", model.text());
1118 EXPECT_EQ(15U, model.GetCursorPosition()); 1122 EXPECT_EQ(gfx::Range(15U), GetSelectedRange(model));
1119 1123
1120 EXPECT_TRUE(model.Undo()); 1124 EXPECT_TRUE(model.Undo());
1121 EXPECT_STR_EQ("www.google.com", model.text()); 1125 EXPECT_STR_EQ("www.google.com", model.text());
1122 EXPECT_EQ(4U, model.GetCursorPosition()); 1126 EXPECT_EQ(gfx::Range(4), GetSelectedRange(model));
1123 EXPECT_TRUE(model.Undo()); 1127 EXPECT_TRUE(model.Undo());
1124 EXPECT_STR_EQ("www.google.com", model.text()); 1128 EXPECT_STR_EQ("www.google.com", model.text());
1125 EXPECT_EQ(3U, model.GetCursorPosition()); 1129 EXPECT_EQ(gfx::Range(3), GetSelectedRange(model));
1126 EXPECT_TRUE(model.Undo()); 1130 EXPECT_TRUE(model.Undo());
1127 EXPECT_STR_EQ("www.google.com", model.text()); 1131 EXPECT_STR_EQ("www.google.com", model.text());
1128 EXPECT_EQ(2U, model.GetCursorPosition()); 1132 EXPECT_EQ(gfx::Range(2), GetSelectedRange(model));
1129 EXPECT_TRUE(model.Undo()); 1133 EXPECT_TRUE(model.Undo());
1130 EXPECT_STR_EQ("www.google.com", model.text()); 1134 EXPECT_STR_EQ("www.google.com", model.text());
1131 EXPECT_EQ(1U, model.GetCursorPosition()); 1135 EXPECT_EQ(gfx::Range(1), GetSelectedRange(model));
1132 EXPECT_TRUE(model.Undo()); 1136 EXPECT_TRUE(model.Undo());
1133 EXPECT_STR_EQ("", model.text()); 1137 EXPECT_STR_EQ("", model.text());
1134 EXPECT_EQ(0U, model.GetCursorPosition()); 1138 EXPECT_EQ(gfx::Range(0), GetSelectedRange(model));
1135 EXPECT_FALSE(model.Undo()); 1139 EXPECT_FALSE(model.Undo());
1136 EXPECT_TRUE(model.Redo()); 1140 EXPECT_TRUE(model.Redo());
1137 EXPECT_STR_EQ("www.google.com", model.text()); 1141 EXPECT_STR_EQ("www.google.com", model.text());
1138 EXPECT_EQ(1U, model.GetCursorPosition()); 1142 EXPECT_EQ(gfx::Range(1), GetSelectedRange(model));
1139 EXPECT_TRUE(model.Redo()); 1143 EXPECT_TRUE(model.Redo());
1140 EXPECT_STR_EQ("www.google.com", model.text()); 1144 EXPECT_STR_EQ("www.google.com", model.text());
1141 EXPECT_EQ(2U, model.GetCursorPosition()); 1145 EXPECT_EQ(gfx::Range(2), GetSelectedRange(model));
1142 EXPECT_TRUE(model.Redo()); 1146 EXPECT_TRUE(model.Redo());
1143 EXPECT_STR_EQ("www.google.com", model.text()); 1147 EXPECT_STR_EQ("www.google.com", model.text());
1144 EXPECT_EQ(3U, model.GetCursorPosition()); 1148 EXPECT_EQ(gfx::Range(3), GetSelectedRange(model));
1145 EXPECT_TRUE(model.Redo()); 1149 EXPECT_TRUE(model.Redo());
1146 EXPECT_STR_EQ("www.google.com", model.text()); 1150 EXPECT_STR_EQ("www.google.com", model.text());
1147 EXPECT_EQ(4U, model.GetCursorPosition()); 1151 EXPECT_EQ(gfx::Range(4), GetSelectedRange(model));
1148 EXPECT_TRUE(model.Redo()); 1152 EXPECT_TRUE(model.Redo());
1149 EXPECT_STR_EQ("www.youtube.com", model.text()); 1153 EXPECT_STR_EQ("www.youtube.com", model.text());
1150 EXPECT_EQ(5U, model.GetCursorPosition()); 1154 EXPECT_EQ(gfx::Range(5), GetSelectedRange(model));
1151 EXPECT_FALSE(model.Redo()); 1155 EXPECT_FALSE(model.Redo());
1152 } 1156 }
1153 1157
1154 TEST_F(TextfieldModelTest, UndoRedo_BackspaceThenSetText) { 1158 TEST_F(TextfieldModelTest, UndoRedo_BackspaceThenSetText) {
1155 // This is to test the undo/redo behavior of omnibox. 1159 // This is to test the undo/redo behavior of omnibox.
1156 TextfieldModel model(NULL); 1160 TextfieldModel model(NULL);
1157 model.InsertChar('w'); 1161 model.InsertChar('w');
1158 EXPECT_STR_EQ("w", model.text()); 1162 EXPECT_STR_EQ("w", model.text());
1159 EXPECT_EQ(1U, model.GetCursorPosition()); 1163 EXPECT_EQ(1U, model.GetCursorPosition());
1160 model.SetText(base::ASCIIToUTF16("www.google.com")); 1164 model.SetText(base::ASCIIToUTF16("www.google.com"));
(...skipping 15 matching lines...) Expand all
1176 } 1180 }
1177 1181
1178 TEST_F(TextfieldModelTest, UndoRedo_CutCopyPasteTest) { 1182 TEST_F(TextfieldModelTest, UndoRedo_CutCopyPasteTest) {
1179 TextfieldModel model(NULL); 1183 TextfieldModel model(NULL);
1180 model.SetText(base::ASCIIToUTF16("ABCDE")); 1184 model.SetText(base::ASCIIToUTF16("ABCDE"));
1181 EXPECT_FALSE(model.Redo()); // There is nothing to redo. 1185 EXPECT_FALSE(model.Redo()); // There is nothing to redo.
1182 // Test Cut. 1186 // Test Cut.
1183 model.SelectRange(gfx::Range(1, 3)); 1187 model.SelectRange(gfx::Range(1, 3));
1184 model.Cut(); 1188 model.Cut();
1185 EXPECT_STR_EQ("ADE", model.text()); 1189 EXPECT_STR_EQ("ADE", model.text());
1186 EXPECT_EQ(1U, model.GetCursorPosition()); 1190 EXPECT_EQ(gfx::Range(1), GetSelectedRange(model));
1187 EXPECT_TRUE(model.Undo()); 1191 EXPECT_TRUE(model.Undo());
1188 EXPECT_STR_EQ("ABCDE", model.text()); 1192 EXPECT_STR_EQ("ABCDE", model.text());
1189 EXPECT_EQ(3U, model.GetCursorPosition()); 1193 EXPECT_EQ(gfx::Range(1,3), GetSelectedRange(model));
1190 EXPECT_TRUE(model.Undo()); 1194 EXPECT_TRUE(model.Undo());
1191 EXPECT_STR_EQ("", model.text()); 1195 EXPECT_STR_EQ("", model.text());
1192 EXPECT_EQ(0U, model.GetCursorPosition()); 1196 EXPECT_EQ(gfx::Range(0), GetSelectedRange(model));
1193 EXPECT_FALSE(model.Undo()); // There is no more to undo. 1197 EXPECT_FALSE(model.Undo()); // There is no more to undo.
1194 EXPECT_STR_EQ("", model.text()); 1198 EXPECT_STR_EQ("", model.text());
1195 EXPECT_TRUE(model.Redo()); 1199 EXPECT_TRUE(model.Redo());
1196 EXPECT_STR_EQ("ABCDE", model.text()); 1200 EXPECT_STR_EQ("ABCDE", model.text());
1197 EXPECT_EQ(5U, model.GetCursorPosition()); 1201 EXPECT_EQ(gfx::Range(5), GetSelectedRange(model));
1198 EXPECT_TRUE(model.Redo()); 1202 EXPECT_TRUE(model.Redo());
1199 EXPECT_STR_EQ("ADE", model.text()); 1203 EXPECT_STR_EQ("ADE", model.text());
1200 EXPECT_EQ(1U, model.GetCursorPosition()); 1204 EXPECT_EQ(gfx::Range(1), GetSelectedRange(model));
1201 EXPECT_FALSE(model.Redo()); // There is no more to redo. 1205 EXPECT_FALSE(model.Redo()); // There is no more to redo.
1202 EXPECT_STR_EQ("ADE", model.text()); 1206 EXPECT_STR_EQ("ADE", model.text());
1203 1207
1204 model.Paste(); 1208 model.Paste();
1205 model.Paste(); 1209 model.Paste();
1206 model.Paste(); 1210 model.Paste();
1207 EXPECT_STR_EQ("ABCBCBCDE", model.text()); 1211 EXPECT_STR_EQ("ABCBCBCDE", model.text());
1208 EXPECT_EQ(7U, model.GetCursorPosition()); 1212 EXPECT_EQ(gfx::Range(7), GetSelectedRange(model));
1209 EXPECT_TRUE(model.Undo()); 1213 EXPECT_TRUE(model.Undo());
1210 EXPECT_STR_EQ("ABCBCDE", model.text()); 1214 EXPECT_STR_EQ("ABCBCDE", model.text());
1211 EXPECT_EQ(5U, model.GetCursorPosition()); 1215 EXPECT_EQ(gfx::Range(5), GetSelectedRange(model));
1212 EXPECT_TRUE(model.Undo()); 1216 EXPECT_TRUE(model.Undo());
1213 EXPECT_STR_EQ("ABCDE", model.text()); 1217 EXPECT_STR_EQ("ABCDE", model.text());
1214 EXPECT_EQ(3U, model.GetCursorPosition()); 1218 EXPECT_EQ(gfx::Range(3), GetSelectedRange(model));
1215 EXPECT_TRUE(model.Undo()); 1219 EXPECT_TRUE(model.Undo());
1216 EXPECT_STR_EQ("ADE", model.text()); 1220 EXPECT_STR_EQ("ADE", model.text());
1217 EXPECT_EQ(1U, model.GetCursorPosition()); 1221 EXPECT_EQ(gfx::Range(1), GetSelectedRange(model));
1218 EXPECT_TRUE(model.Undo()); 1222 EXPECT_TRUE(model.Undo());
1219 EXPECT_STR_EQ("ABCDE", model.text()); 1223 EXPECT_STR_EQ("ABCDE", model.text());
1220 EXPECT_EQ(3U, model.GetCursorPosition()); 1224 EXPECT_EQ(gfx::Range(1,3), GetSelectedRange(model));
1221 EXPECT_TRUE(model.Undo()); 1225 EXPECT_TRUE(model.Undo());
1222 EXPECT_STR_EQ("", model.text()); 1226 EXPECT_STR_EQ("", model.text());
1223 EXPECT_EQ(0U, model.GetCursorPosition()); 1227 EXPECT_EQ(gfx::Range(0), GetSelectedRange(model));
1224 EXPECT_FALSE(model.Undo()); 1228 EXPECT_FALSE(model.Undo());
1225 EXPECT_STR_EQ("", model.text()); 1229 EXPECT_STR_EQ("", model.text());
1226 EXPECT_TRUE(model.Redo()); 1230 EXPECT_TRUE(model.Redo());
1227 EXPECT_STR_EQ("ABCDE", model.text()); 1231 EXPECT_STR_EQ("ABCDE", model.text());
1228 EXPECT_EQ(5U, model.GetCursorPosition()); 1232 EXPECT_EQ(gfx::Range(5), GetSelectedRange(model));
1229 1233
1230 // Test Redo. 1234 // Test Redo.
1231 EXPECT_TRUE(model.Redo()); 1235 EXPECT_TRUE(model.Redo());
1232 EXPECT_STR_EQ("ADE", model.text()); 1236 EXPECT_STR_EQ("ADE", model.text());
1233 EXPECT_EQ(1U, model.GetCursorPosition()); 1237 EXPECT_EQ(gfx::Range(1), GetSelectedRange(model));
1234 EXPECT_TRUE(model.Redo()); 1238 EXPECT_TRUE(model.Redo());
1235 EXPECT_STR_EQ("ABCDE", model.text()); 1239 EXPECT_STR_EQ("ABCDE", model.text());
1236 EXPECT_EQ(3U, model.GetCursorPosition()); 1240 EXPECT_EQ(gfx::Range(3), GetSelectedRange(model));
1237 EXPECT_TRUE(model.Redo()); 1241 EXPECT_TRUE(model.Redo());
1238 EXPECT_STR_EQ("ABCBCDE", model.text()); 1242 EXPECT_STR_EQ("ABCBCDE", model.text());
1239 EXPECT_EQ(5U, model.GetCursorPosition()); 1243 EXPECT_EQ(gfx::Range(5), GetSelectedRange(model));
1240 EXPECT_TRUE(model.Redo()); 1244 EXPECT_TRUE(model.Redo());
1241 EXPECT_STR_EQ("ABCBCBCDE", model.text()); 1245 EXPECT_STR_EQ("ABCBCBCDE", model.text());
1242 EXPECT_EQ(7U, model.GetCursorPosition()); 1246 EXPECT_EQ(gfx::Range(7), GetSelectedRange(model));
1243 EXPECT_FALSE(model.Redo()); 1247 EXPECT_FALSE(model.Redo());
1244 1248
1245 // Test using SelectRange. 1249 // Test using SelectRange.
1246 model.SelectRange(gfx::Range(1, 3)); 1250 model.SelectRange(gfx::Range(1, 3));
1247 EXPECT_TRUE(model.Cut()); 1251 EXPECT_TRUE(model.Cut());
1248 EXPECT_STR_EQ("ABCBCDE", model.text()); 1252 EXPECT_STR_EQ("ABCBCDE", model.text());
1249 EXPECT_EQ(1U, model.GetCursorPosition()); 1253 EXPECT_EQ(gfx::Range(1), GetSelectedRange(model));
1250 model.SelectRange(gfx::Range(1, 1)); 1254 model.SelectRange(gfx::Range(1, 1));
1251 EXPECT_FALSE(model.Cut()); 1255 EXPECT_FALSE(model.Cut());
1252 model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false); 1256 model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false);
1253 EXPECT_TRUE(model.Paste()); 1257 EXPECT_TRUE(model.Paste());
1254 EXPECT_STR_EQ("ABCBCDEBC", model.text()); 1258 EXPECT_STR_EQ("ABCBCDEBC", model.text());
1255 EXPECT_EQ(9U, model.GetCursorPosition()); 1259 EXPECT_EQ(gfx::Range(9), GetSelectedRange(model));
1256 EXPECT_TRUE(model.Undo()); 1260 EXPECT_TRUE(model.Undo());
1257 EXPECT_STR_EQ("ABCBCDE", model.text()); 1261 EXPECT_STR_EQ("ABCBCDE", model.text());
1258 EXPECT_EQ(7U, model.GetCursorPosition()); 1262 EXPECT_EQ(gfx::Range(7), GetSelectedRange(model));
1259 // An empty cut shouldn't create an edit. 1263 // An empty cut shouldn't create an edit.
1260 EXPECT_TRUE(model.Undo()); 1264 EXPECT_TRUE(model.Undo());
1261 EXPECT_STR_EQ("ABCBCBCDE", model.text()); 1265 EXPECT_STR_EQ("ABCBCBCDE", model.text());
1262 EXPECT_EQ(3U, model.GetCursorPosition()); 1266 EXPECT_EQ(gfx::Range(1,3), GetSelectedRange(model));
1263 1267
1264 // Test Copy. 1268 // Test Copy.
1265 ResetModel(&model); 1269 ResetModel(&model);
1266 model.SetText(base::ASCIIToUTF16("12345")); 1270 model.SetText(base::ASCIIToUTF16("12345"));
1267 EXPECT_STR_EQ("12345", model.text()); 1271 EXPECT_STR_EQ("12345", model.text());
1268 EXPECT_EQ(5U, model.GetCursorPosition()); 1272 EXPECT_EQ(gfx::Range(5), GetSelectedRange(model));
1269 model.SelectRange(gfx::Range(1, 3)); 1273 model.SelectRange(gfx::Range(1, 3));
1270 model.Copy(); // Copy "23". 1274 model.Copy(); // Copy "23".
1271 EXPECT_STR_EQ("12345", model.text()); 1275 EXPECT_STR_EQ("12345", model.text());
1272 EXPECT_EQ(3U, model.GetCursorPosition()); 1276 EXPECT_EQ(gfx::Range(1, 3), GetSelectedRange(model));
1273 model.Paste(); // Paste "23" into "23". 1277 model.Paste(); // Paste "23" into "23".
1274 EXPECT_STR_EQ("12345", model.text()); 1278 EXPECT_STR_EQ("12345", model.text());
1275 EXPECT_EQ(3U, model.GetCursorPosition()); 1279 EXPECT_EQ(gfx::Range(3), GetSelectedRange(model));
1276 model.Paste(); 1280 model.Paste();
1277 EXPECT_STR_EQ("1232345", model.text()); 1281 EXPECT_STR_EQ("1232345", model.text());
1278 EXPECT_EQ(5U, model.GetCursorPosition()); 1282 EXPECT_EQ(gfx::Range(5), GetSelectedRange(model));
1279 EXPECT_TRUE(model.Undo()); 1283 EXPECT_TRUE(model.Undo());
1280 EXPECT_STR_EQ("12345", model.text()); 1284 EXPECT_STR_EQ("12345", model.text());
1281 EXPECT_EQ(3U, model.GetCursorPosition()); 1285 EXPECT_EQ(gfx::Range(3), GetSelectedRange(model));
1282 // TODO(oshima): Change the return type from bool to enum. 1286 // TODO(oshima): Change the return type from bool to enum.
1283 EXPECT_FALSE(model.Undo()); // No text change. 1287 EXPECT_FALSE(model.Undo()); // No text change.
1284 EXPECT_STR_EQ("12345", model.text()); 1288 EXPECT_STR_EQ("12345", model.text());
1285 EXPECT_EQ(3U, model.GetCursorPosition()); 1289 EXPECT_EQ(gfx::Range(1,3), GetSelectedRange(model));
1286 EXPECT_TRUE(model.Undo()); 1290 EXPECT_TRUE(model.Undo());
1287 EXPECT_STR_EQ("", model.text()); 1291 EXPECT_STR_EQ("", model.text());
1288 EXPECT_FALSE(model.Undo()); 1292 EXPECT_FALSE(model.Undo());
1289 // Test Redo. 1293 // Test Redo.
1290 EXPECT_TRUE(model.Redo()); 1294 EXPECT_TRUE(model.Redo());
1291 EXPECT_STR_EQ("12345", model.text()); 1295 EXPECT_STR_EQ("12345", model.text());
1292 EXPECT_EQ(5U, model.GetCursorPosition()); 1296 EXPECT_EQ(gfx::Range(5), GetSelectedRange(model));
1293 EXPECT_TRUE(model.Redo()); 1297 EXPECT_TRUE(model.Redo());
1294 EXPECT_STR_EQ("12345", model.text()); // For 1st paste 1298 EXPECT_STR_EQ("12345", model.text()); // For 1st paste
1295 EXPECT_EQ(3U, model.GetCursorPosition()); 1299 EXPECT_EQ(gfx::Range(3), GetSelectedRange(model));
1296 EXPECT_TRUE(model.Redo()); 1300 EXPECT_TRUE(model.Redo());
1297 EXPECT_STR_EQ("1232345", model.text()); 1301 EXPECT_STR_EQ("1232345", model.text());
1298 EXPECT_EQ(5U, model.GetCursorPosition()); 1302 EXPECT_EQ(gfx::Range(5), GetSelectedRange(model));
1299 EXPECT_FALSE(model.Redo()); 1303 EXPECT_FALSE(model.Redo());
1300 EXPECT_STR_EQ("1232345", model.text()); 1304 EXPECT_STR_EQ("1232345", model.text());
1301 1305
1302 // Test using SelectRange. 1306 // Test using SelectRange.
1303 model.SelectRange(gfx::Range(1, 3)); 1307 model.SelectRange(gfx::Range(1, 3));
1304 model.Copy(); 1308 model.Copy();
1305 EXPECT_STR_EQ("1232345", model.text()); 1309 EXPECT_STR_EQ("1232345", model.text());
1306 model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false); 1310 model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false);
1307 EXPECT_TRUE(model.Paste()); 1311 EXPECT_TRUE(model.Paste());
1308 EXPECT_STR_EQ("123234523", model.text()); 1312 EXPECT_STR_EQ("123234523", model.text());
1309 EXPECT_EQ(9U, model.GetCursorPosition()); 1313 EXPECT_EQ(gfx::Range(9), GetSelectedRange(model));
1310 EXPECT_TRUE(model.Undo()); 1314 EXPECT_TRUE(model.Undo());
1311 EXPECT_STR_EQ("1232345", model.text()); 1315 EXPECT_STR_EQ("1232345", model.text());
1312 EXPECT_EQ(7U, model.GetCursorPosition()); 1316 EXPECT_EQ(gfx::Range(7), GetSelectedRange(model));
1313 } 1317 }
1314 1318
1315 TEST_F(TextfieldModelTest, UndoRedo_CursorTest) { 1319 TEST_F(TextfieldModelTest, UndoRedo_CursorTest) {
1316 TextfieldModel model(NULL); 1320 TextfieldModel model(NULL);
1317 model.InsertChar('a'); 1321 model.InsertChar('a');
1318 model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, false); 1322 model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, false);
1319 model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, false); 1323 model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, false);
1320 model.InsertChar('b'); 1324 model.InsertChar('b');
1321 // Moving the cursor shouldn't create a new edit. 1325 // Moving the cursor shouldn't create a new edit.
1322 EXPECT_STR_EQ("ab", model.text()); 1326 EXPECT_STR_EQ("ab", model.text());
1323 EXPECT_FALSE(model.Redo()); 1327 EXPECT_FALSE(model.Redo());
1324 EXPECT_TRUE(model.Undo()); 1328 EXPECT_TRUE(model.Undo());
1325 EXPECT_STR_EQ("", model.text()); 1329 EXPECT_STR_EQ("", model.text());
1326 EXPECT_FALSE(model.Undo()); 1330 EXPECT_FALSE(model.Undo());
1327 EXPECT_STR_EQ("", model.text()); 1331 EXPECT_STR_EQ("", model.text());
1328 EXPECT_TRUE(model.Redo()); 1332 EXPECT_TRUE(model.Redo());
1329 EXPECT_STR_EQ("ab", model.text()); 1333 EXPECT_STR_EQ("ab", model.text());
1330 EXPECT_EQ(2U, model.GetCursorPosition()); 1334 EXPECT_EQ(2U, model.GetCursorPosition());
1331 EXPECT_FALSE(model.Redo()); 1335 EXPECT_FALSE(model.Redo());
1332 } 1336 }
1333 1337
1334 void RunInsertReplaceTest(TextfieldModel& model) { 1338 void RunInsertReplaceTest(TextfieldModel& model) {
1335 const bool reverse = model.render_text()->selection().is_reversed(); 1339 const bool reverse = model.render_text()->selection().is_reversed();
1336 model.InsertChar('1'); 1340 model.InsertChar('1');
1337 model.InsertChar('2'); 1341 model.InsertChar('2');
1338 model.InsertChar('3'); 1342 model.InsertChar('3');
1339 EXPECT_STR_EQ("a123d", model.text()); 1343 EXPECT_STR_EQ("a123d", model.text());
1340 EXPECT_EQ(4U, model.GetCursorPosition()); 1344 EXPECT_EQ(gfx::Range(4), GetSelectedRange(model));
1341 EXPECT_TRUE(model.Undo()); 1345 EXPECT_TRUE(model.Undo());
1342 EXPECT_STR_EQ("abcd", model.text()); 1346 EXPECT_STR_EQ("abcd", model.text());
1343 EXPECT_EQ(reverse ? 1U : 3U, model.GetCursorPosition()); 1347 EXPECT_EQ(reverse ? gfx::Range(3,1) : gfx::Range(1,3), GetSelectedRange(model) );
1344 EXPECT_TRUE(model.Undo()); 1348 EXPECT_TRUE(model.Undo());
1345 EXPECT_STR_EQ("", model.text()); 1349 EXPECT_STR_EQ("", model.text());
1346 EXPECT_EQ(0U, model.GetCursorPosition()); 1350 EXPECT_EQ(gfx::Range(0), GetSelectedRange(model));
1347 EXPECT_FALSE(model.Undo()); 1351 EXPECT_FALSE(model.Undo());
1348 EXPECT_TRUE(model.Redo()); 1352 EXPECT_TRUE(model.Redo());
1349 EXPECT_STR_EQ("abcd", model.text()); 1353 EXPECT_STR_EQ("abcd", model.text());
1350 EXPECT_EQ(4U, model.GetCursorPosition()); 1354 EXPECT_EQ(gfx::Range(4), GetSelectedRange(model));
1351 EXPECT_TRUE(model.Redo()); 1355 EXPECT_TRUE(model.Redo());
1352 EXPECT_STR_EQ("a123d", model.text()); 1356 EXPECT_STR_EQ("a123d", model.text());
1353 EXPECT_EQ(4U, model.GetCursorPosition()); 1357 EXPECT_EQ(gfx::Range(4), GetSelectedRange(model));
1354 EXPECT_FALSE(model.Redo()); 1358 EXPECT_FALSE(model.Redo());
1355 } 1359 }
1356 1360
1357 void RunOverwriteReplaceTest(TextfieldModel& model) { 1361 void RunOverwriteReplaceTest(TextfieldModel& model) {
1358 const bool reverse = model.render_text()->selection().is_reversed(); 1362 const bool reverse = model.render_text()->selection().is_reversed();
1359 model.ReplaceChar('1'); 1363 model.ReplaceChar('1');
1360 model.ReplaceChar('2'); 1364 model.ReplaceChar('2');
1361 model.ReplaceChar('3'); 1365 model.ReplaceChar('3');
1362 model.ReplaceChar('4'); 1366 model.ReplaceChar('4');
1363 EXPECT_STR_EQ("a1234", model.text()); 1367 EXPECT_STR_EQ("a1234", model.text());
1364 EXPECT_EQ(5U, model.GetCursorPosition()); 1368 EXPECT_EQ(gfx::Range(5), GetSelectedRange(model));
1365 EXPECT_TRUE(model.Undo()); 1369 EXPECT_TRUE(model.Undo());
1366 EXPECT_STR_EQ("abcd", model.text()); 1370 EXPECT_STR_EQ("abcd", model.text());
1367 EXPECT_EQ(reverse ? 1U : 3U, model.GetCursorPosition()); 1371 EXPECT_EQ(reverse ? gfx::Range(4,1) : gfx::Range(1,4), GetSelectedRange(model ));
1368 EXPECT_TRUE(model.Undo()); 1372 EXPECT_TRUE(model.Undo());
1369 EXPECT_STR_EQ("", model.text()); 1373 EXPECT_STR_EQ("", model.text());
1370 EXPECT_EQ(0U, model.GetCursorPosition()); 1374 EXPECT_EQ(gfx::Range(0), GetSelectedRange(model));
1371 EXPECT_FALSE(model.Undo()); 1375 EXPECT_FALSE(model.Undo());
1372 EXPECT_TRUE(model.Redo()); 1376 EXPECT_TRUE(model.Redo());
1373 EXPECT_STR_EQ("abcd", model.text()); 1377 EXPECT_STR_EQ("abcd", model.text());
1374 EXPECT_EQ(4U, model.GetCursorPosition()); 1378 EXPECT_EQ(gfx::Range(4), GetSelectedRange(model));
1375 EXPECT_TRUE(model.Redo()); 1379 EXPECT_TRUE(model.Redo());
1376 EXPECT_STR_EQ("a1234", model.text()); 1380 EXPECT_STR_EQ("a1234", model.text());
1377 EXPECT_EQ(5U, model.GetCursorPosition()); 1381 EXPECT_EQ(gfx::Range(5), GetSelectedRange(model));
1378 EXPECT_FALSE(model.Redo()); 1382 EXPECT_FALSE(model.Redo());
1379 } 1383 }
1380 1384
1381 TEST_F(TextfieldModelTest, UndoRedo_ReplaceTest) { 1385 TEST_F(TextfieldModelTest, UndoRedo_ReplaceTest) {
1382 { 1386 {
1383 SCOPED_TRACE("Select forwards and insert."); 1387 SCOPED_TRACE("Select forwards and insert.");
1384 TextfieldModel model(NULL); 1388 TextfieldModel model(NULL);
1385 model.SetText(base::ASCIIToUTF16("abcd")); 1389 model.SetText(base::ASCIIToUTF16("abcd"));
1386 model.SelectRange(gfx::Range(1, 3)); 1390 model.SelectRange(gfx::Range(1, 3));
1387 RunInsertReplaceTest(model); 1391 RunInsertReplaceTest(model);
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
1583 // Test 7 1587 // Test 7
1584 // Clipboard text with lots of spaces between words should have all spaces 1588 // Clipboard text with lots of spaces between words should have all spaces
1585 // replaced with a single space. 1589 // replaced with a single space.
1586 ui::ScopedClipboardWriter(ui::CLIPBOARD_TYPE_COPY_PASTE) 1590 ui::ScopedClipboardWriter(ui::CLIPBOARD_TYPE_COPY_PASTE)
1587 .WriteText(base::ASCIIToUTF16("FOO BAR")); 1591 .WriteText(base::ASCIIToUTF16("FOO BAR"));
1588 EXPECT_TRUE(model.Paste()); 1592 EXPECT_TRUE(model.Paste());
1589 EXPECT_STR_EQ("FOO BAR", model.text()); 1593 EXPECT_STR_EQ("FOO BAR", model.text());
1590 } 1594 }
1591 1595
1592 } // namespace views 1596 } // namespace views
OLDNEW
« no previous file with comments | « ui/views/controls/textfield/textfield_model.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698