summaryrefslogtreecommitdiffstats
path: root/ui/gfx/render_text_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ui/gfx/render_text_unittest.cc')
-rw-r--r--ui/gfx/render_text_unittest.cc180
1 files changed, 180 insertions, 0 deletions
diff --git a/ui/gfx/render_text_unittest.cc b/ui/gfx/render_text_unittest.cc
new file mode 100644
index 0000000..e809d41
--- /dev/null
+++ b/ui/gfx/render_text_unittest.cc
@@ -0,0 +1,180 @@
+// Copyright (c) 2011 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 "ui/gfx/render_text.h"
+
+#include "base/utf_string_conversions.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace gfx {
+
+class RenderTextTest : public testing::Test {
+};
+
+TEST_F(RenderTextTest, DefaultStyle) {
+ // Defaults to empty text with no styles.
+ gfx::RenderText* render_text = gfx::RenderText::CreateRenderText();
+ 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());
+ gfx::StyleRange style;
+ EXPECT_EQ(style.font.GetFontName(),
+ render_text->style_ranges()[0].font.GetFontName());
+ 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());
+}
+
+TEST_F(RenderTextTest, CustomDefaultStyle) {
+ // Test a custom default style.
+ gfx::RenderText* render_text = gfx::RenderText::CreateRenderText();
+ gfx::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.
+ gfx::StyleRange strike;
+ strike.strike = true;
+ render_text->set_default_style(strike);
+ render_text->ApplyDefaultStyle();
+ EXPECT_EQ(1U, render_text->style_ranges().size());
+ EXPECT_EQ(true, render_text->style_ranges()[0].strike);
+ EXPECT_EQ(strike.foreground, render_text->style_ranges()[0].foreground);
+}
+
+TEST_F(RenderTextTest, ApplyStyleRange) {
+ gfx::RenderText* render_text = gfx::RenderText::CreateRenderText();
+ render_text->SetText(ASCIIToUTF16("01234"));
+ EXPECT_EQ(1U, render_text->style_ranges().size());
+
+ // Test ApplyStyleRange (no-op on empty range).
+ gfx::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).
+ gfx::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.
+ gfx::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.
+ gfx::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.
+ gfx::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.
+ gfx::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);
+}
+
+TEST_F(RenderTextTest, StyleRangesAdjust) {
+ // Test that style ranges adjust to the text size.
+ gfx::RenderText* render_text = gfx::RenderText::CreateRenderText();
+ 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.
+ gfx::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);
+}
+
+} // namespace gfx