// Copyright (c) 2011 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.

#include <string>

#include "base/string_piece.h"
#include "base/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace base {

TEST(StringPieceTest, CheckComparisonOperators) {
#define CMP_Y(op, x, y)                                               \
  ASSERT_TRUE( (StringPiece((x)) op StringPiece((y))));               \
  ASSERT_TRUE( (StringPiece((x)).compare(StringPiece((y))) op 0))

#define CMP_N(op, x, y)                                          \
  ASSERT_FALSE(StringPiece((x)) op StringPiece((y)));               \
  ASSERT_FALSE(StringPiece((x)).compare(StringPiece((y))) op 0)

  CMP_Y(==, "",   "");
  CMP_Y(==, "a",  "a");
  CMP_Y(==, "aa", "aa");
  CMP_N(==, "a",  "");
  CMP_N(==, "",   "a");
  CMP_N(==, "a",  "b");
  CMP_N(==, "a",  "aa");
  CMP_N(==, "aa", "a");

  CMP_N(!=, "",   "");
  CMP_N(!=, "a",  "a");
  CMP_N(!=, "aa", "aa");
  CMP_Y(!=, "a",  "");
  CMP_Y(!=, "",   "a");
  CMP_Y(!=, "a",  "b");
  CMP_Y(!=, "a",  "aa");
  CMP_Y(!=, "aa", "a");

  CMP_Y(<, "a",  "b");
  CMP_Y(<, "a",  "aa");
  CMP_Y(<, "aa", "b");
  CMP_Y(<, "aa", "bb");
  CMP_N(<, "a",  "a");
  CMP_N(<, "b",  "a");
  CMP_N(<, "aa", "a");
  CMP_N(<, "b",  "aa");
  CMP_N(<, "bb", "aa");

  CMP_Y(<=, "a",  "a");
  CMP_Y(<=, "a",  "b");
  CMP_Y(<=, "a",  "aa");
  CMP_Y(<=, "aa", "b");
  CMP_Y(<=, "aa", "bb");
  CMP_N(<=, "b",  "a");
  CMP_N(<=, "aa", "a");
  CMP_N(<=, "b",  "aa");
  CMP_N(<=, "bb", "aa");

  CMP_N(>=, "a",  "b");
  CMP_N(>=, "a",  "aa");
  CMP_N(>=, "aa", "b");
  CMP_N(>=, "aa", "bb");
  CMP_Y(>=, "a",  "a");
  CMP_Y(>=, "b",  "a");
  CMP_Y(>=, "aa", "a");
  CMP_Y(>=, "b",  "aa");
  CMP_Y(>=, "bb", "aa");

  CMP_N(>, "a",  "a");
  CMP_N(>, "a",  "b");
  CMP_N(>, "a",  "aa");
  CMP_N(>, "aa", "b");
  CMP_N(>, "aa", "bb");
  CMP_Y(>, "b",  "a");
  CMP_Y(>, "aa", "a");
  CMP_Y(>, "b",  "aa");
  CMP_Y(>, "bb", "aa");

  std::string x;
  for (int i = 0; i < 256; i++) {
    x += 'a';
    std::string y = x;
    CMP_Y(==, x, y);
    for (int j = 0; j < i; j++) {
      std::string z = x;
      z[j] = 'b';       // Differs in position 'j'
      CMP_N(==, x, z);
    }
  }

#undef CMP_Y
#undef CMP_N
}

TEST(StringPieceTest, CheckSTL) {
  StringPiece a("abcdefghijklmnopqrstuvwxyz");
  StringPiece b("abc");
  StringPiece c("xyz");
  StringPiece d("foobar");
  StringPiece e;
  std::string temp("123");
  temp += '\0';
  temp += "456";
  StringPiece f(temp);

  ASSERT_EQ(a[6], 'g');
  ASSERT_EQ(b[0], 'a');
  ASSERT_EQ(c[2], 'z');
  ASSERT_EQ(f[3], '\0');
  ASSERT_EQ(f[5], '5');

  ASSERT_EQ(*d.data(), 'f');
  ASSERT_EQ(d.data()[5], 'r');
  ASSERT_TRUE(e.data() == NULL);

  ASSERT_EQ(*a.begin(), 'a');
  ASSERT_EQ(*(b.begin() + 2), 'c');
  ASSERT_EQ(*(c.end() - 1), 'z');

  ASSERT_EQ(*a.rbegin(), 'z');
  ASSERT_EQ(*(b.rbegin() + 2), 'a');
  ASSERT_EQ(*(c.rend() - 1), 'x');
  ASSERT_TRUE(a.rbegin() + 26 == a.rend());

  ASSERT_EQ(a.size(), 26U);
  ASSERT_EQ(b.size(), 3U);
  ASSERT_EQ(c.size(), 3U);
  ASSERT_EQ(d.size(), 6U);
  ASSERT_EQ(e.size(), 0U);
  ASSERT_EQ(f.size(), 7U);

  ASSERT_TRUE(!d.empty());
  ASSERT_TRUE(d.begin() != d.end());
  ASSERT_TRUE(d.begin() + 6 == d.end());

  ASSERT_TRUE(e.empty());
  ASSERT_TRUE(e.begin() == e.end());

  d.clear();
  ASSERT_EQ(d.size(), 0U);
  ASSERT_TRUE(d.empty());
  ASSERT_TRUE(d.data() == NULL);
  ASSERT_TRUE(d.begin() == d.end());

  ASSERT_GE(a.max_size(), a.capacity());
  ASSERT_GE(a.capacity(), a.size());

  char buf[4] = { '%', '%', '%', '%' };
  ASSERT_EQ(a.copy(buf, 4), 4U);
  ASSERT_EQ(buf[0], a[0]);
  ASSERT_EQ(buf[1], a[1]);
  ASSERT_EQ(buf[2], a[2]);
  ASSERT_EQ(buf[3], a[3]);
  ASSERT_EQ(a.copy(buf, 3, 7), 3U);
  ASSERT_EQ(buf[0], a[7]);
  ASSERT_EQ(buf[1], a[8]);
  ASSERT_EQ(buf[2], a[9]);
  ASSERT_EQ(buf[3], a[3]);
  ASSERT_EQ(c.copy(buf, 99), 3U);
  ASSERT_EQ(buf[0], c[0]);
  ASSERT_EQ(buf[1], c[1]);
  ASSERT_EQ(buf[2], c[2]);
  ASSERT_EQ(buf[3], a[3]);

  ASSERT_EQ(StringPiece::npos, std::string::npos);

  ASSERT_EQ(a.find(b), 0U);
  ASSERT_EQ(a.find(b, 1), StringPiece::npos);
  ASSERT_EQ(a.find(c), 23U);
  ASSERT_EQ(a.find(c, 9), 23U);
  ASSERT_EQ(a.find(c, StringPiece::npos), StringPiece::npos);
  ASSERT_EQ(b.find(c), StringPiece::npos);
  ASSERT_EQ(b.find(c, StringPiece::npos), StringPiece::npos);
  ASSERT_EQ(a.find(d), 0U);
  ASSERT_EQ(a.find(e), 0U);
  ASSERT_EQ(a.find(d, 12), 12U);
  ASSERT_EQ(a.find(e, 17), 17U);
  StringPiece g("xx not found bb");
  ASSERT_EQ(a.find(g), StringPiece::npos);
  // empty string nonsense
  ASSERT_EQ(d.find(b), StringPiece::npos);
  ASSERT_EQ(e.find(b), StringPiece::npos);
  ASSERT_EQ(d.find(b, 4), StringPiece::npos);
  ASSERT_EQ(e.find(b, 7), StringPiece::npos);

  size_t empty_search_pos = std::string().find(std::string());
  ASSERT_EQ(d.find(d), empty_search_pos);
  ASSERT_EQ(d.find(e), empty_search_pos);
  ASSERT_EQ(e.find(d), empty_search_pos);
  ASSERT_EQ(e.find(e), empty_search_pos);
  ASSERT_EQ(d.find(d, 4), std::string().find(std::string(), 4));
  ASSERT_EQ(d.find(e, 4), std::string().find(std::string(), 4));
  ASSERT_EQ(e.find(d, 4), std::string().find(std::string(), 4));
  ASSERT_EQ(e.find(e, 4), std::string().find(std::string(), 4));

  ASSERT_EQ(a.find('a'), 0U);
  ASSERT_EQ(a.find('c'), 2U);
  ASSERT_EQ(a.find('z'), 25U);
  ASSERT_EQ(a.find('$'), StringPiece::npos);
  ASSERT_EQ(a.find('\0'), StringPiece::npos);
  ASSERT_EQ(f.find('\0'), 3U);
  ASSERT_EQ(f.find('3'), 2U);
  ASSERT_EQ(f.find('5'), 5U);
  ASSERT_EQ(g.find('o'), 4U);
  ASSERT_EQ(g.find('o', 4), 4U);
  ASSERT_EQ(g.find('o', 5), 8U);
  ASSERT_EQ(a.find('b', 5), StringPiece::npos);
  // empty string nonsense
  ASSERT_EQ(d.find('\0'), StringPiece::npos);
  ASSERT_EQ(e.find('\0'), StringPiece::npos);
  ASSERT_EQ(d.find('\0', 4), StringPiece::npos);
  ASSERT_EQ(e.find('\0', 7), StringPiece::npos);
  ASSERT_EQ(d.find('x'), StringPiece::npos);
  ASSERT_EQ(e.find('x'), StringPiece::npos);
  ASSERT_EQ(d.find('x', 4), StringPiece::npos);
  ASSERT_EQ(e.find('x', 7), StringPiece::npos);

  ASSERT_EQ(a.rfind(b), 0U);
  ASSERT_EQ(a.rfind(b, 1), 0U);
  ASSERT_EQ(a.rfind(c), 23U);
  ASSERT_EQ(a.rfind(c, 22U), StringPiece::npos);
  ASSERT_EQ(a.rfind(c, 1U), StringPiece::npos);
  ASSERT_EQ(a.rfind(c, 0U), StringPiece::npos);
  ASSERT_EQ(b.rfind(c), StringPiece::npos);
  ASSERT_EQ(b.rfind(c, 0U), StringPiece::npos);
  ASSERT_EQ(a.rfind(d), (size_t) a.as_string().rfind(std::string()));
  ASSERT_EQ(a.rfind(e), a.as_string().rfind(std::string()));
  ASSERT_EQ(a.rfind(d, 12), 12U);
  ASSERT_EQ(a.rfind(e, 17), 17U);
  ASSERT_EQ(a.rfind(g), StringPiece::npos);
  ASSERT_EQ(d.rfind(b), StringPiece::npos);
  ASSERT_EQ(e.rfind(b), StringPiece::npos);
  ASSERT_EQ(d.rfind(b, 4), StringPiece::npos);
  ASSERT_EQ(e.rfind(b, 7), StringPiece::npos);
  // empty string nonsense
  ASSERT_EQ(d.rfind(d, 4), std::string().rfind(std::string()));
  ASSERT_EQ(e.rfind(d, 7), std::string().rfind(std::string()));
  ASSERT_EQ(d.rfind(e, 4), std::string().rfind(std::string()));
  ASSERT_EQ(e.rfind(e, 7), std::string().rfind(std::string()));
  ASSERT_EQ(d.rfind(d), std::string().rfind(std::string()));
  ASSERT_EQ(e.rfind(d), std::string().rfind(std::string()));
  ASSERT_EQ(d.rfind(e), std::string().rfind(std::string()));
  ASSERT_EQ(e.rfind(e), std::string().rfind(std::string()));

  ASSERT_EQ(g.rfind('o'), 8U);
  ASSERT_EQ(g.rfind('q'), StringPiece::npos);
  ASSERT_EQ(g.rfind('o', 8), 8U);
  ASSERT_EQ(g.rfind('o', 7), 4U);
  ASSERT_EQ(g.rfind('o', 3), StringPiece::npos);
  ASSERT_EQ(f.rfind('\0'), 3U);
  ASSERT_EQ(f.rfind('\0', 12), 3U);
  ASSERT_EQ(f.rfind('3'), 2U);
  ASSERT_EQ(f.rfind('5'), 5U);
  // empty string nonsense
  ASSERT_EQ(d.rfind('o'), StringPiece::npos);
  ASSERT_EQ(e.rfind('o'), StringPiece::npos);
  ASSERT_EQ(d.rfind('o', 4), StringPiece::npos);
  ASSERT_EQ(e.rfind('o', 7), StringPiece::npos);

  ASSERT_EQ(a.find_first_of(b), 0U);
  ASSERT_EQ(a.find_first_of(b, 0), 0U);
  ASSERT_EQ(a.find_first_of(b, 1), 1U);
  ASSERT_EQ(a.find_first_of(b, 2), 2U);
  ASSERT_EQ(a.find_first_of(b, 3), StringPiece::npos);
  ASSERT_EQ(a.find_first_of(c), 23U);
  ASSERT_EQ(a.find_first_of(c, 23), 23U);
  ASSERT_EQ(a.find_first_of(c, 24), 24U);
  ASSERT_EQ(a.find_first_of(c, 25), 25U);
  ASSERT_EQ(a.find_first_of(c, 26), StringPiece::npos);
  ASSERT_EQ(g.find_first_of(b), 13U);
  ASSERT_EQ(g.find_first_of(c), 0U);
  ASSERT_EQ(a.find_first_of(f), StringPiece::npos);
  ASSERT_EQ(f.find_first_of(a), StringPiece::npos);
  // empty string nonsense
  ASSERT_EQ(a.find_first_of(d), StringPiece::npos);
  ASSERT_EQ(a.find_first_of(e), StringPiece::npos);
  ASSERT_EQ(d.find_first_of(b), StringPiece::npos);
  ASSERT_EQ(e.find_first_of(b), StringPiece::npos);
  ASSERT_EQ(d.find_first_of(d), StringPiece::npos);
  ASSERT_EQ(e.find_first_of(d), StringPiece::npos);
  ASSERT_EQ(d.find_first_of(e), StringPiece::npos);
  ASSERT_EQ(e.find_first_of(e), StringPiece::npos);

  ASSERT_EQ(a.find_first_not_of(b), 3U);
  ASSERT_EQ(a.find_first_not_of(c), 0U);
  ASSERT_EQ(b.find_first_not_of(a), StringPiece::npos);
  ASSERT_EQ(c.find_first_not_of(a), StringPiece::npos);
  ASSERT_EQ(f.find_first_not_of(a), 0U);
  ASSERT_EQ(a.find_first_not_of(f), 0U);
  ASSERT_EQ(a.find_first_not_of(d), 0U);
  ASSERT_EQ(a.find_first_not_of(e), 0U);
  // empty string nonsense
  ASSERT_EQ(d.find_first_not_of(a), StringPiece::npos);
  ASSERT_EQ(e.find_first_not_of(a), StringPiece::npos);
  ASSERT_EQ(d.find_first_not_of(d), StringPiece::npos);
  ASSERT_EQ(e.find_first_not_of(d), StringPiece::npos);
  ASSERT_EQ(d.find_first_not_of(e), StringPiece::npos);
  ASSERT_EQ(e.find_first_not_of(e), StringPiece::npos);

  StringPiece h("====");
  ASSERT_EQ(h.find_first_not_of('='), StringPiece::npos);
  ASSERT_EQ(h.find_first_not_of('=', 3), StringPiece::npos);
  ASSERT_EQ(h.find_first_not_of('\0'), 0U);
  ASSERT_EQ(g.find_first_not_of('x'), 2U);
  ASSERT_EQ(f.find_first_not_of('\0'), 0U);
  ASSERT_EQ(f.find_first_not_of('\0', 3), 4U);
  ASSERT_EQ(f.find_first_not_of('\0', 2), 2U);
  // empty string nonsense
  ASSERT_EQ(d.find_first_not_of('x'), StringPiece::npos);
  ASSERT_EQ(e.find_first_not_of('x'), StringPiece::npos);
  ASSERT_EQ(d.find_first_not_of('\0'), StringPiece::npos);
  ASSERT_EQ(e.find_first_not_of('\0'), StringPiece::npos);

  //  StringPiece g("xx not found bb");
  StringPiece i("56");
  ASSERT_EQ(h.find_last_of(a), StringPiece::npos);
  ASSERT_EQ(g.find_last_of(a), g.size()-1);
  ASSERT_EQ(a.find_last_of(b), 2U);
  ASSERT_EQ(a.find_last_of(c), a.size()-1);
  ASSERT_EQ(f.find_last_of(i), 6U);
  ASSERT_EQ(a.find_last_of('a'), 0U);
  ASSERT_EQ(a.find_last_of('b'), 1U);
  ASSERT_EQ(a.find_last_of('z'), 25U);
  ASSERT_EQ(a.find_last_of('a', 5), 0U);
  ASSERT_EQ(a.find_last_of('b', 5), 1U);
  ASSERT_EQ(a.find_last_of('b', 0), StringPiece::npos);
  ASSERT_EQ(a.find_last_of('z', 25), 25U);
  ASSERT_EQ(a.find_last_of('z', 24), StringPiece::npos);
  ASSERT_EQ(f.find_last_of(i, 5), 5U);
  ASSERT_EQ(f.find_last_of(i, 6), 6U);
  ASSERT_EQ(f.find_last_of(a, 4), StringPiece::npos);
  // empty string nonsense
  ASSERT_EQ(f.find_last_of(d), StringPiece::npos);
  ASSERT_EQ(f.find_last_of(e), StringPiece::npos);
  ASSERT_EQ(f.find_last_of(d, 4), StringPiece::npos);
  ASSERT_EQ(f.find_last_of(e, 4), StringPiece::npos);
  ASSERT_EQ(d.find_last_of(d), StringPiece::npos);
  ASSERT_EQ(d.find_last_of(e), StringPiece::npos);
  ASSERT_EQ(e.find_last_of(d), StringPiece::npos);
  ASSERT_EQ(e.find_last_of(e), StringPiece::npos);
  ASSERT_EQ(d.find_last_of(f), StringPiece::npos);
  ASSERT_EQ(e.find_last_of(f), StringPiece::npos);
  ASSERT_EQ(d.find_last_of(d, 4), StringPiece::npos);
  ASSERT_EQ(d.find_last_of(e, 4), StringPiece::npos);
  ASSERT_EQ(e.find_last_of(d, 4), StringPiece::npos);
  ASSERT_EQ(e.find_last_of(e, 4), StringPiece::npos);
  ASSERT_EQ(d.find_last_of(f, 4), StringPiece::npos);
  ASSERT_EQ(e.find_last_of(f, 4), StringPiece::npos);

  ASSERT_EQ(a.find_last_not_of(b), a.size()-1);
  ASSERT_EQ(a.find_last_not_of(c), 22U);
  ASSERT_EQ(b.find_last_not_of(a), StringPiece::npos);
  ASSERT_EQ(b.find_last_not_of(b), StringPiece::npos);
  ASSERT_EQ(f.find_last_not_of(i), 4U);
  ASSERT_EQ(a.find_last_not_of(c, 24), 22U);
  ASSERT_EQ(a.find_last_not_of(b, 3), 3U);
  ASSERT_EQ(a.find_last_not_of(b, 2), StringPiece::npos);
  // empty string nonsense
  ASSERT_EQ(f.find_last_not_of(d), f.size()-1);
  ASSERT_EQ(f.find_last_not_of(e), f.size()-1);
  ASSERT_EQ(f.find_last_not_of(d, 4), 4U);
  ASSERT_EQ(f.find_last_not_of(e, 4), 4U);
  ASSERT_EQ(d.find_last_not_of(d), StringPiece::npos);
  ASSERT_EQ(d.find_last_not_of(e), StringPiece::npos);
  ASSERT_EQ(e.find_last_not_of(d), StringPiece::npos);
  ASSERT_EQ(e.find_last_not_of(e), StringPiece::npos);
  ASSERT_EQ(d.find_last_not_of(f), StringPiece::npos);
  ASSERT_EQ(e.find_last_not_of(f), StringPiece::npos);
  ASSERT_EQ(d.find_last_not_of(d, 4), StringPiece::npos);
  ASSERT_EQ(d.find_last_not_of(e, 4), StringPiece::npos);
  ASSERT_EQ(e.find_last_not_of(d, 4), StringPiece::npos);
  ASSERT_EQ(e.find_last_not_of(e, 4), StringPiece::npos);
  ASSERT_EQ(d.find_last_not_of(f, 4), StringPiece::npos);
  ASSERT_EQ(e.find_last_not_of(f, 4), StringPiece::npos);

  ASSERT_EQ(h.find_last_not_of('x'), h.size() - 1);
  ASSERT_EQ(h.find_last_not_of('='), StringPiece::npos);
  ASSERT_EQ(b.find_last_not_of('c'), 1U);
  ASSERT_EQ(h.find_last_not_of('x', 2), 2U);
  ASSERT_EQ(h.find_last_not_of('=', 2), StringPiece::npos);
  ASSERT_EQ(b.find_last_not_of('b', 1), 0U);
  // empty string nonsense
  ASSERT_EQ(d.find_last_not_of('x'), StringPiece::npos);
  ASSERT_EQ(e.find_last_not_of('x'), StringPiece::npos);
  ASSERT_EQ(d.find_last_not_of('\0'), StringPiece::npos);
  ASSERT_EQ(e.find_last_not_of('\0'), StringPiece::npos);

  ASSERT_EQ(a.substr(0, 3), b);
  ASSERT_EQ(a.substr(23), c);
  ASSERT_EQ(a.substr(23, 3), c);
  ASSERT_EQ(a.substr(23, 99), c);
  ASSERT_EQ(a.substr(0), a);
  ASSERT_EQ(a.substr(3, 2), "de");
  // empty string nonsense
  ASSERT_EQ(a.substr(99, 2), e);
  ASSERT_EQ(d.substr(99), e);
  ASSERT_EQ(d.substr(0, 99), e);
  ASSERT_EQ(d.substr(99, 99), e);
}

TEST(StringPieceTest, CheckCustom) {
  StringPiece a("foobar");
  std::string s1("123");
  s1 += '\0';
  s1 += "456";
  StringPiece b(s1);
  StringPiece e;
  std::string s2;

  // CopyToString
  a.CopyToString(&s2);
  ASSERT_EQ(s2.size(), 6U);
  ASSERT_EQ(s2, "foobar");
  b.CopyToString(&s2);
  ASSERT_EQ(s2.size(), 7U);
  ASSERT_EQ(s1, s2);
  e.CopyToString(&s2);
  ASSERT_TRUE(s2.empty());

  // AppendToString
  s2.erase();
  a.AppendToString(&s2);
  ASSERT_EQ(s2.size(), 6U);
  ASSERT_EQ(s2, "foobar");
  a.AppendToString(&s2);
  ASSERT_EQ(s2.size(), 12U);
  ASSERT_EQ(s2, "foobarfoobar");

  // starts_with
  ASSERT_TRUE(a.starts_with(a));
  ASSERT_TRUE(a.starts_with("foo"));
  ASSERT_TRUE(a.starts_with(e));
  ASSERT_TRUE(b.starts_with(s1));
  ASSERT_TRUE(b.starts_with(b));
  ASSERT_TRUE(b.starts_with(e));
  ASSERT_TRUE(e.starts_with(""));
  ASSERT_TRUE(!a.starts_with(b));
  ASSERT_TRUE(!b.starts_with(a));
  ASSERT_TRUE(!e.starts_with(a));

  // ends with
  ASSERT_TRUE(a.ends_with(a));
  ASSERT_TRUE(a.ends_with("bar"));
  ASSERT_TRUE(a.ends_with(e));
  ASSERT_TRUE(b.ends_with(s1));
  ASSERT_TRUE(b.ends_with(b));
  ASSERT_TRUE(b.ends_with(e));
  ASSERT_TRUE(e.ends_with(""));
  ASSERT_TRUE(!a.ends_with(b));
  ASSERT_TRUE(!b.ends_with(a));
  ASSERT_TRUE(!e.ends_with(a));

  // remove_prefix
  StringPiece c(a);
  c.remove_prefix(3);
  ASSERT_EQ(c, "bar");
  c = a;
  c.remove_prefix(0);
  ASSERT_EQ(c, a);
  c.remove_prefix(c.size());
  ASSERT_EQ(c, e);

  // remove_suffix
  c = a;
  c.remove_suffix(3);
  ASSERT_EQ(c, "foo");
  c = a;
  c.remove_suffix(0);
  ASSERT_EQ(c, a);
  c.remove_suffix(c.size());
  ASSERT_EQ(c, e);

  // set
  c.set("foobar", 6);
  ASSERT_EQ(c, a);
  c.set("foobar", 0);
  ASSERT_EQ(c, e);
  c.set("foobar", 7);
  ASSERT_NE(c, a);

  c.set("foobar");
  ASSERT_EQ(c, a);

  c.set(static_cast<const void*>("foobar"), 6);
  ASSERT_EQ(c, a);
  c.set(static_cast<const void*>("foobar"), 0);
  ASSERT_EQ(c, e);
  c.set(static_cast<const void*>("foobar"), 7);
  ASSERT_NE(c, a);

  // as_string
  std::string s3(a.as_string().c_str(), 7);
  ASSERT_EQ(c, s3);
  std::string s4(e.as_string());
  ASSERT_TRUE(s4.empty());
}

TEST(StringPieceTest, CheckNULL) {
  // we used to crash here, but now we don't.
  StringPiece s(NULL);
  ASSERT_EQ(s.data(), (const char*)NULL);
  ASSERT_EQ(s.size(), 0U);

  s.set(NULL);
  ASSERT_EQ(s.data(), (const char*)NULL);
  ASSERT_EQ(s.size(), 0U);
}

TEST(StringPieceTest, CheckComparisons2) {
  StringPiece abc("abcdefghijklmnopqrstuvwxyz");

  // check comparison operations on strings longer than 4 bytes.
  ASSERT_TRUE(abc == StringPiece("abcdefghijklmnopqrstuvwxyz"));
  ASSERT_TRUE(abc.compare(StringPiece("abcdefghijklmnopqrstuvwxyz")) == 0);

  ASSERT_TRUE(abc < StringPiece("abcdefghijklmnopqrstuvwxzz"));
  ASSERT_TRUE(abc.compare(StringPiece("abcdefghijklmnopqrstuvwxzz")) < 0);

  ASSERT_TRUE(abc > StringPiece("abcdefghijklmnopqrstuvwxyy"));
  ASSERT_TRUE(abc.compare(StringPiece("abcdefghijklmnopqrstuvwxyy")) > 0);

  // starts_with
  ASSERT_TRUE(abc.starts_with(abc));
  ASSERT_TRUE(abc.starts_with("abcdefghijklm"));
  ASSERT_TRUE(!abc.starts_with("abcdefguvwxyz"));

  // ends_with
  ASSERT_TRUE(abc.ends_with(abc));
  ASSERT_TRUE(!abc.ends_with("abcdefguvwxyz"));
  ASSERT_TRUE(abc.ends_with("nopqrstuvwxyz"));
}

TEST(StringPieceTest, StringCompareNotAmbiguous) {
  ASSERT_TRUE("hello" == std::string("hello"));
  ASSERT_TRUE("hello" < std::string("world"));
}

TEST(StringPieceTest, HeterogenousStringPieceEquals) {
  ASSERT_TRUE(StringPiece("hello") == std::string("hello"));
  ASSERT_TRUE("hello" == StringPiece("hello"));
}

TEST(StringPiece16Test, CheckComparisonOperators) {
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("")) ==
              StringPiece16(ASCIIToUTF16("")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) ==
              StringPiece16(ASCIIToUTF16("a")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("aa")) ==
              StringPiece16(ASCIIToUTF16("aa")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("a")) ==
               StringPiece16(ASCIIToUTF16("")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("")) ==
               StringPiece16(ASCIIToUTF16("a")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("a")) ==
               StringPiece16(ASCIIToUTF16("b")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("a")) ==
               StringPiece16(ASCIIToUTF16("aa")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("aa")) ==
               StringPiece16(ASCIIToUTF16("a")));

  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("")) !=
               StringPiece16(ASCIIToUTF16("")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("a")) !=
               StringPiece16(ASCIIToUTF16("a")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("aa")) !=
               StringPiece16(ASCIIToUTF16("aa")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) !=
              StringPiece16(ASCIIToUTF16("")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("")) !=
              StringPiece16(ASCIIToUTF16("a")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) !=
              StringPiece16(ASCIIToUTF16("b")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) !=
              StringPiece16(ASCIIToUTF16("aa")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("aa")) !=
              StringPiece16(ASCIIToUTF16("a")));

  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) <
              StringPiece16(ASCIIToUTF16("b")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) <
              StringPiece16(ASCIIToUTF16("aa")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("aa")) <
              StringPiece16(ASCIIToUTF16("b")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("aa")) <
              StringPiece16(ASCIIToUTF16("bb")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("a")) <
               StringPiece16(ASCIIToUTF16("a")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("b")) <
               StringPiece16(ASCIIToUTF16("a")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("aa")) <
               StringPiece16(ASCIIToUTF16("a")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("b")) <
               StringPiece16(ASCIIToUTF16("aa")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("bb")) <
               StringPiece16(ASCIIToUTF16("aa")));

  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) <=
              StringPiece16(ASCIIToUTF16("a")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) <=
              StringPiece16(ASCIIToUTF16("b")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) <=
              StringPiece16(ASCIIToUTF16("aa")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("aa")) <=
              StringPiece16(ASCIIToUTF16("b")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("aa")) <=
              StringPiece16(ASCIIToUTF16("bb")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("b")) <=
               StringPiece16(ASCIIToUTF16("a")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("aa")) <=
               StringPiece16(ASCIIToUTF16("a")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("b")) <=
               StringPiece16(ASCIIToUTF16("aa")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("bb")) <=
               StringPiece16(ASCIIToUTF16("aa")));

  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) <=
              StringPiece16(ASCIIToUTF16("a")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) <=
              StringPiece16(ASCIIToUTF16("b")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) <=
              StringPiece16(ASCIIToUTF16("aa")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("aa")) <=
              StringPiece16(ASCIIToUTF16("b")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("aa")) <=
              StringPiece16(ASCIIToUTF16("bb")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("b")) <=
               StringPiece16(ASCIIToUTF16("a")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("aa")) <=
               StringPiece16(ASCIIToUTF16("a")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("b")) <=
               StringPiece16(ASCIIToUTF16("aa")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("bb")) <=
               StringPiece16(ASCIIToUTF16("aa")));

  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("a")) >=
               StringPiece16(ASCIIToUTF16("b")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("a")) >=
               StringPiece16(ASCIIToUTF16("aa")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("aa")) >=
               StringPiece16(ASCIIToUTF16("b")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("aa")) >=
               StringPiece16(ASCIIToUTF16("bb")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) >=
              StringPiece16(ASCIIToUTF16("a")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("b")) >=
              StringPiece16(ASCIIToUTF16("a")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("aa")) >=
              StringPiece16(ASCIIToUTF16("a")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("b")) >=
              StringPiece16(ASCIIToUTF16("aa")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("bb")) >=
              StringPiece16(ASCIIToUTF16("aa")));

  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("a")) >
               StringPiece16(ASCIIToUTF16("a")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("a")) >
               StringPiece16(ASCIIToUTF16("b")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("a")) >
               StringPiece16(ASCIIToUTF16("aa")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("aa")) >
               StringPiece16(ASCIIToUTF16("b")));
  ASSERT_FALSE(StringPiece16(ASCIIToUTF16("aa")) >
               StringPiece16(ASCIIToUTF16("bb")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("b")) >
              StringPiece16(ASCIIToUTF16("a")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("aa")) >
              StringPiece16(ASCIIToUTF16("a")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("b")) >
              StringPiece16(ASCIIToUTF16("aa")));
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("bb")) >
              StringPiece16(ASCIIToUTF16("aa")));

  string16 x;
  for (int i = 0; i < 256; i++) {
    x += 'a';
    string16 y = x;
    ASSERT_EQ(StringPiece16(x), StringPiece16(y));
    for (int j = 0; j < i; j++) {
      string16 z = x;
      z[j] = 'b';       // Differs in position 'j'
      ASSERT_NE(StringPiece16(x), StringPiece16(z));
    }
  }
}

TEST(StringPiece16Test, CheckSTL) {
  string16 first = ASCIIToUTF16("abcdefghijklmnopqrstuvwxyz");
  StringPiece16 a(first);
  string16 second = ASCIIToUTF16("abc");
  StringPiece16 b(second.c_str());
  string16 third = ASCIIToUTF16("xyz");
  StringPiece16 c(third.c_str(), third.size());
  string16 fourth = ASCIIToUTF16("foobarrandomstuff");
  StringPiece16 d(fourth.c_str(), 6);
  StringPiece16 e;
  // Check some non-ascii characters.
  string16 fifth(ASCIIToUTF16("123"));
  fifth.push_back(0x0000);
  fifth.push_back(0xd8c5);
  fifth.push_back(0xdffe);
  StringPiece16 f(fifth);

  ASSERT_EQ(a[6], 'g');
  ASSERT_EQ(b[0], 'a');
  ASSERT_EQ(c[2], 'z');
  ASSERT_EQ(f[3], '\0');
  ASSERT_EQ(f[5], static_cast<char16>(0xdffe));

  ASSERT_EQ(*d.data(), 'f');
  ASSERT_EQ(d.data()[5], 'r');
  ASSERT_TRUE(e.data() == NULL);

  ASSERT_EQ(*a.begin(), 'a');
  ASSERT_EQ(*(b.begin() + 2), 'c');
  ASSERT_EQ(*(c.end() - 1), 'z');

  ASSERT_EQ(*a.rbegin(), 'z');
  ASSERT_EQ(*(b.rbegin() + 2), 'a');
  ASSERT_EQ(*(c.rend() - 1), 'x');
  ASSERT_TRUE(a.rbegin() + 26 == a.rend());

  ASSERT_EQ(a.size(), 26U);
  ASSERT_EQ(b.size(), 3U);
  ASSERT_EQ(c.size(), 3U);
  ASSERT_EQ(d.size(), 6U);
  ASSERT_EQ(e.size(), 0U);
  ASSERT_EQ(f.size(), 6U);

  ASSERT_TRUE(!d.empty());
  ASSERT_TRUE(d.begin() != d.end());
  ASSERT_TRUE(d.begin() + 6 == d.end());

  ASSERT_TRUE(e.empty());
  ASSERT_TRUE(e.begin() == e.end());

  d.clear();
  ASSERT_EQ(d.size(), 0U);
  ASSERT_TRUE(d.empty());
  ASSERT_TRUE(d.data() == NULL);
  ASSERT_TRUE(d.begin() == d.end());

  ASSERT_GE(a.max_size(), a.capacity());
  ASSERT_GE(a.capacity(), a.size());
}

TEST(StringPiece16Test, CheckNULL) {
  StringPiece16 s(NULL);
  ASSERT_EQ(s.data(), (const char16*)NULL);
  ASSERT_EQ(s.size(), 0U);

  s.set(NULL);
  ASSERT_EQ(s.data(), (const char16*)NULL);
  ASSERT_EQ(s.size(), 0U);

  string16 str = s.as_string16();
  ASSERT_EQ(s.data(), (const char16*)NULL);
  ASSERT_EQ(s.size(), 0U);
}

TEST(StringPiece16Test, HeterogenousStringPieceEquals) {
  ASSERT_TRUE(StringPiece16(ASCIIToUTF16("hello")) == ASCIIToUTF16("hello"));
}

TEST(StringPiece16Test, CheckConversion) {
  // Make sure that we can convert from UTF8 to UTF16 and back. We use a two
  // byte character (G clef) to test this.
  ASSERT_EQ(
      UTF16ToUTF8(
          StringPiece16(UTF8ToUTF16("\xf0\x9d\x84\x9e")).as_string16()),
      "\xf0\x9d\x84\x9e");
}

}  // namespace base
