| Index: ui/gfx/render_text_unittest.cc
|
| diff --git a/ui/gfx/render_text_unittest.cc b/ui/gfx/render_text_unittest.cc
|
| index e27135eff1e5949a2575c7c3dd61e05221a4768e..9491759881e1a73e5ed07431525ca92254a6cb4d 100644
|
| --- a/ui/gfx/render_text_unittest.cc
|
| +++ b/ui/gfx/render_text_unittest.cc
|
| @@ -50,272 +50,236 @@ void SetRTL(bool rtl) {
|
| }
|
| #endif
|
|
|
| +// Return true if there is only one break, and it has the supplied |value|.
|
| +template<class T>
|
| +bool BreakEquals(const std::vector<std::pair<size_t, T> >& breaks, T value) {
|
| + return breaks.size() == 1 && breaks[0] == std::pair<size_t, T>(0, value);
|
| +}
|
| +
|
| +// Return true if |breaks| matches |expected|.
|
| +template<class T>
|
| +bool BreaksEqual(const std::vector<std::pair<size_t, T> >& breaks,
|
| + const std::vector<std::pair<size_t, T> >& expected) {
|
| + if (breaks.size() != expected.size())
|
| + return false;
|
| + for (size_t i = 0; i < breaks.size(); ++i)
|
| + if (breaks[i] != expected[i])
|
| + return false;
|
| + return true;
|
| +}
|
| +
|
| } // namespace
|
|
|
| class RenderTextTest : public testing::Test {
|
| };
|
|
|
| TEST_F(RenderTextTest, DefaultStyle) {
|
| - // Defaults to empty text with no styles.
|
| + // Check the default styles applied to new instances and adjusted text.
|
| scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
|
| EXPECT_TRUE(render_text->text().empty());
|
| - EXPECT_TRUE(render_text->style_ranges().empty());
|
| -
|
| - // Test that the built-in default style is applied for new text.
|
| - render_text->SetText(ASCIIToUTF16("abc"));
|
| - EXPECT_EQ(1U, render_text->style_ranges().size());
|
| - StyleRange style;
|
| - EXPECT_EQ(style.foreground, render_text->style_ranges()[0].foreground);
|
| - EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range);
|
| - EXPECT_EQ(style.strike, render_text->style_ranges()[0].strike);
|
| - EXPECT_EQ(style.underline, render_text->style_ranges()[0].underline);
|
| -
|
| - // Test that clearing the text also clears the styles.
|
| - render_text->SetText(string16());
|
| - EXPECT_TRUE(render_text->text().empty());
|
| - EXPECT_TRUE(render_text->style_ranges().empty());
|
| + const wchar_t* const cases[] = { kWeak, kLtr, L"Hello", kRtl, L"", L"" };
|
| + for (size_t i = 0; i < arraysize(cases); ++i) {
|
| + EXPECT_TRUE(BreakEquals(render_text->colors(), SK_ColorBLACK));
|
| + for (size_t style = 0; style < NUM_TEXT_STYLES; ++style) {
|
| + TextStyle value = static_cast<TextStyle>(style);
|
| + EXPECT_TRUE(BreakEquals(render_text->styles(value), false));
|
| + }
|
| + render_text->SetText(WideToUTF16(cases[i]));
|
| + }
|
| }
|
|
|
| -TEST_F(RenderTextTest, CustomDefaultStyle) {
|
| - // Test a custom default style.
|
| +TEST_F(RenderTextTest, SetColorAndStyle) {
|
| + // Ensure custom default styles persist across setting and clearing text.
|
| scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
|
| - StyleRange color;
|
| - color.foreground = SK_ColorRED;
|
| - render_text->set_default_style(color);
|
| - render_text->SetText(ASCIIToUTF16("abc"));
|
| - EXPECT_EQ(1U, render_text->style_ranges().size());
|
| - EXPECT_EQ(color.foreground, render_text->style_ranges()[0].foreground);
|
| -
|
| - // Test that the custom default style persists across clearing text.
|
| - render_text->SetText(string16());
|
| - EXPECT_TRUE(render_text->style_ranges().empty());
|
| - render_text->SetText(ASCIIToUTF16("abc"));
|
| - EXPECT_EQ(1U, render_text->style_ranges().size());
|
| - EXPECT_EQ(color.foreground, render_text->style_ranges()[0].foreground);
|
| -
|
| - // Test ApplyDefaultStyle after setting a new default.
|
| - StyleRange strike;
|
| - strike.strike = true;
|
| - render_text->set_default_style(strike);
|
| - render_text->ApplyDefaultStyle();
|
| - EXPECT_EQ(1U, render_text->style_ranges().size());
|
| - EXPECT_TRUE(render_text->style_ranges()[0].strike);
|
| - EXPECT_EQ(strike.foreground, render_text->style_ranges()[0].foreground);
|
| + const SkColor color = SK_ColorRED;
|
| + render_text->SetColor(color);
|
| + render_text->SetStyle(BOLD, true);
|
| + render_text->SetStyle(UNDERLINE, false);
|
| + const wchar_t* const cases[] = { kWeak, kLtr, L"Hello", kRtl, L"", L"" };
|
| + for (size_t i = 0; i < arraysize(cases); ++i) {
|
| + EXPECT_TRUE(BreakEquals(render_text->colors(), color));
|
| + EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), true));
|
| + EXPECT_TRUE(BreakEquals(render_text->styles(UNDERLINE), false));
|
| + render_text->SetText(WideToUTF16(cases[i]));
|
| +
|
| + // Ensure custom default styles can be applied after text has been set.
|
| + if (i == 1)
|
| + render_text->SetStyle(STRIKE, true);
|
| + if (i >= 1)
|
| + EXPECT_TRUE(BreakEquals(render_text->styles(STRIKE), true));
|
| + }
|
| }
|
|
|
| -TEST_F(RenderTextTest, ApplyStyleRange) {
|
| +TEST_F(RenderTextTest, ApplyInvalidOrEmptyRange) {
|
| scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
|
| - render_text->SetText(ASCIIToUTF16("01234"));
|
| - EXPECT_EQ(1U, render_text->style_ranges().size());
|
| -
|
| - // Test ApplyStyleRange (no-op on empty range).
|
| - StyleRange empty;
|
| - empty.range = ui::Range(1, 1);
|
| - render_text->ApplyStyleRange(empty);
|
| - EXPECT_EQ(1U, render_text->style_ranges().size());
|
| -
|
| - // Test ApplyStyleRange (no-op on invalid range).
|
| - StyleRange invalid;
|
| - invalid.range = ui::Range::InvalidRange();
|
| - render_text->ApplyStyleRange(invalid);
|
| - EXPECT_EQ(1U, render_text->style_ranges().size());
|
| -
|
| - // Apply a style with a range contained by an existing range.
|
| - StyleRange underline;
|
| - underline.underline = true;
|
| - underline.range = ui::Range(2, 3);
|
| - render_text->ApplyStyleRange(underline);
|
| - EXPECT_EQ(3U, render_text->style_ranges().size());
|
| - EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range);
|
| - EXPECT_FALSE(render_text->style_ranges()[0].underline);
|
| - EXPECT_EQ(ui::Range(2, 3), render_text->style_ranges()[1].range);
|
| - EXPECT_TRUE(render_text->style_ranges()[1].underline);
|
| - EXPECT_EQ(ui::Range(3, 5), render_text->style_ranges()[2].range);
|
| - EXPECT_FALSE(render_text->style_ranges()[2].underline);
|
| -
|
| - // Apply a style with a range equal to another range.
|
| - StyleRange color;
|
| - color.foreground = SK_ColorWHITE;
|
| - color.range = ui::Range(2, 3);
|
| - render_text->ApplyStyleRange(color);
|
| - EXPECT_EQ(3U, render_text->style_ranges().size());
|
| - EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range);
|
| - EXPECT_NE(SK_ColorWHITE, render_text->style_ranges()[0].foreground);
|
| - EXPECT_FALSE(render_text->style_ranges()[0].underline);
|
| - EXPECT_EQ(ui::Range(2, 3), render_text->style_ranges()[1].range);
|
| - EXPECT_EQ(SK_ColorWHITE, render_text->style_ranges()[1].foreground);
|
| - EXPECT_FALSE(render_text->style_ranges()[1].underline);
|
| - EXPECT_EQ(ui::Range(3, 5), render_text->style_ranges()[2].range);
|
| - EXPECT_NE(SK_ColorWHITE, render_text->style_ranges()[2].foreground);
|
| - EXPECT_FALSE(render_text->style_ranges()[2].underline);
|
| -
|
| - // Apply a style with a range containing an existing range.
|
| - // This new style also overlaps portions of neighboring ranges.
|
| - StyleRange strike;
|
| - strike.strike = true;
|
| - strike.range = ui::Range(1, 4);
|
| - render_text->ApplyStyleRange(strike);
|
| - EXPECT_EQ(3U, render_text->style_ranges().size());
|
| - EXPECT_EQ(ui::Range(0, 1), render_text->style_ranges()[0].range);
|
| - EXPECT_FALSE(render_text->style_ranges()[0].strike);
|
| - EXPECT_EQ(ui::Range(1, 4), render_text->style_ranges()[1].range);
|
| - EXPECT_TRUE(render_text->style_ranges()[1].strike);
|
| - EXPECT_EQ(ui::Range(4, 5), render_text->style_ranges()[2].range);
|
| - EXPECT_FALSE(render_text->style_ranges()[2].strike);
|
| -
|
| - // Apply a style overlapping all ranges.
|
| - StyleRange strike_underline;
|
| - strike_underline.strike = true;
|
| - strike_underline.underline = true;
|
| - strike_underline.range = ui::Range(0, render_text->text().length());
|
| - render_text->ApplyStyleRange(strike_underline);
|
| - EXPECT_EQ(1U, render_text->style_ranges().size());
|
| - EXPECT_EQ(ui::Range(0, 5), render_text->style_ranges()[0].range);
|
| - EXPECT_TRUE(render_text->style_ranges()[0].underline);
|
| - EXPECT_TRUE(render_text->style_ranges()[0].strike);
|
| -
|
| - // Apply the default style.
|
| - render_text->ApplyDefaultStyle();
|
| - EXPECT_EQ(1U, render_text->style_ranges().size());
|
| - EXPECT_EQ(ui::Range(0, 5), render_text->style_ranges()[0].range);
|
| - EXPECT_FALSE(render_text->style_ranges()[0].underline);
|
| - EXPECT_FALSE(render_text->style_ranges()[0].strike);
|
| -
|
| - // Apply new style range that contains the 2nd last old style range.
|
| - render_text->SetText(ASCIIToUTF16("abcdefghi"));
|
| - underline.range = ui::Range(0, 3);
|
| - render_text->ApplyStyleRange(underline);
|
| - color.range = ui::Range(3, 6);
|
| - render_text->ApplyStyleRange(color);
|
| - strike.range = ui::Range(6, 9);
|
| - render_text->ApplyStyleRange(strike);
|
| - EXPECT_EQ(3U, render_text->style_ranges().size());
|
| -
|
| - color.foreground = SK_ColorRED;
|
| - color.range = ui::Range(2, 8);
|
| - render_text->ApplyStyleRange(color);
|
| - EXPECT_EQ(3U, render_text->style_ranges().size());
|
| - EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range);
|
| - EXPECT_TRUE(render_text->style_ranges()[0].underline);
|
| - EXPECT_EQ(ui::Range(2, 8), render_text->style_ranges()[1].range);
|
| - EXPECT_EQ(SK_ColorRED, render_text->style_ranges()[1].foreground);
|
| - EXPECT_EQ(ui::Range(8, 9), render_text->style_ranges()[2].range);
|
| - EXPECT_TRUE(render_text->style_ranges()[2].strike);
|
| -
|
| - // Apply new style range that contains multiple old style ranges.
|
| - render_text->SetText(ASCIIToUTF16("abcdefghiopq"));
|
| - underline.range = ui::Range(0, 3);
|
| - render_text->ApplyStyleRange(underline);
|
| - color.range = ui::Range(3, 6);
|
| - render_text->ApplyStyleRange(color);
|
| - strike.range = ui::Range(6, 9);
|
| - render_text->ApplyStyleRange(strike);
|
| - strike_underline.range = ui::Range(9, 12);
|
| - render_text->ApplyStyleRange(strike_underline);
|
| - EXPECT_EQ(4U, render_text->style_ranges().size());
|
| -
|
| - color.foreground = SK_ColorRED;
|
| - color.range = ui::Range(2, 10);
|
| - render_text->ApplyStyleRange(color);
|
| - EXPECT_EQ(3U, render_text->style_ranges().size());
|
| - EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range);
|
| - EXPECT_TRUE(render_text->style_ranges()[0].underline);
|
| - EXPECT_EQ(ui::Range(2, 10), render_text->style_ranges()[1].range);
|
| - EXPECT_EQ(SK_ColorRED, render_text->style_ranges()[1].foreground);
|
| - EXPECT_EQ(ui::Range(10, 12), render_text->style_ranges()[2].range);
|
| - EXPECT_TRUE(render_text->style_ranges()[2].underline);
|
| - EXPECT_TRUE(render_text->style_ranges()[2].strike);
|
| + render_text->SetText(ASCIIToUTF16("012345678"));
|
| +
|
| + // Ensure ApplyStyle and ApplyColor no-op on empty ranges.
|
| + ui::Range empty_range = ui::Range(1, 1);
|
| + const SkColor color = SK_ColorBLACK;
|
| + render_text->ApplyColor(SK_ColorRED, empty_range);
|
| + EXPECT_TRUE(BreakEquals(render_text->colors(), color));
|
| + render_text->ApplyStyle(BOLD, true, empty_range);
|
| + EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), false));
|
| +
|
| + // Ensure ApplyStyle and ApplyColor no-op on invalid ranges.
|
| + ui::Range invalid_range = ui::Range::InvalidRange();
|
| + render_text->ApplyColor(SK_ColorRED, invalid_range);
|
| + EXPECT_TRUE(BreakEquals(render_text->colors(), color));
|
| + render_text->ApplyStyle(BOLD, true, invalid_range);
|
| + EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), false));
|
| }
|
|
|
| -static void SetTextWith2ExtraStyles(RenderText* render_text) {
|
| - render_text->SetText(ASCIIToUTF16("abcdefghi"));
|
| +TEST_F(RenderTextTest, ApplyStyle) {
|
| + scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
|
| + render_text->SetText(ASCIIToUTF16("012345678"));
|
|
|
| - StyleRange strike;
|
| - strike.strike = true;
|
| - strike.range = ui::Range(0, 3);
|
| - render_text->ApplyStyleRange(strike);
|
| + // Apply a style to a valid range, check breaks; repeating should be no-op.
|
| + std::vector<StyleBreak> expected;
|
| + expected.push_back(StyleBreak(0, false));
|
| + expected.push_back(StyleBreak(2, true));
|
| + expected.push_back(StyleBreak(3, false));
|
| + for (size_t i = 0; i < 2; ++i) {
|
| + render_text->ApplyStyle(BOLD, true, ui::Range(2, 3));
|
| + EXPECT_TRUE(BreaksEqual(render_text->styles(BOLD), expected));
|
| + }
|
|
|
| - StyleRange underline;
|
| - underline.underline = true;
|
| - underline.range = ui::Range(3, 6);
|
| - render_text->ApplyStyleRange(underline);
|
| + // Ensure setting a style overrides the ranged style.
|
| + render_text->SetStyle(BOLD, false);
|
| + EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), false));
|
| +
|
| + // Ensure applying a style that is already applied has no effect.
|
| + render_text->ApplyStyle(BOLD, false, ui::Range(0, 2));
|
| + render_text->ApplyStyle(BOLD, false, ui::Range(3, 6));
|
| + render_text->ApplyStyle(BOLD, false, ui::Range(7, 9));
|
| + EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), false));
|
| +
|
| + // Ensure applying an identical neighboring style merges the ranges.
|
| + render_text->ApplyStyle(BOLD, true, ui::Range(0, 3));
|
| + render_text->ApplyStyle(BOLD, true, ui::Range(3, 6));
|
| + render_text->ApplyStyle(BOLD, true, ui::Range(6, 9));
|
| + EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), true));
|
| +
|
| + // Ensure applying a style with the same range overrides the ranged style.
|
| + render_text->ApplyStyle(BOLD, false, ui::Range(2, 3));
|
| + render_text->ApplyStyle(BOLD, true, ui::Range(2, 3));
|
| + EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), true));
|
| +
|
| + // Ensure applying a style with a containing range overrides the ranged style.
|
| + render_text->ApplyStyle(BOLD, false, ui::Range(0, 1));
|
| + render_text->ApplyStyle(BOLD, false, ui::Range(2, 3));
|
| + render_text->ApplyStyle(BOLD, true, ui::Range(0, 3));
|
| + EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), true));
|
| + render_text->ApplyStyle(BOLD, false, ui::Range(4, 5));
|
| + render_text->ApplyStyle(BOLD, false, ui::Range(6, 7));
|
| + render_text->ApplyStyle(BOLD, false, ui::Range(8, 9));
|
| + render_text->ApplyStyle(BOLD, true, ui::Range(4, 9));
|
| + EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), true));
|
| +
|
| + // Ensure applying various overlapping styles yields the intended results.
|
| + render_text->ApplyStyle(BOLD, false, ui::Range(1, 4));
|
| + render_text->ApplyStyle(BOLD, false, ui::Range(5, 8));
|
| + render_text->ApplyStyle(BOLD, true, ui::Range(0, 2));
|
| + render_text->ApplyStyle(BOLD, true, ui::Range(3, 6));
|
| + render_text->ApplyStyle(BOLD, true, ui::Range(7, 9));
|
| + std::vector<StyleBreak> overlap;
|
| + overlap.push_back(StyleBreak(0, true));
|
| + overlap.push_back(StyleBreak(2, false));
|
| + overlap.push_back(StyleBreak(3, true));
|
| + overlap.push_back(StyleBreak(6, false));
|
| + overlap.push_back(StyleBreak(7, true));
|
| + EXPECT_TRUE(BreaksEqual(render_text->styles(BOLD), overlap));
|
| }
|
|
|
| -TEST_F(RenderTextTest, StyleRangesAdjust) {
|
| - // Test that style ranges adjust to the text size.
|
| +TEST_F(RenderTextTest, ResizeStyle) {
|
| + // Ensure styles adjust to accomodate text length changes.
|
| scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
|
| - render_text->SetText(ASCIIToUTF16("abcdef"));
|
| - EXPECT_EQ(1U, render_text->style_ranges().size());
|
| - EXPECT_EQ(ui::Range(0, 6), render_text->style_ranges()[0].range);
|
| -
|
| - // Test that the range is clipped to the length of shorter text.
|
| - render_text->SetText(ASCIIToUTF16("abc"));
|
| - EXPECT_EQ(1U, render_text->style_ranges().size());
|
| - EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range);
|
| -
|
| - // Test that the last range extends to the length of longer text.
|
| - StyleRange strike;
|
| - strike.strike = true;
|
| - strike.range = ui::Range(2, 3);
|
| - render_text->ApplyStyleRange(strike);
|
| - render_text->SetText(ASCIIToUTF16("abcdefghi"));
|
| - EXPECT_EQ(2U, render_text->style_ranges().size());
|
| - EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range);
|
| - EXPECT_EQ(ui::Range(2, 9), render_text->style_ranges()[1].range);
|
| - EXPECT_TRUE(render_text->style_ranges()[1].strike);
|
| -
|
| - // Test that ranges are removed if they're outside the range of shorter text.
|
| - render_text->SetText(ASCIIToUTF16("ab"));
|
| - EXPECT_EQ(1U, render_text->style_ranges().size());
|
| - EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range);
|
| - EXPECT_FALSE(render_text->style_ranges()[0].strike);
|
| -
|
| - // Test that previously removed ranges don't return.
|
| - render_text->SetText(ASCIIToUTF16("abcdef"));
|
| - EXPECT_EQ(1U, render_text->style_ranges().size());
|
| - EXPECT_EQ(ui::Range(0, 6), render_text->style_ranges()[0].range);
|
| - EXPECT_FALSE(render_text->style_ranges()[0].strike);
|
| -
|
| - // Test that ranges are removed correctly if they are outside the range of
|
| - // shorter text.
|
| - SetTextWith2ExtraStyles(render_text.get());
|
| - EXPECT_EQ(3U, render_text->style_ranges().size());
|
| -
|
| - render_text->SetText(ASCIIToUTF16("abcdefg"));
|
| - EXPECT_EQ(3U, render_text->style_ranges().size());
|
| - EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range);
|
| - EXPECT_EQ(ui::Range(3, 6), render_text->style_ranges()[1].range);
|
| - EXPECT_EQ(ui::Range(6, 7), render_text->style_ranges()[2].range);
|
| -
|
| - SetTextWith2ExtraStyles(render_text.get());
|
| - EXPECT_EQ(3U, render_text->style_ranges().size());
|
| -
|
| - render_text->SetText(ASCIIToUTF16("abcdef"));
|
| - EXPECT_EQ(2U, render_text->style_ranges().size());
|
| - EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range);
|
| - EXPECT_EQ(ui::Range(3, 6), render_text->style_ranges()[1].range);
|
| -
|
| - SetTextWith2ExtraStyles(render_text.get());
|
| - EXPECT_EQ(3U, render_text->style_ranges().size());
|
| -
|
| - render_text->SetText(ASCIIToUTF16("abcde"));
|
| - EXPECT_EQ(2U, render_text->style_ranges().size());
|
| - EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range);
|
| - EXPECT_EQ(ui::Range(3, 5), render_text->style_ranges()[1].range);
|
| -
|
| - SetTextWith2ExtraStyles(render_text.get());
|
| - EXPECT_EQ(3U, render_text->style_ranges().size());
|
| + render_text->SetText(ASCIIToUTF16("012345678"));
|
| + render_text->ApplyStyle(BOLD, true, ui::Range(0, 2));
|
| + render_text->ApplyStyle(BOLD, true, ui::Range(3, 6));
|
| + render_text->ApplyStyle(BOLD, true, ui::Range(7, 9));
|
| +
|
| + std::vector<StyleBreak> expected;
|
| + expected.push_back(StyleBreak(0, true));
|
| + expected.push_back(StyleBreak(2, false));
|
| + expected.push_back(StyleBreak(3, true));
|
| + expected.push_back(StyleBreak(6, false));
|
| + expected.push_back(StyleBreak(7, true));
|
| + EXPECT_TRUE(BreaksEqual(render_text->styles(BOLD), expected));
|
| +
|
| + // Truncating the text should trim any corresponding breaks.
|
| + render_text->SetText(ASCIIToUTF16("0123456"));
|
| + expected.resize(4);
|
| + EXPECT_TRUE(BreaksEqual(render_text->styles(BOLD), expected));
|
| + render_text->SetText(ASCIIToUTF16("01234"));
|
| + expected.resize(3);
|
| + EXPECT_TRUE(BreaksEqual(render_text->styles(BOLD), expected));
|
|
|
| - render_text->SetText(ASCIIToUTF16("abc"));
|
| - EXPECT_EQ(1U, render_text->style_ranges().size());
|
| - EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range);
|
| + // Appending text should extend the terminal styles without changing breaks.
|
| + render_text->SetText(ASCIIToUTF16("012345678"));
|
| + EXPECT_TRUE(BreaksEqual(render_text->styles(BOLD), expected));
|
| +}
|
|
|
| - SetTextWith2ExtraStyles(render_text.get());
|
| - EXPECT_EQ(3U, render_text->style_ranges().size());
|
| +TEST_F(RenderTextTest, ApplyColor) {
|
| + scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
|
| + render_text->SetText(ASCIIToUTF16("012345678"));
|
| +
|
| + // Apply a color to a valid range, check breaks; repeating should be no-op.
|
| + ui::Range valid_range = ui::Range(2, 3);
|
| + std::vector<ColorBreak> expected;
|
| + expected.push_back(ColorBreak(0, SK_ColorBLACK));
|
| + expected.push_back(ColorBreak(2, SK_ColorRED));
|
| + expected.push_back(ColorBreak(3, SK_ColorBLACK));
|
| + for (size_t i = 0; i < 2; ++i) {
|
| + render_text->ApplyColor(SK_ColorRED, valid_range);
|
| + EXPECT_TRUE(BreaksEqual(render_text->colors(), expected));
|
| + }
|
|
|
| - render_text->SetText(ASCIIToUTF16("a"));
|
| - EXPECT_EQ(1U, render_text->style_ranges().size());
|
| - EXPECT_EQ(ui::Range(0, 1), render_text->style_ranges()[0].range);
|
| + // Ensure setting a color overrides the ranged color.
|
| + render_text->SetColor(SK_ColorBLUE);
|
| + EXPECT_TRUE(BreakEquals(render_text->colors(), SK_ColorBLUE));
|
| +
|
| + // Ensure applying a color that is already applied has no effect.
|
| + render_text->ApplyColor(SK_ColorBLUE, ui::Range(0, 2));
|
| + render_text->ApplyColor(SK_ColorBLUE, ui::Range(3, 6));
|
| + render_text->ApplyColor( SK_ColorBLUE, ui::Range(7, 9));
|
| + EXPECT_TRUE(BreakEquals(render_text->colors(), SK_ColorBLUE));
|
| +
|
| + // Ensure applying an identical neighboring color merges the ranges.
|
| + render_text->ApplyColor(SK_ColorRED, ui::Range(0, 3));
|
| + render_text->ApplyColor(SK_ColorRED, ui::Range(3, 6));
|
| + render_text->ApplyColor(SK_ColorRED, ui::Range(6, 9));
|
| + EXPECT_TRUE(BreakEquals(render_text->colors(), SK_ColorRED));
|
| +
|
| + // Ensure applying a color with the same range overrides the ranged color.
|
| + render_text->ApplyColor(SK_ColorGREEN, ui::Range(2, 3));
|
| + render_text->ApplyColor(SK_ColorRED, ui::Range(2, 3));
|
| + EXPECT_TRUE(BreakEquals(render_text->colors(), SK_ColorRED));
|
| +
|
| + // Ensure applying a color with a containing range overrides the ranged color.
|
| + render_text->ApplyColor(SK_ColorGREEN, ui::Range(0, 1));
|
| + render_text->ApplyColor(SK_ColorGREEN, ui::Range(2, 3));
|
| + render_text->ApplyColor(SK_ColorRED, ui::Range(0, 3));
|
| + EXPECT_TRUE(BreakEquals(render_text->colors(), SK_ColorRED));
|
| + render_text->ApplyColor(SK_ColorGREEN, ui::Range(4, 5));
|
| + render_text->ApplyColor(SK_ColorGREEN, ui::Range(6, 7));
|
| + render_text->ApplyColor(SK_ColorGREEN, ui::Range(8, 9));
|
| + render_text->ApplyColor(SK_ColorRED, ui::Range(4, 9));
|
| + EXPECT_TRUE(BreakEquals(render_text->colors(), SK_ColorRED));
|
| +
|
| + // Ensure applying various overlapping colors yields the intended results.
|
| + render_text->ApplyColor(SK_ColorGREEN, ui::Range(1, 4));
|
| + render_text->ApplyColor(SK_ColorGREEN, ui::Range(5, 8));
|
| + render_text->ApplyColor(SK_ColorBLUE, ui::Range(0, 2));
|
| + render_text->ApplyColor(SK_ColorBLUE, ui::Range(3, 6));
|
| + render_text->ApplyColor(SK_ColorBLUE, ui::Range(7, 9));
|
| + std::vector<ColorBreak> overlap;
|
| + overlap.push_back(ColorBreak(0, SK_ColorBLUE));
|
| + overlap.push_back(ColorBreak(2, SK_ColorGREEN));
|
| + overlap.push_back(ColorBreak(3, SK_ColorBLUE));
|
| + overlap.push_back(ColorBreak(6, SK_ColorGREEN));
|
| + overlap.push_back(ColorBreak(7, SK_ColorBLUE));
|
| + EXPECT_TRUE(BreaksEqual(render_text->colors(), overlap));
|
| }
|
|
|
| // TODO(asvitkine): Cursor movements tests disabled on Mac because RenderTextMac
|
| @@ -1051,33 +1015,23 @@ TEST_F(RenderTextTest, StringSizeBoldWidth) {
|
| EXPECT_GT(plain_width, 0);
|
|
|
| // Apply a bold style and check that the new width is greater.
|
| - StyleRange bold;
|
| - bold.font_style |= Font::BOLD;
|
| - render_text->set_default_style(bold);
|
| - render_text->ApplyDefaultStyle();
|
| -
|
| + render_text->SetStyle(gfx::BOLD, true);
|
| const int bold_width = render_text->GetStringSize().width();
|
| EXPECT_GT(bold_width, plain_width);
|
|
|
| // Now, apply a plain style over the first word only.
|
| - StyleRange plain;
|
| - plain.font_style = Font::NORMAL;
|
| - plain.range = ui::Range(0, 5);
|
| - render_text->ApplyStyleRange(plain);
|
| -
|
| + render_text->ApplyStyle(gfx::BOLD, false, ui::Range(0, 5));
|
| const int plain_bold_width = render_text->GetStringSize().width();
|
| EXPECT_GT(plain_bold_width, plain_width);
|
| EXPECT_LT(plain_bold_width, bold_width);
|
| }
|
|
|
| TEST_F(RenderTextTest, StringSizeHeight) {
|
| - struct {
|
| - string16 text;
|
| - } cases[] = {
|
| - { WideToUTF16(L"Hello World!") }, // English
|
| - { WideToUTF16(L"\x6328\x62f6") }, // Japanese
|
| - { WideToUTF16(L"\x0915\x093f") }, // Hindi
|
| - { WideToUTF16(L"\x05e0\x05b8") }, // Hebrew
|
| + string16 cases[] = {
|
| + WideToUTF16(L"Hello World!"), // English
|
| + WideToUTF16(L"\x6328\x62f6"), // Japanese
|
| + WideToUTF16(L"\x0915\x093f"), // Hindi
|
| + WideToUTF16(L"\x05e0\x05b8"), // Hebrew
|
| };
|
|
|
| Font default_font;
|
| @@ -1087,7 +1041,7 @@ TEST_F(RenderTextTest, StringSizeHeight) {
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) {
|
| scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
|
| render_text->SetFont(default_font);
|
| - render_text->SetText(cases[i].text);
|
| + render_text->SetText(cases[i]);
|
|
|
| const int height1 = render_text->GetStringSize().height();
|
| EXPECT_GT(height1, 0);
|
|
|