summaryrefslogtreecommitdiffstats
path: root/chromium/ui/views/controls/textfield/textfield_views_model_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ui/views/controls/textfield/textfield_views_model_unittest.cc')
-rw-r--r--chromium/ui/views/controls/textfield/textfield_views_model_unittest.cc1516
1 files changed, 0 insertions, 1516 deletions
diff --git a/chromium/ui/views/controls/textfield/textfield_views_model_unittest.cc b/chromium/ui/views/controls/textfield/textfield_views_model_unittest.cc
deleted file mode 100644
index b23fb10b453..00000000000
--- a/chromium/ui/views/controls/textfield/textfield_views_model_unittest.cc
+++ /dev/null
@@ -1,1516 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <vector>
-
-#include "base/auto_reset.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/message_loop/message_loop.h"
-#include "base/strings/string16.h"
-#include "base/strings/utf_string_conversions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/base/clipboard/clipboard.h"
-#include "ui/base/clipboard/scoped_clipboard_writer.h"
-#include "ui/gfx/range/range.h"
-#include "ui/gfx/render_text.h"
-#include "ui/views/controls/textfield/textfield.h"
-#include "ui/views/controls/textfield/textfield_views_model.h"
-#include "ui/views/test/test_views_delegate.h"
-#include "ui/views/test/views_test_base.h"
-
-#if defined(OS_WIN)
-#include "base/win/windows_version.h"
-#endif
-
-#define EXPECT_STR_EQ(ascii, utf16) EXPECT_EQ(ASCIIToUTF16(ascii), utf16)
-
-namespace {
-
-struct WordAndCursor {
- WordAndCursor(const wchar_t* w, size_t c) : word(w), cursor(c) {}
-
- const wchar_t* word;
- size_t cursor;
-};
-
-void MoveCursorTo(views::TextfieldViewsModel& model, size_t pos) {
- model.MoveCursorTo(gfx::SelectionModel(pos, gfx::CURSOR_FORWARD));
-}
-
-} // namespace
-
-namespace views {
-
-class TextfieldViewsModelTest : public ViewsTestBase,
- public TextfieldViewsModel::Delegate {
- public:
- TextfieldViewsModelTest()
- : ViewsTestBase(),
- composition_text_confirmed_or_cleared_(false) {
- }
-
- virtual void OnCompositionTextConfirmedOrCleared() OVERRIDE {
- composition_text_confirmed_or_cleared_ = true;
- }
-
- protected:
- void ResetModel(TextfieldViewsModel* model) const {
- model->SetText(string16());
- model->ClearEditHistory();
- }
-
- bool composition_text_confirmed_or_cleared_;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(TextfieldViewsModelTest);
-};
-
-TEST_F(TextfieldViewsModelTest, EditString) {
- TextfieldViewsModel model(NULL);
- // append two strings
- model.Append(ASCIIToUTF16("HILL"));
- EXPECT_STR_EQ("HILL", model.GetText());
- model.Append(ASCIIToUTF16("WORLD"));
- EXPECT_STR_EQ("HILLWORLD", model.GetText());
-
- // Insert "E" to make hello
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, false);
- model.InsertChar('E');
- EXPECT_STR_EQ("HEILLWORLD", model.GetText());
- // Replace "I" with "L"
- model.ReplaceChar('L');
- EXPECT_STR_EQ("HELLLWORLD", model.GetText());
- model.ReplaceChar('L');
- model.ReplaceChar('O');
- EXPECT_STR_EQ("HELLOWORLD", model.GetText());
-
- // Delete 6th char "W", then delete 5th char O"
- EXPECT_EQ(5U, model.GetCursorPosition());
- EXPECT_TRUE(model.Delete());
- EXPECT_STR_EQ("HELLOORLD", model.GetText());
- EXPECT_TRUE(model.Backspace());
- EXPECT_EQ(4U, model.GetCursorPosition());
- EXPECT_STR_EQ("HELLORLD", model.GetText());
-
- // Move the cursor to start. backspace should fail.
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_LEFT, false);
- EXPECT_FALSE(model.Backspace());
- EXPECT_STR_EQ("HELLORLD", model.GetText());
- // Move the cursor to the end. delete should fail.
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false);
- EXPECT_FALSE(model.Delete());
- EXPECT_STR_EQ("HELLORLD", model.GetText());
- // but backspace should work.
- EXPECT_TRUE(model.Backspace());
- EXPECT_STR_EQ("HELLORL", model.GetText());
-
- MoveCursorTo(model, 5);
- model.ReplaceText(ASCIIToUTF16(" WOR"));
- EXPECT_STR_EQ("HELLO WORL", model.GetText());
-}
-
-TEST_F(TextfieldViewsModelTest, EditString_SimpleRTL) {
- TextfieldViewsModel model(NULL);
- // Append two strings.
- model.Append(WideToUTF16(L"\x05d0\x05d1\x05d2"));
- EXPECT_EQ(WideToUTF16(L"\x05d0\x05d1\x05d2"), model.GetText());
- model.Append(WideToUTF16(L"\x05e0\x05e1\x05e2"));
- EXPECT_EQ(WideToUTF16(L"\x05d0\x05d1\x05d2\x05e0\x05e1\x05e2"),
- model.GetText());
-
- // Insert 0x05f0.
- MoveCursorTo(model, 1);
- model.InsertChar(0x05f0);
- EXPECT_EQ(WideToUTF16(L"\x05d0\x05f0\x05d1\x05d2\x05e0\x05e1\x05e2"),
- model.GetText());
-
- // Replace "\x05d1" with "\x05f1".
- model.ReplaceChar(0x05f1);
- EXPECT_EQ(WideToUTF16(L"\x05d0\x05f0\x5f1\x05d2\x05e0\x05e1\x05e2"),
- model.GetText());
-
- // Delete and backspace.
- EXPECT_EQ(3U, model.GetCursorPosition());
- EXPECT_TRUE(model.Delete());
- EXPECT_EQ(WideToUTF16(L"\x05d0\x05f0\x5f1\x05e0\x05e1\x05e2"),
- model.GetText());
- EXPECT_TRUE(model.Backspace());
- EXPECT_EQ(2U, model.GetCursorPosition());
- EXPECT_EQ(WideToUTF16(L"\x05d0\x05f0\x05e0\x05e1\x05e2"), model.GetText());
-}
-
-TEST_F(TextfieldViewsModelTest, EditString_ComplexScript) {
- // TODO(asvitkine): Disable tests that fail on XP bots due to lack of complete
- // font support for some scripts - http://crbug.com/106450
- bool on_windows_xp = false;
-#if defined(OS_WIN)
- on_windows_xp = base::win::GetVersion() < base::win::VERSION_VISTA;
-#endif
-
- TextfieldViewsModel model(NULL);
-
- // Append two Hindi strings.
- model.Append(WideToUTF16(L"\x0915\x093f\x0915\x094d\x0915"));
- EXPECT_EQ(WideToUTF16(L"\x0915\x093f\x0915\x094d\x0915"),
- model.GetText());
- model.Append(WideToUTF16(L"\x0915\x094d\x092e\x094d"));
- EXPECT_EQ(WideToUTF16(
- L"\x0915\x093f\x0915\x094d\x0915\x0915\x094d\x092e\x094d"),
- model.GetText());
-
- // TODO(asvitkine): Disable tests that fail on XP bots due to lack of complete
- // font support for some scripts - http://crbug.com/106450
- if (!on_windows_xp) {
- // Check it is not able to place cursor in middle of a grapheme.
- MoveCursorTo(model, 1);
- EXPECT_EQ(0U, model.GetCursorPosition());
-
- MoveCursorTo(model, 2);
- EXPECT_EQ(2U, model.GetCursorPosition());
- model.InsertChar('a');
- EXPECT_EQ(WideToUTF16(
- L"\x0915\x093f\x0061\x0915\x094d\x0915\x0915\x094d\x092e\x094d"),
- model.GetText());
-
- // ReplaceChar will replace the whole grapheme.
- model.ReplaceChar('b');
- // TODO(xji): temporarily disable in platform Win since the complex script
- // characters turned into empty square due to font regression. So, not able
- // to test 2 characters belong to the same grapheme.
-#if defined(OS_LINUX)
- EXPECT_EQ(WideToUTF16(
- L"\x0915\x093f\x0061\x0062\x0915\x0915\x094d\x092e\x094d"),
- model.GetText());
-#endif
- EXPECT_EQ(4U, model.GetCursorPosition());
- }
-
- // Delete should delete the whole grapheme.
- MoveCursorTo(model, 0);
- // TODO(xji): temporarily disable in platform Win since the complex script
- // characters turned into empty square due to font regression. So, not able
- // to test 2 characters belong to the same grapheme.
-#if defined(OS_LINUX)
- EXPECT_TRUE(model.Delete());
- EXPECT_EQ(WideToUTF16(L"\x0061\x0062\x0915\x0915\x094d\x092e\x094d"),
- model.GetText());
- MoveCursorTo(model, model.GetText().length());
- EXPECT_EQ(model.GetText().length(), model.GetCursorPosition());
- EXPECT_TRUE(model.Backspace());
- EXPECT_EQ(WideToUTF16(L"\x0061\x0062\x0915\x0915\x094d\x092e"),
- model.GetText());
-#endif
-
- // Test cursor position and deletion for Hindi Virama.
- model.SetText(WideToUTF16(L"\x0D38\x0D4D\x0D15\x0D16\x0D2E"));
- MoveCursorTo(model, 0);
- EXPECT_EQ(0U, model.GetCursorPosition());
-
- // TODO(asvitkine): Disable tests that fail on XP bots due to lack of complete
- // font support for some scripts - http://crbug.com/106450
- if (!on_windows_xp) {
- MoveCursorTo(model, 1);
- EXPECT_EQ(0U, model.GetCursorPosition());
- MoveCursorTo(model, 3);
- EXPECT_EQ(3U, model.GetCursorPosition());
- }
-
- // TODO(asvitkine): Temporarily disable the following check on Windows. It
- // seems Windows treats "\x0D38\x0D4D\x0D15" as a single grapheme.
-#if !defined(OS_WIN)
- MoveCursorTo(model, 2);
- EXPECT_EQ(2U, model.GetCursorPosition());
- EXPECT_TRUE(model.Backspace());
- EXPECT_EQ(WideToUTF16(L"\x0D38\x0D15\x0D16\x0D2E"), model.GetText());
-#endif
-
- model.SetText(WideToUTF16(L"\x05d5\x05b7\x05D9\x05B0\x05D4\x05B4\x05D9"));
- MoveCursorTo(model, 0);
- EXPECT_TRUE(model.Delete());
- EXPECT_TRUE(model.Delete());
- EXPECT_TRUE(model.Delete());
- EXPECT_TRUE(model.Delete());
- EXPECT_EQ(WideToUTF16(L""), model.GetText());
-
- // The first 2 characters are not strong directionality characters.
- model.SetText(WideToUTF16(L"\x002C\x0020\x05D1\x05BC\x05B7\x05E9\x05BC"));
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_LEFT, false);
- EXPECT_TRUE(model.Backspace());
- EXPECT_EQ(WideToUTF16(L"\x002C\x0020\x05D1\x05BC\x05B7\x05E9"),
- model.GetText());
-}
-
-TEST_F(TextfieldViewsModelTest, EmptyString) {
- TextfieldViewsModel model(NULL);
- EXPECT_EQ(string16(), model.GetText());
- EXPECT_EQ(string16(), model.GetSelectedText());
-
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, true);
- EXPECT_EQ(0U, model.GetCursorPosition());
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true);
- EXPECT_EQ(0U, model.GetCursorPosition());
-
- EXPECT_EQ(string16(), model.GetSelectedText());
-
- EXPECT_FALSE(model.Delete());
- EXPECT_FALSE(model.Backspace());
-}
-
-TEST_F(TextfieldViewsModelTest, Selection) {
- TextfieldViewsModel model(NULL);
- model.Append(ASCIIToUTF16("HELLO"));
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, false);
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true);
- EXPECT_STR_EQ("E", model.GetSelectedText());
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true);
- EXPECT_STR_EQ("EL", model.GetSelectedText());
-
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_LEFT, true);
- EXPECT_STR_EQ("H", model.GetSelectedText());
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, true);
- EXPECT_STR_EQ("ELLO", model.GetSelectedText());
- model.ClearSelection();
- EXPECT_EQ(string16(), model.GetSelectedText());
-
- // SelectAll(false) selects towards the end.
- model.SelectAll(false);
- EXPECT_STR_EQ("HELLO", model.GetSelectedText());
- EXPECT_EQ(gfx::Range(0, 5), model.render_text()->selection());
-
- // SelectAll(true) selects towards the beginning.
- model.SelectAll(true);
- EXPECT_STR_EQ("HELLO", model.GetSelectedText());
- EXPECT_EQ(gfx::Range(5, 0), model.render_text()->selection());
-
- // Select and move cursor.
- model.SelectRange(gfx::Range(1U, 3U));
- EXPECT_STR_EQ("EL", model.GetSelectedText());
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, false);
- EXPECT_EQ(1U, model.GetCursorPosition());
- model.SelectRange(gfx::Range(1U, 3U));
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, false);
- EXPECT_EQ(3U, model.GetCursorPosition());
-
- // Select all and move cursor.
- model.SelectAll(false);
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, false);
- EXPECT_EQ(0U, model.GetCursorPosition());
- model.SelectAll(false);
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, false);
- EXPECT_EQ(5U, model.GetCursorPosition());
-}
-
-TEST_F(TextfieldViewsModelTest, Selection_BidiWithNonSpacingMarks) {
- // Selection is a logical operation. And it should work with the arrow
- // keys doing visual movements, while the selection is logical between
- // the (logical) start and end points. Selection is simply defined as
- // the portion of text between the logical positions of the start and end
- // caret positions.
- TextfieldViewsModel model(NULL);
- // TODO(xji): temporarily disable in platform Win since the complex script
- // characters turned into empty square due to font regression. So, not able
- // to test 2 characters belong to the same grapheme.
-#if defined(OS_LINUX)
- model.Append(WideToUTF16(
- L"abc\x05E9\x05BC\x05C1\x05B8\x05E0\x05B8" L"def"));
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, false);
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, false);
-
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true);
- EXPECT_EQ(gfx::Range(2, 3), model.render_text()->selection());
- EXPECT_EQ(WideToUTF16(L"c"), model.GetSelectedText());
-
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true);
- EXPECT_EQ(gfx::Range(2, 7), model.render_text()->selection());
- EXPECT_EQ(WideToUTF16(L"c\x05E9\x05BC\x05C1\x05B8"),
- model.GetSelectedText());
-
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true);
- EXPECT_EQ(gfx::Range(2, 3), model.render_text()->selection());
- EXPECT_EQ(WideToUTF16(L"c"), model.GetSelectedText());
-
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true);
- EXPECT_EQ(gfx::Range(2, 10), model.render_text()->selection());
- EXPECT_EQ(WideToUTF16(L"c\x05E9\x05BC\x05C1\x05B8\x05E0\x05B8" L"d"),
- model.GetSelectedText());
-
- model.ClearSelection();
- EXPECT_EQ(string16(), model.GetSelectedText());
- model.SelectAll(false);
- EXPECT_EQ(WideToUTF16(L"abc\x05E9\x05BC\x05C1\x05B8\x05E0\x05B8" L"def"),
- model.GetSelectedText());
-#endif
-
- // In case of "aBc", this test shows how to select "aB" or "Bc", assume 'B' is
- // an RTL character.
- model.SetText(WideToUTF16(L"a\x05E9" L"b"));
- MoveCursorTo(model, 0);
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true);
- EXPECT_EQ(WideToUTF16(L"a"), model.GetSelectedText());
-
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true);
- EXPECT_EQ(WideToUTF16(L"a"), model.GetSelectedText());
-
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true);
- EXPECT_EQ(WideToUTF16(L"a\x05E9" L"b"), model.GetSelectedText());
-
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, false);
- EXPECT_EQ(3U, model.GetCursorPosition());
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, true);
- EXPECT_EQ(WideToUTF16(L"b"), model.GetSelectedText());
-
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, true);
- EXPECT_EQ(WideToUTF16(L"b"), model.GetSelectedText());
-
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, true);
- EXPECT_EQ(WideToUTF16(L"a\x05E9" L"b"), model.GetSelectedText());
-
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_LEFT, false);
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true);
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true);
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, true);
- EXPECT_EQ(WideToUTF16(L"a\x05E9"), model.GetSelectedText());
-
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false);
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, true);
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, true);
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true);
- EXPECT_EQ(WideToUTF16(L"\x05E9" L"b"), model.GetSelectedText());
-
- model.ClearSelection();
- EXPECT_EQ(string16(), model.GetSelectedText());
- model.SelectAll(false);
- EXPECT_EQ(WideToUTF16(L"a\x05E9" L"b"), model.GetSelectedText());
-}
-
-TEST_F(TextfieldViewsModelTest, SelectionAndEdit) {
- TextfieldViewsModel model(NULL);
- model.Append(ASCIIToUTF16("HELLO"));
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, false);
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true);
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true); // "EL"
- EXPECT_TRUE(model.Backspace());
- EXPECT_STR_EQ("HLO", model.GetText());
-
- model.Append(ASCIIToUTF16("ILL"));
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true);
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true); // "LO"
- EXPECT_TRUE(model.Delete());
- EXPECT_STR_EQ("HILL", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true); // "I"
- model.InsertChar('E');
- EXPECT_STR_EQ("HELL", model.GetText());
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_LEFT, false);
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true); // "H"
- model.ReplaceChar('B');
- EXPECT_STR_EQ("BELL", model.GetText());
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false);
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, true);
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, true); // "ELL"
- model.ReplaceChar('E');
- EXPECT_STR_EQ("BEE", model.GetText());
-}
-
-TEST_F(TextfieldViewsModelTest, Word) {
- TextfieldViewsModel model(NULL);
- model.Append(
- ASCIIToUTF16("The answer to Life, the Universe, and Everything"));
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, false);
- EXPECT_EQ(3U, model.GetCursorPosition());
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, false);
- EXPECT_EQ(10U, model.GetCursorPosition());
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, false);
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, false);
- EXPECT_EQ(18U, model.GetCursorPosition());
-
- // Should passes the non word char ','
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, true);
- EXPECT_EQ(23U, model.GetCursorPosition());
- EXPECT_STR_EQ(", the", model.GetSelectedText());
-
- // Move to the end.
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, true);
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, true);
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, true);
- EXPECT_STR_EQ(", the Universe, and Everything", model.GetSelectedText());
- // Should be safe to go next word at the end.
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, true);
- EXPECT_STR_EQ(", the Universe, and Everything", model.GetSelectedText());
- model.InsertChar('2');
- EXPECT_EQ(19U, model.GetCursorPosition());
-
- // Now backwards.
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, false); // leave 2.
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, true);
- EXPECT_EQ(14U, model.GetCursorPosition());
- EXPECT_STR_EQ("Life", model.GetSelectedText());
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, true);
- EXPECT_STR_EQ("to Life", model.GetSelectedText());
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, true);
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, true);
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, true); // Now at start.
- EXPECT_STR_EQ("The answer to Life", model.GetSelectedText());
- // Should be safe to go to the previous word at the beginning.
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, true);
- EXPECT_STR_EQ("The answer to Life", model.GetSelectedText());
- model.ReplaceChar('4');
- EXPECT_EQ(string16(), model.GetSelectedText());
- EXPECT_STR_EQ("42", model.GetText());
-}
-
-TEST_F(TextfieldViewsModelTest, SetText) {
- TextfieldViewsModel model(NULL);
- model.Append(ASCIIToUTF16("HELLO"));
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false);
- model.SetText(ASCIIToUTF16("GOODBYE"));
- EXPECT_STR_EQ("GOODBYE", model.GetText());
- // SetText move the cursor to the end of the new text.
- EXPECT_EQ(7U, model.GetCursorPosition());
- model.SelectAll(false);
- EXPECT_STR_EQ("GOODBYE", model.GetSelectedText());
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false);
- EXPECT_EQ(7U, model.GetCursorPosition());
-
- model.SetText(ASCIIToUTF16("BYE"));
- // Setting shorter string moves the cursor to the end of the new string.
- EXPECT_EQ(3U, model.GetCursorPosition());
- EXPECT_EQ(string16(), model.GetSelectedText());
- model.SetText(string16());
- EXPECT_EQ(0U, model.GetCursorPosition());
-}
-
-TEST_F(TextfieldViewsModelTest, Clipboard) {
- ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
- const string16 initial_clipboard_text = ASCIIToUTF16("initial text");
- ui::ScopedClipboardWriter(clipboard, ui::CLIPBOARD_TYPE_COPY_PASTE).
- WriteText(initial_clipboard_text);
-
- string16 clipboard_text;
- TextfieldViewsModel model(NULL);
- model.Append(ASCIIToUTF16("HELLO WORLD"));
-
- // Cut with an empty selection should do nothing.
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false);
- EXPECT_FALSE(model.Cut());
- clipboard->ReadText(ui::CLIPBOARD_TYPE_COPY_PASTE, &clipboard_text);
- EXPECT_EQ(initial_clipboard_text, clipboard_text);
- EXPECT_STR_EQ("HELLO WORLD", model.GetText());
- EXPECT_EQ(11U, model.GetCursorPosition());
-
- // Copy with an empty selection should do nothing.
- model.Copy();
- clipboard->ReadText(ui::CLIPBOARD_TYPE_COPY_PASTE, &clipboard_text);
- EXPECT_EQ(initial_clipboard_text, clipboard_text);
- EXPECT_STR_EQ("HELLO WORLD", model.GetText());
- EXPECT_EQ(11U, model.GetCursorPosition());
-
- // Cut on obscured (password) text should do nothing.
- model.render_text()->SetObscured(true);
- model.SelectAll(false);
- EXPECT_FALSE(model.Cut());
- clipboard->ReadText(ui::CLIPBOARD_TYPE_COPY_PASTE, &clipboard_text);
- EXPECT_EQ(initial_clipboard_text, clipboard_text);
- EXPECT_STR_EQ("HELLO WORLD", model.GetText());
- EXPECT_STR_EQ("HELLO WORLD", model.GetSelectedText());
-
- // Copy on obscured text should do nothing.
- model.SelectAll(false);
- EXPECT_FALSE(model.Copy());
- clipboard->ReadText(ui::CLIPBOARD_TYPE_COPY_PASTE, &clipboard_text);
- EXPECT_EQ(initial_clipboard_text, clipboard_text);
- EXPECT_STR_EQ("HELLO WORLD", model.GetText());
- EXPECT_STR_EQ("HELLO WORLD", model.GetSelectedText());
-
- // Cut with non-empty selection.
- model.render_text()->SetObscured(false);
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false);
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, true);
- EXPECT_TRUE(model.Cut());
- clipboard->ReadText(ui::CLIPBOARD_TYPE_COPY_PASTE, &clipboard_text);
- EXPECT_STR_EQ("WORLD", clipboard_text);
- EXPECT_STR_EQ("HELLO ", model.GetText());
- EXPECT_EQ(6U, model.GetCursorPosition());
-
- // Copy with non-empty selection.
- model.SelectAll(false);
- EXPECT_TRUE(model.Copy());
- clipboard->ReadText(ui::CLIPBOARD_TYPE_COPY_PASTE, &clipboard_text);
- EXPECT_STR_EQ("HELLO ", clipboard_text);
- EXPECT_STR_EQ("HELLO ", model.GetText());
- EXPECT_EQ(6U, model.GetCursorPosition());
-
- // Test that paste works regardless of the obscured bit.
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false);
- EXPECT_TRUE(model.Paste());
- EXPECT_STR_EQ("HELLO HELLO ", model.GetText());
- EXPECT_EQ(12U, model.GetCursorPosition());
- model.render_text()->SetObscured(true);
- EXPECT_TRUE(model.Paste());
- EXPECT_STR_EQ("HELLO HELLO HELLO ", model.GetText());
- EXPECT_EQ(18U, model.GetCursorPosition());
-}
-
-static void SelectWordTestVerifier(const TextfieldViewsModel& model,
- const string16 &expected_selected_string, size_t expected_cursor_pos) {
- EXPECT_EQ(expected_selected_string, model.GetSelectedText());
- EXPECT_EQ(expected_cursor_pos, model.GetCursorPosition());
-}
-
-TEST_F(TextfieldViewsModelTest, SelectWordTest) {
- TextfieldViewsModel model(NULL);
- model.Append(ASCIIToUTF16(" HELLO !! WO RLD "));
-
- // Test when cursor is at the beginning.
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_LEFT, false);
- model.SelectWord();
- SelectWordTestVerifier(model, ASCIIToUTF16(" "), 2U);
-
- // Test when cursor is at the beginning of a word.
- MoveCursorTo(model, 2);
- model.SelectWord();
- SelectWordTestVerifier(model, ASCIIToUTF16("HELLO"), 7U);
-
- // Test when cursor is at the end of a word.
- MoveCursorTo(model, 15);
- model.SelectWord();
- SelectWordTestVerifier(model, ASCIIToUTF16(" "), 20U);
-
- // Test when cursor is somewhere in a non-alpha-numeric fragment.
- for (size_t cursor_pos = 8; cursor_pos < 13U; cursor_pos++) {
- MoveCursorTo(model, cursor_pos);
- model.SelectWord();
- SelectWordTestVerifier(model, ASCIIToUTF16(" !! "), 13U);
- }
-
- // Test when cursor is somewhere in a whitespace fragment.
- MoveCursorTo(model, 17);
- model.SelectWord();
- SelectWordTestVerifier(model, ASCIIToUTF16(" "), 20U);
-
- // Test when cursor is at the end.
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false);
- model.SelectWord();
- SelectWordTestVerifier(model, ASCIIToUTF16(" "), 24U);
-}
-
-// TODO(xji): temporarily disable in platform Win since the complex script
-// characters and Chinese characters are turned into empty square due to font
-// regression.
-#if defined(OS_LINUX)
-TEST_F(TextfieldViewsModelTest, SelectWordTest_MixScripts) {
- TextfieldViewsModel model(NULL);
- std::vector<WordAndCursor> word_and_cursor;
- word_and_cursor.push_back(WordAndCursor(L"a\x05d0", 2));
- word_and_cursor.push_back(WordAndCursor(L"a\x05d0", 2));
- word_and_cursor.push_back(WordAndCursor(L"\x05d1\x05d2", 5));
- word_and_cursor.push_back(WordAndCursor(L"\x05d1\x05d2", 5));
- word_and_cursor.push_back(WordAndCursor(L" ", 3));
- word_and_cursor.push_back(WordAndCursor(L"a\x05d0", 2));
- word_and_cursor.push_back(WordAndCursor(L"\x0915\x094d\x0915", 9));
- word_and_cursor.push_back(WordAndCursor(L"\x0915\x094d\x0915", 9));
- word_and_cursor.push_back(WordAndCursor(L" ", 10));
- word_and_cursor.push_back(WordAndCursor(L"\x4E2D\x56FD", 12));
- word_and_cursor.push_back(WordAndCursor(L"\x4E2D\x56FD", 12));
- word_and_cursor.push_back(WordAndCursor(L"\x82B1", 13));
- word_and_cursor.push_back(WordAndCursor(L"\x5929", 14));
-
- // The text consists of Ascii, Hebrew, Hindi with Virama sign, and Chinese.
- model.SetText(WideToUTF16(L"a\x05d0 \x05d1\x05d2 \x0915\x094d\x0915 "
- L"\x4E2D\x56FD\x82B1\x5929"));
- for (size_t i = 0; i < word_and_cursor.size(); ++i) {
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_LEFT, false);
- for (size_t j = 0; j < i; ++j)
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, false);
- model.SelectWord();
- SelectWordTestVerifier(model, WideToUTF16(word_and_cursor[i].word),
- word_and_cursor[i].cursor);
- }
-}
-#endif
-
-TEST_F(TextfieldViewsModelTest, RangeTest) {
- TextfieldViewsModel model(NULL);
- model.Append(ASCIIToUTF16("HELLO WORLD"));
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_LEFT, false);
- gfx::Range range = model.render_text()->selection();
- EXPECT_TRUE(range.is_empty());
- EXPECT_EQ(0U, range.start());
- EXPECT_EQ(0U, range.end());
-
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, true);
- range = model.render_text()->selection();
- EXPECT_FALSE(range.is_empty());
- EXPECT_FALSE(range.is_reversed());
- EXPECT_EQ(0U, range.start());
- EXPECT_EQ(5U, range.end());
-
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, true);
- range = model.render_text()->selection();
- EXPECT_FALSE(range.is_empty());
- EXPECT_EQ(0U, range.start());
- EXPECT_EQ(4U, range.end());
-
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, true);
- range = model.render_text()->selection();
- EXPECT_TRUE(range.is_empty());
- EXPECT_EQ(0U, range.start());
- EXPECT_EQ(0U, range.end());
-
- // now from the end.
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false);
- range = model.render_text()->selection();
- EXPECT_TRUE(range.is_empty());
- EXPECT_EQ(11U, range.start());
- EXPECT_EQ(11U, range.end());
-
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, true);
- range = model.render_text()->selection();
- EXPECT_FALSE(range.is_empty());
- EXPECT_TRUE(range.is_reversed());
- EXPECT_EQ(11U, range.start());
- EXPECT_EQ(6U, range.end());
-
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true);
- range = model.render_text()->selection();
- EXPECT_FALSE(range.is_empty());
- EXPECT_TRUE(range.is_reversed());
- EXPECT_EQ(11U, range.start());
- EXPECT_EQ(7U, range.end());
-
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, true);
- range = model.render_text()->selection();
- EXPECT_TRUE(range.is_empty());
- EXPECT_EQ(11U, range.start());
- EXPECT_EQ(11U, range.end());
-
- // Select All
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_LEFT, true);
- range = model.render_text()->selection();
- EXPECT_FALSE(range.is_empty());
- EXPECT_TRUE(range.is_reversed());
- EXPECT_EQ(11U, range.start());
- EXPECT_EQ(0U, range.end());
-}
-
-TEST_F(TextfieldViewsModelTest, SelectRangeTest) {
- TextfieldViewsModel model(NULL);
- model.Append(ASCIIToUTF16("HELLO WORLD"));
- gfx::Range range(0, 6);
- EXPECT_FALSE(range.is_reversed());
- model.SelectRange(range);
- EXPECT_STR_EQ("HELLO ", model.GetSelectedText());
-
- range = gfx::Range(6, 1);
- EXPECT_TRUE(range.is_reversed());
- model.SelectRange(range);
- EXPECT_STR_EQ("ELLO ", model.GetSelectedText());
-
- range = gfx::Range(2, 1000);
- EXPECT_FALSE(range.is_reversed());
- model.SelectRange(range);
- EXPECT_STR_EQ("LLO WORLD", model.GetSelectedText());
-
- range = gfx::Range(1000, 3);
- EXPECT_TRUE(range.is_reversed());
- model.SelectRange(range);
- EXPECT_STR_EQ("LO WORLD", model.GetSelectedText());
-
- range = gfx::Range(0, 0);
- EXPECT_TRUE(range.is_empty());
- model.SelectRange(range);
- EXPECT_TRUE(model.GetSelectedText().empty());
-
- range = gfx::Range(3, 3);
- EXPECT_TRUE(range.is_empty());
- model.SelectRange(range);
- EXPECT_TRUE(model.GetSelectedText().empty());
-
- range = gfx::Range(1000, 100);
- EXPECT_FALSE(range.is_empty());
- model.SelectRange(range);
- EXPECT_TRUE(model.GetSelectedText().empty());
-
- range = gfx::Range(1000, 1000);
- EXPECT_TRUE(range.is_empty());
- model.SelectRange(range);
- EXPECT_TRUE(model.GetSelectedText().empty());
-}
-
-TEST_F(TextfieldViewsModelTest, SelectionTest) {
- TextfieldViewsModel model(NULL);
- model.Append(ASCIIToUTF16("HELLO WORLD"));
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_LEFT, false);
- gfx::Range selection = model.render_text()->selection();
- EXPECT_EQ(gfx::Range(0), selection);
-
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, true);
- selection = model.render_text()->selection();
- EXPECT_EQ(gfx::Range(0, 5), selection);
-
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, true);
- selection = model.render_text()->selection();
- EXPECT_EQ(gfx::Range(0, 4), selection);
-
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, true);
- selection = model.render_text()->selection();
- EXPECT_EQ(gfx::Range(0), selection);
-
- // now from the end.
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false);
- selection = model.render_text()->selection();
- EXPECT_EQ(gfx::Range(11), selection);
-
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, true);
- selection = model.render_text()->selection();
- EXPECT_EQ(gfx::Range(11, 6), selection);
-
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true);
- selection = model.render_text()->selection();
- EXPECT_EQ(gfx::Range(11, 7), selection);
-
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, true);
- selection = model.render_text()->selection();
- EXPECT_EQ(gfx::Range(11), selection);
-
- // Select All
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_LEFT, true);
- selection = model.render_text()->selection();
- EXPECT_EQ(gfx::Range(11, 0), selection);
-}
-
-TEST_F(TextfieldViewsModelTest, SelectSelectionModelTest) {
- TextfieldViewsModel model(NULL);
- model.Append(ASCIIToUTF16("HELLO WORLD"));
- model.SelectSelectionModel(gfx::SelectionModel(gfx::Range(0, 6),
- gfx::CURSOR_BACKWARD));
- EXPECT_STR_EQ("HELLO ", model.GetSelectedText());
-
- model.SelectSelectionModel(gfx::SelectionModel(gfx::Range(6, 1),
- gfx::CURSOR_FORWARD));
- EXPECT_STR_EQ("ELLO ", model.GetSelectedText());
-
- model.SelectSelectionModel(gfx::SelectionModel(gfx::Range(2, 1000),
- gfx::CURSOR_BACKWARD));
- EXPECT_STR_EQ("LLO WORLD", model.GetSelectedText());
-
- model.SelectSelectionModel(gfx::SelectionModel(gfx::Range(1000, 3),
- gfx::CURSOR_FORWARD));
- EXPECT_STR_EQ("LO WORLD", model.GetSelectedText());
-
- model.SelectSelectionModel(gfx::SelectionModel(0, gfx::CURSOR_FORWARD));
- EXPECT_TRUE(model.GetSelectedText().empty());
-
- model.SelectSelectionModel(gfx::SelectionModel(3, gfx::CURSOR_FORWARD));
- EXPECT_TRUE(model.GetSelectedText().empty());
-
- model.SelectSelectionModel(gfx::SelectionModel(gfx::Range(1000, 100),
- gfx::CURSOR_FORWARD));
- EXPECT_TRUE(model.GetSelectedText().empty());
-
- model.SelectSelectionModel(gfx::SelectionModel(1000, gfx::CURSOR_BACKWARD));
- EXPECT_TRUE(model.GetSelectedText().empty());
-}
-
-TEST_F(TextfieldViewsModelTest, CompositionTextTest) {
- TextfieldViewsModel model(this);
- model.Append(ASCIIToUTF16("1234590"));
- model.SelectRange(gfx::Range(5, 5));
- EXPECT_FALSE(model.HasSelection());
- EXPECT_EQ(5U, model.GetCursorPosition());
-
- gfx::Range range;
- model.GetTextRange(&range);
- EXPECT_EQ(gfx::Range(0, 7), range);
-
- ui::CompositionText composition;
- composition.text = ASCIIToUTF16("678");
- composition.underlines.push_back(ui::CompositionUnderline(0, 3, 0, false));
-
- // Cursor should be at the end of composition when characters are just typed.
- composition.selection = gfx::Range(3, 3);
- model.SetCompositionText(composition);
- EXPECT_TRUE(model.HasCompositionText());
- EXPECT_FALSE(model.HasSelection());
-
- // Cancel composition
- model.CancelCompositionText();
- composition_text_confirmed_or_cleared_ = false;
-
- // Restart composition with targeting "67" in "678".
- composition.selection = gfx::Range(0, 2);
- composition.underlines.clear();
- composition.underlines.push_back(ui::CompositionUnderline(0, 2, 0, true));
- composition.underlines.push_back(ui::CompositionUnderline(2, 3, 0, false));
- model.SetCompositionText(composition);
- EXPECT_TRUE(model.HasCompositionText());
- EXPECT_TRUE(model.HasSelection());
- EXPECT_EQ(gfx::Range(5, 7), model.render_text()->selection());
-
- model.GetTextRange(&range);
- EXPECT_EQ(10U, range.end());
- EXPECT_STR_EQ("1234567890", model.GetText());
-
- model.GetCompositionTextRange(&range);
- EXPECT_EQ(gfx::Range(5, 8), range);
- // composition text
- EXPECT_STR_EQ("456", model.GetTextFromRange(gfx::Range(3, 6)));
- EXPECT_EQ(gfx::Range(5, 7), model.render_text()->selection());
-
- EXPECT_FALSE(composition_text_confirmed_or_cleared_);
- model.CancelCompositionText();
- EXPECT_TRUE(composition_text_confirmed_or_cleared_);
- composition_text_confirmed_or_cleared_ = false;
- EXPECT_FALSE(model.HasCompositionText());
- EXPECT_FALSE(model.HasSelection());
- EXPECT_EQ(5U, model.GetCursorPosition());
-
- model.SetCompositionText(composition);
- EXPECT_STR_EQ("1234567890", model.GetText());
- EXPECT_TRUE(model.SetText(ASCIIToUTF16("1234567890")));
- EXPECT_TRUE(composition_text_confirmed_or_cleared_);
- composition_text_confirmed_or_cleared_ = false;
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false);
-
- model.SetCompositionText(composition);
- EXPECT_STR_EQ("1234567890678", model.GetText());
-
- model.InsertText(UTF8ToUTF16("-"));
- EXPECT_TRUE(composition_text_confirmed_or_cleared_);
- composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("1234567890-", model.GetText());
- EXPECT_FALSE(model.HasCompositionText());
- EXPECT_FALSE(model.HasSelection());
-
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, true);
- EXPECT_STR_EQ("-", model.GetSelectedText());
- model.SetCompositionText(composition);
- EXPECT_STR_EQ("1234567890678", model.GetText());
-
- model.ReplaceText(UTF8ToUTF16("-"));
- EXPECT_TRUE(composition_text_confirmed_or_cleared_);
- composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("1234567890-", model.GetText());
- EXPECT_FALSE(model.HasCompositionText());
- EXPECT_FALSE(model.HasSelection());
-
- model.SetCompositionText(composition);
- model.Append(UTF8ToUTF16("-"));
- EXPECT_TRUE(composition_text_confirmed_or_cleared_);
- composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("1234567890-678-", model.GetText());
-
- model.SetCompositionText(composition);
- model.Delete();
- EXPECT_TRUE(composition_text_confirmed_or_cleared_);
- composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("1234567890-678-", model.GetText());
-
- model.SetCompositionText(composition);
- model.Backspace();
- EXPECT_TRUE(composition_text_confirmed_or_cleared_);
- composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("1234567890-678-", model.GetText());
-
- model.SetText(string16());
- model.SetCompositionText(composition);
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, false);
- EXPECT_TRUE(composition_text_confirmed_or_cleared_);
- composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("678", model.GetText());
- EXPECT_EQ(2U, model.GetCursorPosition());
-
- model.SetCompositionText(composition);
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, false);
- EXPECT_TRUE(composition_text_confirmed_or_cleared_);
- composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("676788", model.GetText());
- EXPECT_EQ(6U, model.GetCursorPosition());
-
- model.SetCompositionText(composition);
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, false);
- EXPECT_TRUE(composition_text_confirmed_or_cleared_);
- composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("676788678", model.GetText());
-
- model.SetText(string16());
- model.SetCompositionText(composition);
- model.MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, false);
- EXPECT_TRUE(composition_text_confirmed_or_cleared_);
- composition_text_confirmed_or_cleared_ = false;
-
- model.SetCompositionText(composition);
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_LEFT, true);
- EXPECT_TRUE(composition_text_confirmed_or_cleared_);
- composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("678678", model.GetText());
-
- model.SetCompositionText(composition);
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false);
- EXPECT_TRUE(composition_text_confirmed_or_cleared_);
- composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("678", model.GetText());
-
- model.SetCompositionText(composition);
- gfx::SelectionModel sel(
- gfx::Range(model.render_text()->selection().start(), 0),
- gfx::CURSOR_FORWARD);
- model.MoveCursorTo(sel);
- EXPECT_TRUE(composition_text_confirmed_or_cleared_);
- composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("678678", model.GetText());
-
- model.SetCompositionText(composition);
- model.SelectRange(gfx::Range(0, 3));
- EXPECT_TRUE(composition_text_confirmed_or_cleared_);
- composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("678", model.GetText());
-
- model.SetCompositionText(composition);
- model.SelectAll(false);
- EXPECT_TRUE(composition_text_confirmed_or_cleared_);
- composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("678", model.GetText());
-
- model.SetCompositionText(composition);
- model.SelectWord();
- EXPECT_TRUE(composition_text_confirmed_or_cleared_);
- composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("678", model.GetText());
-
- model.SetCompositionText(composition);
- model.ClearSelection();
- EXPECT_TRUE(composition_text_confirmed_or_cleared_);
- composition_text_confirmed_or_cleared_ = false;
-
- model.SetCompositionText(composition);
- EXPECT_FALSE(model.Cut());
- EXPECT_FALSE(composition_text_confirmed_or_cleared_);
-}
-
-TEST_F(TextfieldViewsModelTest, UndoRedo_BasicTest) {
- TextfieldViewsModel model(NULL);
- model.InsertChar('a');
- EXPECT_FALSE(model.Redo()); // nothing to redo
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("a", model.GetText());
-
- // Continuous inserts are treated as one edit.
- model.InsertChar('b');
- model.InsertChar('c');
- EXPECT_STR_EQ("abc", model.GetText());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("a", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition());
-
- // Undoing further shouldn't change the text.
- EXPECT_FALSE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_FALSE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition());
-
- // Redoing to the latest text.
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("a", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("abc", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
-
- // Backspace ===============================
- EXPECT_TRUE(model.Backspace());
- EXPECT_STR_EQ("ab", model.GetText());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("abc", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ab", model.GetText());
- EXPECT_EQ(2U, model.GetCursorPosition());
- // Continous backspaces are treated as one edit.
- EXPECT_TRUE(model.Backspace());
- EXPECT_TRUE(model.Backspace());
- EXPECT_STR_EQ("", model.GetText());
- // Extra backspace shouldn't affect the history.
- EXPECT_FALSE(model.Backspace());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ab", model.GetText());
- EXPECT_EQ(2U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("abc", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("a", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
-
- // Clear history
- model.ClearEditHistory();
- EXPECT_FALSE(model.Undo());
- EXPECT_FALSE(model.Redo());
- EXPECT_STR_EQ("a", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
-
- // Delete ===============================
- model.SetText(ASCIIToUTF16("ABCDE"));
- model.ClearEditHistory();
- MoveCursorTo(model, 2);
- EXPECT_TRUE(model.Delete());
- EXPECT_STR_EQ("ABDE", model.GetText());
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_LEFT, false);
- EXPECT_TRUE(model.Delete());
- EXPECT_STR_EQ("BDE", model.GetText());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABDE", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
- EXPECT_EQ(2U, model.GetCursorPosition());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ABDE", model.GetText());
- EXPECT_EQ(2U, model.GetCursorPosition());
- // Continous deletes are treated as one edit.
- EXPECT_TRUE(model.Delete());
- EXPECT_TRUE(model.Delete());
- EXPECT_STR_EQ("AB", model.GetText());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABDE", model.GetText());
- EXPECT_EQ(2U, model.GetCursorPosition());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("AB", model.GetText());
- EXPECT_EQ(2U, model.GetCursorPosition());
-}
-
-TEST_F(TextfieldViewsModelTest, UndoRedo_SetText) {
- // This is to test the undo/redo behavior of omnibox.
- TextfieldViewsModel model(NULL);
- model.InsertChar('w');
- EXPECT_STR_EQ("w", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
- model.SetText(ASCIIToUTF16("www.google.com"));
- EXPECT_EQ(14U, model.GetCursorPosition());
- EXPECT_STR_EQ("www.google.com", model.GetText());
- model.SelectRange(gfx::Range(14, 1));
- model.InsertChar('w');
- EXPECT_STR_EQ("ww", model.GetText());
- model.SetText(ASCIIToUTF16("www.google.com"));
- model.SelectRange(gfx::Range(14, 2));
- model.InsertChar('w');
- EXPECT_STR_EQ("www", model.GetText());
- model.SetText(ASCIIToUTF16("www.google.com"));
- model.SelectRange(gfx::Range(14, 3));
- model.InsertChar('.');
- EXPECT_STR_EQ("www.", model.GetText());
- model.SetText(ASCIIToUTF16("www.google.com"));
- model.SelectRange(gfx::Range(14, 4));
- model.InsertChar('y');
- EXPECT_STR_EQ("www.y", model.GetText());
- model.SetText(ASCIIToUTF16("www.youtube.com"));
- EXPECT_STR_EQ("www.youtube.com", model.GetText());
- EXPECT_EQ(15U, model.GetCursorPosition());
-
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("www.google.com", model.GetText());
- EXPECT_EQ(4U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("www.google.com", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("www.google.com", model.GetText());
- EXPECT_EQ(2U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("www.google.com", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition());
- EXPECT_FALSE(model.Undo());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("www.google.com", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("www.google.com", model.GetText());
- EXPECT_EQ(2U, model.GetCursorPosition());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("www.google.com", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("www.google.com", model.GetText());
- EXPECT_EQ(4U, model.GetCursorPosition());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("www.youtube.com", model.GetText());
- EXPECT_EQ(5U, model.GetCursorPosition());
- EXPECT_FALSE(model.Redo());
-}
-
-TEST_F(TextfieldViewsModelTest, UndoRedo_BackspaceThenSetText) {
- // This is to test the undo/redo behavior of omnibox.
- TextfieldViewsModel model(NULL);
- model.InsertChar('w');
- EXPECT_STR_EQ("w", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
- model.SetText(ASCIIToUTF16("www.google.com"));
- EXPECT_EQ(14U, model.GetCursorPosition());
- EXPECT_STR_EQ("www.google.com", model.GetText());
- model.SetText(ASCIIToUTF16("www.google.com")); // Confirm the text.
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false);
- EXPECT_EQ(14U, model.GetCursorPosition());
- EXPECT_TRUE(model.Backspace());
- EXPECT_TRUE(model.Backspace());
- EXPECT_STR_EQ("www.google.c", model.GetText());
- // Autocomplete sets the text
- model.SetText(ASCIIToUTF16("www.google.com/search=www.google.c"));
- EXPECT_STR_EQ("www.google.com/search=www.google.c", model.GetText());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("www.google.c", model.GetText());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("www.google.com", model.GetText());
-}
-
-TEST_F(TextfieldViewsModelTest, UndoRedo_CutCopyPasteTest) {
- TextfieldViewsModel model(NULL);
- model.SetText(ASCIIToUTF16("ABCDE"));
- EXPECT_FALSE(model.Redo()); // nothing to redo
- // Cut
- model.SelectRange(gfx::Range(1, 3));
- model.Cut();
- EXPECT_STR_EQ("ADE", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition());
- EXPECT_FALSE(model.Undo()); // no more undo
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
- EXPECT_EQ(5U, model.GetCursorPosition());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ADE", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
- EXPECT_FALSE(model.Redo()); // no more redo
- EXPECT_STR_EQ("ADE", model.GetText());
-
- model.Paste();
- model.Paste();
- model.Paste();
- EXPECT_STR_EQ("ABCBCBCDE", model.GetText());
- EXPECT_EQ(7U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCBCDE", model.GetText());
- EXPECT_EQ(5U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ADE", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition());
- EXPECT_FALSE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ABCDE", model.GetText()); // Redoing SetText
- EXPECT_EQ(5U, model.GetCursorPosition());
-
- // Redo
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ADE", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ABCBCDE", model.GetText());
- EXPECT_EQ(5U, model.GetCursorPosition());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ABCBCBCDE", model.GetText());
- EXPECT_EQ(7U, model.GetCursorPosition());
- EXPECT_FALSE(model.Redo());
-
- // with SelectRange
- model.SelectRange(gfx::Range(1, 3));
- EXPECT_TRUE(model.Cut());
- EXPECT_STR_EQ("ABCBCDE", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
- model.SelectRange(gfx::Range(1, 1));
- EXPECT_FALSE(model.Cut());
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false);
- EXPECT_TRUE(model.Paste());
- EXPECT_STR_EQ("ABCBCDEBC", model.GetText());
- EXPECT_EQ(9U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCBCDE", model.GetText());
- EXPECT_EQ(7U, model.GetCursorPosition());
- // empty cut shouldn't create an edit.
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCBCBCDE", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
-
- // Copy
- ResetModel(&model);
- model.SetText(ASCIIToUTF16("12345"));
- EXPECT_STR_EQ("12345", model.GetText());
- EXPECT_EQ(5U, model.GetCursorPosition());
- model.SelectRange(gfx::Range(1, 3));
- model.Copy(); // Copy "23"
- EXPECT_STR_EQ("12345", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
- model.Paste(); // Paste "23" into "23".
- EXPECT_STR_EQ("12345", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
- model.Paste();
- EXPECT_STR_EQ("1232345", model.GetText());
- EXPECT_EQ(5U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("12345", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
- // TODO(oshima): We need to change the return type from bool to enum.
- EXPECT_FALSE(model.Undo()); // No text change.
- EXPECT_STR_EQ("12345", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_FALSE(model.Undo());
- // Redo
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("12345", model.GetText());
- EXPECT_EQ(5U, model.GetCursorPosition());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("12345", model.GetText()); // For 1st paste
- EXPECT_EQ(3U, model.GetCursorPosition());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("1232345", model.GetText());
- EXPECT_EQ(5U, model.GetCursorPosition());
- EXPECT_FALSE(model.Redo());
- EXPECT_STR_EQ("1232345", model.GetText());
-
- // Test using SelectRange
- model.SelectRange(gfx::Range(1, 3));
- model.Copy();
- EXPECT_STR_EQ("1232345", model.GetText());
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false);
- EXPECT_TRUE(model.Paste());
- EXPECT_STR_EQ("123234523", model.GetText());
- EXPECT_EQ(9U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("1232345", model.GetText());
- EXPECT_EQ(7U, model.GetCursorPosition());
-}
-
-TEST_F(TextfieldViewsModelTest, UndoRedo_CursorTest) {
- TextfieldViewsModel model(NULL);
- model.InsertChar('a');
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, false);
- model.MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, false);
- model.InsertChar('b');
- // Moving the cursor shouldn't create a new edit.
- EXPECT_STR_EQ("ab", model.GetText());
- EXPECT_FALSE(model.Redo());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_FALSE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ab", model.GetText());
- EXPECT_EQ(2U, model.GetCursorPosition());
- EXPECT_FALSE(model.Redo());
-}
-
-void RunInsertReplaceTest(TextfieldViewsModel& model) {
- const bool reverse = model.render_text()->selection().is_reversed();
- model.InsertChar('1');
- model.InsertChar('2');
- model.InsertChar('3');
- EXPECT_STR_EQ("a123d", model.GetText());
- EXPECT_EQ(4U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("abcd", model.GetText());
- EXPECT_EQ(reverse ? 1U : 3U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition());
- EXPECT_FALSE(model.Undo());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("abcd", model.GetText());
- EXPECT_EQ(4U, model.GetCursorPosition()); // By SetText
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("a123d", model.GetText());
- EXPECT_EQ(4U, model.GetCursorPosition());
- EXPECT_FALSE(model.Redo());
-}
-
-void RunOverwriteReplaceTest(TextfieldViewsModel& model) {
- const bool reverse = model.render_text()->selection().is_reversed();
- model.ReplaceChar('1');
- model.ReplaceChar('2');
- model.ReplaceChar('3');
- model.ReplaceChar('4');
- EXPECT_STR_EQ("a1234", model.GetText());
- EXPECT_EQ(5U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("abcd", model.GetText());
- EXPECT_EQ(reverse ? 1U : 3U, model.GetCursorPosition());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition());
- EXPECT_FALSE(model.Undo());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("abcd", model.GetText());
- EXPECT_EQ(4U, model.GetCursorPosition());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("a1234", model.GetText());
- EXPECT_EQ(5U, model.GetCursorPosition());
- EXPECT_FALSE(model.Redo());
-}
-
-TEST_F(TextfieldViewsModelTest, UndoRedo_ReplaceTest) {
- // By Cursor
- {
- SCOPED_TRACE("forward & insert by cursor");
- TextfieldViewsModel model(NULL);
- model.SetText(ASCIIToUTF16("abcd"));
- model.SelectRange(gfx::Range(1, 3));
- RunInsertReplaceTest(model);
- }
- {
- SCOPED_TRACE("backward & insert by cursor");
- TextfieldViewsModel model(NULL);
- model.SetText(ASCIIToUTF16("abcd"));
- model.SelectRange(gfx::Range(3, 1));
- RunInsertReplaceTest(model);
- }
- {
- SCOPED_TRACE("forward & overwrite by cursor");
- TextfieldViewsModel model(NULL);
- model.SetText(ASCIIToUTF16("abcd"));
- model.SelectRange(gfx::Range(1, 3));
- RunOverwriteReplaceTest(model);
- }
- {
- SCOPED_TRACE("backward & overwrite by cursor");
- TextfieldViewsModel model(NULL);
- model.SetText(ASCIIToUTF16("abcd"));
- model.SelectRange(gfx::Range(3, 1));
- RunOverwriteReplaceTest(model);
- }
- // By SelectRange API
- {
- SCOPED_TRACE("forward & insert by SelectRange");
- TextfieldViewsModel model(NULL);
- model.SetText(ASCIIToUTF16("abcd"));
- model.SelectRange(gfx::Range(1, 3));
- RunInsertReplaceTest(model);
- }
- {
- SCOPED_TRACE("backward & insert by SelectRange");
- TextfieldViewsModel model(NULL);
- model.SetText(ASCIIToUTF16("abcd"));
- model.SelectRange(gfx::Range(3, 1));
- RunInsertReplaceTest(model);
- }
- {
- SCOPED_TRACE("forward & overwrite by SelectRange");
- TextfieldViewsModel model(NULL);
- model.SetText(ASCIIToUTF16("abcd"));
- model.SelectRange(gfx::Range(1, 3));
- RunOverwriteReplaceTest(model);
- }
- {
- SCOPED_TRACE("backward & overwrite by SelectRange");
- TextfieldViewsModel model(NULL);
- model.SetText(ASCIIToUTF16("abcd"));
- model.SelectRange(gfx::Range(3, 1));
- RunOverwriteReplaceTest(model);
- }
-}
-
-TEST_F(TextfieldViewsModelTest, UndoRedo_CompositionText) {
- TextfieldViewsModel model(NULL);
-
- ui::CompositionText composition;
- composition.text = ASCIIToUTF16("abc");
- composition.underlines.push_back(ui::CompositionUnderline(0, 3, 0, false));
- composition.selection = gfx::Range(2, 3);
-
- model.SetText(ASCIIToUTF16("ABCDE"));
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false);
- model.InsertChar('x');
- EXPECT_STR_EQ("ABCDEx", model.GetText());
- EXPECT_TRUE(model.Undo()); // set composition should forget undone edit.
- model.SetCompositionText(composition);
- EXPECT_TRUE(model.HasCompositionText());
- EXPECT_TRUE(model.HasSelection());
- EXPECT_STR_EQ("ABCDEabc", model.GetText());
-
- // Accepting composition
- model.ConfirmCompositionText();
- EXPECT_STR_EQ("ABCDEabc", model.GetText());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ABCDEabc", model.GetText());
- EXPECT_FALSE(model.Redo());
-
- // Canceling composition
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_LEFT, false);
- model.SetCompositionText(composition);
- EXPECT_STR_EQ("abcABCDEabc", model.GetText());
- model.CancelCompositionText();
- EXPECT_STR_EQ("ABCDEabc", model.GetText());
- EXPECT_FALSE(model.Redo());
- EXPECT_STR_EQ("ABCDEabc", model.GetText());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ABCDEabc", model.GetText());
- EXPECT_FALSE(model.Redo());
-
- // SetText with the same text as the result.
- ResetModel(&model);
- model.SetText(ASCIIToUTF16("ABCDE"));
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false);
- model.SetCompositionText(composition);
- EXPECT_STR_EQ("ABCDEabc", model.GetText());
- model.SetText(ASCIIToUTF16("ABCDEabc"));
- EXPECT_STR_EQ("ABCDEabc", model.GetText());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ABCDEabc", model.GetText());
- EXPECT_FALSE(model.Redo());
-
- // SetText with the different text than the result should not
- // remember composition text.
- ResetModel(&model);
- model.SetText(ASCIIToUTF16("ABCDE"));
- model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, false);
- model.SetCompositionText(composition);
- EXPECT_STR_EQ("ABCDEabc", model.GetText());
- model.SetText(ASCIIToUTF16("1234"));
- EXPECT_STR_EQ("1234", model.GetText());
- EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
- EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("1234", model.GetText());
- EXPECT_FALSE(model.Redo());
-
- // TODO(oshima): We need MockInputMethod to test the behavior with IME.
-}
-
-} // namespace views