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