// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Unit tests for eliding and formatting utility functions.

#include "ui/gfx/text_elider.h"

#include <stddef.h>

#include <memory>
#include <vector>

#include "base/files/file_path.h"
#include "base/i18n/rtl.h"
#include "base/run_loop.h"
#include "base/stl_util.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/task_environment.h"
#include "build/build_config.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/font.h"
#include "ui/gfx/font_list.h"
#include "ui/gfx/font_render_params.h"
#include "ui/gfx/text_utils.h"

using base::ASCIIToUTF16;
using base::UTF16ToUTF8;
using base::UTF16ToWide;
using base::UTF8ToUTF16;
using base::WideToUTF16;

namespace gfx {

namespace {

struct Testcase {
  const std::string input;
  const std::string output;
};

struct FileTestcase {
  const base::FilePath::StringType input;
  const std::string output;
  // If this value is specified, we will try to cut the path down to the render
  // width of this string; if not specified, output will be used.
  const std::string using_width_of = std::string();
};

struct UTF16Testcase {
  const base::string16 input;
  const base::string16 output;
};

struct TestData {
  const std::string a;
  const std::string b;
  const int compare_result;
};

}  // namespace

TEST(TextEliderTest, ElideEmail) {
  const std::string kEllipsisStr(kEllipsis);

  // Test emails and their expected elided forms (from which the available
  // widths will be derived).
  // For elided forms in which both the username and domain must be elided:
  // the result (how many characters are left on each side) can be font
  // dependent. To avoid this, the username is prefixed with the characters
  // expected to remain in the domain.
  Testcase testcases[] = {
      {"g@g.c", "g@g.c"},
      {"g@g.c", kEllipsisStr},
      {"ga@co.ca", "ga@c" + kEllipsisStr + "a"},
      {"short@small.com", "s" + kEllipsisStr + "@s" + kEllipsisStr},
      {"short@small.com", "s" + kEllipsisStr + "@small.com"},
      {"short@longbutlotsofspace.com", "short@longbutlotsofspace.com"},
      {"short@longbutnotverymuchspace.com",
       "short@long" + kEllipsisStr + ".com"},
      {"la_short@longbutverytightspace.ca",
       "la" + kEllipsisStr + "@l" + kEllipsisStr + "a"},
      {"longusername@gmail.com", "long" + kEllipsisStr + "@gmail.com"},
      {"elidetothemax@justfits.com", "e" + kEllipsisStr + "@justfits.com"},
      {"thatom_somelongemail@thatdoesntfit.com",
       "thatom" + kEllipsisStr + "@tha" + kEllipsisStr + "om"},
      {"namefits@butthedomaindoesnt.com",
       "namefits@butthedo" + kEllipsisStr + "snt.com"},
      {"widthtootight@nospace.com", kEllipsisStr},
      {"nospaceforusername@l", kEllipsisStr},
      {"little@littlespace.com", "l" + kEllipsisStr + "@l" + kEllipsisStr},
      {"l@llllllllllllllllllllllll.com", "l@lllll" + kEllipsisStr + ".com"},
      {"messed\"up@whyanat\"++@notgoogley.com",
       "messed\"up@whyanat\"++@notgoogley.com"},
      {"messed\"up@whyanat\"++@notgoogley.com",
       "messed\"up@why" + kEllipsisStr + "@notgoogley.com"},
      {"noca_messed\"up@whyanat\"++@notgoogley.ca",
       "noca" + kEllipsisStr + "@no" + kEllipsisStr + "ca"},
      {"at\"@@@@@@@@@...@@.@.@.@@@\"@madness.com",
       "at\"@@@@@@@@@...@@.@." + kEllipsisStr + "@madness.com"},
      // Special case: "m..." takes more than half of the available width; thus
      // the domain must elide to "l..." and not "l...l" as it must allow enough
      // space for the minimal username elision although its half of the
      // available width would normally allow it to elide to "l...l".
      {"mmmmm@llllllllll", "m" + kEllipsisStr + "@l" + kEllipsisStr},
  };

  const FontList font_list;
  for (size_t i = 0; i < base::size(testcases); ++i) {
    const base::string16 expected_output = UTF8ToUTF16(testcases[i].output);
    EXPECT_EQ(expected_output,
              ElideText(UTF8ToUTF16(testcases[i].input), font_list,
                        GetStringWidthF(expected_output, font_list),
                        ELIDE_EMAIL));
  }
}

TEST(TextEliderTest, ElideEmailMoreSpace) {
  const int test_widths_extra_spaces[] = {
      10,
      1000,
      100000,
  };
  const char* test_emails[] = {
      "a@c",
      "test@email.com",
      "short@verysuperdupperlongdomain.com",
      "supermegalongusername@withasuperlonnnggggdomain.gouv.qc.ca",
  };

  const FontList font_list;
  for (const auto* test_email : test_emails) {
    const base::string16 test_email16 = UTF8ToUTF16(test_email);
    const int mimimum_width = GetStringWidth(test_email16, font_list);
    for (int extra_space : test_widths_extra_spaces) {
      // Extra space is available: the email should not be elided.
      EXPECT_EQ(test_email16,
                ElideText(test_email16, font_list, mimimum_width + extra_space,
                          ELIDE_EMAIL));
    }
  }
}

TEST(TextEliderTest, TestFilenameEliding) {
  const std::string kEllipsisStr(kEllipsis);
  const base::FilePath::StringType kPathSeparator =
      base::FilePath::StringType().append(1, base::FilePath::kSeparators[0]);

  FileTestcase testcases[] = {
      {FILE_PATH_LITERAL(""), ""},
      {FILE_PATH_LITERAL("."), "."},
      {FILE_PATH_LITERAL("filename.exe"), "filename.exe"},
      {FILE_PATH_LITERAL(".longext"), ".longext"},
      {FILE_PATH_LITERAL("pie"), "pie"},
      {FILE_PATH_LITERAL("c:") + kPathSeparator + FILE_PATH_LITERAL("path") +
           kPathSeparator + FILE_PATH_LITERAL("filename.pie"),
       "filename.pie"},
      {FILE_PATH_LITERAL("c:") + kPathSeparator + FILE_PATH_LITERAL("path") +
           kPathSeparator + FILE_PATH_LITERAL("longfilename.pie"),
       "long" + kEllipsisStr + ".pie"},
      {FILE_PATH_LITERAL("http://path.com/filename.pie"), "filename.pie"},
      {FILE_PATH_LITERAL("http://path.com/longfilename.pie"),
       "long" + kEllipsisStr + ".pie"},
      {FILE_PATH_LITERAL("piesmashingtacularpants"), "pie" + kEllipsisStr},
      {FILE_PATH_LITERAL(".piesmashingtacularpants"), ".pie" + kEllipsisStr},
      {FILE_PATH_LITERAL("cheese."), "cheese."},
      {FILE_PATH_LITERAL("file name.longext"),
       "file" + kEllipsisStr + ".longext"},
      {FILE_PATH_LITERAL("fil ename.longext"),
       "fil" + kEllipsisStr + ".longext", "fil " + kEllipsisStr + ".longext"},
      {FILE_PATH_LITERAL("filename.longext"),
       "file" + kEllipsisStr + ".longext"},
      {FILE_PATH_LITERAL("filename.middleext.longext"),
       "filename.mid" + kEllipsisStr + ".longext"},
      {FILE_PATH_LITERAL("filename.superduperextremelylongext"),
       "filename.sup" + kEllipsisStr + "emelylongext"},
      {FILE_PATH_LITERAL("filenamereallylongtext.superdeduperextremelylongext"),
       "filenamereall" + kEllipsisStr + "emelylongext"},
      {FILE_PATH_LITERAL(
           "file.name.really.long.text.superduperextremelylongext"),
       "file.name.re" + kEllipsisStr + "emelylongext"}};

  static const FontList font_list;
  for (size_t i = 0; i < base::size(testcases); ++i) {
    base::FilePath filepath(testcases[i].input);
    base::string16 expected = UTF8ToUTF16(testcases[i].output);
    base::string16 using_width_of = UTF8ToUTF16(
        testcases[i].using_width_of.empty() ? testcases[i].output
                                            : testcases[i].using_width_of);
    expected = base::i18n::GetDisplayStringInLTRDirectionality(expected);
    EXPECT_EQ(expected,
              ElideFilename(filepath, font_list,
                            GetStringWidthF(using_width_of, font_list),
                            Typesetter::DEFAULT));
  }
}

TEST(TextEliderTest, ElideTextTruncate) {
  const FontList font_list;
  const float kTestWidth = GetStringWidthF(ASCIIToUTF16("Test"), font_list);
  struct TestData {
    const char* input;
    float width;
    const char* output;
  } cases[] = {
    { "", 0, "" },
    { "Test", 0, "" },
    { "", kTestWidth, "" },
    { "Tes", kTestWidth, "Tes" },
    { "Test", kTestWidth, "Test" },
    { "Tests", kTestWidth, "Test" },
  };

  for (size_t i = 0; i < base::size(cases); ++i) {
    base::string16 result = ElideText(UTF8ToUTF16(cases[i].input), font_list,
                                      cases[i].width, TRUNCATE);
    EXPECT_EQ(cases[i].output, UTF16ToUTF8(result));
  }
}

TEST(TextEliderTest, ElideTextEllipsis) {
  const FontList font_list;
  const float kTestWidth = GetStringWidthF(ASCIIToUTF16("Test"), font_list);
  const char* kEllipsis = "\xE2\x80\xA6";
  const float kEllipsisWidth =
      GetStringWidthF(UTF8ToUTF16(kEllipsis), font_list);
  struct TestData {
    const char* input;
    float width;
    const char* output;
  } cases[] = {
    { "", 0, "" },
    { "Test", 0, "" },
    { "Test", kEllipsisWidth, kEllipsis },
    { "", kTestWidth, "" },
    { "Tes", kTestWidth, "Tes" },
    { "Test", kTestWidth, "Test" },
  };

  for (size_t i = 0; i < base::size(cases); ++i) {
    base::string16 result = ElideText(UTF8ToUTF16(cases[i].input), font_list,
                                      cases[i].width, ELIDE_TAIL);
    EXPECT_EQ(cases[i].output, UTF16ToUTF8(result));
  }
}

TEST(TextEliderTest, ElideTextEllipsisFront) {
  const FontList font_list;
  const float kTestWidth = GetStringWidthF(ASCIIToUTF16("Test"), font_list);
  const std::string kEllipsisStr(kEllipsis);
  const float kEllipsisWidth =
      GetStringWidthF(UTF8ToUTF16(kEllipsis), font_list);
  const float kEllipsis23Width =
      GetStringWidthF(UTF8ToUTF16(kEllipsisStr + "23"), font_list);
  struct TestData {
    const char* input;
    float width;
    const base::string16 output;
  } cases[] = {
    { "",        0,                base::string16() },
    { "Test",    0,                base::string16() },
    { "Test",    kEllipsisWidth,   UTF8ToUTF16(kEllipsisStr) },
    { "",        kTestWidth,       base::string16() },
    { "Tes",     kTestWidth,       ASCIIToUTF16("Tes") },
    { "Test",    kTestWidth,       ASCIIToUTF16("Test") },
    { "Test123", kEllipsis23Width, UTF8ToUTF16(kEllipsisStr + "23") },
  };

  for (size_t i = 0; i < base::size(cases); ++i) {
    base::string16 result = ElideText(UTF8ToUTF16(cases[i].input), font_list,
                                      cases[i].width, ELIDE_HEAD);
    EXPECT_EQ(cases[i].output, result);
  }
}

// Checks that all occurrences of |first_char| are followed by |second_char| and
// all occurrences of |second_char| are preceded by |first_char| in |text|. Can
// be used to test surrogate pairs or two-character combining sequences.
static void CheckCodeUnitPairs(const base::string16& text,
                               base::char16 first_char,
                               base::char16 second_char) {
  for (size_t index = 0; index < text.length(); ++index) {
    EXPECT_NE(second_char, text[index]);
    if (text[index] == first_char) {
      ASSERT_LT(++index, text.length());
      EXPECT_EQ(second_char, text[index]);
    }
  }
}

// Test that both both UTF-16 surrogate pairs and combining character sequences
// do not get split by ElideText.
TEST(TextEliderTest, ElideTextAtomicSequences) {
#if defined(OS_WIN)
  // Needed to bypass DCHECK in GetFallbackFont.
  base::test::SingleThreadTaskEnvironment task_environment(
      base::test::SingleThreadTaskEnvironment::MainThreadType::UI);
#endif
  const FontList font_list;
  // The below is 'MUSICAL SYMBOL G CLEF' (U+1D11E), which is represented in
  // UTF-16 as two code units forming a surrogate pair: 0xD834 0xDD1E.
  const base::char16 kSurrogate[] = {0xD834, 0xDD1E, 0};
  // The below is a Devanagari two-character combining sequence U+0921 U+093F.
  // The sequence forms a single display character and should not be separated.
  const base::char16 kCombiningSequence[] = {0x921, 0x93F, 0};
  std::vector<base::string16> pairs;
  pairs.push_back(kSurrogate);
  pairs.push_back(kCombiningSequence);

  for (const base::string16& pair : pairs) {
    base::char16 first_char = pair[0];
    base::char16 second_char = pair[1];
    base::string16 test_string = pair + UTF8ToUTF16("x") + pair;
    SCOPED_TRACE(test_string);
    const float test_string_width = GetStringWidthF(test_string, font_list);
    base::string16 result;

    // Elide |text_string| to all possible widths and check that no instance of
    // |pair| was split in two.
    for (float width = 0; width <= test_string_width; width++) {
      result = ElideText(test_string, font_list, width, TRUNCATE);
      CheckCodeUnitPairs(result, first_char, second_char);

      result = ElideText(test_string, font_list, width, ELIDE_TAIL);
      CheckCodeUnitPairs(result, first_char, second_char);

      result = ElideText(test_string, font_list, width, ELIDE_MIDDLE);
      CheckCodeUnitPairs(result, first_char, second_char);

      result = ElideText(test_string, font_list, width, ELIDE_HEAD);
      CheckCodeUnitPairs(result, first_char, second_char);
    }
  }
}

TEST(TextEliderTest, ElideTextLongStrings) {
  const base::string16 kEllipsisStr = UTF8ToUTF16(kEllipsis);
  base::string16 data_scheme(UTF8ToUTF16("data:text/plain,"));
  size_t data_scheme_length = data_scheme.length();

  base::string16 ten_a(10, 'a');
  base::string16 hundred_a(100, 'a');
  base::string16 thousand_a(1000, 'a');
  base::string16 ten_thousand_a(10000, 'a');
  base::string16 hundred_thousand_a(100000, 'a');
  base::string16 million_a(1000000, 'a');

  // TODO(gbillock): Improve these tests by adding more string diversity and
  // doing string compares instead of length compares. See bug 338836.

  size_t number_of_as = 156;
  base::string16 long_string_end(
      data_scheme + base::string16(number_of_as, 'a') + kEllipsisStr);
  UTF16Testcase testcases_end[] = {
     { data_scheme + ten_a,              data_scheme + ten_a },
     { data_scheme + hundred_a,          data_scheme + hundred_a },
     { data_scheme + thousand_a,         long_string_end },
     { data_scheme + ten_thousand_a,     long_string_end },
     { data_scheme + hundred_thousand_a, long_string_end },
     { data_scheme + million_a,          long_string_end },
  };

  const FontList font_list;
  float ellipsis_width = GetStringWidthF(kEllipsisStr, font_list);
  for (size_t i = 0; i < base::size(testcases_end); ++i) {
    // Compare sizes rather than actual contents because if the test fails,
    // output is rather long.
    EXPECT_EQ(testcases_end[i].output.size(),
              ElideText(testcases_end[i].input, font_list,
                        GetStringWidthF(testcases_end[i].output, font_list),
                        ELIDE_TAIL).size());
    EXPECT_EQ(kEllipsisStr,
              ElideText(testcases_end[i].input, font_list, ellipsis_width,
                        ELIDE_TAIL));
  }

  size_t number_of_trailing_as = (data_scheme_length + number_of_as) / 2;
  base::string16 long_string_middle(data_scheme +
      base::string16(number_of_as - number_of_trailing_as, 'a') + kEllipsisStr +
      base::string16(number_of_trailing_as, 'a'));
  UTF16Testcase testcases_middle[] = {
     { data_scheme + ten_a,              data_scheme + ten_a },
     { data_scheme + hundred_a,          data_scheme + hundred_a },
     { data_scheme + thousand_a,         long_string_middle },
     { data_scheme + ten_thousand_a,     long_string_middle },
     { data_scheme + hundred_thousand_a, long_string_middle },
     { data_scheme + million_a,          long_string_middle },
  };

  for (size_t i = 0; i < base::size(testcases_middle); ++i) {
    // Compare sizes rather than actual contents because if the test fails,
    // output is rather long.
    EXPECT_EQ(testcases_middle[i].output.size(),
              ElideText(testcases_middle[i].input, font_list,
                        GetStringWidthF(testcases_middle[i].output, font_list),
                        ELIDE_MIDDLE).size());
    EXPECT_EQ(kEllipsisStr,
              ElideText(testcases_middle[i].input, font_list, ellipsis_width,
                        ELIDE_MIDDLE));
  }

  base::string16 long_string_beginning(
      kEllipsisStr + base::string16(number_of_as, 'a'));
  UTF16Testcase testcases_beginning[] = {
     { data_scheme + ten_a,              data_scheme + ten_a },
     { data_scheme + hundred_a,          data_scheme + hundred_a },
     { data_scheme + thousand_a,         long_string_beginning },
     { data_scheme + ten_thousand_a,     long_string_beginning },
     { data_scheme + hundred_thousand_a, long_string_beginning },
     { data_scheme + million_a,          long_string_beginning },
  };
  for (size_t i = 0; i < base::size(testcases_beginning); ++i) {
    EXPECT_EQ(testcases_beginning[i].output.size(),
              ElideText(
                  testcases_beginning[i].input, font_list,
                  GetStringWidthF(testcases_beginning[i].output, font_list),
                  ELIDE_HEAD).size());
    EXPECT_EQ(kEllipsisStr,
              ElideText(testcases_beginning[i].input, font_list, ellipsis_width,
                        ELIDE_HEAD));
  }
}

// Detailed tests for StringSlicer. These are faster and test more of the edge
// cases than the above tests which are more end-to-end.

TEST(TextEliderTest, StringSlicerBasicTest) {
  // Must store strings in variables (StringSlicer retains a reference to them).
  base::string16 text(UTF8ToUTF16("Hello, world!"));
  base::string16 ellipsis(kEllipsisUTF16);
  StringSlicer slicer(text, ellipsis, false, false);

  EXPECT_EQ(UTF8ToUTF16(""), slicer.CutString(0, false));
  EXPECT_EQ(base::string16(kEllipsisUTF16), slicer.CutString(0, true));

  EXPECT_EQ(UTF8ToUTF16("Hell"), slicer.CutString(4, false));
  EXPECT_EQ(UTF8ToUTF16("Hell") + kEllipsisUTF16, slicer.CutString(4, true));

  EXPECT_EQ(text, slicer.CutString(text.length(), false));
  EXPECT_EQ(text + kEllipsisUTF16, slicer.CutString(text.length(), true));

  StringSlicer slicer_begin(text, ellipsis, false, true);
  EXPECT_EQ(UTF8ToUTF16("rld!"), slicer_begin.CutString(4, false));
  EXPECT_EQ(kEllipsisUTF16 + UTF8ToUTF16("rld!"),
            slicer_begin.CutString(4, true));

  StringSlicer slicer_mid(text, ellipsis, true, false);
  EXPECT_EQ(UTF8ToUTF16("Held!"), slicer_mid.CutString(5, false));
  EXPECT_EQ(UTF8ToUTF16("Hel") + kEllipsisUTF16 + UTF8ToUTF16("d!"),
            slicer_mid.CutString(5, true));
}

TEST(TextEliderTest, StringSlicerWhitespace_UseDefault) {
  // Must store strings in variables (StringSlicer retains a reference to them).
  base::string16 text(UTF8ToUTF16("Hello, world!"));
  base::string16 ellipsis(kEllipsisUTF16);

  // Eliding the end of a string should result in whitespace being removed
  // before the ellipsis by default.
  StringSlicer slicer_end(text, ellipsis, false, false);
  EXPECT_EQ(UTF8ToUTF16("Hello,") + kEllipsisUTF16,
            slicer_end.CutString(6, true));
  EXPECT_EQ(UTF8ToUTF16("Hello,") + kEllipsisUTF16,
            slicer_end.CutString(7, true));
  EXPECT_EQ(UTF8ToUTF16("Hello, w") + kEllipsisUTF16,
            slicer_end.CutString(8, true));

  // Eliding the start of a string should result in whitespace being removed
  // after the ellipsis by default.
  StringSlicer slicer_begin(text, ellipsis, false, true);
  EXPECT_EQ(kEllipsisUTF16 + UTF8ToUTF16("world!"),
            slicer_begin.CutString(6, true));
  EXPECT_EQ(kEllipsisUTF16 + UTF8ToUTF16("world!"),
            slicer_begin.CutString(7, true));
  EXPECT_EQ(kEllipsisUTF16 + UTF8ToUTF16(", world!"),
            slicer_begin.CutString(8, true));

  // Eliding the middle of a string should *NOT* result in whitespace being
  // removed around the ellipsis by default.
  StringSlicer slicer_mid(text, ellipsis, true, false);
  text = UTF8ToUTF16("Hey world!");
  EXPECT_EQ(UTF8ToUTF16("Hey") + kEllipsisUTF16 + UTF8ToUTF16("ld!"),
            slicer_mid.CutString(6, true));
  EXPECT_EQ(UTF8ToUTF16("Hey ") + kEllipsisUTF16 + UTF8ToUTF16("ld!"),
            slicer_mid.CutString(7, true));
  EXPECT_EQ(UTF8ToUTF16("Hey ") + kEllipsisUTF16 + UTF8ToUTF16("rld!"),
            slicer_mid.CutString(8, true));
}

TEST(TextEliderTest, StringSlicerWhitespace_NoTrim) {
  // Must store strings in variables (StringSlicer retains a reference to them).
  base::string16 text(UTF8ToUTF16("Hello, world!"));
  base::string16 ellipsis(kEllipsisUTF16);

  // Eliding the end of a string should not result in whitespace being removed
  // before the ellipsis in no-trim mode.
  StringSlicer slicer_end(text, ellipsis, false, false, false);
  EXPECT_EQ(UTF8ToUTF16("Hello,") + kEllipsisUTF16,
            slicer_end.CutString(6, true));
  EXPECT_EQ(UTF8ToUTF16("Hello, ") + kEllipsisUTF16,
            slicer_end.CutString(7, true));
  EXPECT_EQ(UTF8ToUTF16("Hello, w") + kEllipsisUTF16,
            slicer_end.CutString(8, true));

  // Eliding the start of a string should not result in whitespace being removed
  // after the ellipsis in no-trim mode.
  StringSlicer slicer_begin(text, ellipsis, false, true, false);
  EXPECT_EQ(kEllipsisUTF16 + UTF8ToUTF16("world!"),
            slicer_begin.CutString(6, true));
  EXPECT_EQ(kEllipsisUTF16 + UTF8ToUTF16(" world!"),
            slicer_begin.CutString(7, true));
  EXPECT_EQ(kEllipsisUTF16 + UTF8ToUTF16(", world!"),
            slicer_begin.CutString(8, true));

  // Eliding the middle of a string should *NOT* result in whitespace being
  // removed around the ellipsis in no-trim mode.
  StringSlicer slicer_mid(text, ellipsis, true, false, false);
  text = UTF8ToUTF16("Hey world!");
  EXPECT_EQ(UTF8ToUTF16("Hey") + kEllipsisUTF16 + UTF8ToUTF16("ld!"),
            slicer_mid.CutString(6, true));
  EXPECT_EQ(UTF8ToUTF16("Hey ") + kEllipsisUTF16 + UTF8ToUTF16("ld!"),
            slicer_mid.CutString(7, true));
  EXPECT_EQ(UTF8ToUTF16("Hey ") + kEllipsisUTF16 + UTF8ToUTF16("rld!"),
            slicer_mid.CutString(8, true));
}

TEST(TextEliderTest, StringSlicerWhitespace_Trim) {
  // Must store strings in variables (StringSlicer retains a reference to them).
  base::string16 text(UTF8ToUTF16("Hello, world!"));
  base::string16 ellipsis(kEllipsisUTF16);

  // Eliding the end of a string should result in whitespace being removed
  // before the ellipsis in trim mode.
  StringSlicer slicer_end(text, ellipsis, false, false, true);
  EXPECT_EQ(UTF8ToUTF16("Hello,") + kEllipsisUTF16,
            slicer_end.CutString(6, true));
  EXPECT_EQ(UTF8ToUTF16("Hello,") + kEllipsisUTF16,
            slicer_end.CutString(7, true));
  EXPECT_EQ(UTF8ToUTF16("Hello, w") + kEllipsisUTF16,
            slicer_end.CutString(8, true));

  // Eliding the start of a string should result in whitespace being removed
  // after the ellipsis in trim mode.
  StringSlicer slicer_begin(text, ellipsis, false, true, true);
  EXPECT_EQ(kEllipsisUTF16 + UTF8ToUTF16("world!"),
            slicer_begin.CutString(6, true));
  EXPECT_EQ(kEllipsisUTF16 + UTF8ToUTF16("world!"),
            slicer_begin.CutString(7, true));
  EXPECT_EQ(kEllipsisUTF16 + UTF8ToUTF16(", world!"),
            slicer_begin.CutString(8, true));

  // Eliding the middle of a string *should* result in whitespace being removed
  // around the ellipsis in trim mode.
  StringSlicer slicer_mid(text, ellipsis, true, false, true);
  text = UTF8ToUTF16("Hey world!");
  EXPECT_EQ(UTF8ToUTF16("Hey") + kEllipsisUTF16 + UTF8ToUTF16("ld!"),
            slicer_mid.CutString(6, true));
  EXPECT_EQ(UTF8ToUTF16("Hey") + kEllipsisUTF16 + UTF8ToUTF16("ld!"),
            slicer_mid.CutString(7, true));
  EXPECT_EQ(UTF8ToUTF16("Hey") + kEllipsisUTF16 + UTF8ToUTF16("rld!"),
            slicer_mid.CutString(8, true));
}

TEST(TextEliderTest, StringSlicer_ElideMiddle_MultipleWhitespace) {
  // Must store strings in variables (StringSlicer retains a reference to them).
  base::string16 text(UTF8ToUTF16("Hello  world!"));
  base::string16 ellipsis(kEllipsisUTF16);

  // Eliding the middle of a string should not result in whitespace being
  // removed around the ellipsis in default whitespace mode.
  StringSlicer slicer_default(text, ellipsis, true, false);
  text = UTF8ToUTF16("Hey  U  man");
  EXPECT_EQ(UTF8ToUTF16("Hey") + kEllipsisUTF16 + UTF8ToUTF16("man"),
            slicer_default.CutString(6, true));
  EXPECT_EQ(UTF8ToUTF16("Hey ") + kEllipsisUTF16 + UTF8ToUTF16("man"),
            slicer_default.CutString(7, true));
  EXPECT_EQ(UTF8ToUTF16("Hey ") + kEllipsisUTF16 + UTF8ToUTF16(" man"),
            slicer_default.CutString(8, true));
  EXPECT_EQ(UTF8ToUTF16("Hey  ") + kEllipsisUTF16 + UTF8ToUTF16(" man"),
            slicer_default.CutString(9, true));
  EXPECT_EQ(UTF8ToUTF16("Hey  ") + kEllipsisUTF16 + UTF8ToUTF16("  man"),
            slicer_default.CutString(10, true));

  // Eliding the middle of a string should not result in whitespace being
  // removed around the ellipsis in no-trim mode.
  StringSlicer slicer_notrim(text, ellipsis, true, false, false);
  text = UTF8ToUTF16("Hey  U  man");
  EXPECT_EQ(UTF8ToUTF16("Hey") + kEllipsisUTF16 + UTF8ToUTF16("man"),
            slicer_notrim.CutString(6, true));
  EXPECT_EQ(UTF8ToUTF16("Hey ") + kEllipsisUTF16 + UTF8ToUTF16("man"),
            slicer_notrim.CutString(7, true));
  EXPECT_EQ(UTF8ToUTF16("Hey ") + kEllipsisUTF16 + UTF8ToUTF16(" man"),
            slicer_notrim.CutString(8, true));
  EXPECT_EQ(UTF8ToUTF16("Hey  ") + kEllipsisUTF16 + UTF8ToUTF16(" man"),
            slicer_notrim.CutString(9, true));
  EXPECT_EQ(UTF8ToUTF16("Hey  ") + kEllipsisUTF16 + UTF8ToUTF16("  man"),
            slicer_notrim.CutString(10, true));

  // Eliding the middle of a string *should* result in whitespace being removed
  // around the ellipsis in trim mode.
  StringSlicer slicer_trim(text, ellipsis, true, false, true);
  text = UTF8ToUTF16("Hey  U  man");
  EXPECT_EQ(UTF8ToUTF16("Hey") + kEllipsisUTF16 + UTF8ToUTF16("man"),
            slicer_trim.CutString(6, true));
  EXPECT_EQ(UTF8ToUTF16("Hey") + kEllipsisUTF16 + UTF8ToUTF16("man"),
            slicer_trim.CutString(7, true));
  EXPECT_EQ(UTF8ToUTF16("Hey") + kEllipsisUTF16 + UTF8ToUTF16("man"),
            slicer_trim.CutString(8, true));
  EXPECT_EQ(UTF8ToUTF16("Hey") + kEllipsisUTF16 + UTF8ToUTF16("man"),
            slicer_trim.CutString(9, true));
  EXPECT_EQ(UTF8ToUTF16("Hey") + kEllipsisUTF16 + UTF8ToUTF16("man"),
            slicer_trim.CutString(10, true));
}

TEST(TextEliderTest, StringSlicerSurrogate) {
  // The below is 'MUSICAL SYMBOL G CLEF' (U+1D11E), which is represented in
  // UTF-16 as two code units forming a surrogate pair: 0xD834 0xDD1E.
  const base::char16 kSurrogate[] = {0xD834, 0xDD1E, 0};
  base::string16 text(UTF8ToUTF16("abc") + kSurrogate + UTF8ToUTF16("xyz"));
  base::string16 ellipsis(kEllipsisUTF16);
  StringSlicer slicer(text, ellipsis, false, false);

  // Cut surrogate on the right. Should round left and exclude the surrogate.
  EXPECT_EQ(base::string16(kEllipsisUTF16), slicer.CutString(0, true));
  EXPECT_EQ(UTF8ToUTF16("abc") + kEllipsisUTF16, slicer.CutString(4, true));
  EXPECT_EQ(text + kEllipsisUTF16, slicer.CutString(text.length(), true));

  // Cut surrogate on the left. Should round right and exclude the surrogate.
  StringSlicer slicer_begin(text, ellipsis, false, true);
  EXPECT_EQ(base::string16(kEllipsisUTF16) + UTF8ToUTF16("xyz"),
            slicer_begin.CutString(4, true));

  // Cut surrogate in the middle. Should round right and exclude the surrogate.
  base::string16 short_text(UTF8ToUTF16("abc") + kSurrogate);
  StringSlicer slicer_mid(short_text, ellipsis, true, false);
  EXPECT_EQ(UTF8ToUTF16("a") + kEllipsisUTF16, slicer_mid.CutString(2, true));

  // String that starts with a dangling trailing surrogate.
  base::char16 dangling_trailing_chars[] = {kSurrogate[1], 0};
  base::string16 dangling_trailing_text(dangling_trailing_chars);
  StringSlicer slicer_dangling_trailing(dangling_trailing_text, ellipsis, false,
                                        false);
  EXPECT_EQ(base::string16(kEllipsisUTF16),
            slicer_dangling_trailing.CutString(0, true));
  EXPECT_EQ(dangling_trailing_text + kEllipsisUTF16,
            slicer_dangling_trailing.CutString(1, true));
}

TEST(TextEliderTest, StringSlicerCombining) {
  // The following string contains three combining character sequences (one for
  // each category of combining mark):
  // LATIN SMALL LETTER E + COMBINING ACUTE ACCENT + COMBINING CEDILLA
  // LATIN SMALL LETTER X + COMBINING ENCLOSING KEYCAP
  // DEVANAGARI LETTER DDA + DEVANAGARI VOWEL SIGN I
  const base::char16 kText[] = {
      'e', 0x301, 0x327, ' ', 'x', 0x20E3, ' ', 0x921, 0x93F, 0};
  base::string16 text(kText);
  base::string16 ellipsis(kEllipsisUTF16);
  StringSlicer slicer(text, ellipsis, false, false);

  // Attempt to cut the string for all lengths. When a combining sequence is
  // cut, it should always round left and exclude the combining sequence.
  // Whitespace is also cut adjacent to the ellipsis.

  // First sequence:
  EXPECT_EQ(base::string16(kEllipsisUTF16), slicer.CutString(0, true));
  EXPECT_EQ(base::string16(kEllipsisUTF16), slicer.CutString(1, true));
  EXPECT_EQ(base::string16(kEllipsisUTF16), slicer.CutString(2, true));
  EXPECT_EQ(text.substr(0, 3) + kEllipsisUTF16, slicer.CutString(3, true));
  // Second sequence:
  EXPECT_EQ(text.substr(0, 3) + kEllipsisUTF16, slicer.CutString(4, true));
  EXPECT_EQ(text.substr(0, 3) + kEllipsisUTF16, slicer.CutString(5, true));
  EXPECT_EQ(text.substr(0, 6) + kEllipsisUTF16, slicer.CutString(6, true));
  // Third sequence:
  EXPECT_EQ(text.substr(0, 6) + kEllipsisUTF16, slicer.CutString(7, true));
  EXPECT_EQ(text.substr(0, 6) + kEllipsisUTF16, slicer.CutString(8, true));
  EXPECT_EQ(text + kEllipsisUTF16, slicer.CutString(9, true));

  // Cut string in the middle, splitting the second sequence in half. Should
  // round both left and right, excluding the second sequence.
  StringSlicer slicer_mid(text, ellipsis, true, false);
  EXPECT_EQ(text.substr(0, 4) + kEllipsisUTF16 + text.substr(6),
            slicer_mid.CutString(9, true));

  // String that starts with a dangling combining mark.
  base::char16 dangling_mark_chars[] = {text[1], 0};
  base::string16 dangling_mark_text(dangling_mark_chars);
  StringSlicer slicer_dangling_mark(dangling_mark_text, ellipsis, false, false);
  EXPECT_EQ(base::string16(kEllipsisUTF16),
            slicer_dangling_mark.CutString(0, true));
  EXPECT_EQ(dangling_mark_text + kEllipsisUTF16,
            slicer_dangling_mark.CutString(1, true));
}

TEST(TextEliderTest, StringSlicerCombiningSurrogate) {
  // The ultimate test: combining sequences comprised of surrogate pairs.
  // The following string contains a single combining character sequence:
  // MUSICAL SYMBOL G CLEF (U+1D11E) + MUSICAL SYMBOL COMBINING FLAG-1 (U+1D16E)
  // Represented as four UTF-16 code units.
  const base::char16 kText[] = {0xD834, 0xDD1E, 0xD834, 0xDD6E, 0};
  base::string16 text(kText);
  base::string16 ellipsis(kEllipsisUTF16);
  StringSlicer slicer(text, ellipsis, false, false);

  // Attempt to cut the string for all lengths. Should always round left and
  // exclude the combining sequence.
  EXPECT_EQ(base::string16(kEllipsisUTF16), slicer.CutString(0, true));
  EXPECT_EQ(base::string16(kEllipsisUTF16), slicer.CutString(1, true));
  EXPECT_EQ(base::string16(kEllipsisUTF16), slicer.CutString(2, true));
  EXPECT_EQ(base::string16(kEllipsisUTF16), slicer.CutString(3, true));
  EXPECT_EQ(text + kEllipsisUTF16, slicer.CutString(4, true));

  // Cut string in the middle. Should exclude the sequence.
  StringSlicer slicer_mid(text, ellipsis, true, false);
  EXPECT_EQ(base::string16(kEllipsisUTF16), slicer_mid.CutString(4, true));
}

TEST(TextEliderTest, ElideString) {
  struct TestData {
    const char* input;
    size_t max_len;
    bool result;
    const char* output;
  } cases[] = {
    { "Hello", 0, true, "" },
    { "", 0, false, "" },
    { "Hello, my name is Tom", 1, true, "H" },
    { "Hello, my name is Tom", 2, true, "He" },
    { "Hello, my name is Tom", 3, true, "H.m" },
    { "Hello, my name is Tom", 4, true, "H..m" },
    { "Hello, my name is Tom", 5, true, "H...m" },
    { "Hello, my name is Tom", 6, true, "He...m" },
    { "Hello, my name is Tom", 7, true, "He...om" },
    { "Hello, my name is Tom", 10, true, "Hell...Tom" },
    { "Hello, my name is Tom", 100, false, "Hello, my name is Tom" }
  };
  for (size_t i = 0; i < base::size(cases); ++i) {
    base::string16 output;
    EXPECT_EQ(cases[i].result,
              ElideString(UTF8ToUTF16(cases[i].input),
                          cases[i].max_len, &output));
    EXPECT_EQ(cases[i].output, UTF16ToUTF8(output));
  }
}

TEST(TextEliderTest, ElideRectangleText) {
  const FontList font_list;
  const int line_height = font_list.GetHeight();
  const float test_width = GetStringWidthF(ASCIIToUTF16("Test"), font_list);

  struct TestData {
    const char* input;
    float available_pixel_width;
    int available_pixel_height;
    bool truncated_y;
    const char* output;
  } cases[] = {
    { "", 0, 0, false, NULL },
    { "", 1, 1, false, NULL },
    { "Test", test_width, 0, true, NULL },
    { "Test", test_width, 1, false, "Test" },
    { "Test", test_width, line_height, false, "Test" },
    { "Test Test", test_width, line_height, true, "Test" },
    { "Test Test", test_width, line_height + 1, false, "Test|Test" },
    { "Test Test", test_width, line_height * 2, false, "Test|Test" },
    { "Test Test", test_width, line_height * 3, false, "Test|Test" },
    { "Test Test", test_width * 2, line_height * 2, false, "Test|Test" },
    { "Test Test", test_width * 3, line_height, false, "Test Test" },
    { "Test\nTest", test_width * 3, line_height * 2, false, "Test|Test" },
    { "Te\nst Te", test_width, line_height * 3, false, "Te|st|Te" },
    { "\nTest", test_width, line_height * 2, false, "|Test" },
    { "\nTest", test_width, line_height, true, "" },
    { "\n\nTest", test_width, line_height * 3, false, "||Test" },
    { "\n\nTest", test_width, line_height * 2, true, "|" },
    { "Test\n", 2 * test_width, line_height * 5, false, "Test|" },
    { "Test\n\n", 2 * test_width, line_height * 5, false, "Test||" },
    { "Test\n\n\n", 2 * test_width, line_height * 5, false, "Test|||" },
    { "Test\nTest\n\n", 2 * test_width, line_height * 5, false, "Test|Test||" },
    { "Test\n\nTest\n", 2 * test_width, line_height * 5, false, "Test||Test|" },
    { "Test\n\n\nTest", 2 * test_width, line_height * 5, false, "Test|||Test" },
    { "Te ", test_width, line_height, false, "Te" },
    { "Te  Te Test", test_width, 3 * line_height, false, "Te|Te|Test" },
  };

  for (size_t i = 0; i < base::size(cases); ++i) {
    std::vector<base::string16> lines;
    EXPECT_EQ(cases[i].truncated_y ? INSUFFICIENT_SPACE_VERTICAL : 0,
              ElideRectangleText(UTF8ToUTF16(cases[i].input),
                                 font_list,
                                 cases[i].available_pixel_width,
                                 cases[i].available_pixel_height,
                                 TRUNCATE_LONG_WORDS,
                                 &lines));
    if (cases[i].output) {
      const std::string result =
          UTF16ToUTF8(base::JoinString(lines, ASCIIToUTF16("|")));
      EXPECT_EQ(cases[i].output, result) << "Case " << i << " failed!";
    } else {
      EXPECT_TRUE(lines.empty()) << "Case " << i << " failed!";
    }
  }
}

TEST(TextEliderTest, ElideRectangleTextFirstWordTruncated) {
  const FontList font_list;
  const int line_height = font_list.GetHeight();

  const float test_width = GetStringWidthF(ASCIIToUTF16("Test"), font_list);
  const float tes_width = GetStringWidthF(ASCIIToUTF16("Tes"), font_list);

  std::vector<base::string16> lines;

  auto result_for_width = [&](const char* input, float width) {
    lines.clear();
    return ElideRectangleText(ASCIIToUTF16(input), font_list, width,
                              line_height * 4, WRAP_LONG_WORDS, &lines);
  };

  // Test base case.
  EXPECT_EQ(0, result_for_width("Test", test_width));
  EXPECT_EQ(1u, lines.size());
  EXPECT_EQ(ASCIIToUTF16("Test"), lines[0]);

  // First word truncated.
  EXPECT_EQ(INSUFFICIENT_SPACE_FOR_FIRST_WORD,
            result_for_width("Test", tes_width));
  EXPECT_EQ(2u, lines.size());
  EXPECT_EQ(ASCIIToUTF16("Tes"), lines[0]);
  EXPECT_EQ(ASCIIToUTF16("t"), lines[1]);

  // Two words truncated.
  EXPECT_EQ(INSUFFICIENT_SPACE_FOR_FIRST_WORD,
            result_for_width("Test\nTest", tes_width));
  EXPECT_EQ(4u, lines.size());
  EXPECT_EQ(ASCIIToUTF16("Tes"), lines[0]);
  EXPECT_EQ(ASCIIToUTF16("t"), lines[1]);
  EXPECT_EQ(ASCIIToUTF16("Tes"), lines[2]);
  EXPECT_EQ(ASCIIToUTF16("t"), lines[3]);

  // Word truncated, but not the first.
  EXPECT_EQ(0, result_for_width("T Test", tes_width));
  EXPECT_EQ(3u, lines.size());
  EXPECT_EQ(ASCIIToUTF16("T"), lines[0]);
  EXPECT_EQ(ASCIIToUTF16("Tes"), lines[1]);
  EXPECT_EQ(ASCIIToUTF16("t"), lines[2]);

  // Leading \n.
  EXPECT_EQ(0, result_for_width("\nTest", tes_width));
  EXPECT_EQ(3u, lines.size());
  EXPECT_EQ(ASCIIToUTF16(""), lines[0]);
  EXPECT_EQ(ASCIIToUTF16("Tes"), lines[1]);
  EXPECT_EQ(ASCIIToUTF16("t"), lines[2]);
}

TEST(TextEliderTest, ElideRectangleTextPunctuation) {
  const FontList font_list;
  const int line_height = font_list.GetHeight();
  const float test_width = GetStringWidthF(ASCIIToUTF16("Test"), font_list);
  const float test_t_width = GetStringWidthF(ASCIIToUTF16("Test T"), font_list);
  constexpr int kResultMask =
      INSUFFICIENT_SPACE_HORIZONTAL | INSUFFICIENT_SPACE_VERTICAL;

  struct TestData {
    const char* input;
    float available_pixel_width;
    int available_pixel_height;
    bool wrap_words;
    bool truncated_x;
    const char* output;
  } cases[] = {
    { "Test T.", test_t_width, line_height * 2, false, false, "Test|T." },
    { "Test T ?", test_t_width, line_height * 2, false, false, "Test|T ?" },
    { "Test. Test", test_width, line_height * 3, false, true, "Test|Test" },
    { "Test. Test", test_width, line_height * 3, true, false, "Test|.|Test" },
  };

  for (size_t i = 0; i < base::size(cases); ++i) {
    std::vector<base::string16> lines;
    const WordWrapBehavior wrap_behavior =
        (cases[i].wrap_words ? WRAP_LONG_WORDS : TRUNCATE_LONG_WORDS);
    EXPECT_EQ(cases[i].truncated_x ? INSUFFICIENT_SPACE_HORIZONTAL : 0,
              ElideRectangleText(UTF8ToUTF16(cases[i].input), font_list,
                                 cases[i].available_pixel_width,
                                 cases[i].available_pixel_height, wrap_behavior,
                                 &lines) &
                  kResultMask);
    if (cases[i].output) {
      const std::string result =
          UTF16ToUTF8(base::JoinString(lines, base::ASCIIToUTF16("|")));
      EXPECT_EQ(cases[i].output, result) << "Case " << i << " failed!";
    } else {
      EXPECT_TRUE(lines.empty()) << "Case " << i << " failed!";
    }
  }
}

TEST(TextEliderTest, ElideRectangleTextLongWords) {
  const FontList font_list;
  const int kAvailableHeight = 1000;
  const base::string16 kElidedTesting =
      UTF8ToUTF16(std::string("Tes") + kEllipsis);
  const float elided_width = GetStringWidthF(kElidedTesting, font_list);
  const float test_width = GetStringWidthF(ASCIIToUTF16("Test"), font_list);
  constexpr int kResultMask =
      INSUFFICIENT_SPACE_HORIZONTAL | INSUFFICIENT_SPACE_VERTICAL;

  struct TestData {
    const char* input;
    float available_pixel_width;
    WordWrapBehavior wrap_behavior;
    bool truncated_x;
    const char* output;
  } cases[] = {
    { "Testing", test_width, IGNORE_LONG_WORDS, false, "Testing" },
    { "X Testing", test_width, IGNORE_LONG_WORDS, false, "X|Testing" },
    { "Test Testing", test_width, IGNORE_LONG_WORDS, false, "Test|Testing" },
    { "Test\nTesting", test_width, IGNORE_LONG_WORDS, false, "Test|Testing" },
    { "Test Tests ", test_width, IGNORE_LONG_WORDS, false, "Test|Tests" },
    { "Test Tests T", test_width, IGNORE_LONG_WORDS, false, "Test|Tests|T" },

    { "Testing", elided_width, ELIDE_LONG_WORDS, true, "Tes..." },
    { "X Testing", elided_width, ELIDE_LONG_WORDS, true, "X|Tes..." },
    { "Test Testing", elided_width, ELIDE_LONG_WORDS, true, "Test|Tes..." },
    { "Test\nTesting", elided_width, ELIDE_LONG_WORDS, true, "Test|Tes..." },

    { "Testing", test_width, TRUNCATE_LONG_WORDS, true, "Test" },
    { "X Testing", test_width, TRUNCATE_LONG_WORDS, true, "X|Test" },
    { "Test Testing", test_width, TRUNCATE_LONG_WORDS, true, "Test|Test" },
    { "Test\nTesting", test_width, TRUNCATE_LONG_WORDS, true, "Test|Test" },
    { "Test Tests ", test_width, TRUNCATE_LONG_WORDS, true, "Test|Test" },
    { "Test Tests T", test_width, TRUNCATE_LONG_WORDS, true, "Test|Test|T" },

    { "Testing", test_width, WRAP_LONG_WORDS, false, "Test|ing" },
    { "X Testing", test_width, WRAP_LONG_WORDS, false, "X|Test|ing" },
    { "Test Testing", test_width, WRAP_LONG_WORDS, false, "Test|Test|ing" },
    { "Test\nTesting", test_width, WRAP_LONG_WORDS, false, "Test|Test|ing" },
    { "Test Tests ", test_width, WRAP_LONG_WORDS, false, "Test|Test|s" },
    { "Test Tests T", test_width, WRAP_LONG_WORDS, false, "Test|Test|s T" },
    { "TestTestTest", test_width, WRAP_LONG_WORDS, false, "Test|Test|Test" },
    { "TestTestTestT", test_width, WRAP_LONG_WORDS, false, "Test|Test|Test|T" },
  };

  for (size_t i = 0; i < base::size(cases); ++i) {
    std::vector<base::string16> lines;
    EXPECT_EQ(
        cases[i].truncated_x ? INSUFFICIENT_SPACE_HORIZONTAL : 0,
        ElideRectangleText(UTF8ToUTF16(cases[i].input), font_list,
                           cases[i].available_pixel_width, kAvailableHeight,
                           cases[i].wrap_behavior, &lines) &
            kResultMask);
    std::string expected_output(cases[i].output);
    base::ReplaceSubstringsAfterOffset(&expected_output, 0, "...", kEllipsis);
    const std::string result =
        UTF16ToUTF8(base::JoinString(lines, base::ASCIIToUTF16("|")));
    EXPECT_EQ(expected_output, result) << "Case " << i << " failed!";
  }
}

// This test is to make sure that the width of each wrapped line does not
// exceed the available width. On some platform like Mac, this test used to
// fail because the truncated integer width is returned for the string
// and the accumulation of the truncated values causes the elide function
// to wrap incorrectly.
TEST(TextEliderTest, ElideRectangleTextCheckLineWidth) {
  FontList font_list;
#if defined(OS_MACOSX) && !defined(OS_IOS)
  // Use a specific font to expose the line width exceeding problem.
  font_list = FontList(Font("LucidaGrande", 12));
#endif
  const float kAvailableWidth = 235;
  const int kAvailableHeight = 1000;
  const char text[] = "that Russian place we used to go to after fencing";
  std::vector<base::string16> lines;
  EXPECT_EQ(0, ElideRectangleText(UTF8ToUTF16(text),
                                  font_list,
                                  kAvailableWidth,
                                  kAvailableHeight,
                                  WRAP_LONG_WORDS,
                                  &lines));
  ASSERT_EQ(2u, lines.size());
  EXPECT_LE(GetStringWidthF(lines[0], font_list), kAvailableWidth);
  EXPECT_LE(GetStringWidthF(lines[1], font_list), kAvailableWidth);
}

#if defined(OS_CHROMEOS)
// This test was created specifically to test a message from crbug.com/415213.
// It tests that width of concatenation of words equals sum of widths of the
// words.
TEST(TextEliderTest, ElideRectangleTextCheckConcatWidthEqualsSumOfWidths) {
  FontList font_list;
  font_list = FontList("Noto Sans UI,ui-sans, 12px");
  SetFontRenderParamsDeviceScaleFactor(1.25f);
#define WIDTH(x) GetStringWidthF(UTF8ToUTF16(x), font_list)
  EXPECT_EQ(WIDTH("The administrator for this account has"),
            WIDTH("The ") + WIDTH("administrator ") + WIDTH("for ") +
                WIDTH("this ") + WIDTH("account ") + WIDTH("has"));
#undef WIDTH
  SetFontRenderParamsDeviceScaleFactor(1.0f);
}
#endif  // defined(OS_CHROMEOS)

TEST(TextEliderTest, ElideRectangleString) {
  struct TestData {
    const char* input;
    int max_rows;
    int max_cols;
    bool result;
    const char* output;
  } cases[] = {
    { "", 0, 0, false, "" },
    { "", 1, 1, false, "" },
    { "Hi, my name is\nTom", 0, 0,  true,  "..." },
    { "Hi, my name is\nTom", 1, 0,  true,  "\n..." },
    { "Hi, my name is\nTom", 0, 1,  true,  "..." },
    { "Hi, my name is\nTom", 1, 1,  true,  "H\n..." },
    { "Hi, my name is\nTom", 2, 1,  true,  "H\ni\n..." },
    { "Hi, my name is\nTom", 3, 1,  true,  "H\ni\n,\n..." },
    { "Hi, my name is\nTom", 4, 1,  true,  "H\ni\n,\n \n..." },
    { "Hi, my name is\nTom", 5, 1,  true,  "H\ni\n,\n \nm\n..." },
    { "Hi, my name is\nTom", 0, 2,  true,  "..." },
    { "Hi, my name is\nTom", 1, 2,  true,  "Hi\n..." },
    { "Hi, my name is\nTom", 2, 2,  true,  "Hi\n, \n..." },
    { "Hi, my name is\nTom", 3, 2,  true,  "Hi\n, \nmy\n..." },
    { "Hi, my name is\nTom", 4, 2,  true,  "Hi\n, \nmy\n n\n..." },
    { "Hi, my name is\nTom", 5, 2,  true,  "Hi\n, \nmy\n n\nam\n..." },
    { "Hi, my name is\nTom", 0, 3,  true,  "..." },
    { "Hi, my name is\nTom", 1, 3,  true,  "Hi,\n..." },
    { "Hi, my name is\nTom", 2, 3,  true,  "Hi,\n my\n..." },
    { "Hi, my name is\nTom", 3, 3,  true,  "Hi,\n my\n na\n..." },
    { "Hi, my name is\nTom", 4, 3,  true,  "Hi,\n my\n na\nme \n..." },
    { "Hi, my name is\nTom", 5, 3,  true,  "Hi,\n my\n na\nme \nis\n..." },
    { "Hi, my name is\nTom", 1, 4,  true,  "Hi, \n..." },
    { "Hi, my name is\nTom", 2, 4,  true,  "Hi, \nmy n\n..." },
    { "Hi, my name is\nTom", 3, 4,  true,  "Hi, \nmy n\name \n..." },
    { "Hi, my name is\nTom", 4, 4,  true,  "Hi, \nmy n\name \nis\n..." },
    { "Hi, my name is\nTom", 5, 4,  false, "Hi, \nmy n\name \nis\nTom" },
    { "Hi, my name is\nTom", 1, 5,  true,  "Hi, \n..." },
    { "Hi, my name is\nTom", 2, 5,  true,  "Hi, \nmy na\n..." },
    { "Hi, my name is\nTom", 3, 5,  true,  "Hi, \nmy na\nme \n..." },
    { "Hi, my name is\nTom", 4, 5,  true,  "Hi, \nmy na\nme \nis\n..." },
    { "Hi, my name is\nTom", 5, 5,  false, "Hi, \nmy na\nme \nis\nTom" },
    { "Hi, my name is\nTom", 1, 6,  true,  "Hi, \n..." },
    { "Hi, my name is\nTom", 2, 6,  true,  "Hi, \nmy \n..." },
    { "Hi, my name is\nTom", 3, 6,  true,  "Hi, \nmy \nname \n..." },
    { "Hi, my name is\nTom", 4, 6,  true,  "Hi, \nmy \nname \nis\n..." },
    { "Hi, my name is\nTom", 5, 6,  false, "Hi, \nmy \nname \nis\nTom" },
    { "Hi, my name is\nTom", 1, 7,  true,  "Hi, \n..." },
    { "Hi, my name is\nTom", 2, 7,  true,  "Hi, \nmy \n..." },
    { "Hi, my name is\nTom", 3, 7,  true,  "Hi, \nmy \nname \n..." },
    { "Hi, my name is\nTom", 4, 7,  true,  "Hi, \nmy \nname \nis\n..." },
    { "Hi, my name is\nTom", 5, 7,  false, "Hi, \nmy \nname \nis\nTom" },
    { "Hi, my name is\nTom", 1, 8,  true,  "Hi, my \n..." },
    { "Hi, my name is\nTom", 2, 8,  true,  "Hi, my \nname \n..." },
    { "Hi, my name is\nTom", 3, 8,  true,  "Hi, my \nname \nis\n..." },
    { "Hi, my name is\nTom", 4, 8,  false, "Hi, my \nname \nis\nTom" },
    { "Hi, my name is\nTom", 1, 9,  true,  "Hi, my \n..." },
    { "Hi, my name is\nTom", 2, 9,  true,  "Hi, my \nname is\n..." },
    { "Hi, my name is\nTom", 3, 9,  false, "Hi, my \nname is\nTom" },
    { "Hi, my name is\nTom", 1, 10, true,  "Hi, my \n..." },
    { "Hi, my name is\nTom", 2, 10, true,  "Hi, my \nname is\n..." },
    { "Hi, my name is\nTom", 3, 10, false, "Hi, my \nname is\nTom" },
    { "Hi, my name is\nTom", 1, 11, true,  "Hi, my \n..." },
    { "Hi, my name is\nTom", 2, 11, true,  "Hi, my \nname is\n..." },
    { "Hi, my name is\nTom", 3, 11, false, "Hi, my \nname is\nTom" },
    { "Hi, my name is\nTom", 1, 12, true,  "Hi, my \n..." },
    { "Hi, my name is\nTom", 2, 12, true,  "Hi, my \nname is\n..." },
    { "Hi, my name is\nTom", 3, 12, false, "Hi, my \nname is\nTom" },
    { "Hi, my name is\nTom", 1, 13, true,  "Hi, my name \n..." },
    { "Hi, my name is\nTom", 2, 13, true,  "Hi, my name \nis\n..." },
    { "Hi, my name is\nTom", 3, 13, false, "Hi, my name \nis\nTom" },
    { "Hi, my name is\nTom", 1, 20, true,  "Hi, my name is\n..." },
    { "Hi, my name is\nTom", 2, 20, false, "Hi, my name is\nTom" },
    { "Hi, my name is Tom",  1, 40, false, "Hi, my name is Tom" },
  };
  base::string16 output;
  for (size_t i = 0; i < base::size(cases); ++i) {
    EXPECT_EQ(cases[i].result,
              ElideRectangleString(UTF8ToUTF16(cases[i].input),
                                   cases[i].max_rows, cases[i].max_cols,
                                   true, &output));
    EXPECT_EQ(cases[i].output, UTF16ToUTF8(output));
  }
}

TEST(TextEliderTest, ElideRectangleStringNotStrict) {
  struct TestData {
    const char* input;
    int max_rows;
    int max_cols;
    bool result;
    const char* output;
  } cases[] = {
    { "", 0, 0, false, "" },
    { "", 1, 1, false, "" },
    { "Hi, my name_is\nDick", 0, 0,  true,  "..." },
    { "Hi, my name_is\nDick", 1, 0,  true,  "\n..." },
    { "Hi, my name_is\nDick", 0, 1,  true,  "..." },
    { "Hi, my name_is\nDick", 1, 1,  true,  "H\n..." },
    { "Hi, my name_is\nDick", 2, 1,  true,  "H\ni\n..." },
    { "Hi, my name_is\nDick", 3, 1,  true,  "H\ni\n,\n..." },
    { "Hi, my name_is\nDick", 4, 1,  true,  "H\ni\n,\n \n..." },
    { "Hi, my name_is\nDick", 5, 1,  true,  "H\ni\n,\n \nm\n..." },
    { "Hi, my name_is\nDick", 0, 2,  true,  "..." },
    { "Hi, my name_is\nDick", 1, 2,  true,  "Hi\n..." },
    { "Hi, my name_is\nDick", 2, 2,  true,  "Hi\n, \n..." },
    { "Hi, my name_is\nDick", 3, 2,  true,  "Hi\n, \nmy\n..." },
    { "Hi, my name_is\nDick", 4, 2,  true,  "Hi\n, \nmy\n n\n..." },
    { "Hi, my name_is\nDick", 5, 2,  true,  "Hi\n, \nmy\n n\nam\n..." },
    { "Hi, my name_is\nDick", 0, 3,  true,  "..." },
    { "Hi, my name_is\nDick", 1, 3,  true,  "Hi,\n..." },
    { "Hi, my name_is\nDick", 2, 3,  true,  "Hi,\n my\n..." },
    { "Hi, my name_is\nDick", 3, 3,  true,  "Hi,\n my\n na\n..." },
    { "Hi, my name_is\nDick", 4, 3,  true,  "Hi,\n my\n na\nme_\n..." },
    { "Hi, my name_is\nDick", 5, 3,  true,  "Hi,\n my\n na\nme_\nis\n..." },
    { "Hi, my name_is\nDick", 1, 4,  true,  "Hi, ..." },
    { "Hi, my name_is\nDick", 2, 4,  true,  "Hi, my n\n..." },
    { "Hi, my name_is\nDick", 3, 4,  true,  "Hi, my n\name_\n..." },
    { "Hi, my name_is\nDick", 4, 4,  true,  "Hi, my n\name_\nis\n..." },
    { "Hi, my name_is\nDick", 5, 4,  false, "Hi, my n\name_\nis\nDick" },
    { "Hi, my name_is\nDick", 1, 5,  true,  "Hi, ..." },
    { "Hi, my name_is\nDick", 2, 5,  true,  "Hi, my na\n..." },
    { "Hi, my name_is\nDick", 3, 5,  true,  "Hi, my na\nme_is\n..." },
    { "Hi, my name_is\nDick", 4, 5,  true,  "Hi, my na\nme_is\n\n..." },
    { "Hi, my name_is\nDick", 5, 5,  false, "Hi, my na\nme_is\n\nDick" },
    { "Hi, my name_is\nDick", 1, 6,  true,  "Hi, ..." },
    { "Hi, my name_is\nDick", 2, 6,  true,  "Hi, my nam\n..." },
    { "Hi, my name_is\nDick", 3, 6,  true,  "Hi, my nam\ne_is\n..." },
    { "Hi, my name_is\nDick", 4, 6,  false, "Hi, my nam\ne_is\nDick" },
    { "Hi, my name_is\nDick", 5, 6,  false, "Hi, my nam\ne_is\nDick" },
    { "Hi, my name_is\nDick", 1, 7,  true,  "Hi, ..." },
    { "Hi, my name_is\nDick", 2, 7,  true,  "Hi, my name\n..." },
    { "Hi, my name_is\nDick", 3, 7,  true,  "Hi, my name\n_is\n..." },
    { "Hi, my name_is\nDick", 4, 7,  false, "Hi, my name\n_is\nDick" },
    { "Hi, my name_is\nDick", 5, 7,  false, "Hi, my name\n_is\nDick" },
    { "Hi, my name_is\nDick", 1, 8,  true,  "Hi, my n\n..." },
    { "Hi, my name_is\nDick", 2, 8,  true,  "Hi, my n\name_is\n..." },
    { "Hi, my name_is\nDick", 3, 8,  false, "Hi, my n\name_is\nDick" },
    { "Hi, my name_is\nDick", 1, 9,  true,  "Hi, my ..." },
    { "Hi, my name_is\nDick", 2, 9,  true,  "Hi, my name_is\n..." },
    { "Hi, my name_is\nDick", 3, 9,  false, "Hi, my name_is\nDick" },
    { "Hi, my name_is\nDick", 1, 10, true,  "Hi, my ..." },
    { "Hi, my name_is\nDick", 2, 10, true,  "Hi, my name_is\n..." },
    { "Hi, my name_is\nDick", 3, 10, false, "Hi, my name_is\nDick" },
    { "Hi, my name_is\nDick", 1, 11, true,  "Hi, my ..." },
    { "Hi, my name_is\nDick", 2, 11, true,  "Hi, my name_is\n..." },
    { "Hi, my name_is\nDick", 3, 11, false, "Hi, my name_is\nDick" },
    { "Hi, my name_is\nDick", 1, 12, true,  "Hi, my ..." },
    { "Hi, my name_is\nDick", 2, 12, true,  "Hi, my name_is\n..." },
    { "Hi, my name_is\nDick", 3, 12, false, "Hi, my name_is\nDick" },
    { "Hi, my name_is\nDick", 1, 13, true,  "Hi, my ..." },
    { "Hi, my name_is\nDick", 2, 13, true,  "Hi, my name_is\n..." },
    { "Hi, my name_is\nDick", 3, 13, false, "Hi, my name_is\nDick" },
    { "Hi, my name_is\nDick", 1, 20, true,  "Hi, my name_is\n..." },
    { "Hi, my name_is\nDick", 2, 20, false, "Hi, my name_is\nDick" },
    { "Hi, my name_is Dick",  1, 40, false, "Hi, my name_is Dick" },
  };
  base::string16 output;
  for (size_t i = 0; i < base::size(cases); ++i) {
    EXPECT_EQ(cases[i].result,
              ElideRectangleString(UTF8ToUTF16(cases[i].input),
                                   cases[i].max_rows, cases[i].max_cols,
                                   false, &output));
    EXPECT_EQ(cases[i].output, UTF16ToUTF8(output));
  }
}

TEST(TextEliderTest, ElideRectangleWide16) {
  // Two greek words separated by space.
  const base::string16 str(WideToUTF16(
      L"\x03a0\x03b1\x03b3\x03ba\x03cc\x03c3\x03bc\x03b9"
      L"\x03bf\x03c2\x0020\x0399\x03c3\x03c4\x03cc\x03c2"));
  const base::string16 out1(WideToUTF16(
      L"\x03a0\x03b1\x03b3\x03ba\n"
      L"\x03cc\x03c3\x03bc\x03b9\n"
      L"..."));
  const base::string16 out2(WideToUTF16(
      L"\x03a0\x03b1\x03b3\x03ba\x03cc\x03c3\x03bc\x03b9\x03bf\x03c2\x0020\n"
      L"\x0399\x03c3\x03c4\x03cc\x03c2"));
  base::string16 output;
  EXPECT_TRUE(ElideRectangleString(str, 2, 4, true, &output));
  EXPECT_EQ(out1, output);
  EXPECT_FALSE(ElideRectangleString(str, 2, 12, true, &output));
  EXPECT_EQ(out2, output);
}

TEST(TextEliderTest, ElideRectangleWide32) {
  // Four U+1D49C MATHEMATICAL SCRIPT CAPITAL A followed by space "aaaaa".
  const base::string16 str(UTF8ToUTF16(
      "\xF0\x9D\x92\x9C\xF0\x9D\x92\x9C\xF0\x9D\x92\x9C\xF0\x9D\x92\x9C"
      " aaaaa"));
  const base::string16 out(UTF8ToUTF16(
      "\xF0\x9D\x92\x9C\xF0\x9D\x92\x9C\xF0\x9D\x92\x9C\n"
      "\xF0\x9D\x92\x9C \naaa\n..."));
  base::string16 output;
  EXPECT_TRUE(ElideRectangleString(str, 3, 3, true, &output));
  EXPECT_EQ(out, output);
}

TEST(TextEliderTest, TruncateString) {
  base::string16 str = ASCIIToUTF16("fooooey    bxxxar baz  ");

  // Test breaking at character 0.
  EXPECT_EQ(base::string16(), TruncateString(str, 0, WORD_BREAK));
  EXPECT_EQ(base::string16(), TruncateString(str, 0, CHARACTER_BREAK));

  // Test breaking at character 1.
  EXPECT_EQ(L"\x2026", UTF16ToWide(TruncateString(str, 1, WORD_BREAK)));
  EXPECT_EQ(L"\x2026", UTF16ToWide(TruncateString(str, 1, CHARACTER_BREAK)));

  // Test breaking in the middle of the first word.
  EXPECT_EQ(L"f\x2026", UTF16ToWide(TruncateString(str, 2, WORD_BREAK)));
  EXPECT_EQ(L"f\x2026", UTF16ToWide(TruncateString(str, 2, CHARACTER_BREAK)));

  // Test breaking in between words.
  EXPECT_EQ(L"fooooey\x2026", UTF16ToWide(TruncateString(str, 9, WORD_BREAK)));
  EXPECT_EQ(L"fooooey\x2026",
            UTF16ToWide(TruncateString(str, 9, CHARACTER_BREAK)));

  // Test breaking at the start of a later word.
  EXPECT_EQ(L"fooooey\x2026", UTF16ToWide(TruncateString(str, 11, WORD_BREAK)));
  EXPECT_EQ(L"fooooey\x2026",
            UTF16ToWide(TruncateString(str, 11, CHARACTER_BREAK)));

  // Test breaking in the middle of a word.
  EXPECT_EQ(L"fooooey\x2026", UTF16ToWide(TruncateString(str, 12, WORD_BREAK)));
  EXPECT_EQ(L"fooooey\x2026",
            UTF16ToWide(TruncateString(str, 12, CHARACTER_BREAK)));
  EXPECT_EQ(L"fooooey\x2026", UTF16ToWide(TruncateString(str, 14, WORD_BREAK)));
  EXPECT_EQ(L"fooooey    bx\x2026",
            UTF16ToWide(TruncateString(str, 14, CHARACTER_BREAK)));

  // Test breaking in whitespace at the end of the string.
  EXPECT_EQ(L"fooooey    bxxxar baz\x2026",
            UTF16ToWide(TruncateString(str, 22, WORD_BREAK)));
  EXPECT_EQ(L"fooooey    bxxxar baz\x2026",
            UTF16ToWide(TruncateString(str, 22, CHARACTER_BREAK)));

  // Test breaking at the end of the string.
  EXPECT_EQ(str, TruncateString(str, str.length(), WORD_BREAK));
  EXPECT_EQ(str, TruncateString(str, str.length(), CHARACTER_BREAK));

  // Test breaking past the end of the string.
  EXPECT_EQ(str, TruncateString(str, str.length() + 10, WORD_BREAK));
  EXPECT_EQ(str, TruncateString(str, str.length() + 10, CHARACTER_BREAK));


  // Tests of strings with leading whitespace:
  base::string16 str2 = ASCIIToUTF16("   foo");

  // Test breaking in leading whitespace.
  EXPECT_EQ(L"\x2026", UTF16ToWide(TruncateString(str2, 2, WORD_BREAK)));
  EXPECT_EQ(L"\x2026", UTF16ToWide(TruncateString(str2, 2, CHARACTER_BREAK)));

  // Test breaking at the beginning of the first word, with leading whitespace.
  EXPECT_EQ(L"\x2026", UTF16ToWide(TruncateString(str2, 3, WORD_BREAK)));
  EXPECT_EQ(L"\x2026", UTF16ToWide(TruncateString(str2, 3, CHARACTER_BREAK)));

  // Test breaking in the middle of the first word, with leading whitespace.
  EXPECT_EQ(L"\x2026", UTF16ToWide(TruncateString(str2, 4, WORD_BREAK)));
  EXPECT_EQ(L"\x2026", UTF16ToWide(TruncateString(str2, 4, CHARACTER_BREAK)));
  EXPECT_EQ(L"   f\x2026", UTF16ToWide(TruncateString(str2, 5, WORD_BREAK)));
  EXPECT_EQ(L"   f\x2026",
            UTF16ToWide(TruncateString(str2, 5, CHARACTER_BREAK)));
}

}  // namespace gfx
