| 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; | |
| 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 | |
| 545 EXPECT_FALSE(composition_text_confirmed_or_cleared_); | 504 EXPECT_FALSE(composition_text_confirmed_or_cleared_); |
| 546 model.CancelCompositionText(); | 505 model.CancelCompositionText(); |
| 547 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 506 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
| 548 composition_text_confirmed_or_cleared_ = false; | 507 composition_text_confirmed_or_cleared_ = false; |
| 549 EXPECT_FALSE(model.HasCompositionText()); | 508 EXPECT_FALSE(model.HasCompositionText()); |
| 550 EXPECT_FALSE(model.HasSelection()); | 509 EXPECT_FALSE(model.HasSelection()); |
| 551 EXPECT_EQ(5U, model.cursor_pos()); | 510 EXPECT_EQ(5U, model.GetCursorPosition()); |
| 552 | 511 |
| 553 model.SetCompositionText(composition); | 512 model.SetCompositionText(composition); |
| 554 EXPECT_STR_EQ("1234567890", model.text()); | 513 EXPECT_STR_EQ("1234567890", model.GetText()); |
| 555 EXPECT_TRUE(model.SetText(ASCIIToUTF16("1234567890"))); | 514 EXPECT_TRUE(model.SetText(ASCIIToUTF16("1234567890"))); |
| 556 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 515 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
| 557 composition_text_confirmed_or_cleared_ = false; | 516 composition_text_confirmed_or_cleared_ = false; |
| 558 model.MoveCursorToEnd(false); | 517 model.MoveCursorToRightEnd(false); |
| 559 | 518 |
| 560 model.SetCompositionText(composition); | 519 model.SetCompositionText(composition); |
| 561 EXPECT_STR_EQ("1234567890678", model.text()); | 520 EXPECT_STR_EQ("1234567890678", model.GetText()); |
| 562 | 521 |
| 563 model.InsertText(UTF8ToUTF16("-")); | 522 model.InsertText(UTF8ToUTF16("-")); |
| 564 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 523 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
| 565 composition_text_confirmed_or_cleared_ = false; | 524 composition_text_confirmed_or_cleared_ = false; |
| 566 EXPECT_STR_EQ("1234567890-", model.text()); | 525 EXPECT_STR_EQ("1234567890-", model.GetText()); |
| 567 EXPECT_FALSE(model.HasCompositionText()); | 526 EXPECT_FALSE(model.HasCompositionText()); |
| 568 EXPECT_FALSE(model.HasSelection()); | 527 EXPECT_FALSE(model.HasSelection()); |
| 569 | 528 |
| 570 model.MoveCursorLeft(true); | 529 model.MoveCursorLeft(true); |
| 571 EXPECT_STR_EQ("-", model.GetSelectedText()); | 530 EXPECT_STR_EQ("-", model.GetSelectedText()); |
| 572 model.SetCompositionText(composition); | 531 model.SetCompositionText(composition); |
| 573 EXPECT_STR_EQ("1234567890678", model.text()); | 532 EXPECT_STR_EQ("1234567890678", model.GetText()); |
| 574 | 533 |
| 575 model.ReplaceText(UTF8ToUTF16("-")); | 534 model.ReplaceText(UTF8ToUTF16("-")); |
| 576 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 535 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
| 577 composition_text_confirmed_or_cleared_ = false; | 536 composition_text_confirmed_or_cleared_ = false; |
| 578 EXPECT_STR_EQ("1234567890-", model.text()); | 537 EXPECT_STR_EQ("1234567890-", model.GetText()); |
| 579 EXPECT_FALSE(model.HasCompositionText()); | 538 EXPECT_FALSE(model.HasCompositionText()); |
| 580 EXPECT_FALSE(model.HasSelection()); | 539 EXPECT_FALSE(model.HasSelection()); |
| 581 | 540 |
| 582 model.SetCompositionText(composition); | 541 model.SetCompositionText(composition); |
| 583 model.Append(UTF8ToUTF16("-")); | 542 model.Append(UTF8ToUTF16("-")); |
| 584 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 543 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
| 585 composition_text_confirmed_or_cleared_ = false; | 544 composition_text_confirmed_or_cleared_ = false; |
| 586 EXPECT_STR_EQ("1234567890-678-", model.text()); | 545 EXPECT_STR_EQ("1234567890-678-", model.GetText()); |
| 587 | 546 |
| 588 model.SetCompositionText(composition); | 547 model.SetCompositionText(composition); |
| 589 model.Delete(); | 548 model.Delete(); |
| 590 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 549 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
| 591 composition_text_confirmed_or_cleared_ = false; | 550 composition_text_confirmed_or_cleared_ = false; |
| 592 EXPECT_STR_EQ("1234567890-678-", model.text()); | 551 EXPECT_STR_EQ("1234567890-678-", model.GetText()); |
| 593 | 552 |
| 594 model.SetCompositionText(composition); | 553 model.SetCompositionText(composition); |
| 595 model.Backspace(); | 554 model.Backspace(); |
| 596 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 555 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
| 597 composition_text_confirmed_or_cleared_ = false; | 556 composition_text_confirmed_or_cleared_ = false; |
| 598 EXPECT_STR_EQ("1234567890-678-", model.text()); | 557 EXPECT_STR_EQ("1234567890-678-", model.GetText()); |
| 599 | 558 |
| 600 model.SetText(string16()); | 559 model.SetText(string16()); |
| 601 model.SetCompositionText(composition); | 560 model.SetCompositionText(composition); |
| 602 model.MoveCursorLeft(false); | 561 model.MoveCursorLeft(false); |
| 603 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 562 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
| 604 composition_text_confirmed_or_cleared_ = false; | 563 composition_text_confirmed_or_cleared_ = false; |
| 605 EXPECT_STR_EQ("678", model.text()); | 564 EXPECT_STR_EQ("678", model.GetText()); |
| 606 EXPECT_EQ(2U, model.cursor_pos()); | 565 EXPECT_EQ(2U, model.GetCursorPosition()); |
| 607 | 566 |
| 608 model.SetCompositionText(composition); | 567 model.SetCompositionText(composition); |
| 609 model.MoveCursorRight(false); | 568 model.MoveCursorRight(false); |
| 610 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 569 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
| 611 composition_text_confirmed_or_cleared_ = false; | 570 composition_text_confirmed_or_cleared_ = false; |
| 612 EXPECT_STR_EQ("676788", model.text()); | 571 EXPECT_STR_EQ("676788", model.GetText()); |
| 613 EXPECT_EQ(6U, model.cursor_pos()); | 572 EXPECT_EQ(6U, model.GetCursorPosition()); |
| 614 | 573 |
| 615 model.SetCompositionText(composition); | 574 model.SetCompositionText(composition); |
| 616 model.MoveCursorToPreviousWord(false); | 575 model.MoveCursorLeftByWord(false); |
| 617 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 576 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
| 618 composition_text_confirmed_or_cleared_ = false; | 577 composition_text_confirmed_or_cleared_ = false; |
| 619 EXPECT_STR_EQ("676788678", model.text()); | 578 EXPECT_STR_EQ("676788678", model.GetText()); |
| 620 | 579 |
| 621 model.SetText(string16()); | 580 model.SetText(string16()); |
| 622 model.SetCompositionText(composition); | 581 model.SetCompositionText(composition); |
| 623 model.MoveCursorToNextWord(false); | 582 model.MoveCursorRightByWord(false); |
| 624 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 583 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
| 625 composition_text_confirmed_or_cleared_ = false; | 584 composition_text_confirmed_or_cleared_ = false; |
| 626 | 585 |
| 627 model.SetCompositionText(composition); | 586 model.SetCompositionText(composition); |
| 628 model.MoveCursorToHome(true); | 587 model.MoveCursorToLeftEnd(true); |
| 629 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 588 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
| 630 composition_text_confirmed_or_cleared_ = false; | 589 composition_text_confirmed_or_cleared_ = false; |
| 631 EXPECT_STR_EQ("678678", model.text()); | 590 EXPECT_STR_EQ("678678", model.GetText()); |
| 632 | 591 |
| 633 model.SetCompositionText(composition); | 592 model.SetCompositionText(composition); |
| 634 model.MoveCursorToEnd(false); | 593 model.MoveCursorToRightEnd(false); |
| 635 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 594 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
| 636 composition_text_confirmed_or_cleared_ = false; | 595 composition_text_confirmed_or_cleared_ = false; |
| 637 EXPECT_STR_EQ("678", model.text()); | 596 EXPECT_STR_EQ("678", model.GetText()); |
| 638 | 597 |
| 639 model.SetCompositionText(composition); | 598 model.SetCompositionText(composition); |
| 640 model.MoveCursorTo(0, true); | 599 model.MoveCursorTo(0, true); |
| 641 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 600 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
| 642 composition_text_confirmed_or_cleared_ = false; | 601 composition_text_confirmed_or_cleared_ = false; |
| 643 EXPECT_STR_EQ("678678", model.text()); | 602 EXPECT_STR_EQ("678678", model.GetText()); |
| 644 | 603 |
| 645 model.SetCompositionText(composition); | 604 model.SetCompositionText(composition); |
| 646 model.SelectRange(ui::Range(0, 3)); | 605 model.SelectRange(ui::Range(0, 3)); |
| 647 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 606 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
| 648 composition_text_confirmed_or_cleared_ = false; | 607 composition_text_confirmed_or_cleared_ = false; |
| 649 EXPECT_STR_EQ("678", model.text()); | 608 EXPECT_STR_EQ("678", model.GetText()); |
| 650 | 609 |
| 651 model.SetCompositionText(composition); | 610 model.SetCompositionText(composition); |
| 652 model.SelectAll(); | 611 model.SelectAll(); |
| 653 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 612 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
| 654 composition_text_confirmed_or_cleared_ = false; | 613 composition_text_confirmed_or_cleared_ = false; |
| 655 EXPECT_STR_EQ("678", model.text()); | 614 EXPECT_STR_EQ("678", model.GetText()); |
| 656 | 615 |
| 657 model.SetCompositionText(composition); | 616 model.SetCompositionText(composition); |
| 658 model.SelectWord(); | 617 model.SelectWord(); |
| 659 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 618 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
| 660 composition_text_confirmed_or_cleared_ = false; | 619 composition_text_confirmed_or_cleared_ = false; |
| 661 EXPECT_STR_EQ("678", model.text()); | 620 EXPECT_STR_EQ("678", model.GetText()); |
| 662 | 621 |
| 663 model.SetCompositionText(composition); | 622 model.SetCompositionText(composition); |
| 664 model.ClearSelection(); | 623 model.ClearSelection(); |
| 665 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 624 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
| 666 composition_text_confirmed_or_cleared_ = false; | 625 composition_text_confirmed_or_cleared_ = false; |
| 667 | 626 |
| 668 model.SetCompositionText(composition); | 627 model.SetCompositionText(composition); |
| 669 EXPECT_FALSE(model.Cut()); | 628 EXPECT_FALSE(model.Cut()); |
| 670 EXPECT_FALSE(composition_text_confirmed_or_cleared_); | 629 EXPECT_FALSE(composition_text_confirmed_or_cleared_); |
| 671 } | 630 } |
| 672 | 631 |
| 673 TEST_F(TextfieldViewsModelTest, UndoRedo_BasicTest) { | 632 TEST_F(TextfieldViewsModelTest, UndoRedo_BasicTest) { |
| 674 TextfieldViewsModel model(NULL); | 633 TextfieldViewsModel model(NULL); |
| 675 model.InsertChar('a'); | 634 model.InsertChar('a'); |
| 676 EXPECT_FALSE(model.Redo()); // nothing to redo | 635 EXPECT_FALSE(model.Redo()); // nothing to redo |
| 677 EXPECT_TRUE(model.Undo()); | 636 EXPECT_TRUE(model.Undo()); |
| 678 EXPECT_STR_EQ("", model.text()); | 637 EXPECT_STR_EQ("", model.GetText()); |
| 679 EXPECT_TRUE(model.Redo()); | 638 EXPECT_TRUE(model.Redo()); |
| 680 EXPECT_STR_EQ("a", model.text()); | 639 EXPECT_STR_EQ("a", model.GetText()); |
| 681 | 640 |
| 682 // Continuous inserts are treated as one edit. | 641 // Continuous inserts are treated as one edit. |
| 683 model.InsertChar('b'); | 642 model.InsertChar('b'); |
| 684 model.InsertChar('c'); | 643 model.InsertChar('c'); |
| 685 EXPECT_STR_EQ("abc", model.text()); | 644 EXPECT_STR_EQ("abc", model.GetText()); |
| 686 EXPECT_TRUE(model.Undo()); | 645 EXPECT_TRUE(model.Undo()); |
| 687 EXPECT_STR_EQ("a", model.text()); | 646 EXPECT_STR_EQ("a", model.GetText()); |
| 688 EXPECT_EQ(1U, model.cursor_pos()); | 647 EXPECT_EQ(1U, model.GetCursorPosition()); |
| 689 EXPECT_TRUE(model.Undo()); | 648 EXPECT_TRUE(model.Undo()); |
| 690 EXPECT_STR_EQ("", model.text()); | 649 EXPECT_STR_EQ("", model.GetText()); |
| 691 EXPECT_EQ(0U, model.cursor_pos()); | 650 EXPECT_EQ(0U, model.GetCursorPosition()); |
| 692 | 651 |
| 693 // Undoing further shouldn't change the text. | 652 // Undoing further shouldn't change the text. |
| 694 EXPECT_FALSE(model.Undo()); | 653 EXPECT_FALSE(model.Undo()); |
| 695 EXPECT_STR_EQ("", model.text()); | 654 EXPECT_STR_EQ("", model.GetText()); |
| 696 EXPECT_FALSE(model.Undo()); | 655 EXPECT_FALSE(model.Undo()); |
| 697 EXPECT_STR_EQ("", model.text()); | 656 EXPECT_STR_EQ("", model.GetText()); |
| 698 EXPECT_EQ(0U, model.cursor_pos()); | 657 EXPECT_EQ(0U, model.GetCursorPosition()); |
| 699 | 658 |
| 700 // Redoing to the latest text. | 659 // Redoing to the latest text. |
| 701 EXPECT_TRUE(model.Redo()); | 660 EXPECT_TRUE(model.Redo()); |
| 702 EXPECT_STR_EQ("a", model.text()); | 661 EXPECT_STR_EQ("a", model.GetText()); |
| 703 EXPECT_EQ(1U, model.cursor_pos()); | 662 EXPECT_EQ(1U, model.GetCursorPosition()); |
| 704 EXPECT_TRUE(model.Redo()); | 663 EXPECT_TRUE(model.Redo()); |
| 705 EXPECT_STR_EQ("abc", model.text()); | 664 EXPECT_STR_EQ("abc", model.GetText()); |
| 706 EXPECT_EQ(3U, model.cursor_pos()); | 665 EXPECT_EQ(3U, model.GetCursorPosition()); |
| 707 | 666 |
| 708 // Backspace =============================== | 667 // Backspace =============================== |
| 709 EXPECT_TRUE(model.Backspace()); | 668 EXPECT_TRUE(model.Backspace()); |
| 710 EXPECT_STR_EQ("ab", model.text()); | 669 EXPECT_STR_EQ("ab", model.GetText()); |
| 711 EXPECT_TRUE(model.Undo()); | 670 EXPECT_TRUE(model.Undo()); |
| 712 EXPECT_STR_EQ("abc", model.text()); | 671 EXPECT_STR_EQ("abc", model.GetText()); |
| 713 EXPECT_EQ(3U, model.cursor_pos()); | 672 EXPECT_EQ(3U, model.GetCursorPosition()); |
| 714 EXPECT_TRUE(model.Redo()); | 673 EXPECT_TRUE(model.Redo()); |
| 715 EXPECT_STR_EQ("ab", model.text()); | 674 EXPECT_STR_EQ("ab", model.GetText()); |
| 716 EXPECT_EQ(2U, model.cursor_pos()); | 675 EXPECT_EQ(2U, model.GetCursorPosition()); |
| 717 // Continous backspaces are treated as one edit. | 676 // Continous backspaces are treated as one edit. |
| 718 EXPECT_TRUE(model.Backspace()); | 677 EXPECT_TRUE(model.Backspace()); |
| 719 EXPECT_TRUE(model.Backspace()); | 678 EXPECT_TRUE(model.Backspace()); |
| 720 EXPECT_STR_EQ("", model.text()); | 679 EXPECT_STR_EQ("", model.GetText()); |
| 721 // Extra backspace shouldn't affect the history. | 680 // Extra backspace shouldn't affect the history. |
| 722 EXPECT_FALSE(model.Backspace()); | 681 EXPECT_FALSE(model.Backspace()); |
| 723 EXPECT_TRUE(model.Undo()); | 682 EXPECT_TRUE(model.Undo()); |
| 724 EXPECT_STR_EQ("ab", model.text()); | 683 EXPECT_STR_EQ("ab", model.GetText()); |
| 725 EXPECT_EQ(2U, model.cursor_pos()); | 684 EXPECT_EQ(2U, model.GetCursorPosition()); |
| 726 EXPECT_TRUE(model.Undo()); | 685 EXPECT_TRUE(model.Undo()); |
| 727 EXPECT_STR_EQ("abc", model.text()); | 686 EXPECT_STR_EQ("abc", model.GetText()); |
| 728 EXPECT_EQ(3U, model.cursor_pos()); | 687 EXPECT_EQ(3U, model.GetCursorPosition()); |
| 729 EXPECT_TRUE(model.Undo()); | 688 EXPECT_TRUE(model.Undo()); |
| 730 EXPECT_STR_EQ("a", model.text()); | 689 EXPECT_STR_EQ("a", model.GetText()); |
| 731 EXPECT_EQ(1U, model.cursor_pos()); | 690 EXPECT_EQ(1U, model.GetCursorPosition()); |
| 732 | 691 |
| 733 // Clear history | 692 // Clear history |
| 734 model.ClearEditHistory(); | 693 model.ClearEditHistory(); |
| 735 EXPECT_FALSE(model.Undo()); | 694 EXPECT_FALSE(model.Undo()); |
| 736 EXPECT_FALSE(model.Redo()); | 695 EXPECT_FALSE(model.Redo()); |
| 737 EXPECT_STR_EQ("a", model.text()); | 696 EXPECT_STR_EQ("a", model.GetText()); |
| 738 EXPECT_EQ(1U, model.cursor_pos()); | 697 EXPECT_EQ(1U, model.GetCursorPosition()); |
| 739 | 698 |
| 740 // Delete =============================== | 699 // Delete =============================== |
| 741 model.SetText(ASCIIToUTF16("ABCDE")); | 700 model.SetText(ASCIIToUTF16("ABCDE")); |
| 742 model.ClearEditHistory(); | 701 model.ClearEditHistory(); |
| 743 model.MoveCursorTo(2, false); | 702 model.MoveCursorTo(2, false); |
| 744 EXPECT_TRUE(model.Delete()); | 703 EXPECT_TRUE(model.Delete()); |
| 745 EXPECT_STR_EQ("ABDE", model.text()); | 704 EXPECT_STR_EQ("ABDE", model.GetText()); |
| 746 model.MoveCursorToHome(false); | 705 model.MoveCursorToLeftEnd(false); |
| 747 EXPECT_TRUE(model.Delete()); | 706 EXPECT_TRUE(model.Delete()); |
| 748 EXPECT_STR_EQ("BDE", model.text()); | 707 EXPECT_STR_EQ("BDE", model.GetText()); |
| 749 EXPECT_TRUE(model.Undo()); | 708 EXPECT_TRUE(model.Undo()); |
| 750 EXPECT_STR_EQ("ABDE", model.text()); | 709 EXPECT_STR_EQ("ABDE", model.GetText()); |
| 751 EXPECT_EQ(0U, model.cursor_pos()); | 710 EXPECT_EQ(0U, model.GetCursorPosition()); |
| 752 EXPECT_TRUE(model.Undo()); | 711 EXPECT_TRUE(model.Undo()); |
| 753 EXPECT_STR_EQ("ABCDE", model.text()); | 712 EXPECT_STR_EQ("ABCDE", model.GetText()); |
| 754 EXPECT_EQ(2U, model.cursor_pos()); | 713 EXPECT_EQ(2U, model.GetCursorPosition()); |
| 755 EXPECT_TRUE(model.Redo()); | 714 EXPECT_TRUE(model.Redo()); |
| 756 EXPECT_STR_EQ("ABDE", model.text()); | 715 EXPECT_STR_EQ("ABDE", model.GetText()); |
| 757 EXPECT_EQ(2U, model.cursor_pos()); | 716 EXPECT_EQ(2U, model.GetCursorPosition()); |
| 758 // Continous deletes are treated as one edit. | 717 // Continous deletes are treated as one edit. |
| 759 EXPECT_TRUE(model.Delete()); | 718 EXPECT_TRUE(model.Delete()); |
| 760 EXPECT_TRUE(model.Delete()); | 719 EXPECT_TRUE(model.Delete()); |
| 761 EXPECT_STR_EQ("AB", model.text()); | 720 EXPECT_STR_EQ("AB", model.GetText()); |
| 762 EXPECT_TRUE(model.Undo()); | 721 EXPECT_TRUE(model.Undo()); |
| 763 EXPECT_STR_EQ("ABDE", model.text()); | 722 EXPECT_STR_EQ("ABDE", model.GetText()); |
| 764 EXPECT_EQ(2U, model.cursor_pos()); | 723 EXPECT_EQ(2U, model.GetCursorPosition()); |
| 765 EXPECT_TRUE(model.Redo()); | 724 EXPECT_TRUE(model.Redo()); |
| 766 EXPECT_STR_EQ("AB", model.text()); | 725 EXPECT_STR_EQ("AB", model.GetText()); |
| 767 EXPECT_EQ(2U, model.cursor_pos()); | 726 EXPECT_EQ(2U, model.GetCursorPosition()); |
| 768 } | 727 } |
| 769 | 728 |
| 770 TEST_F(TextfieldViewsModelTest, UndoRedo_SetText) { | 729 TEST_F(TextfieldViewsModelTest, UndoRedo_SetText) { |
| 771 // This is to test the undo/redo behavior of omnibox. | 730 // This is to test the undo/redo behavior of omnibox. |
| 772 TextfieldViewsModel model(NULL); | 731 TextfieldViewsModel model(NULL); |
| 773 model.InsertChar('w'); | 732 model.InsertChar('w'); |
| 774 EXPECT_STR_EQ("w", model.text()); | 733 EXPECT_STR_EQ("w", model.GetText()); |
| 775 EXPECT_EQ(1U, model.cursor_pos()); | 734 EXPECT_EQ(1U, model.GetCursorPosition()); |
| 776 model.SetText(ASCIIToUTF16("www.google.com")); | 735 model.SetText(ASCIIToUTF16("www.google.com")); |
| 777 EXPECT_EQ(1U, model.cursor_pos()); | 736 EXPECT_EQ(1U, model.GetCursorPosition()); |
| 778 EXPECT_STR_EQ("www.google.com", model.text()); | 737 EXPECT_STR_EQ("www.google.com", model.GetText()); |
| 779 model.SelectRange(ui::Range(14, 1)); | 738 model.SelectRange(ui::Range(14, 1)); |
| 780 model.InsertChar('w'); | 739 model.InsertChar('w'); |
| 781 EXPECT_STR_EQ("ww", model.text()); | 740 EXPECT_STR_EQ("ww", model.GetText()); |
| 782 model.SetText(ASCIIToUTF16("www.google.com")); | 741 model.SetText(ASCIIToUTF16("www.google.com")); |
| 783 model.SelectRange(ui::Range(14, 2)); | 742 model.SelectRange(ui::Range(14, 2)); |
| 784 model.InsertChar('w'); | 743 model.InsertChar('w'); |
| 785 EXPECT_STR_EQ("www", model.text()); | 744 EXPECT_STR_EQ("www", model.GetText()); |
| 786 model.SetText(ASCIIToUTF16("www.google.com")); | 745 model.SetText(ASCIIToUTF16("www.google.com")); |
| 787 model.SelectRange(ui::Range(14, 3)); | 746 model.SelectRange(ui::Range(14, 3)); |
| 788 model.InsertChar('.'); | 747 model.InsertChar('.'); |
| 789 EXPECT_STR_EQ("www.", model.text()); | 748 EXPECT_STR_EQ("www.", model.GetText()); |
| 790 model.SetText(ASCIIToUTF16("www.google.com")); | 749 model.SetText(ASCIIToUTF16("www.google.com")); |
| 791 model.SelectRange(ui::Range(14, 4)); | 750 model.SelectRange(ui::Range(14, 4)); |
| 792 model.InsertChar('y'); | 751 model.InsertChar('y'); |
| 793 EXPECT_STR_EQ("www.y", model.text()); | 752 EXPECT_STR_EQ("www.y", model.GetText()); |
| 794 model.SetText(ASCIIToUTF16("www.youtube.com")); | 753 model.SetText(ASCIIToUTF16("www.youtube.com")); |
| 795 EXPECT_STR_EQ("www.youtube.com", model.text()); | 754 EXPECT_STR_EQ("www.youtube.com", model.GetText()); |
| 796 EXPECT_EQ(5U, model.cursor_pos()); | 755 EXPECT_EQ(5U, model.GetCursorPosition()); |
| 797 | 756 |
| 798 EXPECT_TRUE(model.Undo()); | 757 EXPECT_TRUE(model.Undo()); |
| 799 EXPECT_STR_EQ("www.google.com", model.text()); | 758 EXPECT_STR_EQ("www.google.com", model.GetText()); |
| 800 EXPECT_EQ(4U, model.cursor_pos()); | 759 EXPECT_EQ(4U, model.GetCursorPosition()); |
| 801 EXPECT_TRUE(model.Undo()); | 760 EXPECT_TRUE(model.Undo()); |
| 802 EXPECT_STR_EQ("www.google.com", model.text()); | 761 EXPECT_STR_EQ("www.google.com", model.GetText()); |
| 803 EXPECT_EQ(3U, model.cursor_pos()); | 762 EXPECT_EQ(3U, model.GetCursorPosition()); |
| 804 EXPECT_TRUE(model.Undo()); | 763 EXPECT_TRUE(model.Undo()); |
| 805 EXPECT_STR_EQ("www.google.com", model.text()); | 764 EXPECT_STR_EQ("www.google.com", model.GetText()); |
| 806 EXPECT_EQ(2U, model.cursor_pos()); | 765 EXPECT_EQ(2U, model.GetCursorPosition()); |
| 807 EXPECT_TRUE(model.Undo()); | 766 EXPECT_TRUE(model.Undo()); |
| 808 EXPECT_STR_EQ("www.google.com", model.text()); | 767 EXPECT_STR_EQ("www.google.com", model.GetText()); |
| 809 EXPECT_EQ(1U, model.cursor_pos()); | 768 EXPECT_EQ(1U, model.GetCursorPosition()); |
| 810 EXPECT_TRUE(model.Undo()); | 769 EXPECT_TRUE(model.Undo()); |
| 811 EXPECT_STR_EQ("", model.text()); | 770 EXPECT_STR_EQ("", model.GetText()); |
| 812 EXPECT_EQ(0U, model.cursor_pos()); | 771 EXPECT_EQ(0U, model.GetCursorPosition()); |
| 813 EXPECT_FALSE(model.Undo()); | 772 EXPECT_FALSE(model.Undo()); |
| 814 EXPECT_TRUE(model.Redo()); | 773 EXPECT_TRUE(model.Redo()); |
| 815 EXPECT_STR_EQ("www.google.com", model.text()); | 774 EXPECT_STR_EQ("www.google.com", model.GetText()); |
| 816 EXPECT_EQ(1U, model.cursor_pos()); | 775 EXPECT_EQ(1U, model.GetCursorPosition()); |
| 817 EXPECT_TRUE(model.Redo()); | 776 EXPECT_TRUE(model.Redo()); |
| 818 EXPECT_STR_EQ("www.google.com", model.text()); | 777 EXPECT_STR_EQ("www.google.com", model.GetText()); |
| 819 EXPECT_EQ(2U, model.cursor_pos()); | 778 EXPECT_EQ(2U, model.GetCursorPosition()); |
| 820 EXPECT_TRUE(model.Redo()); | 779 EXPECT_TRUE(model.Redo()); |
| 821 EXPECT_STR_EQ("www.google.com", model.text()); | 780 EXPECT_STR_EQ("www.google.com", model.GetText()); |
| 822 EXPECT_EQ(3U, model.cursor_pos()); | 781 EXPECT_EQ(3U, model.GetCursorPosition()); |
| 823 EXPECT_TRUE(model.Redo()); | 782 EXPECT_TRUE(model.Redo()); |
| 824 EXPECT_STR_EQ("www.google.com", model.text()); | 783 EXPECT_STR_EQ("www.google.com", model.GetText()); |
| 825 EXPECT_EQ(4U, model.cursor_pos()); | 784 EXPECT_EQ(4U, model.GetCursorPosition()); |
| 826 EXPECT_TRUE(model.Redo()); | 785 EXPECT_TRUE(model.Redo()); |
| 827 EXPECT_STR_EQ("www.youtube.com", model.text()); | 786 EXPECT_STR_EQ("www.youtube.com", model.GetText()); |
| 828 EXPECT_EQ(5U, model.cursor_pos()); | 787 EXPECT_EQ(5U, model.GetCursorPosition()); |
| 829 EXPECT_FALSE(model.Redo()); | 788 EXPECT_FALSE(model.Redo()); |
| 830 } | 789 } |
| 831 | 790 |
| 832 TEST_F(TextfieldViewsModelTest, UndoRedo_CutCopyPasteTest) { | 791 TEST_F(TextfieldViewsModelTest, UndoRedo_CutCopyPasteTest) { |
| 833 TextfieldViewsModel model(NULL); | 792 TextfieldViewsModel model(NULL); |
| 834 model.SetText(ASCIIToUTF16("ABCDE")); | 793 model.SetText(ASCIIToUTF16("ABCDE")); |
| 835 EXPECT_FALSE(model.Redo()); // nothing to redo | 794 EXPECT_FALSE(model.Redo()); // nothing to redo |
| 836 // Cut | 795 // Cut |
| 837 model.MoveCursorTo(1, false); | 796 model.MoveCursorTo(1, false); |
| 838 model.MoveCursorTo(3, true); | 797 model.MoveCursorTo(3, true); |
| 839 model.Cut(); | 798 model.Cut(); |
| 840 EXPECT_STR_EQ("ADE", model.text()); | 799 EXPECT_STR_EQ("ADE", model.GetText()); |
| 841 EXPECT_EQ(1U, model.cursor_pos()); | 800 EXPECT_EQ(1U, model.GetCursorPosition()); |
| 842 EXPECT_TRUE(model.Undo()); | 801 EXPECT_TRUE(model.Undo()); |
| 843 EXPECT_STR_EQ("ABCDE", model.text()); | 802 EXPECT_STR_EQ("ABCDE", model.GetText()); |
| 844 EXPECT_EQ(3U, model.cursor_pos()); | 803 EXPECT_EQ(3U, model.GetCursorPosition()); |
| 845 EXPECT_TRUE(model.Undo()); | 804 EXPECT_TRUE(model.Undo()); |
| 846 EXPECT_STR_EQ("", model.text()); | 805 EXPECT_STR_EQ("", model.GetText()); |
| 847 EXPECT_EQ(0U, model.cursor_pos()); | 806 EXPECT_EQ(0U, model.GetCursorPosition()); |
| 848 EXPECT_FALSE(model.Undo()); // no more undo | 807 EXPECT_FALSE(model.Undo()); // no more undo |
| 849 EXPECT_STR_EQ("", model.text()); | 808 EXPECT_STR_EQ("", model.GetText()); |
| 850 EXPECT_TRUE(model.Redo()); | 809 EXPECT_TRUE(model.Redo()); |
| 851 EXPECT_STR_EQ("ABCDE", model.text()); | 810 EXPECT_STR_EQ("ABCDE", model.GetText()); |
| 852 EXPECT_EQ(0U, model.cursor_pos()); | 811 EXPECT_EQ(0U, model.GetCursorPosition()); |
| 853 EXPECT_TRUE(model.Redo()); | 812 EXPECT_TRUE(model.Redo()); |
| 854 EXPECT_STR_EQ("ADE", model.text()); | 813 EXPECT_STR_EQ("ADE", model.GetText()); |
| 855 EXPECT_EQ(1U, model.cursor_pos()); | 814 EXPECT_EQ(1U, model.GetCursorPosition()); |
| 856 EXPECT_FALSE(model.Redo()); // no more redo | 815 EXPECT_FALSE(model.Redo()); // no more redo |
| 857 EXPECT_STR_EQ("ADE", model.text()); | 816 EXPECT_STR_EQ("ADE", model.GetText()); |
| 858 | 817 |
| 859 model.Paste(); | 818 model.Paste(); |
| 860 model.Paste(); | 819 model.Paste(); |
| 861 model.Paste(); | 820 model.Paste(); |
| 862 EXPECT_STR_EQ("ABCBCBCDE", model.text()); | 821 EXPECT_STR_EQ("ABCBCBCDE", model.GetText()); |
| 863 EXPECT_EQ(7U, model.cursor_pos()); | 822 EXPECT_EQ(7U, model.GetCursorPosition()); |
| 864 EXPECT_TRUE(model.Undo()); | 823 EXPECT_TRUE(model.Undo()); |
| 865 EXPECT_STR_EQ("ABCBCDE", model.text()); | 824 EXPECT_STR_EQ("ABCBCDE", model.GetText()); |
| 866 EXPECT_EQ(5U, model.cursor_pos()); | 825 EXPECT_EQ(5U, model.GetCursorPosition()); |
| 867 EXPECT_TRUE(model.Undo()); | 826 EXPECT_TRUE(model.Undo()); |
| 868 EXPECT_STR_EQ("ABCDE", model.text()); | 827 EXPECT_STR_EQ("ABCDE", model.GetText()); |
| 869 EXPECT_EQ(3U, model.cursor_pos()); | 828 EXPECT_EQ(3U, model.GetCursorPosition()); |
| 870 EXPECT_TRUE(model.Undo()); | 829 EXPECT_TRUE(model.Undo()); |
| 871 EXPECT_STR_EQ("ADE", model.text()); | 830 EXPECT_STR_EQ("ADE", model.GetText()); |
| 872 EXPECT_EQ(1U, model.cursor_pos()); | 831 EXPECT_EQ(1U, model.GetCursorPosition()); |
| 873 EXPECT_TRUE(model.Undo()); | 832 EXPECT_TRUE(model.Undo()); |
| 874 EXPECT_STR_EQ("ABCDE", model.text()); | 833 EXPECT_STR_EQ("ABCDE", model.GetText()); |
| 875 EXPECT_EQ(3U, model.cursor_pos()); | 834 EXPECT_EQ(3U, model.GetCursorPosition()); |
| 876 EXPECT_TRUE(model.Undo()); | 835 EXPECT_TRUE(model.Undo()); |
| 877 EXPECT_STR_EQ("", model.text()); | 836 EXPECT_STR_EQ("", model.GetText()); |
| 878 EXPECT_EQ(0U, model.cursor_pos()); | 837 EXPECT_EQ(0U, model.GetCursorPosition()); |
| 879 EXPECT_FALSE(model.Undo()); | 838 EXPECT_FALSE(model.Undo()); |
| 880 EXPECT_STR_EQ("", model.text()); | 839 EXPECT_STR_EQ("", model.GetText()); |
| 881 EXPECT_TRUE(model.Redo()); | 840 EXPECT_TRUE(model.Redo()); |
| 882 EXPECT_STR_EQ("ABCDE", model.text()); // Redoing SetText | 841 EXPECT_STR_EQ("ABCDE", model.GetText()); // Redoing SetText |
| 883 EXPECT_EQ(0U, model.cursor_pos()); | 842 EXPECT_EQ(0U, model.GetCursorPosition()); |
| 884 | 843 |
| 885 // Redo | 844 // Redo |
| 886 EXPECT_TRUE(model.Redo()); | 845 EXPECT_TRUE(model.Redo()); |
| 887 EXPECT_STR_EQ("ADE", model.text()); | 846 EXPECT_STR_EQ("ADE", model.GetText()); |
| 888 EXPECT_EQ(1U, model.cursor_pos()); | 847 EXPECT_EQ(1U, model.GetCursorPosition()); |
| 889 EXPECT_TRUE(model.Redo()); | 848 EXPECT_TRUE(model.Redo()); |
| 890 EXPECT_STR_EQ("ABCDE", model.text()); | 849 EXPECT_STR_EQ("ABCDE", model.GetText()); |
| 891 EXPECT_EQ(3U, model.cursor_pos()); | 850 EXPECT_EQ(3U, model.GetCursorPosition()); |
| 892 EXPECT_TRUE(model.Redo()); | 851 EXPECT_TRUE(model.Redo()); |
| 893 EXPECT_STR_EQ("ABCBCDE", model.text()); | 852 EXPECT_STR_EQ("ABCBCDE", model.GetText()); |
| 894 EXPECT_EQ(5U, model.cursor_pos()); | 853 EXPECT_EQ(5U, model.GetCursorPosition()); |
| 895 EXPECT_TRUE(model.Redo()); | 854 EXPECT_TRUE(model.Redo()); |
| 896 EXPECT_STR_EQ("ABCBCBCDE", model.text()); | 855 EXPECT_STR_EQ("ABCBCBCDE", model.GetText()); |
| 897 EXPECT_EQ(7U, model.cursor_pos()); | 856 EXPECT_EQ(7U, model.GetCursorPosition()); |
| 898 EXPECT_FALSE(model.Redo()); | 857 EXPECT_FALSE(model.Redo()); |
| 899 | 858 |
| 900 // with SelectRange | 859 // with SelectRange |
| 901 model.SelectRange(ui::Range(1, 3)); | 860 model.SelectRange(ui::Range(1, 3)); |
| 902 EXPECT_TRUE(model.Cut()); | 861 EXPECT_TRUE(model.Cut()); |
| 903 EXPECT_STR_EQ("ABCBCDE", model.text()); | 862 EXPECT_STR_EQ("ABCBCDE", model.GetText()); |
| 904 EXPECT_EQ(1U, model.cursor_pos()); | 863 EXPECT_EQ(1U, model.GetCursorPosition()); |
| 905 model.SelectRange(ui::Range(1, 1)); | 864 model.SelectRange(ui::Range(1, 1)); |
| 906 EXPECT_FALSE(model.Cut()); | 865 EXPECT_FALSE(model.Cut()); |
| 907 model.MoveCursorToEnd(false); | 866 model.MoveCursorToRightEnd(false); |
| 908 EXPECT_TRUE(model.Paste()); | 867 EXPECT_TRUE(model.Paste()); |
| 909 EXPECT_STR_EQ("ABCBCDEBC", model.text()); | 868 EXPECT_STR_EQ("ABCBCDEBC", model.GetText()); |
| 910 EXPECT_EQ(9U, model.cursor_pos()); | 869 EXPECT_EQ(9U, model.GetCursorPosition()); |
| 911 EXPECT_TRUE(model.Undo()); | 870 EXPECT_TRUE(model.Undo()); |
| 912 EXPECT_STR_EQ("ABCBCDE", model.text()); | 871 EXPECT_STR_EQ("ABCBCDE", model.GetText()); |
| 913 EXPECT_EQ(7U, model.cursor_pos()); | 872 EXPECT_EQ(7U, model.GetCursorPosition()); |
| 914 // empty cut shouldn't create an edit. | 873 // empty cut shouldn't create an edit. |
| 915 EXPECT_TRUE(model.Undo()); | 874 EXPECT_TRUE(model.Undo()); |
| 916 EXPECT_STR_EQ("ABCBCBCDE", model.text()); | 875 EXPECT_STR_EQ("ABCBCBCDE", model.GetText()); |
| 917 EXPECT_EQ(3U, model.cursor_pos()); | 876 EXPECT_EQ(3U, model.GetCursorPosition()); |
| 918 | 877 |
| 919 // Copy | 878 // Copy |
| 920 ResetModel(&model); | 879 ResetModel(&model); |
| 921 model.SetText(ASCIIToUTF16("12345")); | 880 model.SetText(ASCIIToUTF16("12345")); |
| 922 EXPECT_STR_EQ("12345", model.text()); | 881 EXPECT_STR_EQ("12345", model.GetText()); |
| 923 EXPECT_EQ(0U, model.cursor_pos()); | 882 EXPECT_EQ(0U, model.GetCursorPosition()); |
| 924 model.MoveCursorTo(1, false); | 883 model.MoveCursorTo(1, false); |
| 925 model.MoveCursorTo(3, true); | 884 model.MoveCursorTo(3, true); |
| 926 model.Copy(); // Copy "23" | 885 model.Copy(); // Copy "23" |
| 927 EXPECT_STR_EQ("12345", model.text()); | 886 EXPECT_STR_EQ("12345", model.GetText()); |
| 928 EXPECT_EQ(3U, model.cursor_pos()); | 887 EXPECT_EQ(3U, model.GetCursorPosition()); |
| 929 model.Paste(); // Paste "23" into "23". | 888 model.Paste(); // Paste "23" into "23". |
| 930 EXPECT_STR_EQ("12345", model.text()); | 889 EXPECT_STR_EQ("12345", model.GetText()); |
| 931 EXPECT_EQ(3U, model.cursor_pos()); | 890 EXPECT_EQ(3U, model.GetCursorPosition()); |
| 932 model.Paste(); | 891 model.Paste(); |
| 933 EXPECT_STR_EQ("1232345", model.text()); | 892 EXPECT_STR_EQ("1232345", model.GetText()); |
| 934 EXPECT_EQ(5U, model.cursor_pos()); | 893 EXPECT_EQ(5U, model.GetCursorPosition()); |
| 935 EXPECT_TRUE(model.Undo()); | 894 EXPECT_TRUE(model.Undo()); |
| 936 EXPECT_STR_EQ("12345", model.text()); | 895 EXPECT_STR_EQ("12345", model.GetText()); |
| 937 EXPECT_EQ(3U, model.cursor_pos()); | 896 EXPECT_EQ(3U, model.GetCursorPosition()); |
| 938 // TODO(oshima): We need to change the return type from bool to enum. | 897 // TODO(oshima): We need to change the return type from bool to enum. |
| 939 EXPECT_FALSE(model.Undo()); // No text change. | 898 EXPECT_FALSE(model.Undo()); // No text change. |
| 940 EXPECT_STR_EQ("12345", model.text()); | 899 EXPECT_STR_EQ("12345", model.GetText()); |
| 941 EXPECT_EQ(3U, model.cursor_pos()); | 900 EXPECT_EQ(3U, model.GetCursorPosition()); |
| 942 EXPECT_TRUE(model.Undo()); | 901 EXPECT_TRUE(model.Undo()); |
| 943 EXPECT_STR_EQ("", model.text()); | 902 EXPECT_STR_EQ("", model.GetText()); |
| 944 EXPECT_FALSE(model.Undo()); | 903 EXPECT_FALSE(model.Undo()); |
| 945 // Redo | 904 // Redo |
| 946 EXPECT_TRUE(model.Redo()); | 905 EXPECT_TRUE(model.Redo()); |
| 947 EXPECT_STR_EQ("12345", model.text()); | 906 EXPECT_STR_EQ("12345", model.GetText()); |
| 948 EXPECT_EQ(0U, model.cursor_pos()); | 907 EXPECT_EQ(0U, model.GetCursorPosition()); |
| 949 EXPECT_TRUE(model.Redo()); | 908 EXPECT_TRUE(model.Redo()); |
| 950 EXPECT_STR_EQ("12345", model.text()); // For 1st paste | 909 EXPECT_STR_EQ("12345", model.GetText()); // For 1st paste |
| 951 EXPECT_EQ(3U, model.cursor_pos()); | 910 EXPECT_EQ(3U, model.GetCursorPosition()); |
| 952 EXPECT_TRUE(model.Redo()); | 911 EXPECT_TRUE(model.Redo()); |
| 953 EXPECT_STR_EQ("1232345", model.text()); | 912 EXPECT_STR_EQ("1232345", model.GetText()); |
| 954 EXPECT_EQ(5U, model.cursor_pos()); | 913 EXPECT_EQ(5U, model.GetCursorPosition()); |
| 955 EXPECT_FALSE(model.Redo()); | 914 EXPECT_FALSE(model.Redo()); |
| 956 EXPECT_STR_EQ("1232345", model.text()); | 915 EXPECT_STR_EQ("1232345", model.GetText()); |
| 957 | 916 |
| 958 // with SelectRange | 917 // with SelectRange |
| 959 model.SelectRange(ui::Range(1, 3)); | 918 model.SelectRange(ui::Range(1, 3)); |
| 960 model.Copy(); | 919 model.Copy(); |
| 961 EXPECT_STR_EQ("1232345", model.text()); | 920 EXPECT_STR_EQ("1232345", model.GetText()); |
| 962 model.MoveCursorToEnd(false); | 921 model.MoveCursorToRightEnd(false); |
| 963 EXPECT_TRUE(model.Paste()); | 922 EXPECT_TRUE(model.Paste()); |
| 964 EXPECT_STR_EQ("123234523", model.text()); | 923 EXPECT_STR_EQ("123234523", model.GetText()); |
| 965 EXPECT_EQ(9U, model.cursor_pos()); | 924 EXPECT_EQ(9U, model.GetCursorPosition()); |
| 966 EXPECT_TRUE(model.Undo()); | 925 EXPECT_TRUE(model.Undo()); |
| 967 EXPECT_STR_EQ("1232345", model.text()); | 926 EXPECT_STR_EQ("1232345", model.GetText()); |
| 968 EXPECT_EQ(7U, model.cursor_pos()); | 927 EXPECT_EQ(7U, model.GetCursorPosition()); |
| 969 } | 928 } |
| 970 | 929 |
| 971 TEST_F(TextfieldViewsModelTest, UndoRedo_CursorTest) { | 930 TEST_F(TextfieldViewsModelTest, UndoRedo_CursorTest) { |
| 972 TextfieldViewsModel model(NULL); | 931 TextfieldViewsModel model(NULL); |
| 973 model.InsertChar('a'); | 932 model.InsertChar('a'); |
| 974 model.MoveCursorLeft(false); | 933 model.MoveCursorLeft(false); |
| 975 model.MoveCursorRight(false); | 934 model.MoveCursorRight(false); |
| 976 model.InsertChar('b'); | 935 model.InsertChar('b'); |
| 977 // Moving cursor shoudln't create a new edit. | 936 // Moving cursor shoudln't create a new edit. |
| 978 EXPECT_STR_EQ("ab", model.text()); | 937 EXPECT_STR_EQ("ab", model.GetText()); |
| 979 EXPECT_FALSE(model.Redo()); | 938 EXPECT_FALSE(model.Redo()); |
| 980 EXPECT_TRUE(model.Undo()); | 939 EXPECT_TRUE(model.Undo()); |
| 981 EXPECT_STR_EQ("", model.text()); | 940 EXPECT_STR_EQ("", model.GetText()); |
| 982 EXPECT_FALSE(model.Undo()); | 941 EXPECT_FALSE(model.Undo()); |
| 983 EXPECT_STR_EQ("", model.text()); | 942 EXPECT_STR_EQ("", model.GetText()); |
| 984 EXPECT_TRUE(model.Redo()); | 943 EXPECT_TRUE(model.Redo()); |
| 985 EXPECT_STR_EQ("ab", model.text()); | 944 EXPECT_STR_EQ("ab", model.GetText()); |
| 986 EXPECT_EQ(2U, model.cursor_pos()); | 945 EXPECT_EQ(2U, model.GetCursorPosition()); |
| 987 EXPECT_FALSE(model.Redo()); | 946 EXPECT_FALSE(model.Redo()); |
| 988 } | 947 } |
| 989 | 948 |
| 990 void RunInsertReplaceTest(TextfieldViewsModel& model) { | 949 void RunInsertReplaceTest(TextfieldViewsModel& model) { |
| 991 ui::Range r; | 950 ui::Range r; |
| 992 model.GetSelectedRange(&r); | 951 model.GetSelectedRange(&r); |
| 993 bool reverse = r.is_reversed(); | 952 bool reverse = r.is_reversed(); |
| 994 | 953 |
| 995 model.InsertChar('1'); | 954 model.InsertChar('1'); |
| 996 model.InsertChar('2'); | 955 model.InsertChar('2'); |
| 997 model.InsertChar('3'); | 956 model.InsertChar('3'); |
| 998 EXPECT_STR_EQ("a123d", model.text()); | 957 EXPECT_STR_EQ("a123d", model.GetText()); |
| 999 EXPECT_EQ(4U, model.cursor_pos()); | 958 EXPECT_EQ(4U, model.GetCursorPosition()); |
| 1000 EXPECT_TRUE(model.Undo()); | 959 EXPECT_TRUE(model.Undo()); |
| 1001 EXPECT_STR_EQ("abcd", model.text()); | 960 EXPECT_STR_EQ("abcd", model.GetText()); |
| 1002 EXPECT_EQ(reverse ? 1U : 3U, model.cursor_pos()); | 961 EXPECT_EQ(reverse ? 1U : 3U, model.GetCursorPosition()); |
| 1003 EXPECT_TRUE(model.Undo()); | 962 EXPECT_TRUE(model.Undo()); |
| 1004 EXPECT_STR_EQ("", model.text()); | 963 EXPECT_STR_EQ("", model.GetText()); |
| 1005 EXPECT_EQ(0U, model.cursor_pos()); | 964 EXPECT_EQ(0U, model.GetCursorPosition()); |
| 1006 EXPECT_FALSE(model.Undo()); | 965 EXPECT_FALSE(model.Undo()); |
| 1007 EXPECT_TRUE(model.Redo()); | 966 EXPECT_TRUE(model.Redo()); |
| 1008 EXPECT_STR_EQ("abcd", model.text()); | 967 EXPECT_STR_EQ("abcd", model.GetText()); |
| 1009 EXPECT_EQ(0U, model.cursor_pos()); // By SetText | 968 EXPECT_EQ(0U, model.GetCursorPosition()); // By SetText |
| 1010 EXPECT_TRUE(model.Redo()); | 969 EXPECT_TRUE(model.Redo()); |
| 1011 EXPECT_STR_EQ("a123d", model.text()); | 970 EXPECT_STR_EQ("a123d", model.GetText()); |
| 1012 EXPECT_EQ(4U, model.cursor_pos()); | 971 EXPECT_EQ(4U, model.GetCursorPosition()); |
| 1013 EXPECT_FALSE(model.Redo()); | 972 EXPECT_FALSE(model.Redo()); |
| 1014 } | 973 } |
| 1015 | 974 |
| 1016 void RunOverwriteReplaceTest(TextfieldViewsModel& model) { | 975 void RunOverwriteReplaceTest(TextfieldViewsModel& model) { |
| 1017 ui::Range r; | 976 ui::Range r; |
| 1018 model.GetSelectedRange(&r); | 977 model.GetSelectedRange(&r); |
| 1019 bool reverse = r.is_reversed(); | 978 bool reverse = r.is_reversed(); |
| 1020 | 979 |
| 1021 model.ReplaceChar('1'); | 980 model.ReplaceChar('1'); |
| 1022 model.ReplaceChar('2'); | 981 model.ReplaceChar('2'); |
| 1023 model.ReplaceChar('3'); | 982 model.ReplaceChar('3'); |
| 1024 model.ReplaceChar('4'); | 983 model.ReplaceChar('4'); |
| 1025 EXPECT_STR_EQ("a1234", model.text()); | 984 EXPECT_STR_EQ("a1234", model.GetText()); |
| 1026 EXPECT_EQ(5U, model.cursor_pos()); | 985 EXPECT_EQ(5U, model.GetCursorPosition()); |
| 1027 EXPECT_TRUE(model.Undo()); | 986 EXPECT_TRUE(model.Undo()); |
| 1028 EXPECT_STR_EQ("abcd", model.text()); | 987 EXPECT_STR_EQ("abcd", model.GetText()); |
| 1029 EXPECT_EQ(reverse ? 1U : 3U, model.cursor_pos()); | 988 EXPECT_EQ(reverse ? 1U : 3U, model.GetCursorPosition()); |
| 1030 EXPECT_TRUE(model.Undo()); | 989 EXPECT_TRUE(model.Undo()); |
| 1031 EXPECT_STR_EQ("", model.text()); | 990 EXPECT_STR_EQ("", model.GetText()); |
| 1032 EXPECT_EQ(0U, model.cursor_pos()); | 991 EXPECT_EQ(0U, model.GetCursorPosition()); |
| 1033 EXPECT_FALSE(model.Undo()); | 992 EXPECT_FALSE(model.Undo()); |
| 1034 EXPECT_TRUE(model.Redo()); | 993 EXPECT_TRUE(model.Redo()); |
| 1035 EXPECT_STR_EQ("abcd", model.text()); | 994 EXPECT_STR_EQ("abcd", model.GetText()); |
| 1036 EXPECT_EQ(0U, model.cursor_pos()); | 995 EXPECT_EQ(0U, model.GetCursorPosition()); |
| 1037 EXPECT_TRUE(model.Redo()); | 996 EXPECT_TRUE(model.Redo()); |
| 1038 EXPECT_STR_EQ("a1234", model.text()); | 997 EXPECT_STR_EQ("a1234", model.GetText()); |
| 1039 EXPECT_EQ(5U, model.cursor_pos()); | 998 EXPECT_EQ(5U, model.GetCursorPosition()); |
| 1040 EXPECT_FALSE(model.Redo()); | 999 EXPECT_FALSE(model.Redo()); |
| 1041 } | 1000 } |
| 1042 | 1001 |
| 1043 TEST_F(TextfieldViewsModelTest, UndoRedo_ReplaceTest) { | 1002 TEST_F(TextfieldViewsModelTest, UndoRedo_ReplaceTest) { |
| 1044 // By Cursor | 1003 // By Cursor |
| 1045 { | 1004 { |
| 1046 SCOPED_TRACE("forward & insert by cursor"); | 1005 SCOPED_TRACE("forward & insert by cursor"); |
| 1047 TextfieldViewsModel model(NULL); | 1006 TextfieldViewsModel model(NULL); |
| 1048 model.SetText(ASCIIToUTF16("abcd")); | 1007 model.SetText(ASCIIToUTF16("abcd")); |
| 1049 model.MoveCursorTo(1, false); | 1008 model.MoveCursorTo(1, false); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1107 | 1066 |
| 1108 TEST_F(TextfieldViewsModelTest, UndoRedo_CompositionText) { | 1067 TEST_F(TextfieldViewsModelTest, UndoRedo_CompositionText) { |
| 1109 TextfieldViewsModel model(NULL); | 1068 TextfieldViewsModel model(NULL); |
| 1110 | 1069 |
| 1111 ui::CompositionText composition; | 1070 ui::CompositionText composition; |
| 1112 composition.text = ASCIIToUTF16("abc"); | 1071 composition.text = ASCIIToUTF16("abc"); |
| 1113 composition.underlines.push_back(ui::CompositionUnderline(0, 3, 0, false)); | 1072 composition.underlines.push_back(ui::CompositionUnderline(0, 3, 0, false)); |
| 1114 composition.selection = ui::Range(2, 3); | 1073 composition.selection = ui::Range(2, 3); |
| 1115 | 1074 |
| 1116 model.SetText(ASCIIToUTF16("ABCDE")); | 1075 model.SetText(ASCIIToUTF16("ABCDE")); |
| 1117 model.MoveCursorToEnd(false); | 1076 model.MoveCursorToRightEnd(false); |
| 1118 model.InsertChar('x'); | 1077 model.InsertChar('x'); |
| 1119 EXPECT_STR_EQ("ABCDEx", model.text()); | 1078 EXPECT_STR_EQ("ABCDEx", model.GetText()); |
| 1120 EXPECT_TRUE(model.Undo()); // set composition should forget undone edit. | 1079 EXPECT_TRUE(model.Undo()); // set composition should forget undone edit. |
| 1121 model.SetCompositionText(composition); | 1080 model.SetCompositionText(composition); |
| 1122 EXPECT_TRUE(model.HasCompositionText()); | 1081 EXPECT_TRUE(model.HasCompositionText()); |
| 1123 EXPECT_TRUE(model.HasSelection()); | 1082 EXPECT_TRUE(model.HasSelection()); |
| 1124 EXPECT_STR_EQ("ABCDEabc", model.text()); | 1083 EXPECT_STR_EQ("ABCDEabc", model.GetText()); |
| 1125 | 1084 |
| 1126 // Accepting composition | 1085 // Accepting composition |
| 1127 model.ConfirmCompositionText(); | 1086 model.ConfirmCompositionText(); |
| 1128 EXPECT_STR_EQ("ABCDEabc", model.text()); | 1087 EXPECT_STR_EQ("ABCDEabc", model.GetText()); |
| 1129 EXPECT_TRUE(model.Undo()); | 1088 EXPECT_TRUE(model.Undo()); |
| 1130 EXPECT_STR_EQ("ABCDE", model.text()); | 1089 EXPECT_STR_EQ("ABCDE", model.GetText()); |
| 1131 EXPECT_TRUE(model.Undo()); | 1090 EXPECT_TRUE(model.Undo()); |
| 1132 EXPECT_STR_EQ("", model.text()); | 1091 EXPECT_STR_EQ("", model.GetText()); |
| 1133 EXPECT_TRUE(model.Redo()); | 1092 EXPECT_TRUE(model.Redo()); |
| 1134 EXPECT_STR_EQ("ABCDE", model.text()); | 1093 EXPECT_STR_EQ("ABCDE", model.GetText()); |
| 1135 EXPECT_TRUE(model.Redo()); | 1094 EXPECT_TRUE(model.Redo()); |
| 1136 EXPECT_STR_EQ("ABCDEabc", model.text()); | 1095 EXPECT_STR_EQ("ABCDEabc", model.GetText()); |
| 1137 EXPECT_FALSE(model.Redo()); | 1096 EXPECT_FALSE(model.Redo()); |
| 1138 | 1097 |
| 1139 // Canceling composition | 1098 // Canceling composition |
| 1140 model.MoveCursorToHome(false); | 1099 model.MoveCursorToLeftEnd(false); |
| 1141 model.SetCompositionText(composition); | 1100 model.SetCompositionText(composition); |
| 1142 EXPECT_STR_EQ("abcABCDEabc", model.text()); | 1101 EXPECT_STR_EQ("abcABCDEabc", model.GetText()); |
| 1143 model.CancelCompositionText(); | 1102 model.CancelCompositionText(); |
| 1144 EXPECT_STR_EQ("ABCDEabc", model.text()); | 1103 EXPECT_STR_EQ("ABCDEabc", model.GetText()); |
| 1145 EXPECT_FALSE(model.Redo()); | 1104 EXPECT_FALSE(model.Redo()); |
| 1146 EXPECT_STR_EQ("ABCDEabc", model.text()); | 1105 EXPECT_STR_EQ("ABCDEabc", model.GetText()); |
| 1147 EXPECT_TRUE(model.Undo()); | 1106 EXPECT_TRUE(model.Undo()); |
| 1148 EXPECT_STR_EQ("ABCDE", model.text()); | 1107 EXPECT_STR_EQ("ABCDE", model.GetText()); |
| 1149 EXPECT_TRUE(model.Redo()); | 1108 EXPECT_TRUE(model.Redo()); |
| 1150 EXPECT_STR_EQ("ABCDEabc", model.text()); | 1109 EXPECT_STR_EQ("ABCDEabc", model.GetText()); |
| 1151 EXPECT_FALSE(model.Redo()); | 1110 EXPECT_FALSE(model.Redo()); |
| 1152 | 1111 |
| 1153 // SetText with the same text as the result. | 1112 // SetText with the same text as the result. |
| 1154 ResetModel(&model); | 1113 ResetModel(&model); |
| 1155 model.SetText(ASCIIToUTF16("ABCDE")); | 1114 model.SetText(ASCIIToUTF16("ABCDE")); |
| 1156 model.MoveCursorToEnd(false); | 1115 model.MoveCursorToRightEnd(false); |
| 1157 model.SetCompositionText(composition); | 1116 model.SetCompositionText(composition); |
| 1158 EXPECT_STR_EQ("ABCDEabc", model.text()); | 1117 EXPECT_STR_EQ("ABCDEabc", model.GetText()); |
| 1159 model.SetText(ASCIIToUTF16("ABCDEabc")); | 1118 model.SetText(ASCIIToUTF16("ABCDEabc")); |
| 1160 EXPECT_STR_EQ("ABCDEabc", model.text()); | 1119 EXPECT_STR_EQ("ABCDEabc", model.GetText()); |
| 1161 EXPECT_TRUE(model.Undo()); | 1120 EXPECT_TRUE(model.Undo()); |
| 1162 EXPECT_STR_EQ("ABCDE", model.text()); | 1121 EXPECT_STR_EQ("ABCDE", model.GetText()); |
| 1163 EXPECT_TRUE(model.Redo()); | 1122 EXPECT_TRUE(model.Redo()); |
| 1164 EXPECT_STR_EQ("ABCDEabc", model.text()); | 1123 EXPECT_STR_EQ("ABCDEabc", model.GetText()); |
| 1165 EXPECT_FALSE(model.Redo()); | 1124 EXPECT_FALSE(model.Redo()); |
| 1166 | 1125 |
| 1167 // SetText with the different text than the result should not | 1126 // SetText with the different text than the result should not |
| 1168 // remember composition text. | 1127 // remember composition text. |
| 1169 ResetModel(&model); | 1128 ResetModel(&model); |
| 1170 model.SetText(ASCIIToUTF16("ABCDE")); | 1129 model.SetText(ASCIIToUTF16("ABCDE")); |
| 1171 model.MoveCursorToEnd(false); | 1130 model.MoveCursorToRightEnd(false); |
| 1172 model.SetCompositionText(composition); | 1131 model.SetCompositionText(composition); |
| 1173 EXPECT_STR_EQ("ABCDEabc", model.text()); | 1132 EXPECT_STR_EQ("ABCDEabc", model.GetText()); |
| 1174 model.SetText(ASCIIToUTF16("1234")); | 1133 model.SetText(ASCIIToUTF16("1234")); |
| 1175 EXPECT_STR_EQ("1234", model.text()); | 1134 EXPECT_STR_EQ("1234", model.GetText()); |
| 1176 EXPECT_TRUE(model.Undo()); | 1135 EXPECT_TRUE(model.Undo()); |
| 1177 EXPECT_STR_EQ("ABCDE", model.text()); | 1136 EXPECT_STR_EQ("ABCDE", model.GetText()); |
| 1178 EXPECT_TRUE(model.Redo()); | 1137 EXPECT_TRUE(model.Redo()); |
| 1179 EXPECT_STR_EQ("1234", model.text()); | 1138 EXPECT_STR_EQ("1234", model.GetText()); |
| 1180 EXPECT_FALSE(model.Redo()); | 1139 EXPECT_FALSE(model.Redo()); |
| 1181 | 1140 |
| 1182 // TODO(oshima): We need MockInputMethod to test the behavior with IME. | 1141 // TODO(oshima): We need MockInputMethod to test the behavior with IME. |
| 1183 } | 1142 } |
| 1184 | 1143 |
| 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 | 1144 } // namespace views |
| OLD | NEW |