15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Unit tests for eliding and formatting utility functions. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/text/text_elider.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/rtl.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/font.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Testcase { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string input; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string output; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FileTestcase { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::StringType input; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string output; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct UTF16Testcase { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 input; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 output; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct TestData { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string a; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string b; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int compare_result; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RunUrlTest(Testcase* testcases, size_t num_testcases) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const gfx::Font font; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < num_testcases; ++i) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL url(testcases[i].input); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should we test with non-empty language list? 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // That's kinda redundant with net_util_unittests. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(UTF8ToUTF16(testcases[i].output), 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ElideUrl(url, font, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) font.GetStringWidth(UTF8ToUTF16(testcases[i].output)), 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string())); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(ios): Complex eliding is off by one for some of those tests on iOS. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See crbug.com/154019 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_IOS) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ElideEmail DISABLED_ElideEmail 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ElideEmail ElideEmail 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TextEliderTest, MAYBE_ElideEmail) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string kEllipsisStr(kEllipsis); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test emails and their expected elided forms (from which the available 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // widths will be derived). 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For elided forms in which both the username and domain must be elided: 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the result (how many characters are left on each side) can be font 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dependent. To avoid this, the username is prefixed with the characters 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expected to remain in the domain. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Testcase testcases[] = { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"g@g.c", "g@g.c"}, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"g@g.c", kEllipsisStr}, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"ga@co.ca", "ga@c" + kEllipsisStr + "a"}, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"short@small.com", "s" + kEllipsisStr + "@s" + kEllipsisStr}, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"short@small.com", "s" + kEllipsisStr + "@small.com"}, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"short@longbutlotsofspace.com", "short@longbutlotsofspace.com"}, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"short@longbutnotverymuchspace.com", 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "short@long" + kEllipsisStr + ".com"}, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"la_short@longbutverytightspace.ca", 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "la" + kEllipsisStr + "@l" + kEllipsisStr + "a"}, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"longusername@gmail.com", "long" + kEllipsisStr + "@gmail.com"}, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"elidetothemax@justfits.com", "e" + kEllipsisStr + "@justfits.com"}, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"thatom_somelongemail@thatdoesntfit.com", 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "thatom" + kEllipsisStr + "@tha" + kEllipsisStr + "om"}, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"namefits@butthedomaindoesnt.com", 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "namefits@butthedo" + kEllipsisStr + "snt.com"}, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"widthtootight@nospace.com", kEllipsisStr}, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"nospaceforusername@l", kEllipsisStr}, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"little@littlespace.com", "l" + kEllipsisStr + "@l" + kEllipsisStr}, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"l@llllllllllllllllllllllll.com", "l@lllll" + kEllipsisStr + ".com"}, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"messed\"up@whyanat\"++@notgoogley.com", 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "messed\"up@whyanat\"++@notgoogley.com"}, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"messed\"up@whyanat\"++@notgoogley.com", 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "messed\"up@why" + kEllipsisStr + "@notgoogley.com"}, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"noca_messed\"up@whyanat\"++@notgoogley.ca", 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "noca" + kEllipsisStr + "@no" + kEllipsisStr + "ca"}, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"at\"@@@@@@@@@...@@.@.@.@@@\"@madness.com", 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "at\"@@@@@@@@@...@@.@." + kEllipsisStr + "@madness.com"}, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Special case: "m..." takes more than half of the available width; thus 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the domain must elide to "l..." and not "l...l" as it must allow enough 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // space for the minimal username elision although its half of the 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // available width would normally allow it to elide to "l...l". 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"mmmmm@llllllllll", "m" + kEllipsisStr + "@l" + kEllipsisStr}, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Font font; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(testcases); ++i) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 expected_output = UTF8ToUTF16(testcases[i].output); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_output, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ElideEmail(UTF8ToUTF16(testcases[i].input), 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) font, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) font.GetStringWidth(expected_output))); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TextEliderTest, ElideEmailMoreSpace) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int test_width_factors[] = { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 100, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10000, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1000000, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string test_emails[] = { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a@c", 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "test@email.com", 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "short@verysuperdupperlongdomain.com", 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "supermegalongusername@withasuperlonnnggggdomain.gouv.qc.ca", 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Font font; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(test_width_factors); ++i) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int test_width = test_width_factors[i] * 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) font.GetAverageCharacterWidth(); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t j = 0; j < arraysize(test_emails); ++j) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extra space is available: the email should not be elided. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 test_email = UTF8ToUTF16(test_emails[j]); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_email, ElideEmail(test_email, font, test_width)); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test eliding of commonplace URLs. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TextEliderTest, TestGeneralEliding) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string kEllipsisStr(kEllipsis); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Testcase testcases[] = { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://www.google.com/intl/en/ads/", 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "www.google.com/intl/en/ads/"}, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://www.google.com/intl/en/ads/", "www.google.com/intl/en/ads/"}, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://www.google.com/intl/en/ads/", 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "google.com/intl/" + kEllipsisStr + "/ads/"}, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://www.google.com/intl/en/ads/", 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "google.com/" + kEllipsisStr + "/ads/"}, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://www.google.com/intl/en/ads/", "google.com/" + kEllipsisStr}, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://www.google.com/intl/en/ads/", "goog" + kEllipsisStr}, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"https://subdomain.foo.com/bar/filename.html", 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "subdomain.foo.com/bar/filename.html"}, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"https://subdomain.foo.com/bar/filename.html", 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "subdomain.foo.com/" + kEllipsisStr + "/filename.html"}, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://subdomain.foo.com/bar/filename.html", 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kEllipsisStr + "foo.com/" + kEllipsisStr + "/filename.html"}, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://www.google.com/intl/en/ads/?aLongQueryWhichIsNotRequired", 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "www.google.com/intl/en/ads/?aLongQ" + kEllipsisStr}, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunUrlTest(testcases, arraysize(testcases)); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When there is very little space available, the elision code will shorten 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// both path AND file name to an ellipsis - ".../...". To avoid this result, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// there is a hack in place that simply treats them as one string in this 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// case. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TextEliderTest, TestTrailingEllipsisSlashEllipsisHack) { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string kEllipsisStr(kEllipsis); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Very little space, would cause double ellipsis. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Font font; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://battersbox.com/directory/foo/peter_paul_and_mary.html"); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int available_width = font.GetStringWidth( 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF8ToUTF16("battersbox.com/" + kEllipsisStr + "/" + kEllipsisStr)); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create the expected string, after elision. Depending on font size, the 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // directory might become /dir... or /di... or/d... - it never should be 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // shorter than that. (If it is, the font considers d... to be longer 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // than .../... - that should never happen). 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_GT(font.GetStringWidth(UTF8ToUTF16(kEllipsisStr + "/" + kEllipsisStr)), 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) font.GetStringWidth(UTF8ToUTF16("d" + kEllipsisStr))); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL long_url("http://battersbox.com/directorynameisreallylongtoforcetrunc"); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 expected = ElideUrl(long_url, font, available_width, std::string()); 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure that the expected result still contains part of the directory name. 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_GT(expected.length(), std::string("battersbox.com/d").length()); 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected, 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ElideUrl(url, font, available_width, std::string())); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // More space available - elide directories, partially elide filename. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Testcase testcases[] = { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://battersbox.com/directory/foo/peter_paul_and_mary.html", 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "battersbox.com/" + kEllipsisStr + "/peter" + kEllipsisStr}, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunUrlTest(testcases, arraysize(testcases)); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test eliding of empty strings, URLs with ports, passwords, queries, etc. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TextEliderTest, TestMoreEliding) { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string kEllipsisStr(kEllipsis); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Testcase testcases[] = { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://www.google.com/foo?bar", "www.google.com/foo?bar"}, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://xyz.google.com/foo?bar", "xyz.google.com/foo?" + kEllipsisStr}, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://xyz.google.com/foo?bar", "xyz.google.com/foo" + kEllipsisStr}, 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://xyz.google.com/foo?bar", "xyz.google.com/fo" + kEllipsisStr}, 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://a.b.com/pathname/c?d", "a.b.com/" + kEllipsisStr + "/c?d"}, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"", ""}, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://foo.bar..example.com...hello/test/filename.html", 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "foo.bar..example.com...hello/" + kEllipsisStr + "/filename.html"}, 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://foo.bar../", "foo.bar.."}, 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://xn--1lq90i.cn/foo", "\xe5\x8c\x97\xe4\xba\xac.cn/foo"}, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://me:mypass@secrethost.com:99/foo?bar#baz", 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "secrethost.com:99/foo?bar#baz"}, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://me:mypass@ss%xxfdsf.com/foo", "ss%25xxfdsf.com/foo"}, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"mailto:elgoato@elgoato.com", "mailto:elgoato@elgoato.com"}, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"javascript:click(0)", "javascript:click(0)"}, 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"https://chess.eecs.berkeley.edu:4430/login/arbitfilename", 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chess.eecs.berkeley.edu:4430/login/arbitfilename"}, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"https://chess.eecs.berkeley.edu:4430/login/arbitfilename", 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kEllipsisStr + "berkeley.edu:4430/" + kEllipsisStr + "/arbitfilename"}, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unescaping. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://www/%E4%BD%A0%E5%A5%BD?q=%E4%BD%A0%E5%A5%BD#\xe4\xbd\xa0", 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "www/\xe4\xbd\xa0\xe5\xa5\xbd?q=\xe4\xbd\xa0\xe5\xa5\xbd#\xe4\xbd\xa0"}, 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid unescaping for path. The ref will always be valid UTF-8. We don't 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bother to do too many edge cases, since these are handled by the escaper 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // unittest. 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"http://www/%E4%A0%E5%A5%BD?q=%E4%BD%A0%E5%A5%BD#\xe4\xbd\xa0", 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "www/%E4%A0%E5%A5%BD?q=\xe4\xbd\xa0\xe5\xa5\xbd#\xe4\xbd\xa0"}, 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunUrlTest(testcases, arraysize(testcases)); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test eliding of file: URLs. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TextEliderTest, TestFileURLEliding) { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string kEllipsisStr(kEllipsis); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Testcase testcases[] = { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"file:///C:/path1/path2/path3/filename", 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "file:///C:/path1/path2/path3/filename"}, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"file:///C:/path1/path2/path3/filename", 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "C:/path1/path2/path3/filename"}, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GURL parses "file:///C:path" differently on windows than it does on posix. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"file:///C:path1/path2/path3/filename", 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "C:/path1/path2/" + kEllipsisStr + "/filename"}, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"file:///C:path1/path2/path3/filename", 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "C:/path1/" + kEllipsisStr + "/filename"}, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"file:///C:path1/path2/path3/filename", 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "C:/" + kEllipsisStr + "/filename"}, 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"file://filer/foo/bar/file", "filer/foo/bar/file"}, 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"file://filer/foo/bar/file", "filer/foo/" + kEllipsisStr + "/file"}, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"file://filer/foo/bar/file", "filer/" + kEllipsisStr + "/file"}, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunUrlTest(testcases, arraysize(testcases)); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(ios): Complex eliding is off by one for some of those tests on iOS. 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See crbug.com/154019 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_IOS) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestFilenameEliding DISABLED_TestFilenameEliding 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestFilenameEliding TestFilenameEliding 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TextEliderTest, MAYBE_TestFilenameEliding) { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string kEllipsisStr(kEllipsis); 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::StringType kPathSeparator = 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::StringType().append(1, base::FilePath::kSeparators[0]); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileTestcase testcases[] = { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {FILE_PATH_LITERAL(""), ""}, 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {FILE_PATH_LITERAL("."), "."}, 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {FILE_PATH_LITERAL("filename.exe"), "filename.exe"}, 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {FILE_PATH_LITERAL(".longext"), ".longext"}, 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {FILE_PATH_LITERAL("pie"), "pie"}, 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {FILE_PATH_LITERAL("c:") + kPathSeparator + FILE_PATH_LITERAL("path") + 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kPathSeparator + FILE_PATH_LITERAL("filename.pie"), 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "filename.pie"}, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {FILE_PATH_LITERAL("c:") + kPathSeparator + FILE_PATH_LITERAL("path") + 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kPathSeparator + FILE_PATH_LITERAL("longfilename.pie"), 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "long" + kEllipsisStr + ".pie"}, 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {FILE_PATH_LITERAL("http://path.com/filename.pie"), "filename.pie"}, 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {FILE_PATH_LITERAL("http://path.com/longfilename.pie"), 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "long" + kEllipsisStr + ".pie"}, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {FILE_PATH_LITERAL("piesmashingtacularpants"), "pie" + kEllipsisStr}, 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {FILE_PATH_LITERAL(".piesmashingtacularpants"), ".pie" + kEllipsisStr}, 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {FILE_PATH_LITERAL("cheese."), "cheese."}, 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {FILE_PATH_LITERAL("file name.longext"), 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "file" + kEllipsisStr + ".longext"}, 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {FILE_PATH_LITERAL("fil ename.longext"), 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "fil " + kEllipsisStr + ".longext"}, 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {FILE_PATH_LITERAL("filename.longext"), 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "file" + kEllipsisStr + ".longext"}, 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {FILE_PATH_LITERAL("filename.middleext.longext"), 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "filename.mid" + kEllipsisStr + ".longext"}, 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {FILE_PATH_LITERAL("filename.superduperextremelylongext"), 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "filename.sup" + kEllipsisStr + "emelylongext"}, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {FILE_PATH_LITERAL("filenamereallylongtext.superduperextremelylongext"), 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "filenamereall" + kEllipsisStr + "emelylongext"}, 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {FILE_PATH_LITERAL("file.name.really.long.text.superduperextremelylongext"), 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "file.name.re" + kEllipsisStr + "emelylongext"} 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const gfx::Font font; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(testcases); ++i) { 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath filepath(testcases[i].input); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 expected = UTF8ToUTF16(testcases[i].output); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected = base::i18n::GetDisplayStringInLTRDirectionality(expected); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected, ElideFilename(filepath, 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) font, 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) font.GetStringWidth(UTF8ToUTF16(testcases[i].output)))); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TextEliderTest, ElideTextTruncate) { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Font font; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kTestWidth = font.GetStringWidth(ASCIIToUTF16("Test")); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TestData { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* input; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* output; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } cases[] = { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "", 0, "" }, 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Test", 0, "" }, 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "", kTestWidth, "" }, 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Tes", kTestWidth, "Tes" }, 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Test", kTestWidth, "Test" }, 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Tests", kTestWidth, "Test" }, 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 result = ElideText(UTF8ToUTF16(cases[i].input), font, 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cases[i].width, TRUNCATE_AT_END); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cases[i].output, UTF16ToUTF8(result)); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(TextEliderTest, ElideTextEllipsis) { 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Font font; 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const int kTestWidth = font.GetStringWidth(ASCIIToUTF16("Test")); 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* kEllipsis = "\xE2\x80\xA6"; 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const int kEllipsisWidth = font.GetStringWidth(UTF8ToUTF16(kEllipsis)); 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) struct TestData { 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* input; 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int width; 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* output; 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } cases[] = { 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { "", 0, "" }, 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { "Test", 0, "" }, 360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { "Test", kEllipsisWidth, kEllipsis }, 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { "", kTestWidth, "" }, 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { "Tes", kTestWidth, "Tes" }, 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { "Test", kTestWidth, "Test" }, 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) string16 result = ElideText(UTF8ToUTF16(cases[i].input), font, 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cases[i].width, ELIDE_AT_END); 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(cases[i].output, UTF16ToUTF8(result)); 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that all occurrences of |first_char| are followed by |second_char| and 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// all occurrences of |second_char| are preceded by |first_char| in |text|. 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void CheckSurrogatePairs(const string16& text, 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char16 first_char, 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char16 second_char) { 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t index = text.find_first_of(first_char); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (index != string16::npos) { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LT(index, text.length() - 1); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(second_char, text[index + 1]); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index = text.find_first_of(first_char, index + 1); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index = text.find_first_of(second_char); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (index != string16::npos) { 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(index, 0U); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(first_char, text[index - 1]); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index = text.find_first_of(second_char, index + 1); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TextEliderTest, ElideTextSurrogatePairs) { 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Font font; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The below is 'MUSICAL SYMBOL G CLEF', which is represented in UTF-16 as 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // two characters forming a surrogate pair 0x0001D11E. 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string kSurrogate = "\xF0\x9D\x84\x9E"; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 kTestString = 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF8ToUTF16(kSurrogate + "ab" + kSurrogate + kSurrogate + "cd"); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kTestStringWidth = font.GetStringWidth(kTestString); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char16 kSurrogateFirstChar = kTestString[0]; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char16 kSurrogateSecondChar = kTestString[1]; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 result; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Elide |kTextString| to all possible widths and check that no instance of 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |kSurrogate| was split in two. 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int width = 0; width <= kTestStringWidth; width++) { 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = ElideText(kTestString, font, width, TRUNCATE_AT_END); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckSurrogatePairs(result, kSurrogateFirstChar, kSurrogateSecondChar); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = ElideText(kTestString, font, width, ELIDE_AT_END); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckSurrogatePairs(result, kSurrogateFirstChar, kSurrogateSecondChar); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = ElideText(kTestString, font, width, ELIDE_IN_MIDDLE); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckSurrogatePairs(result, kSurrogateFirstChar, kSurrogateSecondChar); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TextEliderTest, ElideTextLongStrings) { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 kEllipsisStr = UTF8ToUTF16(kEllipsis); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 data_scheme(UTF8ToUTF16("data:text/plain,")); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t data_scheme_length = data_scheme.length(); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 ten_a(10, 'a'); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 hundred_a(100, 'a'); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 thousand_a(1000, 'a'); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 ten_thousand_a(10000, 'a'); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 hundred_thousand_a(100000, 'a'); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 million_a(1000000, 'a'); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t number_of_as = 156; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 long_string_end( 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_scheme + string16(number_of_as, 'a') + kEllipsisStr); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF16Testcase testcases_end[] = { 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {data_scheme + ten_a, data_scheme + ten_a}, 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {data_scheme + hundred_a, data_scheme + hundred_a}, 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {data_scheme + thousand_a, long_string_end}, 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {data_scheme + ten_thousand_a, long_string_end}, 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {data_scheme + hundred_thousand_a, long_string_end}, 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {data_scheme + million_a, long_string_end}, 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Font font; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ellipsis_width = font.GetStringWidth(kEllipsisStr); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(testcases_end); ++i) { 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compare sizes rather than actual contents because if the test fails, 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // output is rather long. 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(testcases_end[i].output.size(), 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ElideText(testcases_end[i].input, font, 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) font.GetStringWidth(testcases_end[i].output), 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ELIDE_AT_END).size()); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kEllipsisStr, 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ElideText(testcases_end[i].input, font, ellipsis_width, 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ELIDE_AT_END)); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t number_of_trailing_as = (data_scheme_length + number_of_as) / 2; 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 long_string_middle(data_scheme + 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16(number_of_as - number_of_trailing_as, 'a') + kEllipsisStr + 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16(number_of_trailing_as, 'a')); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF16Testcase testcases_middle[] = { 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {data_scheme + ten_a, data_scheme + ten_a}, 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {data_scheme + hundred_a, data_scheme + hundred_a}, 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {data_scheme + thousand_a, long_string_middle}, 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {data_scheme + ten_thousand_a, long_string_middle}, 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {data_scheme + hundred_thousand_a, long_string_middle}, 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {data_scheme + million_a, long_string_middle}, 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(testcases_middle); ++i) { 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compare sizes rather than actual contents because if the test fails, 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // output is rather long. 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(testcases_middle[i].output.size(), 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ElideText(testcases_middle[i].input, font, 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) font.GetStringWidth(testcases_middle[i].output), 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ELIDE_AT_END).size()); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kEllipsisStr, 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ElideText(testcases_middle[i].input, font, ellipsis_width, 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ELIDE_AT_END)); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies display_url is set correctly. 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TextEliderTest, SortedDisplayURL) { 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SortedDisplayURL d_url(GURL("http://www.google.com"), std::string()); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("www.google.com", UTF16ToASCII(d_url.display_url())); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies DisplayURL::Compare works correctly. 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TextEliderTest, SortedDisplayURLCompare) { 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UErrorCode create_status = U_ZERO_ERROR; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<icu::Collator> collator( 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icu::Collator::createInstance(create_status)); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!U_SUCCESS(create_status)) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestData tests[] = { 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IDN comparison. Hosts equal, so compares on path. 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://xn--1lq90i.cn/a", "http://xn--1lq90i.cn/b", -1}, 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because the host and after host match, this compares the full url. 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://www.x/b", "http://x/b", -1 }, 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because the host and after host match, this compares the full url. 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://www.a:1/b", "http://a:1/b", 1 }, 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The hosts match, so these end up comparing on the after host portion. 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://www.x:0/b", "http://x:1/b", -1 }, 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://www.x/a", "http://x/b", -1 }, 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://x/b", "http://www.x/a", 1 }, 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Trivial Equality. 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://a/", "http://a/", 0 }, 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compares just hosts. 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://www.a/", "http://b/", -1 }, 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(tests); ++i) { 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SortedDisplayURL url1(GURL(tests[i].a), std::string()); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SortedDisplayURL url2(GURL(tests[i].b), std::string()); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(tests[i].compare_result, url1.Compare(url2, collator.get())); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-tests[i].compare_result, url2.Compare(url1, collator.get())); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TextEliderTest, ElideString) { 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TestData { 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* input; 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_len; 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result; 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* output; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } cases[] = { 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hello", 0, true, "" }, 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "", 0, false, "" }, 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hello, my name is Tom", 1, true, "H" }, 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hello, my name is Tom", 2, true, "He" }, 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hello, my name is Tom", 3, true, "H.m" }, 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hello, my name is Tom", 4, true, "H..m" }, 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hello, my name is Tom", 5, true, "H...m" }, 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hello, my name is Tom", 6, true, "He...m" }, 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hello, my name is Tom", 7, true, "He...om" }, 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hello, my name is Tom", 10, true, "Hell...Tom" }, 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hello, my name is Tom", 100, false, "Hello, my name is Tom" } 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 output; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cases[i].result, 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ElideString(UTF8ToUTF16(cases[i].input), 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cases[i].max_len, &output)); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cases[i].output, UTF16ToUTF8(output)); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TextEliderTest, ElideRectangleText) { 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Font font; 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int line_height = font.GetHeight(); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int test_width = font.GetStringWidth(ASCIIToUTF16("Test")); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TestData { 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* input; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int available_pixel_width; 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int available_pixel_height; 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool truncated_y; 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* output; 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } cases[] = { 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "", 0, 0, false, NULL }, 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "", 1, 1, false, NULL }, 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Test", test_width, 0, true, NULL }, 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Test", test_width, 1, false, "Test" }, 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Test", test_width, line_height, false, "Test" }, 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Test Test", test_width, line_height, true, "Test" }, 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Test Test", test_width, line_height + 1, false, "Test|Test" }, 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Test Test", test_width, line_height * 2, false, "Test|Test" }, 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Test Test", test_width, line_height * 3, false, "Test|Test" }, 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Test Test", test_width * 2, line_height * 2, false, "Test|Test" }, 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Test Test", test_width * 3, line_height, false, "Test Test" }, 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Test\nTest", test_width * 3, line_height * 2, false, "Test|Test" }, 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Te\nst Te", test_width, line_height * 3, false, "Te|st|Te" }, 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "\nTest", test_width, line_height * 2, false, "|Test" }, 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "\nTest", test_width, line_height, true, "" }, 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "\n\nTest", test_width, line_height * 3, false, "||Test" }, 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "\n\nTest", test_width, line_height * 2, true, "|" }, 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Test\n", 2 * test_width, line_height * 5, false, "Test|" }, 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Test\n\n", 2 * test_width, line_height * 5, false, "Test||" }, 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Test\n\n\n", 2 * test_width, line_height * 5, false, "Test|||" }, 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Test\nTest\n\n", 2 * test_width, line_height * 5, false, "Test|Test||" }, 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Test\n\nTest\n", 2 * test_width, line_height * 5, false, "Test||Test|" }, 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Test\n\n\nTest", 2 * test_width, line_height * 5, false, "Test|||Test" }, 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Te ", test_width, line_height, false, "Te" }, 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Te Te Test", test_width, 3 * line_height, false, "Te|Te|Test" }, 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<string16> lines; 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(cases[i].truncated_y ? INSUFFICIENT_SPACE_VERTICAL : 0, 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ElideRectangleText(UTF8ToUTF16(cases[i].input), 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) font, 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cases[i].available_pixel_width, 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cases[i].available_pixel_height, 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUNCATE_LONG_WORDS, 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &lines)); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cases[i].output) { 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string result = UTF16ToUTF8(JoinString(lines, '|')); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cases[i].output, result) << "Case " << i << " failed!"; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(lines.empty()) << "Case " << i << " failed!"; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TextEliderTest, ElideRectangleTextPunctuation) { 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Font font; 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int line_height = font.GetHeight(); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int test_width = font.GetStringWidth(ASCIIToUTF16("Test")); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int test_t_width = font.GetStringWidth(ASCIIToUTF16("Test T")); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TestData { 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* input; 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int available_pixel_width; 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int available_pixel_height; 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool wrap_words; 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool truncated_x; 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* output; 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } cases[] = { 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Test T.", test_t_width, line_height * 2, false, false, "Test|T." }, 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Test T ?", test_t_width, line_height * 2, false, false, "Test|T ?" }, 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "Test. Test", test_width, line_height * 3, false, true, "Test|Test" }, 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Test. Test", test_width, line_height * 3, true, false, "Test|.|Test" }, 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<string16> lines; 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WordWrapBehavior wrap_behavior = 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cases[i].wrap_words ? WRAP_LONG_WORDS : TRUNCATE_LONG_WORDS); 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(cases[i].truncated_x ? INSUFFICIENT_SPACE_HORIZONTAL : 0, 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ElideRectangleText(UTF8ToUTF16(cases[i].input), 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) font, 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cases[i].available_pixel_width, 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cases[i].available_pixel_height, 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wrap_behavior, 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &lines)); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cases[i].output) { 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string result = UTF16ToUTF8(JoinString(lines, '|')); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cases[i].output, result) << "Case " << i << " failed!"; 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(lines.empty()) << "Case " << i << " failed!"; 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TextEliderTest, ElideRectangleTextLongWords) { 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Font font; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kAvailableHeight = 1000; 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 kElidedTesting = UTF8ToUTF16(std::string("Tes") + kEllipsis); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int elided_width = font.GetStringWidth(kElidedTesting); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int test_width = font.GetStringWidth(ASCIIToUTF16("Test")); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TestData { 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* input; 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int available_pixel_width; 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WordWrapBehavior wrap_behavior; 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool truncated_x; 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* output; 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } cases[] = { 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "Testing", test_width, IGNORE_LONG_WORDS, false, "Testing" }, 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "X Testing", test_width, IGNORE_LONG_WORDS, false, "X|Testing" }, 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "Test Testing", test_width, IGNORE_LONG_WORDS, false, "Test|Testing" }, 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "Test\nTesting", test_width, IGNORE_LONG_WORDS, false, "Test|Testing" }, 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "Test Tests ", test_width, IGNORE_LONG_WORDS, false, "Test|Tests" }, 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "Test Tests T", test_width, IGNORE_LONG_WORDS, false, "Test|Tests|T" }, 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "Testing", elided_width, ELIDE_LONG_WORDS, true, "Tes..." }, 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "X Testing", elided_width, ELIDE_LONG_WORDS, true, "X|Tes..." }, 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "Test Testing", elided_width, ELIDE_LONG_WORDS, true, "Test|Tes..." }, 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "Test\nTesting", elided_width, ELIDE_LONG_WORDS, true, "Test|Tes..." }, 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "Testing", test_width, TRUNCATE_LONG_WORDS, true, "Test" }, 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "X Testing", test_width, TRUNCATE_LONG_WORDS, true, "X|Test" }, 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "Test Testing", test_width, TRUNCATE_LONG_WORDS, true, "Test|Test" }, 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "Test\nTesting", test_width, TRUNCATE_LONG_WORDS, true, "Test|Test" }, 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "Test Tests ", test_width, TRUNCATE_LONG_WORDS, true, "Test|Test" }, 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "Test Tests T", test_width, TRUNCATE_LONG_WORDS, true, "Test|Test|T" }, 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "Testing", test_width, WRAP_LONG_WORDS, false, "Test|ing" }, 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "X Testing", test_width, WRAP_LONG_WORDS, false, "X|Test|ing" }, 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "Test Testing", test_width, WRAP_LONG_WORDS, false, "Test|Test|ing" }, 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "Test\nTesting", test_width, WRAP_LONG_WORDS, false, "Test|Test|ing" }, 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "Test Tests ", test_width, WRAP_LONG_WORDS, false, "Test|Test|s" }, 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "Test Tests T", test_width, WRAP_LONG_WORDS, false, "Test|Test|s T" }, 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "TestTestTest", test_width, WRAP_LONG_WORDS, false, "Test|Test|Test" }, 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "TestTestTestT", test_width, WRAP_LONG_WORDS, false, "Test|Test|Test|T" }, 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<string16> lines; 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(cases[i].truncated_x ? INSUFFICIENT_SPACE_HORIZONTAL : 0, 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ElideRectangleText(UTF8ToUTF16(cases[i].input), 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) font, 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cases[i].available_pixel_width, 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kAvailableHeight, 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cases[i].wrap_behavior, 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &lines)); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string expected_output(cases[i].output); 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReplaceSubstringsAfterOffset(&expected_output, 0, "...", kEllipsis); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string result = UTF16ToUTF8(JoinString(lines, '|')); 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_output, result) << "Case " << i << " failed!"; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TextEliderTest, ElideRectangleString) { 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TestData { 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* input; 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_rows; 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_cols; 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result; 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* output; 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } cases[] = { 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "", 0, 0, false, "" }, 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "", 1, 1, false, "" }, 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 0, 0, true, "..." }, 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 1, 0, true, "\n..." }, 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 0, 1, true, "..." }, 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 1, 1, true, "H\n..." }, 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 2, 1, true, "H\ni\n..." }, 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 3, 1, true, "H\ni\n,\n..." }, 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 4, 1, true, "H\ni\n,\n \n..." }, 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 5, 1, true, "H\ni\n,\n \nm\n..." }, 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 0, 2, true, "..." }, 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 1, 2, true, "Hi\n..." }, 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 2, 2, true, "Hi\n, \n..." }, 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 3, 2, true, "Hi\n, \nmy\n..." }, 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 4, 2, true, "Hi\n, \nmy\n n\n..." }, 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 5, 2, true, "Hi\n, \nmy\n n\nam\n..." }, 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 0, 3, true, "..." }, 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 1, 3, true, "Hi,\n..." }, 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 2, 3, true, "Hi,\n my\n..." }, 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 3, 3, true, "Hi,\n my\n na\n..." }, 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 4, 3, true, "Hi,\n my\n na\nme \n..." }, 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 5, 3, true, "Hi,\n my\n na\nme \nis\n..." }, 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 1, 4, true, "Hi, \n..." }, 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 2, 4, true, "Hi, \nmy n\n..." }, 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 3, 4, true, "Hi, \nmy n\name \n..." }, 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 4, 4, true, "Hi, \nmy n\name \nis\n..." }, 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 5, 4, false, "Hi, \nmy n\name \nis\nTom" }, 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 1, 5, true, "Hi, \n..." }, 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 2, 5, true, "Hi, \nmy na\n..." }, 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 3, 5, true, "Hi, \nmy na\nme \n..." }, 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 4, 5, true, "Hi, \nmy na\nme \nis\n..." }, 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 5, 5, false, "Hi, \nmy na\nme \nis\nTom" }, 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 1, 6, true, "Hi, \n..." }, 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 2, 6, true, "Hi, \nmy \n..." }, 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 3, 6, true, "Hi, \nmy \nname \n..." }, 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 4, 6, true, "Hi, \nmy \nname \nis\n..." }, 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 5, 6, false, "Hi, \nmy \nname \nis\nTom" }, 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 1, 7, true, "Hi, \n..." }, 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 2, 7, true, "Hi, \nmy \n..." }, 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 3, 7, true, "Hi, \nmy \nname \n..." }, 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 4, 7, true, "Hi, \nmy \nname \nis\n..." }, 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 5, 7, false, "Hi, \nmy \nname \nis\nTom" }, 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 1, 8, true, "Hi, my \n..." }, 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 2, 8, true, "Hi, my \nname \n..." }, 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 3, 8, true, "Hi, my \nname \nis\n..." }, 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 4, 8, false, "Hi, my \nname \nis\nTom" }, 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 1, 9, true, "Hi, my \n..." }, 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 2, 9, true, "Hi, my \nname is\n..." }, 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 3, 9, false, "Hi, my \nname is\nTom" }, 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 1, 10, true, "Hi, my \n..." }, 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 2, 10, true, "Hi, my \nname is\n..." }, 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 3, 10, false, "Hi, my \nname is\nTom" }, 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 1, 11, true, "Hi, my \n..." }, 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 2, 11, true, "Hi, my \nname is\n..." }, 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 3, 11, false, "Hi, my \nname is\nTom" }, 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 1, 12, true, "Hi, my \n..." }, 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 2, 12, true, "Hi, my \nname is\n..." }, 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 3, 12, false, "Hi, my \nname is\nTom" }, 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 1, 13, true, "Hi, my name \n..." }, 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 2, 13, true, "Hi, my name \nis\n..." }, 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 3, 13, false, "Hi, my name \nis\nTom" }, 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 1, 20, true, "Hi, my name is\n..." }, 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is\nTom", 2, 20, false, "Hi, my name is\nTom" }, 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name is Tom", 1, 40, false, "Hi, my name is Tom" }, 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 output; 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cases[i].result, 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ElideRectangleString(UTF8ToUTF16(cases[i].input), 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cases[i].max_rows, cases[i].max_cols, 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, &output)); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cases[i].output, UTF16ToUTF8(output)); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TextEliderTest, ElideRectangleStringNotStrict) { 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TestData { 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* input; 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_rows; 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_cols; 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result; 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* output; 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } cases[] = { 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "", 0, 0, false, "" }, 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "", 1, 1, false, "" }, 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 0, 0, true, "..." }, 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 1, 0, true, "\n..." }, 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 0, 1, true, "..." }, 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 1, 1, true, "H\n..." }, 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 2, 1, true, "H\ni\n..." }, 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 3, 1, true, "H\ni\n,\n..." }, 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 4, 1, true, "H\ni\n,\n \n..." }, 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 5, 1, true, "H\ni\n,\n \nm\n..." }, 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 0, 2, true, "..." }, 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 1, 2, true, "Hi\n..." }, 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 2, 2, true, "Hi\n, \n..." }, 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 3, 2, true, "Hi\n, \nmy\n..." }, 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 4, 2, true, "Hi\n, \nmy\n n\n..." }, 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 5, 2, true, "Hi\n, \nmy\n n\nam\n..." }, 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 0, 3, true, "..." }, 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 1, 3, true, "Hi,\n..." }, 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 2, 3, true, "Hi,\n my\n..." }, 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 3, 3, true, "Hi,\n my\n na\n..." }, 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 4, 3, true, "Hi,\n my\n na\nme_\n..." }, 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 5, 3, true, "Hi,\n my\n na\nme_\nis\n..." }, 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 1, 4, true, "Hi, ..." }, 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 2, 4, true, "Hi, my n\n..." }, 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 3, 4, true, "Hi, my n\name_\n..." }, 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 4, 4, true, "Hi, my n\name_\nis\n..." }, 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 5, 4, false, "Hi, my n\name_\nis\nDick" }, 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 1, 5, true, "Hi, ..." }, 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 2, 5, true, "Hi, my na\n..." }, 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 3, 5, true, "Hi, my na\nme_is\n..." }, 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 4, 5, true, "Hi, my na\nme_is\n\n..." }, 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 5, 5, false, "Hi, my na\nme_is\n\nDick" }, 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 1, 6, true, "Hi, ..." }, 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 2, 6, true, "Hi, my nam\n..." }, 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 3, 6, true, "Hi, my nam\ne_is\n..." }, 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 4, 6, false, "Hi, my nam\ne_is\nDick" }, 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 5, 6, false, "Hi, my nam\ne_is\nDick" }, 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 1, 7, true, "Hi, ..." }, 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 2, 7, true, "Hi, my name\n..." }, 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 3, 7, true, "Hi, my name\n_is\n..." }, 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 4, 7, false, "Hi, my name\n_is\nDick" }, 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 5, 7, false, "Hi, my name\n_is\nDick" }, 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 1, 8, true, "Hi, my n\n..." }, 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 2, 8, true, "Hi, my n\name_is\n..." }, 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 3, 8, false, "Hi, my n\name_is\nDick" }, 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 1, 9, true, "Hi, my ..." }, 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 2, 9, true, "Hi, my name_is\n..." }, 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 3, 9, false, "Hi, my name_is\nDick" }, 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 1, 10, true, "Hi, my ..." }, 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 2, 10, true, "Hi, my name_is\n..." }, 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 3, 10, false, "Hi, my name_is\nDick" }, 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 1, 11, true, "Hi, my ..." }, 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 2, 11, true, "Hi, my name_is\n..." }, 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 3, 11, false, "Hi, my name_is\nDick" }, 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 1, 12, true, "Hi, my ..." }, 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 2, 12, true, "Hi, my name_is\n..." }, 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 3, 12, false, "Hi, my name_is\nDick" }, 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 1, 13, true, "Hi, my ..." }, 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 2, 13, true, "Hi, my name_is\n..." }, 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 3, 13, false, "Hi, my name_is\nDick" }, 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 1, 20, true, "Hi, my name_is\n..." }, 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is\nDick", 2, 20, false, "Hi, my name_is\nDick" }, 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Hi, my name_is Dick", 1, 40, false, "Hi, my name_is Dick" }, 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 output; 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cases[i].result, 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ElideRectangleString(UTF8ToUTF16(cases[i].input), 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cases[i].max_rows, cases[i].max_cols, 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, &output)); 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cases[i].output, UTF16ToUTF8(output)); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TextEliderTest, ElideRectangleWide16) { 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Two greek words separated by space. 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 str(WideToUTF16( 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x03a0\x03b1\x03b3\x03ba\x03cc\x03c3\x03bc\x03b9" 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x03bf\x03c2\x0020\x0399\x03c3\x03c4\x03cc\x03c2")); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 out1(WideToUTF16( 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x03a0\x03b1\x03b3\x03ba\n" 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x03cc\x03c3\x03bc\x03b9\n" 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"...")); 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 out2(WideToUTF16( 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x03a0\x03b1\x03b3\x03ba\x03cc\x03c3\x03bc\x03b9\x03bf\x03c2\x0020\n" 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x0399\x03c3\x03c4\x03cc\x03c2")); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 output; 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ElideRectangleString(str, 2, 4, true, &output)); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(out1, output); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ElideRectangleString(str, 2, 12, true, &output)); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(out2, output); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TextEliderTest, ElideRectangleWide32) { 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Four U+1D49C MATHEMATICAL SCRIPT CAPITAL A followed by space "aaaaa". 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 str(UTF8ToUTF16( 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\xF0\x9D\x92\x9C\xF0\x9D\x92\x9C\xF0\x9D\x92\x9C\xF0\x9D\x92\x9C" 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " aaaaa")); 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 out(UTF8ToUTF16( 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\xF0\x9D\x92\x9C\xF0\x9D\x92\x9C\xF0\x9D\x92\x9C\n" 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\xF0\x9D\x92\x9C \naaa\n...")); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 output; 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ElideRectangleString(str, 3, 3, true, &output)); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(out, output); 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TextEliderTest, TruncateString) { 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 string = ASCIIToUTF16("foooooey bxxxar baz"); 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure it doesn't modify the string if length > string length. 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(string, TruncateString(string, 100)); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test no characters. 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(L"", UTF16ToWide(TruncateString(string, 0))); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test 1 character. 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(L"\x2026", UTF16ToWide(TruncateString(string, 1))); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test adds ... at right spot when there is enough room to break at a 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // word boundary. 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(L"foooooey\x2026", UTF16ToWide(TruncateString(string, 14))); 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test adds ... at right spot when there is not enough space in first word. 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(L"f\x2026", UTF16ToWide(TruncateString(string, 2))); 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test adds ... at right spot when there is not enough room to break at a 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // word boundary. 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(L"foooooey\x2026", UTF16ToWide(TruncateString(string, 11))); 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test completely truncates string if break is on initial whitespace. 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(L"\x2026", UTF16ToWide(TruncateString(ASCIIToUTF16(" "), 2))); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 935