| 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" |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 EXPECT_EQ(string16(), model.GetSelectedText()); | 119 EXPECT_EQ(string16(), model.GetSelectedText()); |
| 120 model.SelectAll(); | 120 model.SelectAll(); |
| 121 EXPECT_STR_EQ("HELLO", model.GetSelectedText()); | 121 EXPECT_STR_EQ("HELLO", model.GetSelectedText()); |
| 122 // SelectAll should select towards the end. | 122 // SelectAll should select towards the end. |
| 123 ui::Range range; | 123 ui::Range range; |
| 124 model.GetSelectedRange(&range); | 124 model.GetSelectedRange(&range); |
| 125 EXPECT_EQ(0U, range.start()); | 125 EXPECT_EQ(0U, range.start()); |
| 126 EXPECT_EQ(5U, range.end()); | 126 EXPECT_EQ(5U, range.end()); |
| 127 | 127 |
| 128 // Select and move cursor | 128 // Select and move cursor |
| 129 model.MoveCursorTo(1U, false); | 129 gfx::SelectionModel selection(1U); |
| 130 model.MoveCursorTo(3U, true); | 130 model.MoveCursorTo(&selection); |
| 131 selection.set_selection_end(3U); |
| 132 model.MoveCursorTo(&selection); |
| 131 EXPECT_STR_EQ("EL", model.GetSelectedText()); | 133 EXPECT_STR_EQ("EL", model.GetSelectedText()); |
| 132 model.MoveCursorLeft(gfx::CHARACTER_BREAK, false); | 134 model.MoveCursorLeft(gfx::CHARACTER_BREAK, false); |
| 133 EXPECT_EQ(1U, model.GetCursorPosition()); | 135 EXPECT_EQ(1U, model.GetCursorPosition()); |
| 134 model.MoveCursorTo(1U, false); | 136 selection.set_selection_end(1U); |
| 135 model.MoveCursorTo(3U, true); | 137 selection.SetSelectionEmpty(); |
| 138 model.MoveCursorTo(&selection); |
| 139 selection.set_selection_end(3U); |
| 140 model.MoveCursorTo(&selection); |
| 136 model.MoveCursorRight(gfx::CHARACTER_BREAK, false); | 141 model.MoveCursorRight(gfx::CHARACTER_BREAK, false); |
| 137 EXPECT_EQ(3U, model.GetCursorPosition()); | 142 EXPECT_EQ(3U, model.GetCursorPosition()); |
| 138 | 143 |
| 139 // Select all and move cursor | 144 // Select all and move cursor |
| 140 model.SelectAll(); | 145 model.SelectAll(); |
| 141 model.MoveCursorLeft(gfx::CHARACTER_BREAK, false); | 146 model.MoveCursorLeft(gfx::CHARACTER_BREAK, false); |
| 142 EXPECT_EQ(0U, model.GetCursorPosition()); | 147 EXPECT_EQ(0U, model.GetCursorPosition()); |
| 143 model.SelectAll(); | 148 model.SelectAll(); |
| 144 model.MoveCursorRight(gfx::CHARACTER_BREAK, false); | 149 model.MoveCursorRight(gfx::CHARACTER_BREAK, false); |
| 145 EXPECT_EQ(5U, model.GetCursorPosition()); | 150 EXPECT_EQ(5U, model.GetCursorPosition()); |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 TEST_F(TextfieldViewsModelTest, SelectWordTest) { | 329 TEST_F(TextfieldViewsModelTest, SelectWordTest) { |
| 325 TextfieldViewsModel model(NULL); | 330 TextfieldViewsModel model(NULL); |
| 326 model.Append(ASCIIToUTF16(" HELLO !! WO RLD ")); | 331 model.Append(ASCIIToUTF16(" HELLO !! WO RLD ")); |
| 327 | 332 |
| 328 // Test when cursor is at the beginning. | 333 // Test when cursor is at the beginning. |
| 329 model.MoveCursorLeft(gfx::LINE_BREAK, false); | 334 model.MoveCursorLeft(gfx::LINE_BREAK, false); |
| 330 model.SelectWord(); | 335 model.SelectWord(); |
| 331 SelectWordTestVerifier(model, " ", 2U); | 336 SelectWordTestVerifier(model, " ", 2U); |
| 332 | 337 |
| 333 // Test when cursor is at the beginning of a word. | 338 // Test when cursor is at the beginning of a word. |
| 334 model.MoveCursorTo(2U, false); | 339 gfx::SelectionModel selection(2U); |
| 340 model.MoveCursorTo(&selection); |
| 335 model.SelectWord(); | 341 model.SelectWord(); |
| 336 SelectWordTestVerifier(model, "HELLO", 7U); | 342 SelectWordTestVerifier(model, "HELLO", 7U); |
| 337 | 343 |
| 338 // Test when cursor is at the end of a word. | 344 // Test when cursor is at the end of a word. |
| 339 model.MoveCursorTo(15U, false); | 345 selection.set_selection_end(15U); |
| 346 selection.SetSelectionEmpty(); |
| 347 model.MoveCursorTo(&selection); |
| 340 model.SelectWord(); | 348 model.SelectWord(); |
| 341 SelectWordTestVerifier(model, "WO", 15U); | 349 SelectWordTestVerifier(model, "WO", 15U); |
| 342 | 350 |
| 343 // Test when cursor is somewhere in a non-alph-numeric fragment. | 351 // Test when cursor is somewhere in a non-alph-numeric fragment. |
| 344 for (size_t cursor_pos = 8; cursor_pos < 13U; cursor_pos++) { | 352 for (size_t cursor_pos = 8; cursor_pos < 13U; cursor_pos++) { |
| 345 model.MoveCursorTo(cursor_pos, false); | 353 selection.set_selection_end(cursor_pos); |
| 354 selection.SetSelectionEmpty(); |
| 355 model.MoveCursorTo(&selection); |
| 346 model.SelectWord(); | 356 model.SelectWord(); |
| 347 SelectWordTestVerifier(model, " !! ", 13U); | 357 SelectWordTestVerifier(model, " !! ", 13U); |
| 348 } | 358 } |
| 349 | 359 |
| 350 // Test when cursor is somewhere in a whitespace fragment. | 360 // Test when cursor is somewhere in a whitespace fragment. |
| 351 model.MoveCursorTo(17U, false); | 361 selection.set_selection_end(17U); |
| 362 selection.SetSelectionEmpty(); |
| 363 model.MoveCursorTo(&selection); |
| 352 model.SelectWord(); | 364 model.SelectWord(); |
| 353 SelectWordTestVerifier(model, " ", 20U); | 365 SelectWordTestVerifier(model, " ", 20U); |
| 354 | 366 |
| 355 // Test when cursor is at the end. | 367 // Test when cursor is at the end. |
| 356 model.MoveCursorRight(gfx::LINE_BREAK, false); | 368 model.MoveCursorRight(gfx::LINE_BREAK, false); |
| 357 model.SelectWord(); | 369 model.SelectWord(); |
| 358 SelectWordTestVerifier(model, " ", 24U); | 370 SelectWordTestVerifier(model, " ", 24U); |
| 359 } | 371 } |
| 360 | 372 |
| 361 TEST_F(TextfieldViewsModelTest, RangeTest) { | 373 TEST_F(TextfieldViewsModelTest, RangeTest) { |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 590 composition_text_confirmed_or_cleared_ = false; | 602 composition_text_confirmed_or_cleared_ = false; |
| 591 EXPECT_STR_EQ("678678", model.GetText()); | 603 EXPECT_STR_EQ("678678", model.GetText()); |
| 592 | 604 |
| 593 model.SetCompositionText(composition); | 605 model.SetCompositionText(composition); |
| 594 model.MoveCursorRight(gfx::LINE_BREAK, false); | 606 model.MoveCursorRight(gfx::LINE_BREAK, false); |
| 595 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 607 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
| 596 composition_text_confirmed_or_cleared_ = false; | 608 composition_text_confirmed_or_cleared_ = false; |
| 597 EXPECT_STR_EQ("678", model.GetText()); | 609 EXPECT_STR_EQ("678", model.GetText()); |
| 598 | 610 |
| 599 model.SetCompositionText(composition); | 611 model.SetCompositionText(composition); |
| 600 model.MoveCursorTo(0, true); | 612 gfx::SelectionModel sel(0); |
| 613 sel.set_selection_start(model.render_text()->GetSelectionStart()); |
| 614 model.MoveCursorTo(&sel); |
| 601 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 615 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
| 602 composition_text_confirmed_or_cleared_ = false; | 616 composition_text_confirmed_or_cleared_ = false; |
| 603 EXPECT_STR_EQ("678678", model.GetText()); | 617 EXPECT_STR_EQ("678678", model.GetText()); |
| 604 | 618 |
| 605 model.SetCompositionText(composition); | 619 model.SetCompositionText(composition); |
| 606 model.SelectRange(ui::Range(0, 3)); | 620 model.SelectRange(ui::Range(0, 3)); |
| 607 EXPECT_TRUE(composition_text_confirmed_or_cleared_); | 621 EXPECT_TRUE(composition_text_confirmed_or_cleared_); |
| 608 composition_text_confirmed_or_cleared_ = false; | 622 composition_text_confirmed_or_cleared_ = false; |
| 609 EXPECT_STR_EQ("678", model.GetText()); | 623 EXPECT_STR_EQ("678", model.GetText()); |
| 610 | 624 |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 693 // Clear history | 707 // Clear history |
| 694 model.ClearEditHistory(); | 708 model.ClearEditHistory(); |
| 695 EXPECT_FALSE(model.Undo()); | 709 EXPECT_FALSE(model.Undo()); |
| 696 EXPECT_FALSE(model.Redo()); | 710 EXPECT_FALSE(model.Redo()); |
| 697 EXPECT_STR_EQ("a", model.GetText()); | 711 EXPECT_STR_EQ("a", model.GetText()); |
| 698 EXPECT_EQ(1U, model.GetCursorPosition()); | 712 EXPECT_EQ(1U, model.GetCursorPosition()); |
| 699 | 713 |
| 700 // Delete =============================== | 714 // Delete =============================== |
| 701 model.SetText(ASCIIToUTF16("ABCDE")); | 715 model.SetText(ASCIIToUTF16("ABCDE")); |
| 702 model.ClearEditHistory(); | 716 model.ClearEditHistory(); |
| 703 model.MoveCursorTo(2, false); | 717 gfx::SelectionModel sel(2); |
| 718 model.MoveCursorTo(&sel); |
| 704 EXPECT_TRUE(model.Delete()); | 719 EXPECT_TRUE(model.Delete()); |
| 705 EXPECT_STR_EQ("ABDE", model.GetText()); | 720 EXPECT_STR_EQ("ABDE", model.GetText()); |
| 706 model.MoveCursorLeft(gfx::LINE_BREAK, false); | 721 model.MoveCursorLeft(gfx::LINE_BREAK, false); |
| 707 EXPECT_TRUE(model.Delete()); | 722 EXPECT_TRUE(model.Delete()); |
| 708 EXPECT_STR_EQ("BDE", model.GetText()); | 723 EXPECT_STR_EQ("BDE", model.GetText()); |
| 709 EXPECT_TRUE(model.Undo()); | 724 EXPECT_TRUE(model.Undo()); |
| 710 EXPECT_STR_EQ("ABDE", model.GetText()); | 725 EXPECT_STR_EQ("ABDE", model.GetText()); |
| 711 EXPECT_EQ(0U, model.GetCursorPosition()); | 726 EXPECT_EQ(0U, model.GetCursorPosition()); |
| 712 EXPECT_TRUE(model.Undo()); | 727 EXPECT_TRUE(model.Undo()); |
| 713 EXPECT_STR_EQ("ABCDE", model.GetText()); | 728 EXPECT_STR_EQ("ABCDE", model.GetText()); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 787 EXPECT_STR_EQ("www.youtube.com", model.GetText()); | 802 EXPECT_STR_EQ("www.youtube.com", model.GetText()); |
| 788 EXPECT_EQ(5U, model.GetCursorPosition()); | 803 EXPECT_EQ(5U, model.GetCursorPosition()); |
| 789 EXPECT_FALSE(model.Redo()); | 804 EXPECT_FALSE(model.Redo()); |
| 790 } | 805 } |
| 791 | 806 |
| 792 TEST_F(TextfieldViewsModelTest, UndoRedo_CutCopyPasteTest) { | 807 TEST_F(TextfieldViewsModelTest, UndoRedo_CutCopyPasteTest) { |
| 793 TextfieldViewsModel model(NULL); | 808 TextfieldViewsModel model(NULL); |
| 794 model.SetText(ASCIIToUTF16("ABCDE")); | 809 model.SetText(ASCIIToUTF16("ABCDE")); |
| 795 EXPECT_FALSE(model.Redo()); // nothing to redo | 810 EXPECT_FALSE(model.Redo()); // nothing to redo |
| 796 // Cut | 811 // Cut |
| 797 model.MoveCursorTo(1, false); | 812 gfx::SelectionModel sel(1); |
| 798 model.MoveCursorTo(3, true); | 813 model.MoveCursorTo(&sel); |
| 814 sel.set_selection_end(3); |
| 815 model.MoveCursorTo(&sel); |
| 799 model.Cut(); | 816 model.Cut(); |
| 800 EXPECT_STR_EQ("ADE", model.GetText()); | 817 EXPECT_STR_EQ("ADE", model.GetText()); |
| 801 EXPECT_EQ(1U, model.GetCursorPosition()); | 818 EXPECT_EQ(1U, model.GetCursorPosition()); |
| 802 EXPECT_TRUE(model.Undo()); | 819 EXPECT_TRUE(model.Undo()); |
| 803 EXPECT_STR_EQ("ABCDE", model.GetText()); | 820 EXPECT_STR_EQ("ABCDE", model.GetText()); |
| 804 EXPECT_EQ(3U, model.GetCursorPosition()); | 821 EXPECT_EQ(3U, model.GetCursorPosition()); |
| 805 EXPECT_TRUE(model.Undo()); | 822 EXPECT_TRUE(model.Undo()); |
| 806 EXPECT_STR_EQ("", model.GetText()); | 823 EXPECT_STR_EQ("", model.GetText()); |
| 807 EXPECT_EQ(0U, model.GetCursorPosition()); | 824 EXPECT_EQ(0U, model.GetCursorPosition()); |
| 808 EXPECT_FALSE(model.Undo()); // no more undo | 825 EXPECT_FALSE(model.Undo()); // no more undo |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 874 // empty cut shouldn't create an edit. | 891 // empty cut shouldn't create an edit. |
| 875 EXPECT_TRUE(model.Undo()); | 892 EXPECT_TRUE(model.Undo()); |
| 876 EXPECT_STR_EQ("ABCBCBCDE", model.GetText()); | 893 EXPECT_STR_EQ("ABCBCBCDE", model.GetText()); |
| 877 EXPECT_EQ(3U, model.GetCursorPosition()); | 894 EXPECT_EQ(3U, model.GetCursorPosition()); |
| 878 | 895 |
| 879 // Copy | 896 // Copy |
| 880 ResetModel(&model); | 897 ResetModel(&model); |
| 881 model.SetText(ASCIIToUTF16("12345")); | 898 model.SetText(ASCIIToUTF16("12345")); |
| 882 EXPECT_STR_EQ("12345", model.GetText()); | 899 EXPECT_STR_EQ("12345", model.GetText()); |
| 883 EXPECT_EQ(0U, model.GetCursorPosition()); | 900 EXPECT_EQ(0U, model.GetCursorPosition()); |
| 884 model.MoveCursorTo(1, false); | 901 sel.set_selection_end(1); |
| 885 model.MoveCursorTo(3, true); | 902 sel.SetSelectionEmpty(); |
| 903 model.MoveCursorTo(&sel); |
| 904 sel.set_selection_end(3); |
| 905 model.MoveCursorTo(&sel); |
| 886 model.Copy(); // Copy "23" | 906 model.Copy(); // Copy "23" |
| 887 EXPECT_STR_EQ("12345", model.GetText()); | 907 EXPECT_STR_EQ("12345", model.GetText()); |
| 888 EXPECT_EQ(3U, model.GetCursorPosition()); | 908 EXPECT_EQ(3U, model.GetCursorPosition()); |
| 889 model.Paste(); // Paste "23" into "23". | 909 model.Paste(); // Paste "23" into "23". |
| 890 EXPECT_STR_EQ("12345", model.GetText()); | 910 EXPECT_STR_EQ("12345", model.GetText()); |
| 891 EXPECT_EQ(3U, model.GetCursorPosition()); | 911 EXPECT_EQ(3U, model.GetCursorPosition()); |
| 892 model.Paste(); | 912 model.Paste(); |
| 893 EXPECT_STR_EQ("1232345", model.GetText()); | 913 EXPECT_STR_EQ("1232345", model.GetText()); |
| 894 EXPECT_EQ(5U, model.GetCursorPosition()); | 914 EXPECT_EQ(5U, model.GetCursorPosition()); |
| 895 EXPECT_TRUE(model.Undo()); | 915 EXPECT_TRUE(model.Undo()); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 999 EXPECT_EQ(5U, model.GetCursorPosition()); | 1019 EXPECT_EQ(5U, model.GetCursorPosition()); |
| 1000 EXPECT_FALSE(model.Redo()); | 1020 EXPECT_FALSE(model.Redo()); |
| 1001 } | 1021 } |
| 1002 | 1022 |
| 1003 TEST_F(TextfieldViewsModelTest, UndoRedo_ReplaceTest) { | 1023 TEST_F(TextfieldViewsModelTest, UndoRedo_ReplaceTest) { |
| 1004 // By Cursor | 1024 // By Cursor |
| 1005 { | 1025 { |
| 1006 SCOPED_TRACE("forward & insert by cursor"); | 1026 SCOPED_TRACE("forward & insert by cursor"); |
| 1007 TextfieldViewsModel model(NULL); | 1027 TextfieldViewsModel model(NULL); |
| 1008 model.SetText(ASCIIToUTF16("abcd")); | 1028 model.SetText(ASCIIToUTF16("abcd")); |
| 1009 model.MoveCursorTo(1, false); | 1029 gfx::SelectionModel sel(1); |
| 1010 model.MoveCursorTo(3, true); | 1030 model.MoveCursorTo(&sel); |
| 1031 sel.set_selection_end(3); |
| 1032 model.MoveCursorTo(&sel); |
| 1011 RunInsertReplaceTest(model); | 1033 RunInsertReplaceTest(model); |
| 1012 } | 1034 } |
| 1013 { | 1035 { |
| 1014 SCOPED_TRACE("backward & insert by cursor"); | 1036 SCOPED_TRACE("backward & insert by cursor"); |
| 1015 TextfieldViewsModel model(NULL); | 1037 TextfieldViewsModel model(NULL); |
| 1016 model.SetText(ASCIIToUTF16("abcd")); | 1038 model.SetText(ASCIIToUTF16("abcd")); |
| 1017 model.MoveCursorTo(3, false); | 1039 gfx::SelectionModel sel(3); |
| 1018 model.MoveCursorTo(1, true); | 1040 model.MoveCursorTo(&sel); |
| 1041 sel.set_selection_end(1); |
| 1042 model.MoveCursorTo(&sel); |
| 1019 RunInsertReplaceTest(model); | 1043 RunInsertReplaceTest(model); |
| 1020 } | 1044 } |
| 1021 { | 1045 { |
| 1022 SCOPED_TRACE("forward & overwrite by cursor"); | 1046 SCOPED_TRACE("forward & overwrite by cursor"); |
| 1023 TextfieldViewsModel model(NULL); | 1047 TextfieldViewsModel model(NULL); |
| 1024 model.SetText(ASCIIToUTF16("abcd")); | 1048 model.SetText(ASCIIToUTF16("abcd")); |
| 1025 model.MoveCursorTo(1, false); | 1049 gfx::SelectionModel sel(1); |
| 1026 model.MoveCursorTo(3, true); | 1050 model.MoveCursorTo(&sel); |
| 1051 sel.set_selection_end(3); |
| 1052 model.MoveCursorTo(&sel); |
| 1027 RunOverwriteReplaceTest(model); | 1053 RunOverwriteReplaceTest(model); |
| 1028 } | 1054 } |
| 1029 { | 1055 { |
| 1030 SCOPED_TRACE("backward & overwrite by cursor"); | 1056 SCOPED_TRACE("backward & overwrite by cursor"); |
| 1031 TextfieldViewsModel model(NULL); | 1057 TextfieldViewsModel model(NULL); |
| 1032 model.SetText(ASCIIToUTF16("abcd")); | 1058 model.SetText(ASCIIToUTF16("abcd")); |
| 1033 model.MoveCursorTo(3, false); | 1059 gfx::SelectionModel sel(3); |
| 1034 model.MoveCursorTo(1, true); | 1060 model.MoveCursorTo(&sel); |
| 1061 sel.set_selection_end(1); |
| 1062 model.MoveCursorTo(&sel); |
| 1035 RunOverwriteReplaceTest(model); | 1063 RunOverwriteReplaceTest(model); |
| 1036 } | 1064 } |
| 1037 // By SelectRange API | 1065 // By SelectRange API |
| 1038 { | 1066 { |
| 1039 SCOPED_TRACE("forward & insert by SelectRange"); | 1067 SCOPED_TRACE("forward & insert by SelectRange"); |
| 1040 TextfieldViewsModel model(NULL); | 1068 TextfieldViewsModel model(NULL); |
| 1041 model.SetText(ASCIIToUTF16("abcd")); | 1069 model.SetText(ASCIIToUTF16("abcd")); |
| 1042 model.SelectRange(ui::Range(1, 3)); | 1070 model.SelectRange(ui::Range(1, 3)); |
| 1043 RunInsertReplaceTest(model); | 1071 RunInsertReplaceTest(model); |
| 1044 } | 1072 } |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1136 EXPECT_TRUE(model.Undo()); | 1164 EXPECT_TRUE(model.Undo()); |
| 1137 EXPECT_STR_EQ("ABCDE", model.GetText()); | 1165 EXPECT_STR_EQ("ABCDE", model.GetText()); |
| 1138 EXPECT_TRUE(model.Redo()); | 1166 EXPECT_TRUE(model.Redo()); |
| 1139 EXPECT_STR_EQ("1234", model.GetText()); | 1167 EXPECT_STR_EQ("1234", model.GetText()); |
| 1140 EXPECT_FALSE(model.Redo()); | 1168 EXPECT_FALSE(model.Redo()); |
| 1141 | 1169 |
| 1142 // TODO(oshima): We need MockInputMethod to test the behavior with IME. | 1170 // TODO(oshima): We need MockInputMethod to test the behavior with IME. |
| 1143 } | 1171 } |
| 1144 | 1172 |
| 1145 } // namespace views | 1173 } // namespace views |
| OLD | NEW |