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