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

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

Issue 312233003: Add fade eliding for Views Labels; related cleanup. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Refine alignment check; minor additional cleanup. Created 6 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « ui/gfx/text_elider.cc ('k') | ui/message_center/cocoa/notification_controller.mm » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 // Unit tests for eliding and formatting utility functions. 5 // Unit tests for eliding and formatting utility functions.
6 6
7 #include "ui/gfx/text_elider.h" 7 #include "ui/gfx/text_elider.h"
8 8
9 #include "base/files/file_path.h" 9 #include "base/files/file_path.h"
10 #include "base/i18n/rtl.h" 10 #include "base/i18n/rtl.h"
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 // the domain must elide to "l..." and not "l...l" as it must allow enough 99 // the domain must elide to "l..." and not "l...l" as it must allow enough
100 // space for the minimal username elision although its half of the 100 // space for the minimal username elision although its half of the
101 // available width would normally allow it to elide to "l...l". 101 // available width would normally allow it to elide to "l...l".
102 {"mmmmm@llllllllll", "m" + kEllipsisStr + "@l" + kEllipsisStr}, 102 {"mmmmm@llllllllll", "m" + kEllipsisStr + "@l" + kEllipsisStr},
103 }; 103 };
104 104
105 const FontList font_list; 105 const FontList font_list;
106 for (size_t i = 0; i < arraysize(testcases); ++i) { 106 for (size_t i = 0; i < arraysize(testcases); ++i) {
107 const base::string16 expected_output = UTF8ToUTF16(testcases[i].output); 107 const base::string16 expected_output = UTF8ToUTF16(testcases[i].output);
108 EXPECT_EQ(expected_output, 108 EXPECT_EQ(expected_output,
109 ElideEmail( 109 ElideText(UTF8ToUTF16(testcases[i].input), font_list,
110 UTF8ToUTF16(testcases[i].input), 110 GetStringWidthF(expected_output, font_list),
111 font_list, 111 ELIDE_EMAIL));
112 GetStringWidthF(expected_output, font_list)));
113 } 112 }
114 } 113 }
115 114
116 // TODO(338784): Enable this on android. 115 // TODO(338784): Enable this on android.
117 #if defined(OS_ANDROID) 116 #if defined(OS_ANDROID)
118 #define MAYBE_ElideEmailMoreSpace DISABLED_ElideEmailMoreSpace 117 #define MAYBE_ElideEmailMoreSpace DISABLED_ElideEmailMoreSpace
119 #else 118 #else
120 #define MAYBE_ElideEmailMoreSpace ElideEmailMoreSpace 119 #define MAYBE_ElideEmailMoreSpace ElideEmailMoreSpace
121 #endif 120 #endif
122 TEST(TextEliderTest, MAYBE_ElideEmailMoreSpace) { 121 TEST(TextEliderTest, MAYBE_ElideEmailMoreSpace) {
123 const int test_width_factors[] = { 122 const int test_width_factors[] = {
124 100, 123 100,
125 10000, 124 10000,
126 1000000, 125 1000000,
127 }; 126 };
128 const std::string test_emails[] = { 127 const std::string test_emails[] = {
129 "a@c", 128 "a@c",
130 "test@email.com", 129 "test@email.com",
131 "short@verysuperdupperlongdomain.com", 130 "short@verysuperdupperlongdomain.com",
132 "supermegalongusername@withasuperlonnnggggdomain.gouv.qc.ca", 131 "supermegalongusername@withasuperlonnnggggdomain.gouv.qc.ca",
133 }; 132 };
134 133
135 const FontList font_list; 134 const FontList font_list;
136 for (size_t i = 0; i < arraysize(test_width_factors); ++i) { 135 for (size_t i = 0; i < arraysize(test_width_factors); ++i) {
137 const int test_width = 136 const int test_width =
138 font_list.GetExpectedTextWidth(test_width_factors[i]); 137 font_list.GetExpectedTextWidth(test_width_factors[i]);
139 for (size_t j = 0; j < arraysize(test_emails); ++j) { 138 for (size_t j = 0; j < arraysize(test_emails); ++j) {
140 // Extra space is available: the email should not be elided. 139 // Extra space is available: the email should not be elided.
141 const base::string16 test_email = UTF8ToUTF16(test_emails[j]); 140 const base::string16 test_email = UTF8ToUTF16(test_emails[j]);
142 EXPECT_EQ(test_email, ElideEmail(test_email, font_list, test_width)); 141 EXPECT_EQ(test_email,
142 ElideText(test_email, font_list, test_width, ELIDE_EMAIL));
143 } 143 }
144 } 144 }
145 } 145 }
146 146
147 // TODO(ios): This test fails on iOS because iOS version of GetStringWidthF 147 // TODO(ios): This test fails on iOS because iOS version of GetStringWidthF
148 // that calls [NSString sizeWithFont] returns the rounded string width. 148 // that calls [NSString sizeWithFont] returns the rounded string width.
149 // TODO(338784): Enable this on android. 149 // TODO(338784): Enable this on android.
150 #if defined(OS_IOS) || defined(OS_ANDROID) 150 #if defined(OS_IOS) || defined(OS_ANDROID)
151 #define MAYBE_TestFilenameEliding DISABLED_TestFilenameEliding 151 #define MAYBE_TestFilenameEliding DISABLED_TestFilenameEliding
152 #else 152 #else
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 { "", 0, "" }, 218 { "", 0, "" },
219 { "Test", 0, "" }, 219 { "Test", 0, "" },
220 { "", kTestWidth, "" }, 220 { "", kTestWidth, "" },
221 { "Tes", kTestWidth, "Tes" }, 221 { "Tes", kTestWidth, "Tes" },
222 { "Test", kTestWidth, "Test" }, 222 { "Test", kTestWidth, "Test" },
223 { "Tests", kTestWidth, "Test" }, 223 { "Tests", kTestWidth, "Test" },
224 }; 224 };
225 225
226 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { 226 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
227 base::string16 result = ElideText(UTF8ToUTF16(cases[i].input), font_list, 227 base::string16 result = ElideText(UTF8ToUTF16(cases[i].input), font_list,
228 cases[i].width, TRUNCATE_AT_END); 228 cases[i].width, TRUNCATE);
229 EXPECT_EQ(cases[i].output, UTF16ToUTF8(result)); 229 EXPECT_EQ(cases[i].output, UTF16ToUTF8(result));
230 } 230 }
231 } 231 }
232 232
233 // TODO(338784): Enable this on android. 233 // TODO(338784): Enable this on android.
234 #if defined(OS_ANDROID) 234 #if defined(OS_ANDROID)
235 #define MAYBE_ElideTextEllipsis DISABLED_ElideTextEllipsis 235 #define MAYBE_ElideTextEllipsis DISABLED_ElideTextEllipsis
236 #else 236 #else
237 #define MAYBE_ElideTextEllipsis ElideTextEllipsis 237 #define MAYBE_ElideTextEllipsis ElideTextEllipsis
238 #endif 238 #endif
(...skipping 11 matching lines...) Expand all
250 { "", 0, "" }, 250 { "", 0, "" },
251 { "Test", 0, "" }, 251 { "Test", 0, "" },
252 { "Test", kEllipsisWidth, kEllipsis }, 252 { "Test", kEllipsisWidth, kEllipsis },
253 { "", kTestWidth, "" }, 253 { "", kTestWidth, "" },
254 { "Tes", kTestWidth, "Tes" }, 254 { "Tes", kTestWidth, "Tes" },
255 { "Test", kTestWidth, "Test" }, 255 { "Test", kTestWidth, "Test" },
256 }; 256 };
257 257
258 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { 258 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
259 base::string16 result = ElideText(UTF8ToUTF16(cases[i].input), font_list, 259 base::string16 result = ElideText(UTF8ToUTF16(cases[i].input), font_list,
260 cases[i].width, ELIDE_AT_END); 260 cases[i].width, ELIDE_TAIL);
261 EXPECT_EQ(cases[i].output, UTF16ToUTF8(result)); 261 EXPECT_EQ(cases[i].output, UTF16ToUTF8(result));
262 } 262 }
263 } 263 }
264 264
265 // TODO(338784): Enable this on android. 265 // TODO(338784): Enable this on android.
266 #if defined(OS_ANDROID) 266 #if defined(OS_ANDROID)
267 #define MAYBE_ElideTextEllipsisFront DISABLED_ElideTextEllipsisFront 267 #define MAYBE_ElideTextEllipsisFront DISABLED_ElideTextEllipsisFront
268 #else 268 #else
269 #define MAYBE_ElideTextEllipsisFront ElideTextEllipsisFront 269 #define MAYBE_ElideTextEllipsisFront ElideTextEllipsisFront
270 #endif 270 #endif
(...skipping 14 matching lines...) Expand all
285 { "Test", 0, base::string16() }, 285 { "Test", 0, base::string16() },
286 { "Test", kEllipsisWidth, UTF8ToUTF16(kEllipsisStr) }, 286 { "Test", kEllipsisWidth, UTF8ToUTF16(kEllipsisStr) },
287 { "", kTestWidth, base::string16() }, 287 { "", kTestWidth, base::string16() },
288 { "Tes", kTestWidth, ASCIIToUTF16("Tes") }, 288 { "Tes", kTestWidth, ASCIIToUTF16("Tes") },
289 { "Test", kTestWidth, ASCIIToUTF16("Test") }, 289 { "Test", kTestWidth, ASCIIToUTF16("Test") },
290 { "Test123", kEllipsis23Width, UTF8ToUTF16(kEllipsisStr + "23") }, 290 { "Test123", kEllipsis23Width, UTF8ToUTF16(kEllipsisStr + "23") },
291 }; 291 };
292 292
293 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { 293 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
294 base::string16 result = ElideText(UTF8ToUTF16(cases[i].input), font_list, 294 base::string16 result = ElideText(UTF8ToUTF16(cases[i].input), font_list,
295 cases[i].width, ELIDE_AT_BEGINNING); 295 cases[i].width, ELIDE_HEAD);
296 EXPECT_EQ(cases[i].output, result); 296 EXPECT_EQ(cases[i].output, result);
297 } 297 }
298 } 298 }
299 299
300 // Checks that all occurrences of |first_char| are followed by |second_char| and 300 // Checks that all occurrences of |first_char| are followed by |second_char| and
301 // all occurrences of |second_char| are preceded by |first_char| in |text|. 301 // all occurrences of |second_char| are preceded by |first_char| in |text|.
302 static void CheckSurrogatePairs(const base::string16& text, 302 static void CheckSurrogatePairs(const base::string16& text,
303 base::char16 first_char, 303 base::char16 first_char,
304 base::char16 second_char) { 304 base::char16 second_char) {
305 size_t index = text.find_first_of(first_char); 305 size_t index = text.find_first_of(first_char);
(...skipping 24 matching lines...) Expand all
330 const base::string16 kTestString = 330 const base::string16 kTestString =
331 UTF8ToUTF16(kSurrogate + "ab" + kSurrogate + kSurrogate + "cd"); 331 UTF8ToUTF16(kSurrogate + "ab" + kSurrogate + kSurrogate + "cd");
332 const float kTestStringWidth = GetStringWidthF(kTestString, font_list); 332 const float kTestStringWidth = GetStringWidthF(kTestString, font_list);
333 const base::char16 kSurrogateFirstChar = kTestString[0]; 333 const base::char16 kSurrogateFirstChar = kTestString[0];
334 const base::char16 kSurrogateSecondChar = kTestString[1]; 334 const base::char16 kSurrogateSecondChar = kTestString[1];
335 base::string16 result; 335 base::string16 result;
336 336
337 // Elide |kTextString| to all possible widths and check that no instance of 337 // Elide |kTextString| to all possible widths and check that no instance of
338 // |kSurrogate| was split in two. 338 // |kSurrogate| was split in two.
339 for (float width = 0; width <= kTestStringWidth; width++) { 339 for (float width = 0; width <= kTestStringWidth; width++) {
340 result = ElideText(kTestString, font_list, width, TRUNCATE_AT_END); 340 result = ElideText(kTestString, font_list, width, TRUNCATE);
341 CheckSurrogatePairs(result, kSurrogateFirstChar, kSurrogateSecondChar); 341 CheckSurrogatePairs(result, kSurrogateFirstChar, kSurrogateSecondChar);
342 342
343 result = ElideText(kTestString, font_list, width, ELIDE_AT_END); 343 result = ElideText(kTestString, font_list, width, ELIDE_TAIL);
344 CheckSurrogatePairs(result, kSurrogateFirstChar, kSurrogateSecondChar); 344 CheckSurrogatePairs(result, kSurrogateFirstChar, kSurrogateSecondChar);
345 345
346 result = ElideText(kTestString, font_list, width, ELIDE_IN_MIDDLE); 346 result = ElideText(kTestString, font_list, width, ELIDE_MIDDLE);
347 CheckSurrogatePairs(result, kSurrogateFirstChar, kSurrogateSecondChar); 347 CheckSurrogatePairs(result, kSurrogateFirstChar, kSurrogateSecondChar);
348 348
349 result = ElideText(kTestString, font_list, width, ELIDE_AT_BEGINNING); 349 result = ElideText(kTestString, font_list, width, ELIDE_HEAD);
350 CheckSurrogatePairs(result, kSurrogateFirstChar, kSurrogateSecondChar); 350 CheckSurrogatePairs(result, kSurrogateFirstChar, kSurrogateSecondChar);
351 } 351 }
352 } 352 }
353 353
354 // TODO(338784): Enable this on android. 354 // TODO(338784): Enable this on android.
355 #if defined(OS_ANDROID) 355 #if defined(OS_ANDROID)
356 #define MAYBE_ElideTextLongStrings DISABLED_ElideTextLongStrings 356 #define MAYBE_ElideTextLongStrings DISABLED_ElideTextLongStrings
357 #else 357 #else
358 #define MAYBE_ElideTextLongStrings ElideTextLongStrings 358 #define MAYBE_ElideTextLongStrings ElideTextLongStrings
359 #endif 359 #endif
(...skipping 23 matching lines...) Expand all
383 { data_scheme + hundred_thousand_a, long_string_end }, 383 { data_scheme + hundred_thousand_a, long_string_end },
384 { data_scheme + million_a, long_string_end }, 384 { data_scheme + million_a, long_string_end },
385 }; 385 };
386 386
387 const FontList font_list; 387 const FontList font_list;
388 float ellipsis_width = GetStringWidthF(kEllipsisStr, font_list); 388 float ellipsis_width = GetStringWidthF(kEllipsisStr, font_list);
389 for (size_t i = 0; i < arraysize(testcases_end); ++i) { 389 for (size_t i = 0; i < arraysize(testcases_end); ++i) {
390 // Compare sizes rather than actual contents because if the test fails, 390 // Compare sizes rather than actual contents because if the test fails,
391 // output is rather long. 391 // output is rather long.
392 EXPECT_EQ(testcases_end[i].output.size(), 392 EXPECT_EQ(testcases_end[i].output.size(),
393 ElideText( 393 ElideText(testcases_end[i].input, font_list,
394 testcases_end[i].input, 394 GetStringWidthF(testcases_end[i].output, font_list),
395 font_list, 395 ELIDE_TAIL).size());
396 GetStringWidthF(testcases_end[i].output, font_list),
397 ELIDE_AT_END).size());
398 EXPECT_EQ(kEllipsisStr, 396 EXPECT_EQ(kEllipsisStr,
399 ElideText(testcases_end[i].input, font_list, ellipsis_width, 397 ElideText(testcases_end[i].input, font_list, ellipsis_width,
400 ELIDE_AT_END)); 398 ELIDE_TAIL));
401 } 399 }
402 400
403 size_t number_of_trailing_as = (data_scheme_length + number_of_as) / 2; 401 size_t number_of_trailing_as = (data_scheme_length + number_of_as) / 2;
404 base::string16 long_string_middle(data_scheme + 402 base::string16 long_string_middle(data_scheme +
405 base::string16(number_of_as - number_of_trailing_as, 'a') + kEllipsisStr + 403 base::string16(number_of_as - number_of_trailing_as, 'a') + kEllipsisStr +
406 base::string16(number_of_trailing_as, 'a')); 404 base::string16(number_of_trailing_as, 'a'));
407 UTF16Testcase testcases_middle[] = { 405 UTF16Testcase testcases_middle[] = {
408 { data_scheme + ten_a, data_scheme + ten_a }, 406 { data_scheme + ten_a, data_scheme + ten_a },
409 { data_scheme + hundred_a, data_scheme + hundred_a }, 407 { data_scheme + hundred_a, data_scheme + hundred_a },
410 { data_scheme + thousand_a, long_string_middle }, 408 { data_scheme + thousand_a, long_string_middle },
411 { data_scheme + ten_thousand_a, long_string_middle }, 409 { data_scheme + ten_thousand_a, long_string_middle },
412 { data_scheme + hundred_thousand_a, long_string_middle }, 410 { data_scheme + hundred_thousand_a, long_string_middle },
413 { data_scheme + million_a, long_string_middle }, 411 { data_scheme + million_a, long_string_middle },
414 }; 412 };
415 413
416 for (size_t i = 0; i < arraysize(testcases_middle); ++i) { 414 for (size_t i = 0; i < arraysize(testcases_middle); ++i) {
417 // Compare sizes rather than actual contents because if the test fails, 415 // Compare sizes rather than actual contents because if the test fails,
418 // output is rather long. 416 // output is rather long.
419 EXPECT_EQ(testcases_middle[i].output.size(), 417 EXPECT_EQ(testcases_middle[i].output.size(),
420 ElideText( 418 ElideText(testcases_middle[i].input, font_list,
421 testcases_middle[i].input, 419 GetStringWidthF(testcases_middle[i].output, font_list),
422 font_list, 420 ELIDE_MIDDLE).size());
423 GetStringWidthF(testcases_middle[i].output, font_list),
424 ELIDE_IN_MIDDLE).size());
425 EXPECT_EQ(kEllipsisStr, 421 EXPECT_EQ(kEllipsisStr,
426 ElideText(testcases_middle[i].input, font_list, ellipsis_width, 422 ElideText(testcases_middle[i].input, font_list, ellipsis_width,
427 ELIDE_IN_MIDDLE)); 423 ELIDE_MIDDLE));
428 } 424 }
429 425
430 base::string16 long_string_beginning( 426 base::string16 long_string_beginning(
431 kEllipsisStr + base::string16(number_of_as, 'a')); 427 kEllipsisStr + base::string16(number_of_as, 'a'));
432 UTF16Testcase testcases_beginning[] = { 428 UTF16Testcase testcases_beginning[] = {
433 { data_scheme + ten_a, data_scheme + ten_a }, 429 { data_scheme + ten_a, data_scheme + ten_a },
434 { data_scheme + hundred_a, data_scheme + hundred_a }, 430 { data_scheme + hundred_a, data_scheme + hundred_a },
435 { data_scheme + thousand_a, long_string_beginning }, 431 { data_scheme + thousand_a, long_string_beginning },
436 { data_scheme + ten_thousand_a, long_string_beginning }, 432 { data_scheme + ten_thousand_a, long_string_beginning },
437 { data_scheme + hundred_thousand_a, long_string_beginning }, 433 { data_scheme + hundred_thousand_a, long_string_beginning },
438 { data_scheme + million_a, long_string_beginning }, 434 { data_scheme + million_a, long_string_beginning },
439 }; 435 };
440 for (size_t i = 0; i < arraysize(testcases_beginning); ++i) { 436 for (size_t i = 0; i < arraysize(testcases_beginning); ++i) {
441 EXPECT_EQ(testcases_beginning[i].output.size(), 437 EXPECT_EQ(testcases_beginning[i].output.size(),
442 ElideText( 438 ElideText(
443 testcases_beginning[i].input, font_list, 439 testcases_beginning[i].input, font_list,
444 GetStringWidthF(testcases_beginning[i].output, font_list), 440 GetStringWidthF(testcases_beginning[i].output, font_list),
445 ELIDE_AT_BEGINNING).size()); 441 ELIDE_HEAD).size());
446 EXPECT_EQ(kEllipsisStr, 442 EXPECT_EQ(kEllipsisStr,
447 ElideText(testcases_beginning[i].input, font_list, ellipsis_width, 443 ElideText(testcases_beginning[i].input, font_list, ellipsis_width,
448 ELIDE_AT_BEGINNING)); 444 ELIDE_HEAD));
449 } 445 }
450 } 446 }
451 447
452 TEST(TextEliderTest, ElideString) { 448 TEST(TextEliderTest, ElideString) {
453 struct TestData { 449 struct TestData {
454 const char* input; 450 const char* input;
455 int max_len; 451 int max_len;
456 bool result; 452 bool result;
457 const char* output; 453 const char* output;
458 } cases[] = { 454 } cases[] = {
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after
904 900
905 // Test adds ... at right spot when there is not enough room to break at a 901 // Test adds ... at right spot when there is not enough room to break at a
906 // word boundary. 902 // word boundary.
907 EXPECT_EQ(L"foooooey\x2026", UTF16ToWide(TruncateString(string, 11))); 903 EXPECT_EQ(L"foooooey\x2026", UTF16ToWide(TruncateString(string, 11)));
908 904
909 // Test completely truncates string if break is on initial whitespace. 905 // Test completely truncates string if break is on initial whitespace.
910 EXPECT_EQ(L"\x2026", UTF16ToWide(TruncateString(ASCIIToUTF16(" "), 2))); 906 EXPECT_EQ(L"\x2026", UTF16ToWide(TruncateString(ASCIIToUTF16(" "), 2)));
911 } 907 }
912 908
913 } // namespace gfx 909 } // namespace gfx
OLDNEW
« no previous file with comments | « ui/gfx/text_elider.cc ('k') | ui/message_center/cocoa/notification_controller.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698