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

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: comments addressed Created 7 years, 4 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/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/strings/stringprintf.h" 10 #include "base/strings/stringprintf.h"
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 EXPECT_EQ(expected[i], render_text->selection_model()); 72 EXPECT_EQ(expected[i], render_text->selection_model());
73 render_text->MoveCursor(CHARACTER_BREAK, direction, false); 73 render_text->MoveCursor(CHARACTER_BREAK, direction, false);
74 } 74 }
75 // Check that cursoring is clamped at the line edge. 75 // Check that cursoring is clamped at the line edge.
76 EXPECT_EQ(expected.back(), render_text->selection_model()); 76 EXPECT_EQ(expected.back(), render_text->selection_model());
77 // Check that it is the line edge. 77 // Check that it is the line edge.
78 render_text->MoveCursor(LINE_BREAK, direction, false); 78 render_text->MoveCursor(LINE_BREAK, direction, false);
79 EXPECT_EQ(expected.back(), render_text->selection_model()); 79 EXPECT_EQ(expected.back(), render_text->selection_model());
80 } 80 }
81 81
82 #if defined(OS_WIN)
83 bool CheckLineIntegrity(const std::vector<internal::Line>& lines,
84 const ScopedVector<internal::TextRun>& runs) {
85 size_t previous_segment_line = 0;
86 const internal::LineSegment* previous_segment = NULL;
87
88 for (size_t i = 0; i < lines.size(); ++i)
89 for (size_t j = 0; j < lines[i].segments.size(); ++j) {
90 const internal::LineSegment* const segment = &lines[i].segments[j];
91 internal::TextRun* const run = runs[segment->run];
92
93 if (!previous_segment || runs[previous_segment->run] != run) {
94 previous_segment = 0;
95 } else {
96 if (!run->script_analysis.fRTL) {
97 if (previous_segment->x_pos.end() != segment->x_pos.start())
98 return false;
99 } else if (i != previous_segment_line) {
100 if (segment->x_pos.end() != previous_segment->x_pos.start())
101 return false;
102 }
103
104 previous_segment = segment;
105 previous_segment_line = i;
106 }
107 }
108
109 return true;
110 }
111 #endif // defined(OS_WIN)
112
82 } // namespace 113 } // namespace
83 114
84 class RenderTextTest : public testing::Test { 115 class RenderTextTest : public testing::Test {
85 }; 116 };
86 117
87 TEST_F(RenderTextTest, DefaultStyle) { 118 TEST_F(RenderTextTest, DefaultStyle) {
88 // Check the default styles applied to new instances and adjusted text. 119 // Check the default styles applied to new instances and adjusted text.
89 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 120 scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
90 EXPECT_TRUE(render_text->text().empty()); 121 EXPECT_TRUE(render_text->text().empty());
91 const wchar_t* const cases[] = { kWeak, kLtr, L"Hello", kRtl, L"", L"" }; 122 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()); 1318 scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
1288 render_text->SetText(ASCIIToUTF16("abcdefg")); 1319 render_text->SetText(ASCIIToUTF16("abcdefg"));
1289 render_text->SetFontList(FontList("Arial, 13px")); 1320 render_text->SetFontList(FontList("Arial, 13px"));
1290 1321
1291 // Set display area's size equal to the font size. 1322 // Set display area's size equal to the font size.
1292 const Size font_size(render_text->GetContentWidth(), 1323 const Size font_size(render_text->GetContentWidth(),
1293 render_text->GetStringSize().height()); 1324 render_text->GetStringSize().height());
1294 Rect display_rect(font_size); 1325 Rect display_rect(font_size);
1295 render_text->SetDisplayRect(display_rect); 1326 render_text->SetDisplayRect(display_rect);
1296 1327
1297 Vector2d offset = render_text->GetTextOffset(); 1328 Vector2d offset = render_text->GetLineOffset(0);
1298 EXPECT_TRUE(offset.IsZero()); 1329 EXPECT_TRUE(offset.IsZero());
1299 1330
1300 // Set display area's size greater than font size. 1331 // Set display area's size greater than font size.
1301 const int kEnlargement = 2; 1332 const int kEnlargement = 2;
1302 display_rect.Inset(0, 0, -kEnlargement, -kEnlargement); 1333 display_rect.Inset(0, 0, -kEnlargement, -kEnlargement);
1303 render_text->SetDisplayRect(display_rect); 1334 render_text->SetDisplayRect(display_rect);
1304 1335
1305 // Check the default horizontal and vertical alignment. 1336 // Check the default horizontal and vertical alignment.
1306 offset = render_text->GetTextOffset(); 1337 offset = render_text->GetLineOffset(0);
1307 EXPECT_EQ(kEnlargement / 2, offset.y()); 1338 EXPECT_EQ(kEnlargement / 2, offset.y());
1308 EXPECT_EQ(0, offset.x()); 1339 EXPECT_EQ(0, offset.x());
1309 1340
1310 // Check explicitly setting the horizontal alignment. 1341 // Check explicitly setting the horizontal alignment.
1311 render_text->SetHorizontalAlignment(ALIGN_LEFT); 1342 render_text->SetHorizontalAlignment(ALIGN_LEFT);
1312 offset = render_text->GetTextOffset(); 1343 offset = render_text->GetLineOffset(0);
1313 EXPECT_EQ(0, offset.x()); 1344 EXPECT_EQ(0, offset.x());
1314 render_text->SetHorizontalAlignment(ALIGN_CENTER); 1345 render_text->SetHorizontalAlignment(ALIGN_CENTER);
1315 offset = render_text->GetTextOffset(); 1346 offset = render_text->GetLineOffset(0);
1316 EXPECT_EQ(kEnlargement / 2, offset.x()); 1347 EXPECT_EQ(kEnlargement / 2, offset.x());
1317 render_text->SetHorizontalAlignment(ALIGN_RIGHT); 1348 render_text->SetHorizontalAlignment(ALIGN_RIGHT);
1318 offset = render_text->GetTextOffset(); 1349 offset = render_text->GetLineOffset(0);
1319 EXPECT_EQ(kEnlargement, offset.x()); 1350 EXPECT_EQ(kEnlargement, offset.x());
1320 1351
1321 // Check explicitly setting the vertical alignment. 1352 // Check explicitly setting the vertical alignment.
1322 render_text->SetVerticalAlignment(ALIGN_TOP); 1353 render_text->SetVerticalAlignment(ALIGN_TOP);
1323 offset = render_text->GetTextOffset(); 1354 offset = render_text->GetLineOffset(0);
1324 EXPECT_EQ(0, offset.y()); 1355 EXPECT_EQ(0, offset.y());
1325 render_text->SetVerticalAlignment(ALIGN_VCENTER); 1356 render_text->SetVerticalAlignment(ALIGN_VCENTER);
1326 offset = render_text->GetTextOffset(); 1357 offset = render_text->GetLineOffset(0);
1327 EXPECT_EQ(kEnlargement / 2, offset.y()); 1358 EXPECT_EQ(kEnlargement / 2, offset.y());
1328 render_text->SetVerticalAlignment(ALIGN_BOTTOM); 1359 render_text->SetVerticalAlignment(ALIGN_BOTTOM);
1329 offset = render_text->GetTextOffset(); 1360 offset = render_text->GetLineOffset(0);
1330 EXPECT_EQ(kEnlargement, offset.y()); 1361 EXPECT_EQ(kEnlargement, offset.y());
1331 1362
1332 SetRTL(was_rtl); 1363 SetRTL(was_rtl);
1333 } 1364 }
1334 1365
1335 TEST_F(RenderTextTest, GetTextOffsetHorizontalDefaultInRTL) { 1366 TEST_F(RenderTextTest, GetTextOffsetHorizontalDefaultInRTL) {
1336 // This only checks the default horizontal alignment in RTL mode; all other 1367 // This only checks the default horizontal alignment in RTL mode; all other
1337 // GetTextOffset() attributes are checked by the test above. 1368 // GetLineOffset(0) attributes are checked by the test above.
1338 const bool was_rtl = base::i18n::IsRTL(); 1369 const bool was_rtl = base::i18n::IsRTL();
1339 SetRTL(true); 1370 SetRTL(true);
1340 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1371 scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
1341 render_text->SetText(ASCIIToUTF16("abcdefg")); 1372 render_text->SetText(ASCIIToUTF16("abcdefg"));
1342 render_text->SetFontList(FontList("Arial, 13px")); 1373 render_text->SetFontList(FontList("Arial, 13px"));
1343 const int kEnlargement = 2; 1374 const int kEnlargement = 2;
1344 const Size font_size(render_text->GetContentWidth() + kEnlargement, 1375 const Size font_size(render_text->GetContentWidth() + kEnlargement,
1345 render_text->GetStringSize().height()); 1376 render_text->GetStringSize().height());
1346 Rect display_rect(font_size); 1377 Rect display_rect(font_size);
1347 render_text->SetDisplayRect(display_rect); 1378 render_text->SetDisplayRect(display_rect);
1348 Vector2d offset = render_text->GetTextOffset(); 1379 Vector2d offset = render_text->GetLineOffset(0);
1349 EXPECT_EQ(kEnlargement, offset.x()); 1380 EXPECT_EQ(kEnlargement, offset.x());
1350 SetRTL(was_rtl); 1381 SetRTL(was_rtl);
1351 } 1382 }
1352 1383
1353 TEST_F(RenderTextTest, SameFontForParentheses) { 1384 TEST_F(RenderTextTest, SameFontForParentheses) {
1354 struct { 1385 struct {
1355 const char16 left_char; 1386 const char16 left_char;
1356 const char16 right_char; 1387 const char16 right_char;
1357 } punctuation_pairs[] = { 1388 } punctuation_pairs[] = {
1358 { '(', ')' }, 1389 { '(', ')' },
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
1644 const int expected_width = render_text->GetStringSize().width(); 1675 const int expected_width = render_text->GetStringSize().width();
1645 render_text->MoveCursorTo(SelectionModel(ui::Range(0, 1), CURSOR_FORWARD)); 1676 render_text->MoveCursorTo(SelectionModel(ui::Range(0, 1), CURSOR_FORWARD));
1646 EXPECT_EQ(expected_width, render_text->GetStringSize().width()); 1677 EXPECT_EQ(expected_width, render_text->GetStringSize().width());
1647 // Draw the text. It shouldn't hit any DCHECKs or crash. 1678 // Draw the text. It shouldn't hit any DCHECKs or crash.
1648 // See http://crbug.com/214150 1679 // See http://crbug.com/214150
1649 render_text->Draw(&canvas); 1680 render_text->Draw(&canvas);
1650 render_text->MoveCursorTo(SelectionModel(0, CURSOR_FORWARD)); 1681 render_text->MoveCursorTo(SelectionModel(0, CURSOR_FORWARD));
1651 } 1682 }
1652 } 1683 }
1653 1684
1685 #if defined(OS_WIN)
1686 TEST_F(RenderTextTest, Multiline) {
1687 const wchar_t* kTestStrings[] = { kWeak, kLtr, kLtrRtl, kLtrRtlLtr, kRtl,
1688 kRtlLtr, kRtlLtrRtl };
Alexei Svitkine (slow) 2013/08/16 18:32:34 Nit: Align with previous line.
ckocagil 2013/08/20 00:09:06 Done.
1689
1690 scoped_ptr<RenderTextWin> render_text(
1691 static_cast<RenderTextWin*>(RenderText::CreateInstance()));
1692 render_text->SetDisplayRect(Rect());
1693 render_text->SetMultiline(true);
1694 Canvas canvas;
1695
1696 for (size_t i = 0; i < arraysize(kTestStrings); ++i) {
1697 render_text->SetText(WideToUTF16(kTestStrings[i]));
1698 render_text->Draw(&canvas);
1699 EXPECT_TRUE(CheckLineIntegrity(render_text->lines_, render_text->runs_)) <<
1700 "For kTestStrings[" << i << "]";
1701 }
1702 }
1703 #endif // defined(OS_WIN)
1704
1654 } // namespace gfx 1705 } // namespace gfx
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698