Chromium Code Reviews| Index: ui/gfx/render_text_unittest.cc |
| diff --git a/ui/gfx/render_text_unittest.cc b/ui/gfx/render_text_unittest.cc |
| index f947d754d385a0436167d5b8f8f6a4c83bb4b60e..69ebd7da86f2faadc71ffe32f05991cbdd205a82 100644 |
| --- a/ui/gfx/render_text_unittest.cc |
| +++ b/ui/gfx/render_text_unittest.cc |
| @@ -80,6 +80,18 @@ void RunMoveCursorLeftRightTest(RenderText* render_text, |
| } |
| #endif // !defined(OS_MACOSX) |
| +// Test utility for Multiline_Newline test case. Empty |expected_range| means |
| +// the blank line which has no segments. Otherwise |segments| should contain |
| +// exactly one line segment whose range equals to |expected_range|. |
| +void VerifyLineSegments(const Range& expected_range, |
| + const std::vector<internal::LineSegment>& segments, |
| + const std::string& message) { |
| + EXPECT_EQ(expected_range.length() == 0 ? 0ul : 1ul, segments.size()) |
|
msw
2015/02/05 23:49:46
nit: expected_range.is_empty(), ditto below.
Jun Mukai
2015/02/06 01:00:53
Done.
|
| + << message; |
| + if (expected_range.length() != 0) |
| + EXPECT_EQ(expected_range, segments[0].char_range) << message; |
| +} |
| + |
| } // namespace |
| class RenderTextTest : public testing::Test { |
| @@ -1863,121 +1875,134 @@ TEST_F(RenderTextTest, SelectionKeepsLigatures) { |
| } |
| } |
| -// TODO(ckocagil): Enable for RenderTextHarfBuzz after implementing multiline. |
| // Ensure strings wrap onto multiple lines for a small available width. |
| -TEST_F(RenderTextTest, DISABLED_Multiline_MinWidth) { |
| +TEST_F(RenderTextTest, Multiline_MinWidth) { |
| const wchar_t* kTestStrings[] = { kWeak, kLtr, kLtrRtl, kLtrRtlLtr, kRtl, |
| kRtlLtr, kRtlLtrRtl }; |
| - scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| - render_text->SetDisplayRect(Rect(1, 1000)); |
| - render_text->SetMultiline(true); |
| + RenderTextHarfBuzz render_text; |
| + render_text.SetDisplayRect(Rect(1, 1000)); |
| + render_text.SetMultiline(true); |
| Canvas canvas; |
| for (size_t i = 0; i < arraysize(kTestStrings); ++i) { |
| SCOPED_TRACE(base::StringPrintf("kTestStrings[%" PRIuS "]", i)); |
| - render_text->SetText(WideToUTF16(kTestStrings[i])); |
| - render_text->Draw(&canvas); |
| - EXPECT_GT(render_text->lines_.size(), 1U); |
| + render_text.SetText(WideToUTF16(kTestStrings[i])); |
| + render_text.Draw(&canvas); |
| + EXPECT_GT(render_text.lines_.size(), 1U); |
| } |
| } |
| -// TODO(ckocagil): Enable for RenderTextHarfBuzz after implementing multiline. |
| // Ensure strings wrap onto multiple lines for a normal available width. |
| -TEST_F(RenderTextTest, DISABLED_Multiline_NormalWidth) { |
| +TEST_F(RenderTextTest, Multiline_NormalWidth) { |
| const struct { |
| const wchar_t* const text; |
| const Range first_line_char_range; |
| const Range second_line_char_range; |
| } kTestStrings[] = { |
| { L"abc defg hijkl", Range(0, 9), Range(9, 14) }, |
| - { L"qwertyzxcvbn", Range(0, 8), Range(8, 12) }, |
| - { L"\x062A\x0641\x0627\x062D\x05EA\x05E4\x05D5\x05D6\x05D9\x05DD", |
| - Range(4, 10), Range(0, 4) } |
| + { L"qwertyzxcvbn", Range(0, 10), Range(10, 12) }, |
| + { L"\x062A\x0641\x0627\x062D\x05EA\x05E4\x05D5\x05D6\x05D9" |
| + L"\x05DA\x05DB\x05DD", Range(4, 12), Range(0, 4) } |
| }; |
| - scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| - render_text->SetDisplayRect(Rect(50, 1000)); |
| - render_text->SetMultiline(true); |
| + RenderTextHarfBuzz render_text; |
| + // Specify the fixed width for characters to suppress the possible variations |
| + // of linebreak results. |
| + render_text.set_glyph_width_for_test(5); |
| + render_text.SetDisplayRect(Rect(50, 1000)); |
| + render_text.SetMultiline(true); |
| Canvas canvas; |
| for (size_t i = 0; i < arraysize(kTestStrings); ++i) { |
| SCOPED_TRACE(base::StringPrintf("kTestStrings[%" PRIuS "]", i)); |
| - render_text->SetText(WideToUTF16(kTestStrings[i].text)); |
| - render_text->Draw(&canvas); |
| - ASSERT_EQ(2U, render_text->lines_.size()); |
| - ASSERT_EQ(1U, render_text->lines_[0].segments.size()); |
| + render_text.SetText(WideToUTF16(kTestStrings[i].text)); |
| + render_text.Draw(&canvas); |
| + ASSERT_EQ(2U, render_text.lines_.size()); |
| + ASSERT_EQ(1U, render_text.lines_[0].segments.size()); |
| EXPECT_EQ(kTestStrings[i].first_line_char_range, |
| - render_text->lines_[0].segments[0].char_range); |
| - ASSERT_EQ(1U, render_text->lines_[1].segments.size()); |
| + render_text.lines_[0].segments[0].char_range); |
| + ASSERT_EQ(1U, render_text.lines_[1].segments.size()); |
| EXPECT_EQ(kTestStrings[i].second_line_char_range, |
| - render_text->lines_[1].segments[0].char_range); |
| + render_text.lines_[1].segments[0].char_range); |
| } |
| } |
| -// TODO(ckocagil): Enable for RenderTextHarfBuzz after implementing multiline. |
| // Ensure strings don't wrap onto multiple lines for a sufficient available |
| // width. |
| -TEST_F(RenderTextTest, DISABLED_Multiline_SufficientWidth) { |
| +TEST_F(RenderTextTest, Multiline_SufficientWidth) { |
| const wchar_t* kTestStrings[] = { L"", L" ", L".", L" . ", L"abc", L"a b c", |
| L"\x62E\x628\x632", L"\x62E \x628 \x632" }; |
| - scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| - render_text->SetDisplayRect(Rect(30, 1000)); |
| - render_text->SetMultiline(true); |
| + RenderTextHarfBuzz render_text; |
| + render_text.SetDisplayRect(Rect(1000, 1000)); |
| + render_text.SetMultiline(true); |
| Canvas canvas; |
| for (size_t i = 0; i < arraysize(kTestStrings); ++i) { |
| SCOPED_TRACE(base::StringPrintf("kTestStrings[%" PRIuS "]", i)); |
| - render_text->SetText(WideToUTF16(kTestStrings[i])); |
| - render_text->Draw(&canvas); |
| - EXPECT_EQ(1U, render_text->lines_.size()); |
| + render_text.SetText(WideToUTF16(kTestStrings[i])); |
| + render_text.Draw(&canvas); |
| + EXPECT_EQ(1U, render_text.lines_.size()); |
| } |
| } |
| -// TODO(ckocagil): Enable for RenderTextHarfBuzz after implementing multiline. |
| -TEST_F(RenderTextTest, DISABLED_Multiline_Newline) { |
| +TEST_F(RenderTextTest, Multiline_Newline) { |
| const struct { |
| const wchar_t* const text; |
| + const size_t lines_count; |
| // Ranges of the characters on each line preceding the newline. |
| const Range first_line_char_range; |
| const Range second_line_char_range; |
| + const Range third_line_char_range; |
| } kTestStrings[] = { |
| - { L"abc\ndef", Range(0, 3), Range(4, 7) }, |
| - { L"a \n b ", Range(0, 2), Range(3, 6) }, |
| - { L"\n" , Range::InvalidRange(), Range::InvalidRange() } |
| + {L"abc\ndef", 2ul, Range(0, 3), Range(4, 7), Range::InvalidRange()}, |
| + {L"a \n b ", 2ul, Range(0, 2), Range(3, 6), Range::InvalidRange()}, |
| + {L"ab\n", 2ul, Range(0, 2), Range(), Range::InvalidRange()}, |
| + {L"a\n\nb", 3ul, Range(0, 1), Range(), Range(3, 4)}, |
| + {L"\nab", 2ul, Range(), Range(1, 3), Range::InvalidRange()}, |
| + {L"\n", 2ul, Range(), Range(), Range::InvalidRange()}, |
| }; |
| - scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| - render_text->SetDisplayRect(Rect(200, 1000)); |
| - render_text->SetMultiline(true); |
| + RenderTextHarfBuzz render_text; |
| + render_text.SetDisplayRect(Rect(200, 1000)); |
| + render_text.SetMultiline(true); |
| Canvas canvas; |
| for (size_t i = 0; i < arraysize(kTestStrings); ++i) { |
| SCOPED_TRACE(base::StringPrintf("kTestStrings[%" PRIuS "]", i)); |
| - render_text->SetText(WideToUTF16(kTestStrings[i].text)); |
| - render_text->Draw(&canvas); |
| + render_text.SetText(WideToUTF16(kTestStrings[i].text)); |
| + render_text.Draw(&canvas); |
| + EXPECT_EQ(kTestStrings[i].lines_count, render_text.lines_.size()); |
| + if (kTestStrings[i].lines_count != render_text.lines_.size()) |
| + continue; |
| + |
| + VerifyLineSegments(kTestStrings[i].first_line_char_range, |
|
msw
2015/02/05 23:49:47
optional nit: Make kTestStrings contain an array o
Jun Mukai
2015/02/06 01:00:53
Done.
|
| + render_text.lines_[0].segments, "first line"); |
| + VerifyLineSegments(kTestStrings[i].second_line_char_range, |
| + render_text.lines_[1].segments, "second line"); |
| + if (kTestStrings[i].lines_count > 2) { |
| + VerifyLineSegments(kTestStrings[i].third_line_char_range, |
| + render_text.lines_[2].segments, "third line"); |
| + } |
| + } |
| +} |
| + |
| +TEST_F(RenderTextTest, NewlineWithoutMultilineFlag) { |
| + const wchar_t* kTestStrings[] = { |
| + L"abc\ndef", L"a \n b ", L"ab\n", L"a\n\nb", L"\nab", L"\n", |
| + }; |
| + |
| + RenderTextHarfBuzz render_text; |
| + render_text.SetDisplayRect(Rect(200, 1000)); |
| + Canvas canvas; |
| + |
| + for (size_t i = 0; i < arraysize(kTestStrings); ++i) { |
| + SCOPED_TRACE(base::StringPrintf("kTestStrings[%" PRIuS "]", i)); |
| + render_text.SetText(WideToUTF16(kTestStrings[i])); |
| + render_text.Draw(&canvas); |
| - ASSERT_EQ(2U, render_text->lines_.size()); |
| - |
| - const Range first_expected_range = kTestStrings[i].first_line_char_range; |
| - ASSERT_EQ(first_expected_range.IsValid() ? 2U : 1U, |
| - render_text->lines_[0].segments.size()); |
| - if (first_expected_range.IsValid()) |
| - EXPECT_EQ(first_expected_range, |
| - render_text->lines_[0].segments[0].char_range); |
| - |
| - const internal::LineSegment& newline_segment = |
| - render_text->lines_[0].segments[first_expected_range.IsValid() ? 1 : 0]; |
| - ASSERT_EQ(1U, newline_segment.char_range.length()); |
| - EXPECT_EQ(L'\n', kTestStrings[i].text[newline_segment.char_range.start()]); |
| - |
| - const Range second_expected_range = kTestStrings[i].second_line_char_range; |
| - ASSERT_EQ(second_expected_range.IsValid() ? 1U : 0U, |
| - render_text->lines_[1].segments.size()); |
| - if (second_expected_range.IsValid()) |
| - EXPECT_EQ(second_expected_range, |
| - render_text->lines_[1].segments[0].char_range); |
| + EXPECT_EQ(1U, render_text.lines_.size()); |
| } |
| } |