// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <stddef.h>

#include <string>

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

namespace gurl_base {

template <typename CharT>
class CommonStringPieceTest : public ::testing::Test {
 public:
  static std::string as_string(const char* input) { return input; }
  static const std::string& as_string(const std::string& input) {
    return input;
  }
};

template <>
class CommonStringPieceTest<char16_t> : public ::testing::Test {
 public:
  static std::u16string as_string(const char* input) {
    return UTF8ToUTF16(input);
  }
  static std::u16string as_string(const std::string& input) {
    return UTF8ToUTF16(input);
  }
};

typedef ::testing::Types<char, char16_t> SupportedCharTypes;

TYPED_TEST_SUITE(CommonStringPieceTest, SupportedCharTypes);

TYPED_TEST(CommonStringPieceTest, CheckComparisonOperators) {
#define CMP_Y(op, x, y)                                                   \
  {                                                                       \
    std::basic_string<TypeParam> lhs(TestFixture::as_string(x));          \
    std::basic_string<TypeParam> rhs(TestFixture::as_string(y));          \
    ASSERT_TRUE((BasicStringPiece<TypeParam>((lhs.c_str()))               \
                     op BasicStringPiece<TypeParam>((rhs.c_str()))));     \
    ASSERT_TRUE(BasicStringPiece<TypeParam>(lhs) op rhs);                 \
    ASSERT_TRUE(lhs op BasicStringPiece<TypeParam>(rhs));                 \
    ASSERT_TRUE((BasicStringPiece<TypeParam>((lhs.c_str()))               \
                     .compare(BasicStringPiece<TypeParam>((rhs.c_str()))) \
                         op 0));                                          \
  }

#define CMP_N(op, x, y)                                                    \
  {                                                                        \
    std::basic_string<TypeParam> lhs(TestFixture::as_string(x));           \
    std::basic_string<TypeParam> rhs(TestFixture::as_string(y));           \
    ASSERT_FALSE((BasicStringPiece<TypeParam>((lhs.c_str()))               \
                      op BasicStringPiece<TypeParam>((rhs.c_str()))));     \
    ASSERT_FALSE(BasicStringPiece<TypeParam>(lhs) op rhs);                 \
    ASSERT_FALSE(lhs op BasicStringPiece<TypeParam>(rhs));                 \
    ASSERT_FALSE((BasicStringPiece<TypeParam>((lhs.c_str()))               \
                      .compare(BasicStringPiece<TypeParam>((rhs.c_str()))) \
                          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
}

TYPED_TEST(CommonStringPieceTest, CheckSTL) {
  std::basic_string<TypeParam> alphabet(
      TestFixture::as_string("abcdefghijklmnopqrstuvwxyz"));
  std::basic_string<TypeParam> abc(TestFixture::as_string("abc"));
  std::basic_string<TypeParam> xyz(TestFixture::as_string("xyz"));
  std::basic_string<TypeParam> foobar(TestFixture::as_string("foobar"));

  BasicStringPiece<TypeParam> a(alphabet);
  BasicStringPiece<TypeParam> b(abc);
  BasicStringPiece<TypeParam> c(xyz);
  BasicStringPiece<TypeParam> d(foobar);
  BasicStringPiece<TypeParam> e;
  std::basic_string<TypeParam> temp(TestFixture::as_string("123"));
  temp += static_cast<TypeParam>(0);
  temp += TestFixture::as_string("456");
  BasicStringPiece<TypeParam> f(temp);

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

  ASSERT_EQ(*d.data(), static_cast<TypeParam>('f'));
  ASSERT_EQ(d.data()[5], static_cast<TypeParam>('r'));
  ASSERT_EQ(e.data(), nullptr);

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

  ASSERT_EQ(*a.rbegin(), static_cast<TypeParam>('z'));
  ASSERT_EQ(*(b.rbegin() + 2), static_cast<TypeParam>('a'));
  ASSERT_EQ(*(c.rend() - 1), static_cast<TypeParam>('x'));
  ASSERT_EQ(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_EQ(d.begin() + 6, d.end());

  ASSERT_TRUE(e.empty());
  ASSERT_EQ(e.begin(), e.end());

  d = BasicStringPiece<TypeParam>();
  ASSERT_EQ(d.size(), 0U);
  ASSERT_TRUE(d.empty());
  ASSERT_EQ(d.data(), nullptr);
  ASSERT_EQ(d.begin(), d.end());

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

TYPED_TEST(CommonStringPieceTest, CheckFind) {
  typedef BasicStringPiece<TypeParam> Piece;

  std::basic_string<TypeParam> alphabet(
      TestFixture::as_string("abcdefghijklmnopqrstuvwxyz"));
  std::basic_string<TypeParam> abc(TestFixture::as_string("abc"));
  std::basic_string<TypeParam> xyz(TestFixture::as_string("xyz"));
  std::basic_string<TypeParam> foobar(TestFixture::as_string("foobar"));

  BasicStringPiece<TypeParam> a(alphabet);
  BasicStringPiece<TypeParam> b(abc);
  BasicStringPiece<TypeParam> c(xyz);
  BasicStringPiece<TypeParam> d(foobar);

  d = Piece();
  Piece e;
  std::basic_string<TypeParam> temp(TestFixture::as_string("123"));
  temp.push_back('\0');
  temp += TestFixture::as_string("456");
  Piece f(temp);

  TypeParam 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(Piece::npos, std::basic_string<TypeParam>::npos);

  ASSERT_EQ(a.find(b), 0U);
  ASSERT_EQ(a.find(b, 1), Piece::npos);
  ASSERT_EQ(a.find(c), 23U);
  ASSERT_EQ(a.find(c, 9), 23U);
  ASSERT_EQ(a.find(c, Piece::npos), Piece::npos);
  ASSERT_EQ(b.find(c), Piece::npos);
  ASSERT_EQ(b.find(c, Piece::npos), Piece::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);
  std::basic_string<TypeParam> not_found(
      TestFixture::as_string("xx not found bb"));
  Piece g(not_found);
  ASSERT_EQ(a.find(g), Piece::npos);
  // empty string nonsense
  ASSERT_EQ(d.find(b), Piece::npos);
  ASSERT_EQ(e.find(b), Piece::npos);
  ASSERT_EQ(d.find(b, 4), Piece::npos);
  ASSERT_EQ(e.find(b, 7), Piece::npos);

  size_t empty_search_pos =
      std::basic_string<TypeParam>().find(std::basic_string<TypeParam>());
  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));

  constexpr TypeParam kNul = '\0';
  ASSERT_EQ(a.find('a'), 0U);
  ASSERT_EQ(a.find('c'), 2U);
  ASSERT_EQ(a.find('z'), 25U);
  ASSERT_EQ(a.find('$'), Piece::npos);
  ASSERT_EQ(a.find(kNul), Piece::npos);
  ASSERT_EQ(f.find(kNul), 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), Piece::npos);
  // empty string nonsense
  ASSERT_EQ(d.find(kNul), Piece::npos);
  ASSERT_EQ(e.find(kNul), Piece::npos);
  ASSERT_EQ(d.find(kNul, 4), Piece::npos);
  ASSERT_EQ(e.find(kNul, 7), Piece::npos);
  ASSERT_EQ(d.find('x'), Piece::npos);
  ASSERT_EQ(e.find('x'), Piece::npos);
  ASSERT_EQ(d.find('x', 4), Piece::npos);
  ASSERT_EQ(e.find('x', 7), Piece::npos);

  ASSERT_EQ(a.find(b.data(), 1, 0), 1U);
  ASSERT_EQ(a.find(c.data(), 9, 0), 9U);
  ASSERT_EQ(a.find(c.data(), Piece::npos, 0), Piece::npos);
  ASSERT_EQ(b.find(c.data(), Piece::npos, 0), Piece::npos);
  // empty string nonsense
  ASSERT_EQ(d.find(b.data(), 4, 0), Piece::npos);
  ASSERT_EQ(e.find(b.data(), 7, 0), Piece::npos);

  ASSERT_EQ(a.find(b.data(), 1), Piece::npos);
  ASSERT_EQ(a.find(c.data(), 9), 23U);
  ASSERT_EQ(a.find(c.data(), Piece::npos), Piece::npos);
  ASSERT_EQ(b.find(c.data(), Piece::npos), Piece::npos);
  // empty string nonsense
  ASSERT_EQ(d.find(b.data(), 4), Piece::npos);
  ASSERT_EQ(e.find(b.data(), 7), Piece::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), Piece::npos);
  ASSERT_EQ(a.rfind(c, 1U), Piece::npos);
  ASSERT_EQ(a.rfind(c, 0U), Piece::npos);
  ASSERT_EQ(b.rfind(c), Piece::npos);
  ASSERT_EQ(b.rfind(c, 0U), Piece::npos);
  ASSERT_EQ(a.rfind(d),
            static_cast<size_t>(a.rfind(std::basic_string<TypeParam>())));
  ASSERT_EQ(a.rfind(e), a.rfind(std::basic_string<TypeParam>()));
  ASSERT_EQ(a.rfind(d),
            static_cast<size_t>(std::basic_string<TypeParam>(a).rfind(
                std::basic_string<TypeParam>())));
  ASSERT_EQ(a.rfind(e), std::basic_string<TypeParam>(a).rfind(
                            std::basic_string<TypeParam>()));
  ASSERT_EQ(a.rfind(d, 12), 12U);
  ASSERT_EQ(a.rfind(e, 17), 17U);
  ASSERT_EQ(a.rfind(g), Piece::npos);
  ASSERT_EQ(d.rfind(b), Piece::npos);
  ASSERT_EQ(e.rfind(b), Piece::npos);
  ASSERT_EQ(d.rfind(b, 4), Piece::npos);
  ASSERT_EQ(e.rfind(b, 7), Piece::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'), Piece::npos);
  ASSERT_EQ(g.rfind('o', 8), 8U);
  ASSERT_EQ(g.rfind('o', 7), 4U);
  ASSERT_EQ(g.rfind('o', 3), Piece::npos);
  ASSERT_EQ(f.rfind(kNul), 3U);
  ASSERT_EQ(f.rfind(kNul, 12), 3U);
  ASSERT_EQ(f.rfind('3'), 2U);
  ASSERT_EQ(f.rfind('5'), 5U);
  // empty string nonsense
  ASSERT_EQ(d.rfind('o'), Piece::npos);
  ASSERT_EQ(e.rfind('o'), Piece::npos);
  ASSERT_EQ(d.rfind('o', 4), Piece::npos);
  ASSERT_EQ(e.rfind('o', 7), Piece::npos);

  ASSERT_EQ(a.rfind(b.data(), 1, 0), 1U);
  ASSERT_EQ(a.rfind(c.data(), 22U, 0), 22U);
  ASSERT_EQ(a.rfind(c.data(), 1U, 0), 1U);
  ASSERT_EQ(a.rfind(c.data(), 0U, 0), 0U);
  ASSERT_EQ(b.rfind(c.data(), 0U, 0), 0U);
  ASSERT_EQ(d.rfind(b.data(), 4, 0), 0U);
  ASSERT_EQ(e.rfind(b.data(), 7, 0), 0U);

  std::basic_string<TypeParam> one_two_three_four(
      TestFixture::as_string("one,two:three;four"));
  std::basic_string<TypeParam> comma_colon(TestFixture::as_string(",:"));
  ASSERT_EQ(3U, Piece(one_two_three_four).find_first_of(comma_colon));
  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), Piece::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), Piece::npos);
  ASSERT_EQ(g.find_first_of(b), 13U);
  ASSERT_EQ(g.find_first_of(c), 0U);
  ASSERT_EQ(a.find_first_of(f), Piece::npos);
  ASSERT_EQ(f.find_first_of(a), Piece::npos);
  // empty string nonsense
  ASSERT_EQ(a.find_first_of(d), Piece::npos);
  ASSERT_EQ(a.find_first_of(e), Piece::npos);
  ASSERT_EQ(d.find_first_of(b), Piece::npos);
  ASSERT_EQ(e.find_first_of(b), Piece::npos);
  ASSERT_EQ(d.find_first_of(d), Piece::npos);
  ASSERT_EQ(e.find_first_of(d), Piece::npos);
  ASSERT_EQ(d.find_first_of(e), Piece::npos);
  ASSERT_EQ(e.find_first_of(e), Piece::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), Piece::npos);
  ASSERT_EQ(c.find_first_not_of(a), Piece::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);
  ASSERT_EQ(a.find_first_not_of(d, 1), 1U);
  ASSERT_EQ(a.find_first_not_of(e, 1), 1U);
  ASSERT_EQ(a.find_first_not_of(d, a.size()), Piece::npos);
  ASSERT_EQ(a.find_first_not_of(e, a.size()), Piece::npos);
  // empty string nonsense
  ASSERT_EQ(d.find_first_not_of(a), Piece::npos);
  ASSERT_EQ(e.find_first_not_of(a), Piece::npos);
  ASSERT_EQ(d.find_first_not_of(d), Piece::npos);
  ASSERT_EQ(e.find_first_not_of(d), Piece::npos);
  ASSERT_EQ(d.find_first_not_of(e), Piece::npos);
  ASSERT_EQ(e.find_first_not_of(e), Piece::npos);

  std::basic_string<TypeParam> equals(TestFixture::as_string("===="));
  Piece h(equals);
  ASSERT_EQ(h.find_first_not_of('='), Piece::npos);
  ASSERT_EQ(h.find_first_not_of('=', 3), Piece::npos);
  ASSERT_EQ(h.find_first_not_of(kNul), 0U);
  ASSERT_EQ(g.find_first_not_of('x'), 2U);
  ASSERT_EQ(f.find_first_not_of(kNul), 0U);
  ASSERT_EQ(f.find_first_not_of(kNul, 3), 4U);
  ASSERT_EQ(f.find_first_not_of(kNul, 2), 2U);
  // empty string nonsense
  ASSERT_EQ(d.find_first_not_of('x'), Piece::npos);
  ASSERT_EQ(e.find_first_not_of('x'), Piece::npos);
  ASSERT_EQ(d.find_first_not_of(kNul), Piece::npos);
  ASSERT_EQ(e.find_first_not_of(kNul), Piece::npos);

  //  Piece g("xx not found bb");
  std::basic_string<TypeParam> fifty_six(TestFixture::as_string("56"));
  Piece i(fifty_six);
  ASSERT_EQ(h.find_last_of(a), Piece::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), Piece::npos);
  ASSERT_EQ(a.find_last_of('z', 25), 25U);
  ASSERT_EQ(a.find_last_of('z', 24), Piece::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), Piece::npos);
  // empty string nonsense
  ASSERT_EQ(f.find_last_of(d), Piece::npos);
  ASSERT_EQ(f.find_last_of(e), Piece::npos);
  ASSERT_EQ(f.find_last_of(d, 4), Piece::npos);
  ASSERT_EQ(f.find_last_of(e, 4), Piece::npos);
  ASSERT_EQ(d.find_last_of(d), Piece::npos);
  ASSERT_EQ(d.find_last_of(e), Piece::npos);
  ASSERT_EQ(e.find_last_of(d), Piece::npos);
  ASSERT_EQ(e.find_last_of(e), Piece::npos);
  ASSERT_EQ(d.find_last_of(f), Piece::npos);
  ASSERT_EQ(e.find_last_of(f), Piece::npos);
  ASSERT_EQ(d.find_last_of(d, 4), Piece::npos);
  ASSERT_EQ(d.find_last_of(e, 4), Piece::npos);
  ASSERT_EQ(e.find_last_of(d, 4), Piece::npos);
  ASSERT_EQ(e.find_last_of(e, 4), Piece::npos);
  ASSERT_EQ(d.find_last_of(f, 4), Piece::npos);
  ASSERT_EQ(e.find_last_of(f, 4), Piece::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), Piece::npos);
  ASSERT_EQ(b.find_last_not_of(b), Piece::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), Piece::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), Piece::npos);
  ASSERT_EQ(d.find_last_not_of(e), Piece::npos);
  ASSERT_EQ(e.find_last_not_of(d), Piece::npos);
  ASSERT_EQ(e.find_last_not_of(e), Piece::npos);
  ASSERT_EQ(d.find_last_not_of(f), Piece::npos);
  ASSERT_EQ(e.find_last_not_of(f), Piece::npos);
  ASSERT_EQ(d.find_last_not_of(d, 4), Piece::npos);
  ASSERT_EQ(d.find_last_not_of(e, 4), Piece::npos);
  ASSERT_EQ(e.find_last_not_of(d, 4), Piece::npos);
  ASSERT_EQ(e.find_last_not_of(e, 4), Piece::npos);
  ASSERT_EQ(d.find_last_not_of(f, 4), Piece::npos);
  ASSERT_EQ(e.find_last_not_of(f, 4), Piece::npos);

  ASSERT_EQ(h.find_last_not_of('x'), h.size() - 1);
  ASSERT_EQ(h.find_last_not_of('='), Piece::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), Piece::npos);
  ASSERT_EQ(b.find_last_not_of('b', 1), 0U);
  // empty string nonsense
  ASSERT_EQ(d.find_last_not_of('x'), Piece::npos);
  ASSERT_EQ(e.find_last_not_of('x'), Piece::npos);
  ASSERT_EQ(d.find_last_not_of(kNul), Piece::npos);
  ASSERT_EQ(e.find_last_not_of(kNul), Piece::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(), a);
  ASSERT_EQ(a.substr(0), a);
  ASSERT_EQ(a.substr(3, 2), TestFixture::as_string("de"));
  ASSERT_EQ(d.substr(0, 99), e);
}

TYPED_TEST(CommonStringPieceTest, CheckCustom) {
  std::basic_string<TypeParam> foobar(TestFixture::as_string("foobar"));
  BasicStringPiece<TypeParam> a(foobar);
  std::basic_string<TypeParam> s1(TestFixture::as_string("123"));
  s1 += static_cast<TypeParam>('\0');
  s1 += TestFixture::as_string("456");
  BasicStringPiece<TypeParam> b(s1);
  BasicStringPiece<TypeParam> e;
  std::basic_string<TypeParam> s2;

  // remove_prefix
  BasicStringPiece<TypeParam> c(a);
  c.remove_prefix(3);
  ASSERT_EQ(c, TestFixture::as_string("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, TestFixture::as_string("foo"));
  c = a;
  c.remove_suffix(0);
  ASSERT_EQ(c, a);
  c.remove_suffix(c.size());
  ASSERT_EQ(c, e);

  // assignment
  c = foobar.c_str();
  ASSERT_EQ(c, a);
  c = {foobar.c_str(), 6};
  ASSERT_EQ(c, a);
  c = {foobar.c_str(), 0};
  ASSERT_EQ(c, e);
  c = {foobar.c_str(), 7};  // Note, has an embedded NULL
  ASSERT_NE(c, a);

  // operator STRING_TYPE()
  std::basic_string<TypeParam> s5(std::basic_string<TypeParam>(a).c_str(),
                                  7);  // Note, has an embedded NULL
  ASSERT_EQ(c, s5);
  std::basic_string<TypeParam> s6(e);
  ASSERT_TRUE(s6.empty());
}

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

  StringPiece c;
  c = {"foobar", 6};
  ASSERT_EQ(c, a);
  c = {"foobar", 0};
  ASSERT_EQ(c, e);
  c = {"foobar", 7};
  ASSERT_NE(c, a);
}

TYPED_TEST(CommonStringPieceTest, CheckNULL) {
  BasicStringPiece<TypeParam> s;
  ASSERT_EQ(s.data(), nullptr);
  ASSERT_EQ(s.size(), 0U);

  std::basic_string<TypeParam> str(s);
  ASSERT_EQ(str.length(), 0U);
  ASSERT_EQ(str, std::basic_string<TypeParam>());
}

TYPED_TEST(CommonStringPieceTest, CheckComparisons2) {
  std::basic_string<TypeParam> alphabet(
      TestFixture::as_string("abcdefghijklmnopqrstuvwxyz"));
  std::basic_string<TypeParam> alphabet_z(
      TestFixture::as_string("abcdefghijklmnopqrstuvwxyzz"));
  std::basic_string<TypeParam> alphabet_y(
      TestFixture::as_string("abcdefghijklmnopqrstuvwxyy"));
  BasicStringPiece<TypeParam> abc(alphabet);

  // check comparison operations on strings longer than 4 bytes.
  ASSERT_EQ(abc, BasicStringPiece<TypeParam>(alphabet));
  ASSERT_EQ(abc.compare(BasicStringPiece<TypeParam>(alphabet)), 0);

  ASSERT_TRUE(abc < BasicStringPiece<TypeParam>(alphabet_z));
  ASSERT_LT(abc.compare(BasicStringPiece<TypeParam>(alphabet_z)), 0);

  ASSERT_TRUE(abc > BasicStringPiece<TypeParam>(alphabet_y));
  ASSERT_GT(abc.compare(BasicStringPiece<TypeParam>(alphabet_y)), 0);
}

TYPED_TEST(CommonStringPieceTest, StringCompareNotAmbiguous) {
  ASSERT_TRUE(TestFixture::as_string("hello").c_str() ==
              TestFixture::as_string("hello"));
  ASSERT_TRUE(TestFixture::as_string("hello").c_str() <
              TestFixture::as_string("world"));
}

TYPED_TEST(CommonStringPieceTest, HeterogenousStringPieceEquals) {
  std::basic_string<TypeParam> hello(TestFixture::as_string("hello"));

  ASSERT_EQ(BasicStringPiece<TypeParam>(hello), hello);
  ASSERT_EQ(hello.c_str(), BasicStringPiece<TypeParam>(hello));
}

// std::u16string-specific stuff
TEST(StringPiece16Test, CheckSTL) {
  // Check some non-ascii characters.
  std::u16string fifth(u"123");
  fifth.push_back(0x0000);
  fifth.push_back(0xd8c5);
  fifth.push_back(0xdffe);
  StringPiece16 f(fifth);

  ASSERT_EQ(f[3], '\0');
  ASSERT_EQ(f[5], 0xdffe);

  ASSERT_EQ(f.size(), 6U);
}

TEST(StringPiece16Test, CheckConversion) {
  // Make sure that we can convert from UTF8 to UTF16 and back. We use a
  // character (G clef) outside the BMP to test this.
  const char* kTest = "\U0001D11E";
  ASSERT_EQ(UTF16ToUTF8(UTF8ToUTF16(kTest)), kTest);
}

TYPED_TEST(CommonStringPieceTest, CheckConstructors) {
  std::basic_string<TypeParam> str(TestFixture::as_string("hello world"));
  std::basic_string<TypeParam> empty;

  ASSERT_EQ(str, BasicStringPiece<TypeParam>(str));
  ASSERT_EQ(str, BasicStringPiece<TypeParam>(str.c_str()));
  ASSERT_TRUE(TestFixture::as_string("hello") ==
              BasicStringPiece<TypeParam>(str.c_str(), 5));
  ASSERT_EQ(
      empty,
      BasicStringPiece<TypeParam>(
          str.c_str(),
          static_cast<typename BasicStringPiece<TypeParam>::size_type>(0)));
  ASSERT_EQ(empty, BasicStringPiece<TypeParam>());
  ASSERT_TRUE(
      empty ==
      BasicStringPiece<TypeParam>(
          nullptr,
          static_cast<typename BasicStringPiece<TypeParam>::size_type>(0)));
  ASSERT_EQ(empty, BasicStringPiece<TypeParam>());
  ASSERT_EQ(empty, BasicStringPiece<TypeParam>(empty));
}

TEST(StringPieceTest, ConstexprCtor) {
  {
    constexpr StringPiece piece;
    std::ignore = piece;
  }

  {
    constexpr StringPiece piece("abc");
    std::ignore = piece;
  }

  {
    constexpr StringPiece piece("abc", 2);
    std::ignore = piece;
  }
}

TEST(StringPieceTest, OutOfBoundsDeath) {
  {
    constexpr StringPiece piece;
    ASSERT_DEATH_IF_SUPPORTED(piece[0], "");
  }

  {
    constexpr StringPiece piece;
    ASSERT_DEATH_IF_SUPPORTED(piece.front(), "");
  }

  {
    constexpr StringPiece piece;
    ASSERT_DEATH_IF_SUPPORTED(piece.back(), "");
  }

  {
    StringPiece piece;
    ASSERT_DEATH_IF_SUPPORTED(piece.remove_suffix(1), "");
  }

  {
    StringPiece piece;
    ASSERT_DEATH_IF_SUPPORTED(piece.remove_prefix(1), "");
  }

  {
    StringPiece piece;
    ASSERT_DEATH_IF_SUPPORTED(piece.copy(nullptr, 0, 1), "");
  }

  {
    StringPiece piece;
    ASSERT_DEATH_IF_SUPPORTED(piece.substr(1), "");
  }
}

TEST(StringPieceTest, ConstexprData) {
  {
    constexpr StringPiece piece;
    static_assert(piece.data() == nullptr, "");
  }

  {
    constexpr StringPiece piece("abc");
    static_assert(piece.data()[0] == 'a', "");
    static_assert(piece.data()[1] == 'b', "");
    static_assert(piece.data()[2] == 'c', "");
  }

  {
    constexpr StringPiece piece("def", 2);
    static_assert(piece.data()[0] == 'd', "");
    static_assert(piece.data()[1] == 'e', "");
  }
}

TEST(StringPieceTest, ConstexprSize) {
  {
    constexpr StringPiece piece;
    static_assert(piece.size() == 0, "");
  }

  {
    constexpr StringPiece piece("abc");
    static_assert(piece.size() == 3, "");
  }

  {
    constexpr StringPiece piece("def", 2);
    static_assert(piece.size() == 2, "");
  }
}

TEST(StringPieceTest, ConstexprFront) {
  static_assert(StringPiece("abc").front() == 'a', "");
}

TEST(StringPieceTest, ConstexprBack) {
  static_assert(StringPiece("abc").back() == 'c', "");
}

TEST(StringPieceTest, Compare) {
  constexpr StringPiece piece = "def";

  static_assert(piece.compare("ab") == 1, "");
  static_assert(piece.compare("abc") == 1, "");
  static_assert(piece.compare("abcd") == 1, "");
  static_assert(piece.compare("de") == 1, "");
  static_assert(piece.compare("def") == 0, "");
  static_assert(piece.compare("defg") == -1, "");
  static_assert(piece.compare("gh") == -1, "");
  static_assert(piece.compare("ghi") == -1, "");
  static_assert(piece.compare("ghij") == -1, "");

  static_assert(piece.compare(0, 0, "") == 0, "");
  static_assert(piece.compare(0, 1, "d") == 0, "");
  static_assert(piece.compare(0, 2, "de") == 0, "");
  static_assert(piece.compare(0, 3, "def") == 0, "");
  static_assert(piece.compare(1, 0, "") == 0, "");
  static_assert(piece.compare(1, 1, "e") == 0, "");
  static_assert(piece.compare(1, 2, "ef") == 0, "");
  static_assert(piece.compare(1, 3, "ef") == 0, "");
  static_assert(piece.compare(2, 0, "") == 0, "");
  static_assert(piece.compare(2, 1, "f") == 0, "");
  static_assert(piece.compare(2, 2, "f") == 0, "");
  static_assert(piece.compare(2, 3, "f") == 0, "");
  static_assert(piece.compare(3, 0, "") == 0, "");
  static_assert(piece.compare(3, 1, "") == 0, "");
  static_assert(piece.compare(3, 2, "") == 0, "");
  static_assert(piece.compare(3, 3, "") == 0, "");

  static_assert(piece.compare(0, 0, "def", 0) == 0, "");
  static_assert(piece.compare(0, 1, "def", 1) == 0, "");
  static_assert(piece.compare(0, 2, "def", 2) == 0, "");
  static_assert(piece.compare(0, 3, "def", 3) == 0, "");
  static_assert(piece.compare(1, 0, "ef", 0) == 0, "");
  static_assert(piece.compare(1, 1, "ef", 1) == 0, "");
  static_assert(piece.compare(1, 2, "ef", 2) == 0, "");
  static_assert(piece.compare(1, 3, "ef", 2) == 0, "");
  static_assert(piece.compare(2, 0, "f", 0) == 0, "");
  static_assert(piece.compare(2, 1, "f", 1) == 0, "");
  static_assert(piece.compare(2, 2, "f", 1) == 0, "");
  static_assert(piece.compare(2, 3, "f", 1) == 0, "");
  static_assert(piece.compare(3, 0, "", 0) == 0, "");
  static_assert(piece.compare(3, 1, "", 0) == 0, "");
  static_assert(piece.compare(3, 2, "", 0) == 0, "");
  static_assert(piece.compare(3, 3, "", 0) == 0, "");

  static_assert(piece.compare(0, 0, "def", 0, 0) == 0, "");
  static_assert(piece.compare(0, 1, "def", 0, 1) == 0, "");
  static_assert(piece.compare(0, 2, "def", 0, 2) == 0, "");
  static_assert(piece.compare(0, 3, "def", 0, 3) == 0, "");
  static_assert(piece.compare(1, 0, "def", 1, 0) == 0, "");
  static_assert(piece.compare(1, 1, "def", 1, 1) == 0, "");
  static_assert(piece.compare(1, 2, "def", 1, 2) == 0, "");
  static_assert(piece.compare(1, 3, "def", 1, 3) == 0, "");
  static_assert(piece.compare(2, 0, "def", 2, 0) == 0, "");
  static_assert(piece.compare(2, 1, "def", 2, 1) == 0, "");
  static_assert(piece.compare(2, 2, "def", 2, 2) == 0, "");
  static_assert(piece.compare(2, 3, "def", 2, 3) == 0, "");
  static_assert(piece.compare(3, 0, "def", 3, 0) == 0, "");
  static_assert(piece.compare(3, 1, "def", 3, 1) == 0, "");
  static_assert(piece.compare(3, 2, "def", 3, 2) == 0, "");
  static_assert(piece.compare(3, 3, "def", 3, 3) == 0, "");
}

TEST(StringPieceTest, Substr) {
  constexpr StringPiece piece = "abcdefghijklmnopqrstuvwxyz";

  static_assert(piece.substr(0, 2) == "ab", "");
  static_assert(piece.substr(0, 3) == "abc", "");
  static_assert(piece.substr(0, 4) == "abcd", "");
  static_assert(piece.substr(3, 2) == "de", "");
  static_assert(piece.substr(3, 3) == "def", "");
  static_assert(piece.substr(23) == "xyz", "");
  static_assert(piece.substr(23, 3) == "xyz", "");
  static_assert(piece.substr(23, 99) == "xyz", "");
  static_assert(piece.substr() == piece, "");
  static_assert(piece.substr(0) == piece, "");
  static_assert(piece.substr(0, 99) == piece, "");
}

TEST(StringPieceTest, Find) {
  constexpr StringPiece foobar("foobar", 6);
  constexpr StringPiece foo = foobar.substr(0, 3);
  constexpr StringPiece bar = foobar.substr(3);

  // find
  static_assert(foobar.find(bar, 0) == 3, "");
  static_assert(foobar.find('o', 0) == 1, "");
  static_assert(foobar.find("ox", 0, 1) == 1, "");
  static_assert(foobar.find("ox", 0) == StringPiece::npos, "");

  // rfind
  static_assert(foobar.rfind(bar, 5) == 3, "");
  static_assert(foobar.rfind('o', 5) == 2, "");
  static_assert(foobar.rfind("ox", 5, 1) == 2, "");
  static_assert(foobar.rfind("ox", 5) == StringPiece::npos, "");

  // find_first_of
  static_assert(foobar.find_first_of(foo, 2) == 2, "");
  static_assert(foobar.find_first_of('o', 2) == 2, "");
  static_assert(foobar.find_first_of("ox", 2, 2) == 2, "");
  static_assert(foobar.find_first_of("ox", 2) == 2, "");

  // find_last_of
  static_assert(foobar.find_last_of(foo, 5) == 2, "");
  static_assert(foobar.find_last_of('o', 5) == 2, "");
  static_assert(foobar.find_last_of("ox", 5, 2) == 2, "");
  static_assert(foobar.find_last_of("ox", 5) == 2, "");

  // find_first_not_of
  static_assert(foobar.find_first_not_of(foo, 2) == 3, "");
  static_assert(foobar.find_first_not_of('o', 2) == 3, "");
  static_assert(foobar.find_first_not_of("ox", 2, 2) == 3, "");
  static_assert(foobar.find_first_not_of("ox", 2) == 3, "");

  // find_last_not_of
  static_assert(foobar.find_last_not_of(bar, 5) == 2, "");
  static_assert(foobar.find_last_not_of('a', 4) == 3, "");
  static_assert(foobar.find_last_not_of("ox", 2, 2) == 0, "");
  static_assert(foobar.find_last_not_of("ox", 2) == 0, "");
}

}  // namespace base
