OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |