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

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: removed GetMultilineTextSize 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 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 EXPECT_EQ(expected[i], render_text->selection_model()); 73 EXPECT_EQ(expected[i], render_text->selection_model());
73 render_text->MoveCursor(CHARACTER_BREAK, direction, false); 74 render_text->MoveCursor(CHARACTER_BREAK, direction, false);
74 } 75 }
75 // Check that cursoring is clamped at the line edge. 76 // Check that cursoring is clamped at the line edge.
76 EXPECT_EQ(expected.back(), render_text->selection_model()); 77 EXPECT_EQ(expected.back(), render_text->selection_model());
77 // Check that it is the line edge. 78 // Check that it is the line edge.
78 render_text->MoveCursor(LINE_BREAK, direction, false); 79 render_text->MoveCursor(LINE_BREAK, direction, false);
79 EXPECT_EQ(expected.back(), render_text->selection_model()); 80 EXPECT_EQ(expected.back(), render_text->selection_model());
80 } 81 }
81 82
83 // For segments in the same run, checks the continuity and order of |x_range|
84 // and |char_range| fields.
85 #if defined(OS_WIN)
86 void CheckLineIntegrity(const std::vector<internal::Line>& lines,
87 const ScopedVector<internal::TextRun>& runs) {
88 size_t previous_segment_line = 0;
89 const internal::LineSegment* previous_segment = NULL;
90
91 for (size_t i = 0; i < lines.size(); ++i) {
92 SCOPED_TRACE(base::StringPrintf("line %" PRIuS, i));
93 for (size_t j = 0; j < lines[i].segments.size(); ++j) {
94 SCOPED_TRACE(base::StringPrintf("segment %" PRIuS, j));
95 const internal::LineSegment* segment = &lines[i].segments[j];
96 internal::TextRun* run = runs[segment->run];
97
98 if (!previous_segment) {
99 previous_segment = segment;
100 } else if (runs[previous_segment->run] != run) {
101 previous_segment = NULL;
102 } else {
103 SCOPED_TRACE(run->script_analysis.fRTL ? "RTL" : "LTR");
104 SCOPED_TRACE(std::string("current x_range: ") +
105 segment->x_range.ToString());
106 SCOPED_TRACE(std::string("previous x_range: ") +
107 previous_segment->x_range.ToString());
108
109 EXPECT_EQ(previous_segment->char_range.end(),
110 segment->char_range.start());
111 if (!run->script_analysis.fRTL)
112 EXPECT_EQ(previous_segment->x_range.end(), segment->x_range.start());
113 else if (i != previous_segment_line)
msw 2013/09/06 23:47:45 I realize that we shouldn't break a run into separ
ckocagil 2013/09/11 14:59:49 It doesn't seem necessary to me either. Done.
114 EXPECT_EQ(segment->x_range.end(), previous_segment->x_range.start());
115
116 previous_segment = segment;
117 previous_segment_line = i;
118 }
119 }
120 }
121 }
122 #endif // defined(OS_WIN)
123
82 } // namespace 124 } // namespace
83 125
84 class RenderTextTest : public testing::Test { 126 class RenderTextTest : public testing::Test {
85 }; 127 };
86 128
87 TEST_F(RenderTextTest, DefaultStyle) { 129 TEST_F(RenderTextTest, DefaultStyle) {
88 // Check the default styles applied to new instances and adjusted text. 130 // Check the default styles applied to new instances and adjusted text.
89 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 131 scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
90 EXPECT_TRUE(render_text->text().empty()); 132 EXPECT_TRUE(render_text->text().empty());
91 const wchar_t* const cases[] = { kWeak, kLtr, L"Hello", kRtl, L"", L"" }; 133 const wchar_t* const cases[] = { kWeak, kLtr, L"Hello", kRtl, L"", L"" };
(...skipping 1195 matching lines...) Expand 10 before | Expand all | Expand 10 after
1287 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1329 scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
1288 render_text->SetText(ASCIIToUTF16("abcdefg")); 1330 render_text->SetText(ASCIIToUTF16("abcdefg"));
1289 render_text->SetFontList(FontList("Arial, 13px")); 1331 render_text->SetFontList(FontList("Arial, 13px"));
1290 1332
1291 // Set display area's size equal to the font size. 1333 // Set display area's size equal to the font size.
1292 const Size font_size(render_text->GetContentWidth(), 1334 const Size font_size(render_text->GetContentWidth(),
1293 render_text->GetStringSize().height()); 1335 render_text->GetStringSize().height());
1294 Rect display_rect(font_size); 1336 Rect display_rect(font_size);
1295 render_text->SetDisplayRect(display_rect); 1337 render_text->SetDisplayRect(display_rect);
1296 1338
1297 Vector2d offset = render_text->GetTextOffset(); 1339 Vector2d offset = render_text->GetLineOffset(0);
1298 EXPECT_TRUE(offset.IsZero()); 1340 EXPECT_TRUE(offset.IsZero());
1299 1341
1300 // Set display area's size greater than font size. 1342 // Set display area's size greater than font size.
1301 const int kEnlargement = 2; 1343 const int kEnlargement = 2;
1302 display_rect.Inset(0, 0, -kEnlargement, -kEnlargement); 1344 display_rect.Inset(0, 0, -kEnlargement, -kEnlargement);
1303 render_text->SetDisplayRect(display_rect); 1345 render_text->SetDisplayRect(display_rect);
1304 1346
1305 // Check the default horizontal and vertical alignment. 1347 // Check the default horizontal and vertical alignment.
1306 offset = render_text->GetTextOffset(); 1348 offset = render_text->GetLineOffset(0);
1307 EXPECT_EQ(kEnlargement / 2, offset.y()); 1349 EXPECT_EQ(kEnlargement / 2, offset.y());
1308 EXPECT_EQ(0, offset.x()); 1350 EXPECT_EQ(0, offset.x());
1309 1351
1310 // Check explicitly setting the horizontal alignment. 1352 // Check explicitly setting the horizontal alignment.
1311 render_text->SetHorizontalAlignment(ALIGN_LEFT); 1353 render_text->SetHorizontalAlignment(ALIGN_LEFT);
1312 offset = render_text->GetTextOffset(); 1354 offset = render_text->GetLineOffset(0);
1313 EXPECT_EQ(0, offset.x()); 1355 EXPECT_EQ(0, offset.x());
1314 render_text->SetHorizontalAlignment(ALIGN_CENTER); 1356 render_text->SetHorizontalAlignment(ALIGN_CENTER);
1315 offset = render_text->GetTextOffset(); 1357 offset = render_text->GetLineOffset(0);
1316 EXPECT_EQ(kEnlargement / 2, offset.x()); 1358 EXPECT_EQ(kEnlargement / 2, offset.x());
1317 render_text->SetHorizontalAlignment(ALIGN_RIGHT); 1359 render_text->SetHorizontalAlignment(ALIGN_RIGHT);
1318 offset = render_text->GetTextOffset(); 1360 offset = render_text->GetLineOffset(0);
1319 EXPECT_EQ(kEnlargement, offset.x()); 1361 EXPECT_EQ(kEnlargement, offset.x());
1320 1362
1321 // Check explicitly setting the vertical alignment. 1363 // Check explicitly setting the vertical alignment.
1322 render_text->SetVerticalAlignment(ALIGN_TOP); 1364 render_text->SetVerticalAlignment(ALIGN_TOP);
1323 offset = render_text->GetTextOffset(); 1365 offset = render_text->GetLineOffset(0);
1324 EXPECT_EQ(0, offset.y()); 1366 EXPECT_EQ(0, offset.y());
1325 render_text->SetVerticalAlignment(ALIGN_VCENTER); 1367 render_text->SetVerticalAlignment(ALIGN_VCENTER);
1326 offset = render_text->GetTextOffset(); 1368 offset = render_text->GetLineOffset(0);
1327 EXPECT_EQ(kEnlargement / 2, offset.y()); 1369 EXPECT_EQ(kEnlargement / 2, offset.y());
1328 render_text->SetVerticalAlignment(ALIGN_BOTTOM); 1370 render_text->SetVerticalAlignment(ALIGN_BOTTOM);
1329 offset = render_text->GetTextOffset(); 1371 offset = render_text->GetLineOffset(0);
1330 EXPECT_EQ(kEnlargement, offset.y()); 1372 EXPECT_EQ(kEnlargement, offset.y());
1331 1373
1332 SetRTL(was_rtl); 1374 SetRTL(was_rtl);
1333 } 1375 }
1334 1376
1335 TEST_F(RenderTextTest, GetTextOffsetHorizontalDefaultInRTL) { 1377 TEST_F(RenderTextTest, GetTextOffsetHorizontalDefaultInRTL) {
1336 // This only checks the default horizontal alignment in RTL mode; all other 1378 // This only checks the default horizontal alignment in RTL mode; all other
1337 // GetTextOffset() attributes are checked by the test above. 1379 // GetLineOffset(0) attributes are checked by the test above.
1338 const bool was_rtl = base::i18n::IsRTL(); 1380 const bool was_rtl = base::i18n::IsRTL();
1339 SetRTL(true); 1381 SetRTL(true);
1340 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1382 scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
1341 render_text->SetText(ASCIIToUTF16("abcdefg")); 1383 render_text->SetText(ASCIIToUTF16("abcdefg"));
1342 render_text->SetFontList(FontList("Arial, 13px")); 1384 render_text->SetFontList(FontList("Arial, 13px"));
1343 const int kEnlargement = 2; 1385 const int kEnlargement = 2;
1344 const Size font_size(render_text->GetContentWidth() + kEnlargement, 1386 const Size font_size(render_text->GetContentWidth() + kEnlargement,
1345 render_text->GetStringSize().height()); 1387 render_text->GetStringSize().height());
1346 Rect display_rect(font_size); 1388 Rect display_rect(font_size);
1347 render_text->SetDisplayRect(display_rect); 1389 render_text->SetDisplayRect(display_rect);
1348 Vector2d offset = render_text->GetTextOffset(); 1390 Vector2d offset = render_text->GetLineOffset(0);
1349 EXPECT_EQ(kEnlargement, offset.x()); 1391 EXPECT_EQ(kEnlargement, offset.x());
1350 SetRTL(was_rtl); 1392 SetRTL(was_rtl);
1351 } 1393 }
1352 1394
1353 TEST_F(RenderTextTest, SameFontForParentheses) { 1395 TEST_F(RenderTextTest, SameFontForParentheses) {
1354 struct { 1396 struct {
1355 const char16 left_char; 1397 const char16 left_char;
1356 const char16 right_char; 1398 const char16 right_char;
1357 } punctuation_pairs[] = { 1399 } punctuation_pairs[] = {
1358 { '(', ')' }, 1400 { '(', ')' },
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
1644 const int expected_width = render_text->GetStringSize().width(); 1686 const int expected_width = render_text->GetStringSize().width();
1645 render_text->MoveCursorTo(SelectionModel(ui::Range(0, 1), CURSOR_FORWARD)); 1687 render_text->MoveCursorTo(SelectionModel(ui::Range(0, 1), CURSOR_FORWARD));
1646 EXPECT_EQ(expected_width, render_text->GetStringSize().width()); 1688 EXPECT_EQ(expected_width, render_text->GetStringSize().width());
1647 // Draw the text. It shouldn't hit any DCHECKs or crash. 1689 // Draw the text. It shouldn't hit any DCHECKs or crash.
1648 // See http://crbug.com/214150 1690 // See http://crbug.com/214150
1649 render_text->Draw(&canvas); 1691 render_text->Draw(&canvas);
1650 render_text->MoveCursorTo(SelectionModel(0, CURSOR_FORWARD)); 1692 render_text->MoveCursorTo(SelectionModel(0, CURSOR_FORWARD));
1651 } 1693 }
1652 } 1694 }
1653 1695
1696 #if defined(OS_WIN)
1697 TEST_F(RenderTextTest, Multiline_MinWidth) {
msw 2013/09/06 23:47:45 I'm looking forward to many more tests. Can you ad
ckocagil 2013/09/11 14:59:49 Done.
1698 const wchar_t* kTestStrings[] = { kWeak, kLtr, kLtrRtl, kLtrRtlLtr, kRtl,
1699 kRtlLtr, kRtlLtrRtl };
1700
1701 scoped_ptr<RenderTextWin> render_text(
1702 static_cast<RenderTextWin*>(RenderText::CreateInstance()));
1703 render_text->SetDisplayRect(Rect(Point(), Size(1, 1000)));
1704 render_text->SetMultiline(true);
1705 Canvas canvas;
1706
1707 for (size_t i = 0; i < arraysize(kTestStrings); ++i) {
1708 SCOPED_TRACE(base::StringPrintf("kTestStrings[%" PRIuS "]", i));
1709 render_text->SetText(WideToUTF16(kTestStrings[i]));
1710 render_text->Draw(&canvas);
1711 CheckLineIntegrity(render_text->lines_, render_text->runs_);
msw 2013/09/06 23:47:45 Can you EXPECT_GT(render_text->lines_.size(), 1U)
ckocagil 2013/09/11 14:59:49 Done.
1712 }
1713 }
1714
1715 TEST_F(RenderTextTest, Multiline_NormalWidth) {
1716 const struct {
1717 wchar_t* text;
msw 2013/09/06 23:47:45 nit: make all these members const.
ckocagil 2013/09/11 14:59:49 Done.
1718 ui::Range first_line;
msw 2013/09/06 23:47:45 nit: |first_line_char_range| and |second_line_char
ckocagil 2013/09/11 14:59:49 Done.
1719 ui::Range second_line;
1720 } kTestStrings[] = {
1721 { L"abc defg hijkl", ui::Range(0, 9), ui::Range(9, 14) },
1722 { L"qwertyuiop", ui::Range(0, 8), ui::Range(8, 10) },
msw 2013/09/06 23:47:45 nit: indent the ui::Range entries to match, even o
ckocagil 2013/09/11 14:59:49 Done.
1723 { L"\x0647\x0630\x0627 \x0647\x0648 \x0627\x0644\x0628\x0627\x0628",
1724 ui::Range(0, 7), ui::Range(7, 12) }
1725 };
1726
1727 scoped_ptr<RenderTextWin> render_text(
1728 static_cast<RenderTextWin*>(RenderText::CreateInstance()));
1729 render_text->SetDisplayRect(Rect(Point(), Size(50, 1000)));
1730 render_text->SetMultiline(true);
1731 Canvas canvas;
1732
1733 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestStrings); ++i) {
1734 SCOPED_TRACE(base::StringPrintf("kTestStrings[%" PRIuS "]", i));
1735 render_text->SetText(WideToUTF16(kTestStrings[i].text));
1736 render_text->Draw(&canvas);
1737 CheckLineIntegrity(render_text->lines_, render_text->runs_);
1738 ASSERT_EQ(2U, render_text->lines_.size());
1739 ASSERT_EQ(1U, render_text->lines_[0].segments.size());
1740 EXPECT_EQ(kTestStrings[i].first_line,
1741 render_text->lines_[0].segments[0].char_range);
1742 ASSERT_EQ(1U, render_text->lines_[1].segments.size());
1743 EXPECT_EQ(kTestStrings[i].second_line,
1744 render_text->lines_[1].segments[0].char_range);
1745 }
1746 }
1747 #endif // defined(OS_WIN)
1748
1654 } // namespace gfx 1749 } // namespace gfx
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698