summaryrefslogtreecommitdiffstats
path: root/views/controls/textfield/textfield_views_model_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'views/controls/textfield/textfield_views_model_unittest.cc')
-rw-r--r--views/controls/textfield/textfield_views_model_unittest.cc922
1 files changed, 586 insertions, 336 deletions
diff --git a/views/controls/textfield/textfield_views_model_unittest.cc b/views/controls/textfield/textfield_views_model_unittest.cc
index 907e353..7e2f7e6 100644
--- a/views/controls/textfield/textfield_views_model_unittest.cc
+++ b/views/controls/textfield/textfield_views_model_unittest.cc
@@ -10,7 +10,7 @@
#include "ui/base/clipboard/clipboard.h"
#include "ui/base/clipboard/scoped_clipboard_writer.h"
#include "ui/base/range/range.h"
-#include "ui/gfx/render_text.h"
+#include "views/controls/textfield/text_style.h"
#include "views/controls/textfield/textfield.h"
#include "views/controls/textfield/textfield_views_model.h"
#include "views/test/test_views_delegate.h"
@@ -19,6 +19,8 @@
namespace views {
+#include "views/test/views_test_base.h"
+
class TextfieldViewsModelTest : public ViewsTestBase,
public TextfieldViewsModel::Delegate {
public:
@@ -45,56 +47,57 @@ class TextfieldViewsModelTest : public ViewsTestBase,
#define EXPECT_STR_EQ(ascii, utf16) \
EXPECT_EQ(ASCIIToWide(ascii), UTF16ToWide(utf16))
+
TEST_F(TextfieldViewsModelTest, EditString) {
TextfieldViewsModel model(NULL);
// append two strings
model.Append(ASCIIToUTF16("HILL"));
- EXPECT_STR_EQ("HILL", model.GetText());
+ EXPECT_STR_EQ("HILL", model.text());
model.Append(ASCIIToUTF16("WORLD"));
- EXPECT_STR_EQ("HILLWORLD", model.GetText());
+ EXPECT_STR_EQ("HILLWORLD", model.text());
// Insert "E" to make hello
- model.MoveCursorRight(gfx::CHARACTER_BREAK, false);
+ model.MoveCursorRight(false);
model.InsertChar('E');
- EXPECT_STR_EQ("HEILLWORLD", model.GetText());
+ EXPECT_STR_EQ("HEILLWORLD", model.text());
// Replace "I" with "L"
model.ReplaceChar('L');
- EXPECT_STR_EQ("HELLLWORLD", model.GetText());
+ EXPECT_STR_EQ("HELLLWORLD", model.text());
model.ReplaceChar('L');
model.ReplaceChar('O');
- EXPECT_STR_EQ("HELLOWORLD", model.GetText());
+ EXPECT_STR_EQ("HELLOWORLD", model.text());
// Delete 6th char "W", then delete 5th char O"
- EXPECT_EQ(5U, model.GetCursorPosition());
+ EXPECT_EQ(5U, model.cursor_pos());
EXPECT_TRUE(model.Delete());
- EXPECT_STR_EQ("HELLOORLD", model.GetText());
+ EXPECT_STR_EQ("HELLOORLD", model.text());
EXPECT_TRUE(model.Backspace());
- EXPECT_EQ(4U, model.GetCursorPosition());
- EXPECT_STR_EQ("HELLORLD", model.GetText());
+ EXPECT_EQ(4U, model.cursor_pos());
+ EXPECT_STR_EQ("HELLORLD", model.text());
// Move the cursor to start. backspace should fail.
- model.MoveCursorLeft(gfx::LINE_BREAK, false);
+ model.MoveCursorToHome(false);
EXPECT_FALSE(model.Backspace());
- EXPECT_STR_EQ("HELLORLD", model.GetText());
+ EXPECT_STR_EQ("HELLORLD", model.text());
// Move the cursor to the end. delete should fail.
- model.MoveCursorRight(gfx::LINE_BREAK, false);
+ model.MoveCursorToEnd(false);
EXPECT_FALSE(model.Delete());
- EXPECT_STR_EQ("HELLORLD", model.GetText());
+ EXPECT_STR_EQ("HELLORLD", model.text());
// but backspace should work.
EXPECT_TRUE(model.Backspace());
- EXPECT_STR_EQ("HELLORL", model.GetText());
+ EXPECT_STR_EQ("HELLORL", model.text());
}
TEST_F(TextfieldViewsModelTest, EmptyString) {
TextfieldViewsModel model(NULL);
- EXPECT_EQ(string16(), model.GetText());
+ EXPECT_EQ(string16(), model.text());
EXPECT_EQ(string16(), model.GetSelectedText());
EXPECT_EQ(string16(), model.GetVisibleText());
- model.MoveCursorLeft(gfx::CHARACTER_BREAK, true);
- EXPECT_EQ(0U, model.GetCursorPosition());
- model.MoveCursorRight(gfx::CHARACTER_BREAK, true);
- EXPECT_EQ(0U, model.GetCursorPosition());
+ model.MoveCursorLeft(true);
+ EXPECT_EQ(0U, model.cursor_pos());
+ model.MoveCursorRight(true);
+ EXPECT_EQ(0U, model.cursor_pos());
EXPECT_EQ(string16(), model.GetSelectedText());
@@ -105,15 +108,15 @@ TEST_F(TextfieldViewsModelTest, EmptyString) {
TEST_F(TextfieldViewsModelTest, Selection) {
TextfieldViewsModel model(NULL);
model.Append(ASCIIToUTF16("HELLO"));
- model.MoveCursorRight(gfx::CHARACTER_BREAK, false);
- model.MoveCursorRight(gfx::CHARACTER_BREAK, true);
+ model.MoveCursorRight(false);
+ model.MoveCursorRight(true);
EXPECT_STR_EQ("E", model.GetSelectedText());
- model.MoveCursorRight(gfx::CHARACTER_BREAK, true);
+ model.MoveCursorRight(true);
EXPECT_STR_EQ("EL", model.GetSelectedText());
- model.MoveCursorLeft(gfx::LINE_BREAK, true);
+ model.MoveCursorToHome(true);
EXPECT_STR_EQ("H", model.GetSelectedText());
- model.MoveCursorRight(gfx::LINE_BREAK, true);
+ model.MoveCursorToEnd(true);
EXPECT_STR_EQ("ELLO", model.GetSelectedText());
model.ClearSelection();
EXPECT_EQ(string16(), model.GetSelectedText());
@@ -129,49 +132,49 @@ TEST_F(TextfieldViewsModelTest, Selection) {
model.MoveCursorTo(1U, false);
model.MoveCursorTo(3U, true);
EXPECT_STR_EQ("EL", model.GetSelectedText());
- model.MoveCursorLeft(gfx::CHARACTER_BREAK, false);
- EXPECT_EQ(1U, model.GetCursorPosition());
+ model.MoveCursorLeft(false);
+ EXPECT_EQ(1U, model.cursor_pos());
model.MoveCursorTo(1U, false);
model.MoveCursorTo(3U, true);
- model.MoveCursorRight(gfx::CHARACTER_BREAK, false);
- EXPECT_EQ(3U, model.GetCursorPosition());
+ model.MoveCursorRight(false);
+ EXPECT_EQ(3U, model.cursor_pos());
// Select all and move cursor
model.SelectAll();
- model.MoveCursorLeft(gfx::CHARACTER_BREAK, false);
- EXPECT_EQ(0U, model.GetCursorPosition());
+ model.MoveCursorLeft(false);
+ EXPECT_EQ(0U, model.cursor_pos());
model.SelectAll();
- model.MoveCursorRight(gfx::CHARACTER_BREAK, false);
- EXPECT_EQ(5U, model.GetCursorPosition());
+ model.MoveCursorRight(false);
+ EXPECT_EQ(5U, model.cursor_pos());
}
TEST_F(TextfieldViewsModelTest, SelectionAndEdit) {
TextfieldViewsModel model(NULL);
model.Append(ASCIIToUTF16("HELLO"));
- model.MoveCursorRight(gfx::CHARACTER_BREAK, false);
- model.MoveCursorRight(gfx::CHARACTER_BREAK, true);
- model.MoveCursorRight(gfx::CHARACTER_BREAK, true); // select "EL"
+ model.MoveCursorRight(false);
+ model.MoveCursorRight(true);
+ model.MoveCursorRight(true); // select "EL"
EXPECT_TRUE(model.Backspace());
- EXPECT_STR_EQ("HLO", model.GetText());
+ EXPECT_STR_EQ("HLO", model.text());
model.Append(ASCIIToUTF16("ILL"));
- model.MoveCursorRight(gfx::CHARACTER_BREAK, true);
- model.MoveCursorRight(gfx::CHARACTER_BREAK, true); // select "LO"
+ model.MoveCursorRight(true);
+ model.MoveCursorRight(true); // select "LO"
EXPECT_TRUE(model.Delete());
- EXPECT_STR_EQ("HILL", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
- model.MoveCursorRight(gfx::CHARACTER_BREAK, true); // select "I"
+ EXPECT_STR_EQ("HILL", model.text());
+ EXPECT_EQ(1U, model.cursor_pos());
+ model.MoveCursorRight(true); // select "I"
model.InsertChar('E');
- EXPECT_STR_EQ("HELL", model.GetText());
- model.MoveCursorLeft(gfx::LINE_BREAK, false);
- model.MoveCursorRight(gfx::CHARACTER_BREAK, true); // select "H"
+ EXPECT_STR_EQ("HELL", model.text());
+ model.MoveCursorToHome(false);
+ model.MoveCursorRight(true); // select "H"
model.ReplaceChar('B');
- EXPECT_STR_EQ("BELL", model.GetText());
- model.MoveCursorRight(gfx::LINE_BREAK, false);
- model.MoveCursorLeft(gfx::CHARACTER_BREAK, true);
- model.MoveCursorLeft(gfx::CHARACTER_BREAK, true); // select "ELL"
+ EXPECT_STR_EQ("BELL", model.text());
+ model.MoveCursorToEnd(false);
+ model.MoveCursorLeft(true);
+ model.MoveCursorLeft(true); // select ">LL"
model.ReplaceChar('E');
- EXPECT_STR_EQ("BEE", model.GetText());
+ EXPECT_STR_EQ("BEE", model.text());
}
TEST_F(TextfieldViewsModelTest, Password) {
@@ -179,88 +182,110 @@ TEST_F(TextfieldViewsModelTest, Password) {
model.set_is_password(true);
model.Append(ASCIIToUTF16("HELLO"));
EXPECT_STR_EQ("*****", model.GetVisibleText());
- EXPECT_STR_EQ("HELLO", model.GetText());
+ EXPECT_STR_EQ("HELLO", model.text());
EXPECT_TRUE(model.Delete());
EXPECT_STR_EQ("****", model.GetVisibleText());
- EXPECT_STR_EQ("ELLO", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ELLO", model.text());
+ EXPECT_EQ(0U, model.cursor_pos());
model.SelectAll();
EXPECT_STR_EQ("ELLO", model.GetSelectedText());
- EXPECT_EQ(4U, model.GetCursorPosition());
+ EXPECT_EQ(4U, model.cursor_pos());
model.InsertChar('X');
EXPECT_STR_EQ("*", model.GetVisibleText());
- EXPECT_STR_EQ("X", model.GetText());
+ EXPECT_STR_EQ("X", model.text());
}
TEST_F(TextfieldViewsModelTest, Word) {
TextfieldViewsModel model(NULL);
model.Append(
ASCIIToUTF16("The answer to Life, the Universe, and Everything"));
- model.MoveCursorRight(gfx::WORD_BREAK, false);
- EXPECT_EQ(3U, model.GetCursorPosition());
- model.MoveCursorRight(gfx::WORD_BREAK, false);
- EXPECT_EQ(10U, model.GetCursorPosition());
- model.MoveCursorRight(gfx::WORD_BREAK, false);
- model.MoveCursorRight(gfx::WORD_BREAK, false);
- EXPECT_EQ(18U, model.GetCursorPosition());
+ model.MoveCursorToNextWord(false);
+ EXPECT_EQ(3U, model.cursor_pos());
+ model.MoveCursorToNextWord(false);
+ EXPECT_EQ(10U, model.cursor_pos());
+ model.MoveCursorToNextWord(false);
+ model.MoveCursorToNextWord(false);
+ EXPECT_EQ(18U, model.cursor_pos());
// Should passes the non word char ','
- model.MoveCursorRight(gfx::WORD_BREAK, true);
- EXPECT_EQ(23U, model.GetCursorPosition());
+ model.MoveCursorToNextWord(true);
+ EXPECT_EQ(23U, model.cursor_pos());
EXPECT_STR_EQ(", the", model.GetSelectedText());
// Move to the end.
- model.MoveCursorRight(gfx::WORD_BREAK, true);
- model.MoveCursorRight(gfx::WORD_BREAK, true);
- model.MoveCursorRight(gfx::WORD_BREAK, true);
+ model.MoveCursorToNextWord(true);
+ model.MoveCursorToNextWord(true);
+ model.MoveCursorToNextWord(true);
EXPECT_STR_EQ(", the Universe, and Everything", model.GetSelectedText());
// Should be safe to go next word at the end.
- model.MoveCursorRight(gfx::WORD_BREAK, true);
+ model.MoveCursorToNextWord(true);
EXPECT_STR_EQ(", the Universe, and Everything", model.GetSelectedText());
model.InsertChar('2');
- EXPECT_EQ(19U, model.GetCursorPosition());
+ EXPECT_EQ(19U, model.cursor_pos());
// Now backwards.
- model.MoveCursorLeft(gfx::CHARACTER_BREAK, false); // leave 2.
- model.MoveCursorLeft(gfx::WORD_BREAK, true);
- EXPECT_EQ(14U, model.GetCursorPosition());
+ model.MoveCursorLeft(false); // leave 2.
+ model.MoveCursorToPreviousWord(true);
+ EXPECT_EQ(14U, model.cursor_pos());
EXPECT_STR_EQ("Life", model.GetSelectedText());
- model.MoveCursorLeft(gfx::WORD_BREAK, true);
+ model.MoveCursorToPreviousWord(true);
EXPECT_STR_EQ("to Life", model.GetSelectedText());
- model.MoveCursorLeft(gfx::WORD_BREAK, true);
- model.MoveCursorLeft(gfx::WORD_BREAK, true);
- model.MoveCursorLeft(gfx::WORD_BREAK, true); // Select to the begining.
+ model.MoveCursorToPreviousWord(true);
+ model.MoveCursorToPreviousWord(true);
+ model.MoveCursorToPreviousWord(true); // Select to the begining.
EXPECT_STR_EQ("The answer to Life", model.GetSelectedText());
// Should be safe to go pervious word at the begining.
- model.MoveCursorLeft(gfx::WORD_BREAK, true);
+ model.MoveCursorToPreviousWord(true);
EXPECT_STR_EQ("The answer to Life", model.GetSelectedText());
model.ReplaceChar('4');
EXPECT_EQ(string16(), model.GetSelectedText());
EXPECT_STR_EQ("42", model.GetVisibleText());
}
+TEST_F(TextfieldViewsModelTest, TextFragment) {
+ TextfieldViewsModel model(NULL);
+ TextfieldViewsModel::TextFragments fragments;
+ // Empty string has no fragment.
+ model.GetFragments(&fragments);
+ EXPECT_EQ(0U, fragments.size());
+
+ // Some string
+ model.Append(ASCIIToUTF16("Hello world"));
+ model.GetFragments(&fragments);
+ EXPECT_EQ(1U, fragments.size());
+ EXPECT_EQ(0U, fragments[0].range.start());
+ EXPECT_EQ(11U, fragments[0].range.end());
+
+ // Selection won't change fragment.
+ model.MoveCursorToNextWord(true);
+ model.GetFragments(&fragments);
+ EXPECT_EQ(1U, fragments.size());
+ EXPECT_EQ(0U, fragments[0].range.start());
+ EXPECT_EQ(11U, fragments[0].range.end());
+}
+
TEST_F(TextfieldViewsModelTest, SetText) {
TextfieldViewsModel model(NULL);
model.Append(ASCIIToUTF16("HELLO"));
- model.MoveCursorRight(gfx::LINE_BREAK, false);
+ model.MoveCursorToEnd(false);
model.SetText(ASCIIToUTF16("GOODBYE"));
- EXPECT_STR_EQ("GOODBYE", model.GetText());
+ EXPECT_STR_EQ("GOODBYE", model.text());
// SetText won't reset the cursor posistion.
- EXPECT_EQ(5U, model.GetCursorPosition());
+ EXPECT_EQ(5U, model.cursor_pos());
model.SelectAll();
EXPECT_STR_EQ("GOODBYE", model.GetSelectedText());
- model.MoveCursorRight(gfx::LINE_BREAK, false);
- EXPECT_EQ(7U, model.GetCursorPosition());
+ model.MoveCursorToEnd(false);
+ EXPECT_EQ(7U, model.cursor_pos());
model.SetText(ASCIIToUTF16("BYE"));
// Setting shorter string moves the cursor to the end of the new string.
- EXPECT_EQ(3U, model.GetCursorPosition());
+ EXPECT_EQ(3U, model.cursor_pos());
EXPECT_EQ(string16(), model.GetSelectedText());
model.SetText(ASCIIToUTF16(""));
- EXPECT_EQ(0U, model.GetCursorPosition());
+ EXPECT_EQ(0U, model.cursor_pos());
}
TEST_F(TextfieldViewsModelTest, Clipboard) {
@@ -271,29 +296,29 @@ TEST_F(TextfieldViewsModelTest, Clipboard) {
string16 clipboard_text;
TextfieldViewsModel model(NULL);
model.Append(ASCIIToUTF16("HELLO WORLD"));
- model.MoveCursorRight(gfx::LINE_BREAK, false);
+ model.MoveCursorToEnd(false);
// Test for cut: Empty selection.
EXPECT_FALSE(model.Cut());
clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &clipboard_text);
EXPECT_STR_EQ(UTF16ToUTF8(initial_clipboard_text), clipboard_text);
- EXPECT_STR_EQ("HELLO WORLD", model.GetText());
- EXPECT_EQ(11U, model.GetCursorPosition());
+ EXPECT_STR_EQ("HELLO WORLD", model.text());
+ EXPECT_EQ(11U, model.cursor_pos());
// Test for cut: Non-empty selection.
- model.MoveCursorLeft(gfx::WORD_BREAK, true);
+ model.MoveCursorToPreviousWord(true);
EXPECT_TRUE(model.Cut());
clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &clipboard_text);
EXPECT_STR_EQ("WORLD", clipboard_text);
- EXPECT_STR_EQ("HELLO ", model.GetText());
- EXPECT_EQ(6U, model.GetCursorPosition());
+ EXPECT_STR_EQ("HELLO ", model.text());
+ EXPECT_EQ(6U, model.cursor_pos());
// Test for copy: Empty selection.
model.Copy();
clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &clipboard_text);
EXPECT_STR_EQ("WORLD", clipboard_text);
- EXPECT_STR_EQ("HELLO ", model.GetText());
- EXPECT_EQ(6U, model.GetCursorPosition());
+ EXPECT_STR_EQ("HELLO ", model.text());
+ EXPECT_EQ(6U, model.cursor_pos());
// Test for copy: Non-empty selection.
model.Append(ASCIIToUTF16("HELLO WORLD"));
@@ -301,24 +326,24 @@ TEST_F(TextfieldViewsModelTest, Clipboard) {
model.Copy();
clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &clipboard_text);
EXPECT_STR_EQ("HELLO HELLO WORLD", clipboard_text);
- EXPECT_STR_EQ("HELLO HELLO WORLD", model.GetText());
- EXPECT_EQ(17U, model.GetCursorPosition());
+ EXPECT_STR_EQ("HELLO HELLO WORLD", model.text());
+ EXPECT_EQ(17U, model.cursor_pos());
// Test for paste.
model.ClearSelection();
- model.MoveCursorRight(gfx::LINE_BREAK, false);
- model.MoveCursorLeft(gfx::WORD_BREAK, true);
+ model.MoveCursorToEnd(false);
+ model.MoveCursorToPreviousWord(true);
EXPECT_TRUE(model.Paste());
clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &clipboard_text);
EXPECT_STR_EQ("HELLO HELLO WORLD", clipboard_text);
- EXPECT_STR_EQ("HELLO HELLO HELLO HELLO WORLD", model.GetText());
- EXPECT_EQ(29U, model.GetCursorPosition());
+ EXPECT_STR_EQ("HELLO HELLO HELLO HELLO WORLD", model.text());
+ EXPECT_EQ(29U, model.cursor_pos());
}
void SelectWordTestVerifier(TextfieldViewsModel &model,
const std::string &expected_selected_string, size_t expected_cursor_pos) {
EXPECT_STR_EQ(expected_selected_string, model.GetSelectedText());
- EXPECT_EQ(expected_cursor_pos, model.GetCursorPosition());
+ EXPECT_EQ(expected_cursor_pos, model.cursor_pos());
}
TEST_F(TextfieldViewsModelTest, SelectWordTest) {
@@ -326,7 +351,7 @@ TEST_F(TextfieldViewsModelTest, SelectWordTest) {
model.Append(ASCIIToUTF16(" HELLO !! WO RLD "));
// Test when cursor is at the beginning.
- model.MoveCursorLeft(gfx::LINE_BREAK, false);
+ model.MoveCursorToHome(false);
model.SelectWord();
SelectWordTestVerifier(model, " ", 2U);
@@ -353,7 +378,7 @@ TEST_F(TextfieldViewsModelTest, SelectWordTest) {
SelectWordTestVerifier(model, " ", 20U);
// Test when cursor is at the end.
- model.MoveCursorRight(gfx::LINE_BREAK, false);
+ model.MoveCursorToEnd(false);
model.SelectWord();
SelectWordTestVerifier(model, " ", 24U);
}
@@ -361,61 +386,61 @@ TEST_F(TextfieldViewsModelTest, SelectWordTest) {
TEST_F(TextfieldViewsModelTest, RangeTest) {
TextfieldViewsModel model(NULL);
model.Append(ASCIIToUTF16("HELLO WORLD"));
- model.MoveCursorLeft(gfx::LINE_BREAK, false);
+ model.MoveCursorToHome(false);
ui::Range range;
model.GetSelectedRange(&range);
EXPECT_TRUE(range.is_empty());
EXPECT_EQ(0U, range.start());
EXPECT_EQ(0U, range.end());
- model.MoveCursorRight(gfx::WORD_BREAK, true);
+ model.MoveCursorToNextWord(true);
model.GetSelectedRange(&range);
EXPECT_FALSE(range.is_empty());
EXPECT_FALSE(range.is_reversed());
EXPECT_EQ(0U, range.start());
EXPECT_EQ(5U, range.end());
- model.MoveCursorLeft(gfx::CHARACTER_BREAK, true);
+ model.MoveCursorLeft(true);
model.GetSelectedRange(&range);
EXPECT_FALSE(range.is_empty());
EXPECT_EQ(0U, range.start());
EXPECT_EQ(4U, range.end());
- model.MoveCursorLeft(gfx::WORD_BREAK, true);
+ model.MoveCursorToPreviousWord(true);
model.GetSelectedRange(&range);
EXPECT_TRUE(range.is_empty());
EXPECT_EQ(0U, range.start());
EXPECT_EQ(0U, range.end());
// now from the end.
- model.MoveCursorRight(gfx::LINE_BREAK, false);
+ model.MoveCursorToEnd(false);
model.GetSelectedRange(&range);
EXPECT_TRUE(range.is_empty());
EXPECT_EQ(11U, range.start());
EXPECT_EQ(11U, range.end());
- model.MoveCursorLeft(gfx::WORD_BREAK, true);
+ model.MoveCursorToPreviousWord(true);
model.GetSelectedRange(&range);
EXPECT_FALSE(range.is_empty());
EXPECT_TRUE(range.is_reversed());
EXPECT_EQ(11U, range.start());
EXPECT_EQ(6U, range.end());
- model.MoveCursorRight(gfx::CHARACTER_BREAK, true);
+ model.MoveCursorRight(true);
model.GetSelectedRange(&range);
EXPECT_FALSE(range.is_empty());
EXPECT_TRUE(range.is_reversed());
EXPECT_EQ(11U, range.start());
EXPECT_EQ(7U, range.end());
- model.MoveCursorRight(gfx::WORD_BREAK, true);
+ model.MoveCursorToNextWord(true);
model.GetSelectedRange(&range);
EXPECT_TRUE(range.is_empty());
EXPECT_EQ(11U, range.start());
EXPECT_EQ(11U, range.end());
// Select All
- model.MoveCursorLeft(gfx::LINE_BREAK, true);
+ model.MoveCursorToHome(true);
model.GetSelectedRange(&range);
EXPECT_FALSE(range.is_empty());
EXPECT_TRUE(range.is_reversed());
@@ -472,7 +497,7 @@ TEST_F(TextfieldViewsModelTest, CompositionTextTest) {
model.Append(ASCIIToUTF16("1234590"));
model.SelectRange(ui::Range(5, 5));
EXPECT_FALSE(model.HasSelection());
- EXPECT_EQ(5U, model.GetCursorPosition());
+ EXPECT_EQ(5U, model.cursor_pos());
ui::Range range;
model.GetTextRange(&range);
@@ -489,7 +514,7 @@ TEST_F(TextfieldViewsModelTest, CompositionTextTest) {
model.GetTextRange(&range);
EXPECT_EQ(10U, range.end());
- EXPECT_STR_EQ("1234567890", model.GetText());
+ EXPECT_STR_EQ("1234567890", model.text());
model.GetCompositionTextRange(&range);
EXPECT_EQ(5U, range.start());
@@ -502,40 +527,55 @@ TEST_F(TextfieldViewsModelTest, CompositionTextTest) {
EXPECT_EQ(8U, range.end());
EXPECT_STR_EQ("8", model.GetSelectedText());
+ TextfieldViewsModel::TextFragments fragments;
+ model.GetFragments(&fragments);
+ EXPECT_EQ(3U, fragments.size());
+ EXPECT_EQ(0U, fragments[0].range.start());
+ EXPECT_EQ(5U, fragments[0].range.end());
+ EXPECT_FALSE(fragments[0].style->underline());
+
+ EXPECT_EQ(5U, fragments[1].range.start());
+ EXPECT_EQ(8U, fragments[1].range.end());
+ EXPECT_TRUE(fragments[1].style->underline());
+
+ EXPECT_EQ(8U, fragments[2].range.start());
+ EXPECT_EQ(10U, fragments[2].range.end());
+ EXPECT_FALSE(fragments[2].style->underline());
+
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());
+ EXPECT_EQ(5U, model.cursor_pos());
model.SetCompositionText(composition);
- EXPECT_STR_EQ("1234567890", model.GetText());
+ EXPECT_STR_EQ("1234567890", model.text());
EXPECT_TRUE(model.SetText(ASCIIToUTF16("1234567890")));
EXPECT_TRUE(composition_text_confirmed_or_cleared_);
composition_text_confirmed_or_cleared_ = false;
- model.MoveCursorRight(gfx::LINE_BREAK, false);
+ model.MoveCursorToEnd(false);
model.SetCompositionText(composition);
- EXPECT_STR_EQ("1234567890678", model.GetText());
+ EXPECT_STR_EQ("1234567890678", model.text());
model.InsertText(UTF8ToUTF16("-"));
EXPECT_TRUE(composition_text_confirmed_or_cleared_);
composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("1234567890-", model.GetText());
+ EXPECT_STR_EQ("1234567890-", model.text());
EXPECT_FALSE(model.HasCompositionText());
EXPECT_FALSE(model.HasSelection());
- model.MoveCursorLeft(gfx::CHARACTER_BREAK, true);
+ model.MoveCursorLeft(true);
EXPECT_STR_EQ("-", model.GetSelectedText());
model.SetCompositionText(composition);
- EXPECT_STR_EQ("1234567890678", model.GetText());
+ EXPECT_STR_EQ("1234567890678", model.text());
model.ReplaceText(UTF8ToUTF16("-"));
EXPECT_TRUE(composition_text_confirmed_or_cleared_);
composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("1234567890-", model.GetText());
+ EXPECT_STR_EQ("1234567890-", model.text());
EXPECT_FALSE(model.HasCompositionText());
EXPECT_FALSE(model.HasSelection());
@@ -543,82 +583,82 @@ TEST_F(TextfieldViewsModelTest, CompositionTextTest) {
model.Append(UTF8ToUTF16("-"));
EXPECT_TRUE(composition_text_confirmed_or_cleared_);
composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("1234567890-678-", model.GetText());
+ EXPECT_STR_EQ("1234567890-678-", model.text());
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());
+ EXPECT_STR_EQ("1234567890-678-", model.text());
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());
+ EXPECT_STR_EQ("1234567890-678-", model.text());
model.SetText(string16());
model.SetCompositionText(composition);
- model.MoveCursorLeft(gfx::CHARACTER_BREAK, false);
+ model.MoveCursorLeft(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());
+ EXPECT_STR_EQ("678", model.text());
+ EXPECT_EQ(2U, model.cursor_pos());
model.SetCompositionText(composition);
- model.MoveCursorRight(gfx::CHARACTER_BREAK, false);
+ model.MoveCursorRight(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());
+ EXPECT_STR_EQ("676788", model.text());
+ EXPECT_EQ(6U, model.cursor_pos());
model.SetCompositionText(composition);
- model.MoveCursorLeft(gfx::WORD_BREAK, false);
+ model.MoveCursorToPreviousWord(false);
EXPECT_TRUE(composition_text_confirmed_or_cleared_);
composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("676788678", model.GetText());
+ EXPECT_STR_EQ("676788678", model.text());
model.SetText(string16());
model.SetCompositionText(composition);
- model.MoveCursorRight(gfx::WORD_BREAK, false);
+ model.MoveCursorToNextWord(false);
EXPECT_TRUE(composition_text_confirmed_or_cleared_);
composition_text_confirmed_or_cleared_ = false;
model.SetCompositionText(composition);
- model.MoveCursorLeft(gfx::LINE_BREAK, true);
+ model.MoveCursorToHome(true);
EXPECT_TRUE(composition_text_confirmed_or_cleared_);
composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("678678", model.GetText());
+ EXPECT_STR_EQ("678678", model.text());
model.SetCompositionText(composition);
- model.MoveCursorRight(gfx::LINE_BREAK, false);
+ model.MoveCursorToEnd(false);
EXPECT_TRUE(composition_text_confirmed_or_cleared_);
composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("678", model.GetText());
+ EXPECT_STR_EQ("678", model.text());
model.SetCompositionText(composition);
model.MoveCursorTo(0, true);
EXPECT_TRUE(composition_text_confirmed_or_cleared_);
composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("678678", model.GetText());
+ EXPECT_STR_EQ("678678", model.text());
model.SetCompositionText(composition);
model.SelectRange(ui::Range(0, 3));
EXPECT_TRUE(composition_text_confirmed_or_cleared_);
composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("678", model.GetText());
+ EXPECT_STR_EQ("678", model.text());
model.SetCompositionText(composition);
model.SelectAll();
EXPECT_TRUE(composition_text_confirmed_or_cleared_);
composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("678", model.GetText());
+ EXPECT_STR_EQ("678", model.text());
model.SetCompositionText(composition);
model.SelectWord();
EXPECT_TRUE(composition_text_confirmed_or_cleared_);
composition_text_confirmed_or_cleared_ = false;
- EXPECT_STR_EQ("678", model.GetText());
+ EXPECT_STR_EQ("678", model.text());
model.SetCompositionText(composition);
model.ClearSelection();
@@ -635,157 +675,157 @@ TEST_F(TextfieldViewsModelTest, UndoRedo_BasicTest) {
model.InsertChar('a');
EXPECT_FALSE(model.Redo()); // nothing to redo
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
+ EXPECT_STR_EQ("", model.text());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("a", model.GetText());
+ EXPECT_STR_EQ("a", model.text());
// Continuous inserts are treated as one edit.
model.InsertChar('b');
model.InsertChar('c');
- EXPECT_STR_EQ("abc", model.GetText());
+ EXPECT_STR_EQ("abc", model.text());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("a", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
+ EXPECT_STR_EQ("a", model.text());
+ EXPECT_EQ(1U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition());
+ EXPECT_STR_EQ("", model.text());
+ EXPECT_EQ(0U, model.cursor_pos());
// Undoing further shouldn't change the text.
EXPECT_FALSE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
+ EXPECT_STR_EQ("", model.text());
EXPECT_FALSE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition());
+ EXPECT_STR_EQ("", model.text());
+ EXPECT_EQ(0U, model.cursor_pos());
// Redoing to the latest text.
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("a", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
+ EXPECT_STR_EQ("a", model.text());
+ EXPECT_EQ(1U, model.cursor_pos());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("abc", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
+ EXPECT_STR_EQ("abc", model.text());
+ EXPECT_EQ(3U, model.cursor_pos());
// Backspace ===============================
EXPECT_TRUE(model.Backspace());
- EXPECT_STR_EQ("ab", model.GetText());
+ EXPECT_STR_EQ("ab", model.text());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("abc", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
+ EXPECT_STR_EQ("abc", model.text());
+ EXPECT_EQ(3U, model.cursor_pos());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ab", model.GetText());
- EXPECT_EQ(2U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ab", model.text());
+ EXPECT_EQ(2U, model.cursor_pos());
// Continous backspaces are treated as one edit.
EXPECT_TRUE(model.Backspace());
EXPECT_TRUE(model.Backspace());
- EXPECT_STR_EQ("", model.GetText());
+ EXPECT_STR_EQ("", model.text());
// 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_STR_EQ("ab", model.text());
+ EXPECT_EQ(2U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("abc", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
+ EXPECT_STR_EQ("abc", model.text());
+ EXPECT_EQ(3U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("a", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
+ EXPECT_STR_EQ("a", model.text());
+ EXPECT_EQ(1U, model.cursor_pos());
// Clear history
model.ClearEditHistory();
EXPECT_FALSE(model.Undo());
EXPECT_FALSE(model.Redo());
- EXPECT_STR_EQ("a", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
+ EXPECT_STR_EQ("a", model.text());
+ EXPECT_EQ(1U, model.cursor_pos());
// Delete ===============================
model.SetText(ASCIIToUTF16("ABCDE"));
model.ClearEditHistory();
model.MoveCursorTo(2, false);
EXPECT_TRUE(model.Delete());
- EXPECT_STR_EQ("ABDE", model.GetText());
- model.MoveCursorLeft(gfx::LINE_BREAK, false);
+ EXPECT_STR_EQ("ABDE", model.text());
+ model.MoveCursorToHome(false);
EXPECT_TRUE(model.Delete());
- EXPECT_STR_EQ("BDE", model.GetText());
+ EXPECT_STR_EQ("BDE", model.text());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABDE", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ABDE", model.text());
+ EXPECT_EQ(0U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
- EXPECT_EQ(2U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ABCDE", model.text());
+ EXPECT_EQ(2U, model.cursor_pos());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ABDE", model.GetText());
- EXPECT_EQ(2U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ABDE", model.text());
+ EXPECT_EQ(2U, model.cursor_pos());
// Continous deletes are treated as one edit.
EXPECT_TRUE(model.Delete());
EXPECT_TRUE(model.Delete());
- EXPECT_STR_EQ("AB", model.GetText());
+ EXPECT_STR_EQ("AB", model.text());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABDE", model.GetText());
- EXPECT_EQ(2U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ABDE", model.text());
+ EXPECT_EQ(2U, model.cursor_pos());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("AB", model.GetText());
- EXPECT_EQ(2U, model.GetCursorPosition());
+ EXPECT_STR_EQ("AB", model.text());
+ EXPECT_EQ(2U, model.cursor_pos());
}
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());
+ EXPECT_STR_EQ("w", model.text());
+ EXPECT_EQ(1U, model.cursor_pos());
model.SetText(ASCIIToUTF16("www.google.com"));
- EXPECT_EQ(1U, model.GetCursorPosition());
- EXPECT_STR_EQ("www.google.com", model.GetText());
+ EXPECT_EQ(1U, model.cursor_pos());
+ EXPECT_STR_EQ("www.google.com", model.text());
model.SelectRange(ui::Range(14, 1));
model.InsertChar('w');
- EXPECT_STR_EQ("ww", model.GetText());
+ EXPECT_STR_EQ("ww", model.text());
model.SetText(ASCIIToUTF16("www.google.com"));
model.SelectRange(ui::Range(14, 2));
model.InsertChar('w');
- EXPECT_STR_EQ("www", model.GetText());
+ EXPECT_STR_EQ("www", model.text());
model.SetText(ASCIIToUTF16("www.google.com"));
model.SelectRange(ui::Range(14, 3));
model.InsertChar('.');
- EXPECT_STR_EQ("www.", model.GetText());
+ EXPECT_STR_EQ("www.", model.text());
model.SetText(ASCIIToUTF16("www.google.com"));
model.SelectRange(ui::Range(14, 4));
model.InsertChar('y');
- EXPECT_STR_EQ("www.y", model.GetText());
+ EXPECT_STR_EQ("www.y", model.text());
model.SetText(ASCIIToUTF16("www.youtube.com"));
- EXPECT_STR_EQ("www.youtube.com", model.GetText());
- EXPECT_EQ(5U, model.GetCursorPosition());
+ EXPECT_STR_EQ("www.youtube.com", model.text());
+ EXPECT_EQ(5U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("www.google.com", model.GetText());
- EXPECT_EQ(4U, model.GetCursorPosition());
+ EXPECT_STR_EQ("www.google.com", model.text());
+ EXPECT_EQ(4U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("www.google.com", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
+ EXPECT_STR_EQ("www.google.com", model.text());
+ EXPECT_EQ(3U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("www.google.com", model.GetText());
- EXPECT_EQ(2U, model.GetCursorPosition());
+ EXPECT_STR_EQ("www.google.com", model.text());
+ EXPECT_EQ(2U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("www.google.com", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
+ EXPECT_STR_EQ("www.google.com", model.text());
+ EXPECT_EQ(1U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition());
+ EXPECT_STR_EQ("", model.text());
+ EXPECT_EQ(0U, model.cursor_pos());
EXPECT_FALSE(model.Undo());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("www.google.com", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
+ EXPECT_STR_EQ("www.google.com", model.text());
+ EXPECT_EQ(1U, model.cursor_pos());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("www.google.com", model.GetText());
- EXPECT_EQ(2U, model.GetCursorPosition());
+ EXPECT_STR_EQ("www.google.com", model.text());
+ EXPECT_EQ(2U, model.cursor_pos());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("www.google.com", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
+ EXPECT_STR_EQ("www.google.com", model.text());
+ EXPECT_EQ(3U, model.cursor_pos());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("www.google.com", model.GetText());
- EXPECT_EQ(4U, model.GetCursorPosition());
+ EXPECT_STR_EQ("www.google.com", model.text());
+ EXPECT_EQ(4U, model.cursor_pos());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("www.youtube.com", model.GetText());
- EXPECT_EQ(5U, model.GetCursorPosition());
+ EXPECT_STR_EQ("www.youtube.com", model.text());
+ EXPECT_EQ(5U, model.cursor_pos());
EXPECT_FALSE(model.Redo());
}
@@ -797,153 +837,153 @@ TEST_F(TextfieldViewsModelTest, UndoRedo_CutCopyPasteTest) {
model.MoveCursorTo(1, false);
model.MoveCursorTo(3, true);
model.Cut();
- EXPECT_STR_EQ("ADE", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ADE", model.text());
+ EXPECT_EQ(1U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ABCDE", model.text());
+ EXPECT_EQ(3U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition());
+ EXPECT_STR_EQ("", model.text());
+ EXPECT_EQ(0U, model.cursor_pos());
EXPECT_FALSE(model.Undo()); // no more undo
- EXPECT_STR_EQ("", model.GetText());
+ EXPECT_STR_EQ("", model.text());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ABCDE", model.text());
+ EXPECT_EQ(0U, model.cursor_pos());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ADE", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ADE", model.text());
+ EXPECT_EQ(1U, model.cursor_pos());
EXPECT_FALSE(model.Redo()); // no more redo
- EXPECT_STR_EQ("ADE", model.GetText());
+ EXPECT_STR_EQ("ADE", model.text());
model.Paste();
model.Paste();
model.Paste();
- EXPECT_STR_EQ("ABCBCBCDE", model.GetText());
- EXPECT_EQ(7U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ABCBCBCDE", model.text());
+ EXPECT_EQ(7U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCBCDE", model.GetText());
- EXPECT_EQ(5U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ABCBCDE", model.text());
+ EXPECT_EQ(5U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ABCDE", model.text());
+ EXPECT_EQ(3U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ADE", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ADE", model.text());
+ EXPECT_EQ(1U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ABCDE", model.text());
+ EXPECT_EQ(3U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition());
+ EXPECT_STR_EQ("", model.text());
+ EXPECT_EQ(0U, model.cursor_pos());
EXPECT_FALSE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
+ EXPECT_STR_EQ("", model.text());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ABCDE", model.GetText()); // Redoing SetText
- EXPECT_EQ(0U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ABCDE", model.text()); // Redoing SetText
+ EXPECT_EQ(0U, model.cursor_pos());
// Redo
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ADE", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ADE", model.text());
+ EXPECT_EQ(1U, model.cursor_pos());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ABCDE", model.text());
+ EXPECT_EQ(3U, model.cursor_pos());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ABCBCDE", model.GetText());
- EXPECT_EQ(5U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ABCBCDE", model.text());
+ EXPECT_EQ(5U, model.cursor_pos());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ABCBCBCDE", model.GetText());
- EXPECT_EQ(7U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ABCBCBCDE", model.text());
+ EXPECT_EQ(7U, model.cursor_pos());
EXPECT_FALSE(model.Redo());
// with SelectRange
model.SelectRange(ui::Range(1, 3));
EXPECT_TRUE(model.Cut());
- EXPECT_STR_EQ("ABCBCDE", model.GetText());
- EXPECT_EQ(1U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ABCBCDE", model.text());
+ EXPECT_EQ(1U, model.cursor_pos());
model.SelectRange(ui::Range(1, 1));
EXPECT_FALSE(model.Cut());
- model.MoveCursorRight(gfx::LINE_BREAK, false);
+ model.MoveCursorToEnd(false);
EXPECT_TRUE(model.Paste());
- EXPECT_STR_EQ("ABCBCDEBC", model.GetText());
- EXPECT_EQ(9U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ABCBCDEBC", model.text());
+ EXPECT_EQ(9U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCBCDE", model.GetText());
- EXPECT_EQ(7U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ABCBCDE", model.text());
+ EXPECT_EQ(7U, model.cursor_pos());
// empty cut shouldn't create an edit.
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCBCBCDE", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ABCBCBCDE", model.text());
+ EXPECT_EQ(3U, model.cursor_pos());
// Copy
ResetModel(&model);
model.SetText(ASCIIToUTF16("12345"));
- EXPECT_STR_EQ("12345", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition());
+ EXPECT_STR_EQ("12345", model.text());
+ EXPECT_EQ(0U, model.cursor_pos());
model.MoveCursorTo(1, false);
model.MoveCursorTo(3, true);
model.Copy(); // Copy "23"
- EXPECT_STR_EQ("12345", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
+ EXPECT_STR_EQ("12345", model.text());
+ EXPECT_EQ(3U, model.cursor_pos());
model.Paste(); // Paste "23" into "23".
- EXPECT_STR_EQ("12345", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
+ EXPECT_STR_EQ("12345", model.text());
+ EXPECT_EQ(3U, model.cursor_pos());
model.Paste();
- EXPECT_STR_EQ("1232345", model.GetText());
- EXPECT_EQ(5U, model.GetCursorPosition());
+ EXPECT_STR_EQ("1232345", model.text());
+ EXPECT_EQ(5U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("12345", model.GetText());
- EXPECT_EQ(3U, model.GetCursorPosition());
+ EXPECT_STR_EQ("12345", model.text());
+ EXPECT_EQ(3U, model.cursor_pos());
// 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_STR_EQ("12345", model.text());
+ EXPECT_EQ(3U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
+ EXPECT_STR_EQ("", model.text());
EXPECT_FALSE(model.Undo());
// Redo
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("12345", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition());
+ EXPECT_STR_EQ("12345", model.text());
+ EXPECT_EQ(0U, model.cursor_pos());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("12345", model.GetText()); // For 1st paste
- EXPECT_EQ(3U, model.GetCursorPosition());
+ EXPECT_STR_EQ("12345", model.text()); // For 1st paste
+ EXPECT_EQ(3U, model.cursor_pos());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("1232345", model.GetText());
- EXPECT_EQ(5U, model.GetCursorPosition());
+ EXPECT_STR_EQ("1232345", model.text());
+ EXPECT_EQ(5U, model.cursor_pos());
EXPECT_FALSE(model.Redo());
- EXPECT_STR_EQ("1232345", model.GetText());
+ EXPECT_STR_EQ("1232345", model.text());
- // Test using SelectRange
+ // with SelectRange
model.SelectRange(ui::Range(1, 3));
model.Copy();
- EXPECT_STR_EQ("1232345", model.GetText());
- model.MoveCursorRight(gfx::LINE_BREAK, false);
+ EXPECT_STR_EQ("1232345", model.text());
+ model.MoveCursorToEnd(false);
EXPECT_TRUE(model.Paste());
- EXPECT_STR_EQ("123234523", model.GetText());
- EXPECT_EQ(9U, model.GetCursorPosition());
+ EXPECT_STR_EQ("123234523", model.text());
+ EXPECT_EQ(9U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("1232345", model.GetText());
- EXPECT_EQ(7U, model.GetCursorPosition());
+ EXPECT_STR_EQ("1232345", model.text());
+ EXPECT_EQ(7U, model.cursor_pos());
}
TEST_F(TextfieldViewsModelTest, UndoRedo_CursorTest) {
TextfieldViewsModel model(NULL);
model.InsertChar('a');
- model.MoveCursorLeft(gfx::CHARACTER_BREAK, false);
- model.MoveCursorRight(gfx::CHARACTER_BREAK, false);
+ model.MoveCursorLeft(false);
+ model.MoveCursorRight(false);
model.InsertChar('b');
- // Moving the cursor shouldn't create a new edit.
- EXPECT_STR_EQ("ab", model.GetText());
+ // Moving cursor shoudln't create a new edit.
+ EXPECT_STR_EQ("ab", model.text());
EXPECT_FALSE(model.Redo());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
+ EXPECT_STR_EQ("", model.text());
EXPECT_FALSE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
+ EXPECT_STR_EQ("", model.text());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ab", model.GetText());
- EXPECT_EQ(2U, model.GetCursorPosition());
+ EXPECT_STR_EQ("ab", model.text());
+ EXPECT_EQ(2U, model.cursor_pos());
EXPECT_FALSE(model.Redo());
}
@@ -955,21 +995,21 @@ void RunInsertReplaceTest(TextfieldViewsModel& model) {
model.InsertChar('1');
model.InsertChar('2');
model.InsertChar('3');
- EXPECT_STR_EQ("a123d", model.GetText());
- EXPECT_EQ(4U, model.GetCursorPosition());
+ EXPECT_STR_EQ("a123d", model.text());
+ EXPECT_EQ(4U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("abcd", model.GetText());
- EXPECT_EQ(reverse ? 1U : 3U, model.GetCursorPosition());
+ EXPECT_STR_EQ("abcd", model.text());
+ EXPECT_EQ(reverse ? 1U : 3U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition());
+ EXPECT_STR_EQ("", model.text());
+ EXPECT_EQ(0U, model.cursor_pos());
EXPECT_FALSE(model.Undo());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("abcd", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition()); // By SetText
+ EXPECT_STR_EQ("abcd", model.text());
+ EXPECT_EQ(0U, model.cursor_pos()); // By SetText
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("a123d", model.GetText());
- EXPECT_EQ(4U, model.GetCursorPosition());
+ EXPECT_STR_EQ("a123d", model.text());
+ EXPECT_EQ(4U, model.cursor_pos());
EXPECT_FALSE(model.Redo());
}
@@ -982,21 +1022,21 @@ void RunOverwriteReplaceTest(TextfieldViewsModel& model) {
model.ReplaceChar('2');
model.ReplaceChar('3');
model.ReplaceChar('4');
- EXPECT_STR_EQ("a1234", model.GetText());
- EXPECT_EQ(5U, model.GetCursorPosition());
+ EXPECT_STR_EQ("a1234", model.text());
+ EXPECT_EQ(5U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("abcd", model.GetText());
- EXPECT_EQ(reverse ? 1U : 3U, model.GetCursorPosition());
+ EXPECT_STR_EQ("abcd", model.text());
+ EXPECT_EQ(reverse ? 1U : 3U, model.cursor_pos());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition());
+ EXPECT_STR_EQ("", model.text());
+ EXPECT_EQ(0U, model.cursor_pos());
EXPECT_FALSE(model.Undo());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("abcd", model.GetText());
- EXPECT_EQ(0U, model.GetCursorPosition());
+ EXPECT_STR_EQ("abcd", model.text());
+ EXPECT_EQ(0U, model.cursor_pos());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("a1234", model.GetText());
- EXPECT_EQ(5U, model.GetCursorPosition());
+ EXPECT_STR_EQ("a1234", model.text());
+ EXPECT_EQ(5U, model.cursor_pos());
EXPECT_FALSE(model.Redo());
}
@@ -1074,72 +1114,282 @@ TEST_F(TextfieldViewsModelTest, UndoRedo_CompositionText) {
composition.selection = ui::Range(2, 3);
model.SetText(ASCIIToUTF16("ABCDE"));
- model.MoveCursorRight(gfx::LINE_BREAK, false);
+ model.MoveCursorToEnd(false);
model.InsertChar('x');
- EXPECT_STR_EQ("ABCDEx", model.GetText());
+ EXPECT_STR_EQ("ABCDEx", model.text());
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());
+ EXPECT_STR_EQ("ABCDEabc", model.text());
// Accepting composition
model.ConfirmCompositionText();
- EXPECT_STR_EQ("ABCDEabc", model.GetText());
+ EXPECT_STR_EQ("ABCDEabc", model.text());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
+ EXPECT_STR_EQ("ABCDE", model.text());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("", model.GetText());
+ EXPECT_STR_EQ("", model.text());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
+ EXPECT_STR_EQ("ABCDE", model.text());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ABCDEabc", model.GetText());
+ EXPECT_STR_EQ("ABCDEabc", model.text());
EXPECT_FALSE(model.Redo());
// Canceling composition
- model.MoveCursorLeft(gfx::LINE_BREAK, false);
+ model.MoveCursorToHome(false);
model.SetCompositionText(composition);
- EXPECT_STR_EQ("abcABCDEabc", model.GetText());
+ EXPECT_STR_EQ("abcABCDEabc", model.text());
model.CancelCompositionText();
- EXPECT_STR_EQ("ABCDEabc", model.GetText());
+ EXPECT_STR_EQ("ABCDEabc", model.text());
EXPECT_FALSE(model.Redo());
- EXPECT_STR_EQ("ABCDEabc", model.GetText());
+ EXPECT_STR_EQ("ABCDEabc", model.text());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
+ EXPECT_STR_EQ("ABCDE", model.text());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ABCDEabc", model.GetText());
+ EXPECT_STR_EQ("ABCDEabc", model.text());
EXPECT_FALSE(model.Redo());
// SetText with the same text as the result.
ResetModel(&model);
model.SetText(ASCIIToUTF16("ABCDE"));
- model.MoveCursorRight(gfx::LINE_BREAK, false);
+ model.MoveCursorToEnd(false);
model.SetCompositionText(composition);
- EXPECT_STR_EQ("ABCDEabc", model.GetText());
+ EXPECT_STR_EQ("ABCDEabc", model.text());
model.SetText(ASCIIToUTF16("ABCDEabc"));
- EXPECT_STR_EQ("ABCDEabc", model.GetText());
+ EXPECT_STR_EQ("ABCDEabc", model.text());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
+ EXPECT_STR_EQ("ABCDE", model.text());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("ABCDEabc", model.GetText());
+ EXPECT_STR_EQ("ABCDEabc", model.text());
EXPECT_FALSE(model.Redo());
// SetText with the different text than the result should not
// remember composition text.
ResetModel(&model);
model.SetText(ASCIIToUTF16("ABCDE"));
- model.MoveCursorRight(gfx::LINE_BREAK, false);
+ model.MoveCursorToEnd(false);
model.SetCompositionText(composition);
- EXPECT_STR_EQ("ABCDEabc", model.GetText());
+ EXPECT_STR_EQ("ABCDEabc", model.text());
model.SetText(ASCIIToUTF16("1234"));
- EXPECT_STR_EQ("1234", model.GetText());
+ EXPECT_STR_EQ("1234", model.text());
EXPECT_TRUE(model.Undo());
- EXPECT_STR_EQ("ABCDE", model.GetText());
+ EXPECT_STR_EQ("ABCDE", model.text());
EXPECT_TRUE(model.Redo());
- EXPECT_STR_EQ("1234", model.GetText());
+ EXPECT_STR_EQ("1234", model.text());
EXPECT_FALSE(model.Redo());
// TODO(oshima): We need MockInputMethod to test the behavior with IME.
}
+TEST_F(TextfieldViewsModelTest, TextStyleTest) {
+ const SkColor black = 0xFF000000; // black is default text color.
+ const SkColor white = 0xFFFFFFFF;
+ TextfieldViewsModel model(NULL);
+ TextStyle* color = model.CreateTextStyle();
+ color->set_foreground(white);
+ TextStyle* underline = model.CreateTextStyle();
+ underline->set_underline(true);
+ underline->set_foreground(white);
+ TextStyle* strike = model.CreateTextStyle();
+ strike->set_strike(true);
+ strike->set_foreground(white);
+
+ // Case 1: No overlaps
+ model.ApplyTextStyle(color, ui::Range(1, 3));
+ model.ApplyTextStyle(underline, ui::Range(5, 6));
+
+ TextfieldViewsModel::TextFragments fragments;
+ model.GetFragments(&fragments);
+ // Styles with empty string simply returns an empty fragments.
+ EXPECT_EQ(0U, fragments.size());
+
+ // 1st style only.
+ model.SetText(ASCIIToUTF16("01234")); // SetText doesn't change styles.
+ model.GetFragments(&fragments);
+ EXPECT_EQ(3U, fragments.size());
+ EXPECT_EQ(0U, fragments[0].range.start());
+ EXPECT_EQ(1U, fragments[0].range.end());
+ EXPECT_EQ(black, fragments[0].style->foreground());
+
+ EXPECT_EQ(1U, fragments[1].range.start());
+ EXPECT_EQ(3U, fragments[1].range.end());
+ EXPECT_EQ(color, fragments[1].style);
+
+ EXPECT_EQ(3U, fragments[2].range.start());
+ EXPECT_EQ(5U, fragments[2].range.end());
+ EXPECT_EQ(black, fragments[2].style->foreground());
+
+ // Clear styles
+ model.ClearAllTextStyles();
+ model.GetFragments(&fragments);
+ EXPECT_EQ(1U, fragments.size());
+ EXPECT_EQ(0U, fragments[0].range.start());
+ EXPECT_EQ(5U, fragments[0].range.end());
+ EXPECT_EQ(black, fragments[0].style->foreground());
+
+ // Case 2: Overlaps on left and on right
+ model.ApplyTextStyle(color, ui::Range(1, 3));
+ model.ApplyTextStyle(strike, ui::Range(6, 8));
+ model.ApplyTextStyle(underline, ui::Range(2, 7));
+
+ // With short string
+ model.SetText(ASCIIToUTF16("0"));
+ model.GetFragments(&fragments);
+ EXPECT_EQ(1U, fragments.size());
+ EXPECT_EQ(0U, fragments[0].range.start());
+ EXPECT_EQ(1U, fragments[0].range.end());
+ EXPECT_EQ(black, fragments[0].style->foreground());
+
+ // With mid-length string
+ model.SetText(ASCIIToUTF16("0123"));
+ model.GetFragments(&fragments);
+ EXPECT_EQ(3U, fragments.size());
+ EXPECT_EQ(0U, fragments[0].range.start());
+ EXPECT_EQ(1U, fragments[0].range.end());
+ EXPECT_EQ(black, fragments[0].style->foreground());
+
+ EXPECT_EQ(1U, fragments[1].range.start());
+ EXPECT_EQ(2U, fragments[1].range.end());
+ EXPECT_EQ(color, fragments[1].style);
+
+ EXPECT_EQ(2U, fragments[2].range.start());
+ EXPECT_EQ(4U, fragments[2].range.end());
+ EXPECT_EQ(underline, fragments[2].style);
+
+ // With long (longer than styles) string
+ model.SetText(ASCIIToUTF16("0123456789"));
+ model.GetFragments(&fragments);
+ EXPECT_EQ(5U, fragments.size());
+ EXPECT_EQ(0U, fragments[0].range.start());
+ EXPECT_EQ(1U, fragments[0].range.end());
+ EXPECT_EQ(black, fragments[0].style->foreground());
+
+ EXPECT_EQ(1U, fragments[1].range.start());
+ EXPECT_EQ(2U, fragments[1].range.end());
+ EXPECT_EQ(color, fragments[1].style);
+
+ EXPECT_EQ(2U, fragments[2].range.start());
+ EXPECT_EQ(7U, fragments[2].range.end());
+ EXPECT_EQ(underline, fragments[2].style);
+
+ EXPECT_EQ(7U, fragments[3].range.start());
+ EXPECT_EQ(8U, fragments[3].range.end());
+ EXPECT_EQ(strike, fragments[3].style);
+
+ EXPECT_EQ(8U, fragments[4].range.start());
+ EXPECT_EQ(10U, fragments[4].range.end());
+ EXPECT_EQ(black, fragments[4].style->foreground());
+
+ model.ClearAllTextStyles();
+
+ // Case 3: The underline style splits the color style underneath.
+ model.ApplyTextStyle(color, ui::Range(0, 15));
+ model.ApplyTextStyle(underline, ui::Range(5, 6));
+ model.GetFragments(&fragments);
+ EXPECT_EQ(3U, fragments.size());
+ EXPECT_EQ(0U, fragments[0].range.start());
+ EXPECT_EQ(5U, fragments[0].range.end());
+ EXPECT_EQ(color, fragments[0].style);
+
+ EXPECT_EQ(5U, fragments[1].range.start());
+ EXPECT_EQ(6U, fragments[1].range.end());
+ EXPECT_EQ(underline, fragments[1].style);
+
+ EXPECT_EQ(6U, fragments[2].range.start());
+ EXPECT_EQ(10U, fragments[2].range.end());
+ EXPECT_EQ(color, fragments[2].style);
+
+ model.ClearAllTextStyles();
+
+ // Case 4: The underline style moves the color style underneath.
+ model.ApplyTextStyle(color, ui::Range(0, 15));
+ model.ApplyTextStyle(underline, ui::Range(0, 6));
+ model.GetFragments(&fragments);
+ EXPECT_EQ(2U, fragments.size());
+ EXPECT_EQ(0U, fragments[0].range.start());
+ EXPECT_EQ(6U, fragments[0].range.end());
+ EXPECT_EQ(underline, fragments[0].style);
+
+ EXPECT_EQ(6U, fragments[1].range.start());
+ EXPECT_EQ(10U, fragments[1].range.end());
+ EXPECT_EQ(color, fragments[1].style);
+
+ model.ClearAllTextStyles();
+
+ model.ApplyTextStyle(color, ui::Range(0, 10));
+ model.ApplyTextStyle(underline, ui::Range(6, 10));
+ model.GetFragments(&fragments);
+ EXPECT_EQ(2U, fragments.size());
+ EXPECT_EQ(0U, fragments[0].range.start());
+ EXPECT_EQ(6U, fragments[0].range.end());
+ EXPECT_EQ(color, fragments[0].style);
+
+ EXPECT_EQ(6U, fragments[1].range.start());
+ EXPECT_EQ(10U, fragments[1].range.end());
+ EXPECT_EQ(underline, fragments[1].style);
+
+ model.ClearAllTextStyles();
+ // Case 5: The strike style hides the unerline style underneath.
+ model.ApplyTextStyle(color, ui::Range(0, 15));
+ model.ApplyTextStyle(underline, ui::Range(0, 6));
+ model.ApplyTextStyle(strike, ui::Range(4, 7));
+ model.GetFragments(&fragments);
+ EXPECT_EQ(3U, fragments.size());
+ EXPECT_EQ(0U, fragments[0].range.start());
+ EXPECT_EQ(4U, fragments[0].range.end());
+ EXPECT_EQ(underline, fragments[0].style);
+
+ EXPECT_EQ(4U, fragments[1].range.start());
+ EXPECT_EQ(7U, fragments[1].range.end());
+ EXPECT_EQ(strike, fragments[1].style);
+
+ EXPECT_EQ(7U, fragments[2].range.start());
+ EXPECT_EQ(10U, fragments[2].range.end());
+ EXPECT_EQ(color, fragments[2].style);
+
+ // Case 6: Reversed range.
+ model.ClearAllTextStyles();
+ model.ApplyTextStyle(color, ui::Range(3, 1));
+ model.ApplyTextStyle(underline, ui::Range(6, 4));
+ model.ApplyTextStyle(strike, ui::Range(5, 2));
+ model.GetFragments(&fragments);
+ EXPECT_EQ(5U, fragments.size());
+
+ EXPECT_EQ(0U, fragments[0].range.start());
+ EXPECT_EQ(1U, fragments[0].range.end());
+ EXPECT_EQ(black, fragments[0].style->foreground());
+
+ EXPECT_EQ(1U, fragments[1].range.start());
+ EXPECT_EQ(2U, fragments[1].range.end());
+ EXPECT_EQ(color, fragments[1].style);
+
+ EXPECT_EQ(2U, fragments[2].range.start());
+ EXPECT_EQ(5U, fragments[2].range.end());
+ EXPECT_EQ(strike, fragments[2].style);
+
+ EXPECT_EQ(5U, fragments[3].range.start());
+ EXPECT_EQ(6U, fragments[3].range.end());
+ EXPECT_EQ(underline, fragments[3].style);
+
+ EXPECT_EQ(6U, fragments[4].range.start());
+ EXPECT_EQ(10U, fragments[4].range.end());
+ EXPECT_EQ(black, fragments[4].style->foreground());
+
+ // Case 7: empty / invald range
+ model.ClearAllTextStyles();
+ model.ApplyTextStyle(color, ui::Range(0, 0));
+ model.ApplyTextStyle(underline, ui::Range(4, 4));
+ ui::Range invalid = ui::Range(0, 2).Intersect(ui::Range(3, 4));
+ ASSERT_FALSE(invalid.IsValid());
+
+ model.ApplyTextStyle(strike, invalid);
+ model.GetFragments(&fragments);
+ EXPECT_EQ(1U, fragments.size());
+
+ EXPECT_EQ(0U, fragments[0].range.start());
+ EXPECT_EQ(10U, fragments[0].range.end());
+ EXPECT_EQ(black, fragments[0].style->foreground());
+}
+
} // namespace views