Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(256)

Side by Side Diff: ui/gfx/render_text_unittest.cc

Issue 16867016: Windows implementation of multiline RenderText (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Mike's comments 2 Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/gfx/render_text.h" 5 #include "ui/gfx/render_text.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/format_macros.h"
9 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
10 #include "base/strings/stringprintf.h" 11 #include "base/strings/stringprintf.h"
11 #include "base/strings/utf_string_conversions.h" 12 #include "base/strings/utf_string_conversions.h"
12 #include "testing/gtest/include/gtest/gtest.h" 13 #include "testing/gtest/include/gtest/gtest.h"
13 #include "ui/gfx/break_list.h" 14 #include "ui/gfx/break_list.h"
14 #include "ui/gfx/canvas.h" 15 #include "ui/gfx/canvas.h"
15 16
16 #if defined(OS_WIN) 17 #if defined(OS_WIN)
17 #include "base/win/windows_version.h" 18 #include "base/win/windows_version.h"
18 #include "ui/gfx/render_text_win.h" 19 #include "ui/gfx/render_text_win.h"
(...skipping 1268 matching lines...) Expand 10 before | Expand all | Expand 10 after
1287 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1288 scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
1288 render_text->SetText(ASCIIToUTF16("abcdefg")); 1289 render_text->SetText(ASCIIToUTF16("abcdefg"));
1289 render_text->SetFontList(FontList("Arial, 13px")); 1290 render_text->SetFontList(FontList("Arial, 13px"));
1290 1291
1291 // Set display area's size equal to the font size. 1292 // Set display area's size equal to the font size.
1292 const Size font_size(render_text->GetContentWidth(), 1293 const Size font_size(render_text->GetContentWidth(),
1293 render_text->GetStringSize().height()); 1294 render_text->GetStringSize().height());
1294 Rect display_rect(font_size); 1295 Rect display_rect(font_size);
1295 render_text->SetDisplayRect(display_rect); 1296 render_text->SetDisplayRect(display_rect);
1296 1297
1297 Vector2d offset = render_text->GetTextOffset(); 1298 Vector2d offset = render_text->GetLineOffset(0);
1298 EXPECT_TRUE(offset.IsZero()); 1299 EXPECT_TRUE(offset.IsZero());
1299 1300
1300 // Set display area's size greater than font size. 1301 // Set display area's size greater than font size.
1301 const int kEnlargement = 2; 1302 const int kEnlargement = 2;
1302 display_rect.Inset(0, 0, -kEnlargement, -kEnlargement); 1303 display_rect.Inset(0, 0, -kEnlargement, -kEnlargement);
1303 render_text->SetDisplayRect(display_rect); 1304 render_text->SetDisplayRect(display_rect);
1304 1305
1305 // Check the default horizontal and vertical alignment. 1306 // Check the default horizontal and vertical alignment.
1306 offset = render_text->GetTextOffset(); 1307 offset = render_text->GetLineOffset(0);
1307 EXPECT_EQ(kEnlargement / 2, offset.y()); 1308 EXPECT_EQ(kEnlargement / 2, offset.y());
1308 EXPECT_EQ(0, offset.x()); 1309 EXPECT_EQ(0, offset.x());
1309 1310
1310 // Check explicitly setting the horizontal alignment. 1311 // Check explicitly setting the horizontal alignment.
1311 render_text->SetHorizontalAlignment(ALIGN_LEFT); 1312 render_text->SetHorizontalAlignment(ALIGN_LEFT);
1312 offset = render_text->GetTextOffset(); 1313 offset = render_text->GetLineOffset(0);
1313 EXPECT_EQ(0, offset.x()); 1314 EXPECT_EQ(0, offset.x());
1314 render_text->SetHorizontalAlignment(ALIGN_CENTER); 1315 render_text->SetHorizontalAlignment(ALIGN_CENTER);
1315 offset = render_text->GetTextOffset(); 1316 offset = render_text->GetLineOffset(0);
1316 EXPECT_EQ(kEnlargement / 2, offset.x()); 1317 EXPECT_EQ(kEnlargement / 2, offset.x());
1317 render_text->SetHorizontalAlignment(ALIGN_RIGHT); 1318 render_text->SetHorizontalAlignment(ALIGN_RIGHT);
1318 offset = render_text->GetTextOffset(); 1319 offset = render_text->GetLineOffset(0);
1319 EXPECT_EQ(kEnlargement, offset.x()); 1320 EXPECT_EQ(kEnlargement, offset.x());
1320 1321
1321 // Check explicitly setting the vertical alignment. 1322 // Check explicitly setting the vertical alignment.
1322 render_text->SetVerticalAlignment(ALIGN_TOP); 1323 render_text->SetVerticalAlignment(ALIGN_TOP);
1323 offset = render_text->GetTextOffset(); 1324 offset = render_text->GetLineOffset(0);
1324 EXPECT_EQ(0, offset.y()); 1325 EXPECT_EQ(0, offset.y());
1325 render_text->SetVerticalAlignment(ALIGN_VCENTER); 1326 render_text->SetVerticalAlignment(ALIGN_VCENTER);
1326 offset = render_text->GetTextOffset(); 1327 offset = render_text->GetLineOffset(0);
1327 EXPECT_EQ(kEnlargement / 2, offset.y()); 1328 EXPECT_EQ(kEnlargement / 2, offset.y());
1328 render_text->SetVerticalAlignment(ALIGN_BOTTOM); 1329 render_text->SetVerticalAlignment(ALIGN_BOTTOM);
1329 offset = render_text->GetTextOffset(); 1330 offset = render_text->GetLineOffset(0);
1330 EXPECT_EQ(kEnlargement, offset.y()); 1331 EXPECT_EQ(kEnlargement, offset.y());
1331 1332
1332 SetRTL(was_rtl); 1333 SetRTL(was_rtl);
1333 } 1334 }
1334 1335
1335 TEST_F(RenderTextTest, GetTextOffsetHorizontalDefaultInRTL) { 1336 TEST_F(RenderTextTest, GetTextOffsetHorizontalDefaultInRTL) {
1336 // This only checks the default horizontal alignment in RTL mode; all other 1337 // This only checks the default horizontal alignment in RTL mode; all other
1337 // GetTextOffset() attributes are checked by the test above. 1338 // GetLineOffset(0) attributes are checked by the test above.
1338 const bool was_rtl = base::i18n::IsRTL(); 1339 const bool was_rtl = base::i18n::IsRTL();
1339 SetRTL(true); 1340 SetRTL(true);
1340 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1341 scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
1341 render_text->SetText(ASCIIToUTF16("abcdefg")); 1342 render_text->SetText(ASCIIToUTF16("abcdefg"));
1342 render_text->SetFontList(FontList("Arial, 13px")); 1343 render_text->SetFontList(FontList("Arial, 13px"));
1343 const int kEnlargement = 2; 1344 const int kEnlargement = 2;
1344 const Size font_size(render_text->GetContentWidth() + kEnlargement, 1345 const Size font_size(render_text->GetContentWidth() + kEnlargement,
1345 render_text->GetStringSize().height()); 1346 render_text->GetStringSize().height());
1346 Rect display_rect(font_size); 1347 Rect display_rect(font_size);
1347 render_text->SetDisplayRect(display_rect); 1348 render_text->SetDisplayRect(display_rect);
1348 Vector2d offset = render_text->GetTextOffset(); 1349 Vector2d offset = render_text->GetLineOffset(0);
1349 EXPECT_EQ(kEnlargement, offset.x()); 1350 EXPECT_EQ(kEnlargement, offset.x());
1350 SetRTL(was_rtl); 1351 SetRTL(was_rtl);
1351 } 1352 }
1352 1353
1353 TEST_F(RenderTextTest, SameFontForParentheses) { 1354 TEST_F(RenderTextTest, SameFontForParentheses) {
1354 struct { 1355 struct {
1355 const char16 left_char; 1356 const char16 left_char;
1356 const char16 right_char; 1357 const char16 right_char;
1357 } punctuation_pairs[] = { 1358 } punctuation_pairs[] = {
1358 { '(', ')' }, 1359 { '(', ')' },
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
1644 const int expected_width = render_text->GetStringSize().width(); 1645 const int expected_width = render_text->GetStringSize().width();
1645 render_text->MoveCursorTo(SelectionModel(ui::Range(0, 1), CURSOR_FORWARD)); 1646 render_text->MoveCursorTo(SelectionModel(ui::Range(0, 1), CURSOR_FORWARD));
1646 EXPECT_EQ(expected_width, render_text->GetStringSize().width()); 1647 EXPECT_EQ(expected_width, render_text->GetStringSize().width());
1647 // Draw the text. It shouldn't hit any DCHECKs or crash. 1648 // Draw the text. It shouldn't hit any DCHECKs or crash.
1648 // See http://crbug.com/214150 1649 // See http://crbug.com/214150
1649 render_text->Draw(&canvas); 1650 render_text->Draw(&canvas);
1650 render_text->MoveCursorTo(SelectionModel(0, CURSOR_FORWARD)); 1651 render_text->MoveCursorTo(SelectionModel(0, CURSOR_FORWARD));
1651 } 1652 }
1652 } 1653 }
1653 1654
1655 #if defined(OS_WIN)
1656 // Ensure strings wrap onto multiple lines for a small available width.
1657 TEST_F(RenderTextTest, Multiline_MinWidth) {
1658 const wchar_t* kTestStrings[] = { kWeak, kLtr, kLtrRtl, kLtrRtlLtr, kRtl,
1659 kRtlLtr, kRtlLtrRtl };
1660
1661 scoped_ptr<RenderTextWin> render_text(
1662 static_cast<RenderTextWin*>(RenderText::CreateInstance()));
1663 render_text->SetDisplayRect(Rect(Point(), Size(1, 1000)));
1664 render_text->SetMultiline(true);
1665 Canvas canvas;
1666
1667 for (size_t i = 0; i < arraysize(kTestStrings); ++i) {
1668 SCOPED_TRACE(base::StringPrintf("kTestStrings[%" PRIuS "]", i));
1669 render_text->SetText(WideToUTF16(kTestStrings[i]));
1670 render_text->Draw(&canvas);
1671 EXPECT_GT(render_text->lines_.size(), 1U);
1672 }
1673 }
1674
1675 // Ensure strings wrap onto multiple lines for a normal available width.
1676 TEST_F(RenderTextTest, Multiline_NormalWidth) {
1677 const struct {
1678 const wchar_t* const text;
1679 const ui::Range first_line_char_range;
Alexei Svitkine (slow) 2013/09/12 00:38:08 Also, you'll need to re-base this. Range has been
ckocagil 2013/09/12 02:46:49 Done.
1680 const ui::Range second_line_char_range;
1681 } kTestStrings[] = {
1682 { L"abc defg hijkl", ui::Range(0, 9), ui::Range(9, 14) },
1683 { L"qwertyuiop", ui::Range(0, 8), ui::Range(8, 10) },
Alexei Svitkine (slow) 2013/09/12 00:37:00 Nit: Don't align.
msw 2013/09/12 02:39:15 I asked for this; it helps readability, but I'll c
1684 { L"\x0647\x0630\x0627 \x0647\x0648 \x0627\x0644\x0628\x0627\x0628",
1685 ui::Range(0, 7), ui::Range(7, 12) }
Alexei Svitkine (slow) 2013/09/12 00:37:00 Nit: Just indent this 4 more than the previous lin
msw 2013/09/12 02:39:15 ditto to my statement above.
1686 };
1687
1688 scoped_ptr<RenderTextWin> render_text(
1689 static_cast<RenderTextWin*>(RenderText::CreateInstance()));
1690 render_text->SetDisplayRect(Rect(Point(), Size(50, 1000)));
Alexei Svitkine (slow) 2013/09/12 00:37:00 Nit: You can just do Rect(50, 1000).
ckocagil 2013/09/12 02:46:49 Done, throughout.
1691 render_text->SetMultiline(true);
1692 Canvas canvas;
1693
1694 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestStrings); ++i) {
1695 SCOPED_TRACE(base::StringPrintf("kTestStrings[%" PRIuS "]", i));
1696 render_text->SetText(WideToUTF16(kTestStrings[i].text));
1697 render_text->Draw(&canvas);
1698 ASSERT_EQ(2U, render_text->lines_.size());
1699 ASSERT_EQ(1U, render_text->lines_[0].segments.size());
1700 EXPECT_EQ(kTestStrings[i].first_line_char_range,
1701 render_text->lines_[0].segments[0].char_range);
1702 ASSERT_EQ(1U, render_text->lines_[1].segments.size());
1703 EXPECT_EQ(kTestStrings[i].second_line_char_range,
1704 render_text->lines_[1].segments[0].char_range);
1705 }
1706 }
1707
1708 // Ensure strings don't wrap onto multiple lines for a sufficient available
1709 // width.
1710 TEST_F(RenderTextTest, Multiline_SufficientWidth) {
1711 const wchar_t* kTestStrings[] = { L"", L" ",
1712 L".", L" . ",
Alexei Svitkine (slow) 2013/09/12 00:37:00 Nit: This wrapping is off. Either move some string
ckocagil 2013/09/12 02:46:49 Done.
1713 L"abc", L"a b c",
1714 L"\x62E\x628\x632", L"\x62E \x628 \x632" };
1715
1716 scoped_ptr<RenderTextWin> render_text(
1717 static_cast<RenderTextWin*>(RenderText::CreateInstance()));
1718 render_text->SetDisplayRect(Rect(Point(), Size(30, 1000)));
1719 render_text->SetMultiline(true);
1720 Canvas canvas;
1721
1722 for (size_t i = 0; i < arraysize(kTestStrings); ++i) {
1723 SCOPED_TRACE(base::StringPrintf("kTestStrings[%" PRIuS "]", i));
1724 render_text->SetText(WideToUTF16(kTestStrings[i]));
1725 render_text->Draw(&canvas);
1726 EXPECT_EQ(1U, render_text->lines_.size());
1727 }
1728 }
1729 #endif // defined(OS_WIN)
1730
1654 } // namespace gfx 1731 } // namespace gfx
OLDNEW
« ui/gfx/render_text.h ('K') | « ui/gfx/render_text.cc ('k') | ui/gfx/render_text_win.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698