blob: a310dffdfadd70b2b7e07f875868723f50364ebd [file] [log] [blame]
// Copyright 2016 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 "platform/wtf/text/StringView.h"
#include "platform/wtf/text/AtomicString.h"
#include "platform/wtf/text/StringImpl.h"
#include "platform/wtf/text/WTFString.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace WTF {
const char kChars[] = "12345";
const LChar* const kChars8 = reinterpret_cast<const LChar*>(kChars);
const UChar* const kChars16 = reinterpret_cast<const UChar*>(u"12345");
TEST(StringViewTest, ConstructionStringImpl8) {
scoped_refptr<StringImpl> impl8_bit = StringImpl::Create(kChars8, 5);
// StringView(StringImpl*);
ASSERT_TRUE(StringView(impl8_bit.get()).Is8Bit());
EXPECT_FALSE(StringView(impl8_bit.get()).IsNull());
EXPECT_EQ(impl8_bit->Characters8(),
StringView(impl8_bit.get()).Characters8());
EXPECT_EQ(impl8_bit->length(), StringView(impl8_bit.get()).length());
EXPECT_STREQ(kChars, StringView(impl8_bit.get()).ToString().Utf8().data());
// StringView(StringImpl*, unsigned offset);
ASSERT_TRUE(StringView(impl8_bit.get(), 2).Is8Bit());
EXPECT_FALSE(StringView(impl8_bit.get(), 2).IsNull());
EXPECT_EQ(impl8_bit->Characters8() + 2,
StringView(impl8_bit.get(), 2).Characters8());
EXPECT_EQ(3u, StringView(impl8_bit.get(), 2).length());
EXPECT_EQ(StringView("345"), StringView(impl8_bit.get(), 2));
EXPECT_STREQ("345", StringView(impl8_bit.get(), 2).ToString().Utf8().data());
// StringView(StringImpl*, unsigned offset, unsigned length);
ASSERT_TRUE(StringView(impl8_bit.get(), 2, 1).Is8Bit());
EXPECT_FALSE(StringView(impl8_bit.get(), 2, 1).IsNull());
EXPECT_EQ(impl8_bit->Characters8() + 2,
StringView(impl8_bit.get(), 2, 1).Characters8());
EXPECT_EQ(1u, StringView(impl8_bit.get(), 2, 1).length());
EXPECT_EQ(StringView("3"), StringView(impl8_bit.get(), 2, 1));
EXPECT_STREQ("3", StringView(impl8_bit.get(), 2, 1).ToString().Utf8().data());
}
TEST(StringViewTest, ConstructionStringImpl16) {
scoped_refptr<StringImpl> impl16_bit = StringImpl::Create(kChars16, 5);
// StringView(StringImpl*);
ASSERT_FALSE(StringView(impl16_bit.get()).Is8Bit());
EXPECT_FALSE(StringView(impl16_bit.get()).IsNull());
EXPECT_EQ(impl16_bit->Characters16(),
StringView(impl16_bit.get()).Characters16());
EXPECT_EQ(impl16_bit->length(), StringView(impl16_bit.get()).length());
EXPECT_STREQ(kChars, StringView(impl16_bit.get()).ToString().Utf8().data());
// StringView(StringImpl*, unsigned offset);
ASSERT_FALSE(StringView(impl16_bit.get(), 2).Is8Bit());
EXPECT_FALSE(StringView(impl16_bit.get(), 2).IsNull());
EXPECT_EQ(impl16_bit->Characters16() + 2,
StringView(impl16_bit.get(), 2).Characters16());
EXPECT_EQ(3u, StringView(impl16_bit.get(), 2).length());
EXPECT_EQ(StringView("345"), StringView(impl16_bit.get(), 2));
EXPECT_STREQ("345", StringView(impl16_bit.get(), 2).ToString().Utf8().data());
// StringView(StringImpl*, unsigned offset, unsigned length);
ASSERT_FALSE(StringView(impl16_bit.get(), 2, 1).Is8Bit());
EXPECT_FALSE(StringView(impl16_bit.get(), 2, 1).IsNull());
EXPECT_EQ(impl16_bit->Characters16() + 2,
StringView(impl16_bit.get(), 2, 1).Characters16());
EXPECT_EQ(1u, StringView(impl16_bit.get(), 2, 1).length());
EXPECT_EQ(StringView("3"), StringView(impl16_bit.get(), 2, 1));
EXPECT_STREQ("3",
StringView(impl16_bit.get(), 2, 1).ToString().Utf8().data());
}
TEST(StringViewTest, ConstructionStringImplRef8) {
scoped_refptr<StringImpl> impl8_bit = StringImpl::Create(kChars8, 5);
// StringView(StringImpl&);
ASSERT_TRUE(StringView(*impl8_bit).Is8Bit());
EXPECT_FALSE(StringView(*impl8_bit).IsNull());
EXPECT_EQ(impl8_bit->Characters8(), StringView(*impl8_bit).Characters8());
EXPECT_EQ(impl8_bit->length(), StringView(*impl8_bit).length());
EXPECT_STREQ(kChars, StringView(*impl8_bit).ToString().Utf8().data());
// StringView(StringImpl&, unsigned offset);
ASSERT_TRUE(StringView(*impl8_bit, 2).Is8Bit());
EXPECT_FALSE(StringView(*impl8_bit, 2).IsNull());
EXPECT_EQ(impl8_bit->Characters8() + 2,
StringView(*impl8_bit, 2).Characters8());
EXPECT_EQ(3u, StringView(*impl8_bit, 2).length());
EXPECT_EQ(StringView("345"), StringView(*impl8_bit, 2));
EXPECT_STREQ("345", StringView(*impl8_bit, 2).ToString().Utf8().data());
// StringView(StringImpl&, unsigned offset, unsigned length);
ASSERT_TRUE(StringView(*impl8_bit, 2, 1).Is8Bit());
EXPECT_FALSE(StringView(*impl8_bit, 2, 1).IsNull());
EXPECT_EQ(impl8_bit->Characters8() + 2,
StringView(*impl8_bit, 2, 1).Characters8());
EXPECT_EQ(1u, StringView(*impl8_bit, 2, 1).length());
EXPECT_EQ(StringView("3"), StringView(*impl8_bit, 2, 1));
EXPECT_STREQ("3", StringView(*impl8_bit, 2, 1).ToString().Utf8().data());
}
TEST(StringViewTest, ConstructionStringImplRef16) {
scoped_refptr<StringImpl> impl16_bit = StringImpl::Create(kChars16, 5);
// StringView(StringImpl&);
ASSERT_FALSE(StringView(*impl16_bit).Is8Bit());
EXPECT_FALSE(StringView(*impl16_bit).IsNull());
EXPECT_EQ(impl16_bit->Characters16(), StringView(*impl16_bit).Characters16());
EXPECT_EQ(impl16_bit->length(), StringView(*impl16_bit).length());
EXPECT_STREQ(kChars, StringView(*impl16_bit).ToString().Utf8().data());
// StringView(StringImpl&, unsigned offset);
ASSERT_FALSE(StringView(*impl16_bit, 2).Is8Bit());
EXPECT_FALSE(StringView(*impl16_bit, 2).IsNull());
EXPECT_EQ(impl16_bit->Characters16() + 2,
StringView(*impl16_bit, 2).Characters16());
EXPECT_EQ(3u, StringView(*impl16_bit, 2).length());
EXPECT_EQ(StringView("345"), StringView(*impl16_bit, 2));
EXPECT_STREQ("345", StringView(*impl16_bit, 2).ToString().Utf8().data());
// StringView(StringImpl&, unsigned offset, unsigned length);
ASSERT_FALSE(StringView(*impl16_bit, 2, 1).Is8Bit());
EXPECT_FALSE(StringView(*impl16_bit, 2, 1).IsNull());
EXPECT_EQ(impl16_bit->Characters16() + 2,
StringView(*impl16_bit, 2, 1).Characters16());
EXPECT_EQ(1u, StringView(*impl16_bit, 2, 1).length());
EXPECT_EQ(StringView("3"), StringView(*impl16_bit, 2, 1));
EXPECT_STREQ("3", StringView(*impl16_bit, 2, 1).ToString().Utf8().data());
}
TEST(StringViewTest, ConstructionString8) {
String string8_bit = String(StringImpl::Create(kChars8, 5));
// StringView(const String&);
ASSERT_TRUE(StringView(string8_bit).Is8Bit());
EXPECT_FALSE(StringView(string8_bit).IsNull());
EXPECT_EQ(string8_bit.Characters8(), StringView(string8_bit).Characters8());
EXPECT_EQ(string8_bit.length(), StringView(string8_bit).length());
EXPECT_STREQ(kChars, StringView(string8_bit).ToString().Utf8().data());
// StringView(const String&, unsigned offset);
ASSERT_TRUE(StringView(string8_bit, 2).Is8Bit());
EXPECT_FALSE(StringView(string8_bit, 2).IsNull());
EXPECT_EQ(string8_bit.Characters8() + 2,
StringView(string8_bit, 2).Characters8());
EXPECT_EQ(3u, StringView(string8_bit, 2).length());
EXPECT_EQ(StringView("345"), StringView(string8_bit, 2));
EXPECT_STREQ("345", StringView(string8_bit, 2).ToString().Utf8().data());
// StringView(const String&, unsigned offset, unsigned length);
ASSERT_TRUE(StringView(string8_bit, 2, 1).Is8Bit());
EXPECT_FALSE(StringView(string8_bit, 2, 1).IsNull());
EXPECT_EQ(string8_bit.Characters8() + 2,
StringView(string8_bit, 2, 1).Characters8());
EXPECT_EQ(1u, StringView(string8_bit, 2, 1).length());
EXPECT_EQ(StringView("3"), StringView(string8_bit, 2, 1));
EXPECT_STREQ("3", StringView(string8_bit, 2, 1).ToString().Utf8().data());
}
TEST(StringViewTest, ConstructionString16) {
String string16_bit = String(StringImpl::Create(kChars16, 5));
// StringView(const String&);
ASSERT_FALSE(StringView(string16_bit).Is8Bit());
EXPECT_FALSE(StringView(string16_bit).IsNull());
EXPECT_EQ(string16_bit.Characters16(),
StringView(string16_bit).Characters16());
EXPECT_EQ(string16_bit.length(), StringView(string16_bit).length());
EXPECT_STREQ(kChars, StringView(string16_bit).ToString().Utf8().data());
// StringView(const String&, unsigned offset);
ASSERT_FALSE(StringView(string16_bit, 2).Is8Bit());
EXPECT_FALSE(StringView(string16_bit, 2).IsNull());
EXPECT_EQ(string16_bit.Characters16() + 2,
StringView(string16_bit, 2).Characters16());
EXPECT_EQ(3u, StringView(string16_bit, 2).length());
EXPECT_EQ(StringView("345"), StringView(string16_bit, 2));
EXPECT_STREQ("345", StringView(string16_bit, 2).ToString().Utf8().data());
// StringView(const String&, unsigned offset, unsigned length);
ASSERT_FALSE(StringView(string16_bit, 2, 1).Is8Bit());
EXPECT_FALSE(StringView(string16_bit, 2, 1).IsNull());
EXPECT_EQ(string16_bit.Characters16() + 2,
StringView(string16_bit, 2, 1).Characters16());
EXPECT_EQ(1u, StringView(string16_bit, 2, 1).length());
EXPECT_EQ(StringView("3"), StringView(string16_bit, 2, 1));
EXPECT_STREQ("3", StringView(string16_bit, 2, 1).ToString().Utf8().data());
}
TEST(StringViewTest, ConstructionAtomicString8) {
AtomicString atom8_bit = AtomicString(StringImpl::Create(kChars8, 5));
// StringView(const AtomicString&);
ASSERT_TRUE(StringView(atom8_bit).Is8Bit());
EXPECT_FALSE(StringView(atom8_bit).IsNull());
EXPECT_EQ(atom8_bit.Characters8(), StringView(atom8_bit).Characters8());
EXPECT_EQ(atom8_bit.length(), StringView(atom8_bit).length());
EXPECT_STREQ(kChars, StringView(atom8_bit).ToString().Utf8().data());
// StringView(const AtomicString&, unsigned offset);
ASSERT_TRUE(StringView(atom8_bit, 2).Is8Bit());
EXPECT_FALSE(StringView(atom8_bit, 2).IsNull());
EXPECT_EQ(atom8_bit.Characters8() + 2,
StringView(atom8_bit, 2).Characters8());
EXPECT_EQ(3u, StringView(atom8_bit, 2).length());
EXPECT_EQ(StringView("345"), StringView(atom8_bit, 2));
EXPECT_STREQ("345", StringView(atom8_bit, 2).ToString().Utf8().data());
// StringView(const AtomicString&, unsigned offset, unsigned length);
ASSERT_TRUE(StringView(atom8_bit, 2, 1).Is8Bit());
EXPECT_FALSE(StringView(atom8_bit, 2, 1).IsNull());
EXPECT_EQ(atom8_bit.Characters8() + 2,
StringView(atom8_bit, 2, 1).Characters8());
EXPECT_EQ(1u, StringView(atom8_bit, 2, 1).length());
EXPECT_EQ(StringView("3"), StringView(atom8_bit, 2, 1));
EXPECT_STREQ("3", StringView(atom8_bit, 2, 1).ToString().Utf8().data());
}
TEST(StringViewTest, ConstructionAtomicString16) {
AtomicString atom16_bit = AtomicString(StringImpl::Create(kChars16, 5));
// StringView(const AtomicString&);
ASSERT_FALSE(StringView(atom16_bit).Is8Bit());
EXPECT_FALSE(StringView(atom16_bit).IsNull());
EXPECT_EQ(atom16_bit.Characters16(), StringView(atom16_bit).Characters16());
EXPECT_EQ(atom16_bit.length(), StringView(atom16_bit).length());
EXPECT_STREQ(kChars, StringView(atom16_bit).ToString().Utf8().data());
// StringView(const AtomicString&, unsigned offset);
ASSERT_FALSE(StringView(atom16_bit, 2).Is8Bit());
EXPECT_FALSE(StringView(atom16_bit, 2).IsNull());
EXPECT_EQ(atom16_bit.Characters16() + 2,
StringView(atom16_bit, 2).Characters16());
EXPECT_EQ(3u, StringView(atom16_bit, 2).length());
EXPECT_EQ(StringView("345"), StringView(atom16_bit, 2));
EXPECT_STREQ("345", StringView(atom16_bit, 2).ToString().Utf8().data());
// StringView(const AtomicString&, unsigned offset, unsigned length);
ASSERT_FALSE(StringView(atom16_bit, 2, 1).Is8Bit());
EXPECT_FALSE(StringView(atom16_bit, 2, 1).IsNull());
EXPECT_EQ(atom16_bit.Characters16() + 2,
StringView(atom16_bit, 2, 1).Characters16());
EXPECT_EQ(1u, StringView(atom16_bit, 2, 1).length());
EXPECT_EQ(StringView("3"), StringView(atom16_bit, 2, 1));
EXPECT_STREQ("3", StringView(atom16_bit, 2, 1).ToString().Utf8().data());
}
TEST(StringViewTest, ConstructionStringView8) {
StringView view8_bit = StringView(kChars8, 5);
// StringView(StringView&);
ASSERT_TRUE(StringView(view8_bit).Is8Bit());
EXPECT_FALSE(StringView(view8_bit).IsNull());
EXPECT_EQ(view8_bit.Characters8(), StringView(view8_bit).Characters8());
EXPECT_EQ(view8_bit.length(), StringView(view8_bit).length());
EXPECT_STREQ(kChars, StringView(view8_bit).ToString().Utf8().data());
// StringView(const StringView&, unsigned offset);
ASSERT_TRUE(StringView(view8_bit, 2).Is8Bit());
EXPECT_FALSE(StringView(view8_bit, 2).IsNull());
EXPECT_EQ(view8_bit.Characters8() + 2,
StringView(view8_bit, 2).Characters8());
EXPECT_EQ(3u, StringView(view8_bit, 2).length());
EXPECT_EQ(StringView("345"), StringView(view8_bit, 2));
EXPECT_STREQ("345", StringView(view8_bit, 2).ToString().Utf8().data());
// StringView(const StringView&, unsigned offset, unsigned length);
ASSERT_TRUE(StringView(view8_bit, 2, 1).Is8Bit());
EXPECT_FALSE(StringView(view8_bit, 2, 1).IsNull());
EXPECT_EQ(view8_bit.Characters8() + 2,
StringView(view8_bit, 2, 1).Characters8());
EXPECT_EQ(1u, StringView(view8_bit, 2, 1).length());
EXPECT_EQ(StringView("3"), StringView(view8_bit, 2, 1));
EXPECT_STREQ("3", StringView(view8_bit, 2, 1).ToString().Utf8().data());
}
TEST(StringViewTest, ConstructionStringView16) {
StringView view16_bit = StringView(kChars16, 5);
// StringView(StringView&);
ASSERT_FALSE(StringView(view16_bit).Is8Bit());
EXPECT_FALSE(StringView(view16_bit).IsNull());
EXPECT_EQ(view16_bit.Characters16(), StringView(view16_bit).Characters16());
EXPECT_EQ(view16_bit.length(), StringView(view16_bit).length());
EXPECT_EQ(kChars, StringView(view16_bit).ToString());
// StringView(const StringView&, unsigned offset);
ASSERT_FALSE(StringView(view16_bit, 2).Is8Bit());
EXPECT_FALSE(StringView(view16_bit, 2).IsNull());
EXPECT_EQ(view16_bit.Characters16() + 2,
StringView(view16_bit, 2).Characters16());
EXPECT_EQ(3u, StringView(view16_bit, 2).length());
EXPECT_EQ(StringView("345"), StringView(view16_bit, 2));
EXPECT_STREQ("345", StringView(view16_bit, 2).ToString().Utf8().data());
// StringView(const StringView&, unsigned offset, unsigned length);
ASSERT_FALSE(StringView(view16_bit, 2, 1).Is8Bit());
EXPECT_FALSE(StringView(view16_bit, 2, 1).IsNull());
EXPECT_EQ(view16_bit.Characters16() + 2,
StringView(view16_bit, 2, 1).Characters16());
EXPECT_EQ(1u, StringView(view16_bit, 2, 1).length());
EXPECT_EQ(StringView("3"), StringView(view16_bit, 2, 1));
EXPECT_STREQ("3", StringView(view16_bit, 2, 1).ToString().Utf8().data());
}
TEST(StringViewTest, ConstructionLiteral8) {
// StringView(const LChar* chars);
ASSERT_TRUE(StringView(kChars8).Is8Bit());
EXPECT_FALSE(StringView(kChars8).IsNull());
EXPECT_EQ(kChars8, StringView(kChars8).Characters8());
EXPECT_EQ(5u, StringView(kChars8).length());
EXPECT_STREQ(kChars, StringView(kChars8).ToString().Utf8().data());
// StringView(const char* chars);
ASSERT_TRUE(StringView(kChars).Is8Bit());
EXPECT_FALSE(StringView(kChars).IsNull());
EXPECT_EQ(kChars8, StringView(kChars).Characters8());
EXPECT_EQ(5u, StringView(kChars).length());
EXPECT_STREQ(kChars, StringView(kChars).ToString().Utf8().data());
// StringView(const LChar* chars, unsigned length);
ASSERT_TRUE(StringView(kChars8, 2).Is8Bit());
EXPECT_FALSE(StringView(kChars8, 2).IsNull());
EXPECT_EQ(2u, StringView(kChars8, 2).length());
EXPECT_EQ(StringView("12"), StringView(kChars8, 2));
EXPECT_STREQ("12", StringView(kChars8, 2).ToString().Utf8().data());
// StringView(const char* chars, unsigned length);
ASSERT_TRUE(StringView(kChars, 2).Is8Bit());
EXPECT_FALSE(StringView(kChars, 2).IsNull());
EXPECT_EQ(2u, StringView(kChars, 2).length());
EXPECT_EQ(StringView("12"), StringView(kChars, 2));
EXPECT_STREQ("12", StringView(kChars, 2).ToString().Utf8().data());
}
TEST(StringViewTest, ConstructionLiteral16) {
// StringView(const UChar* chars);
ASSERT_FALSE(StringView(kChars16).Is8Bit());
EXPECT_FALSE(StringView(kChars16).IsNull());
EXPECT_EQ(kChars16, StringView(kChars16).Characters16());
EXPECT_EQ(5u, StringView(kChars16).length());
EXPECT_EQ(String(kChars16), StringView(kChars16).ToString().Utf8().data());
// StringView(const UChar* chars, unsigned length);
ASSERT_FALSE(StringView(kChars16, 2).Is8Bit());
EXPECT_FALSE(StringView(kChars16, 2).IsNull());
EXPECT_EQ(kChars16, StringView(kChars16, 2).Characters16());
EXPECT_EQ(StringView("12"), StringView(kChars16, 2));
EXPECT_EQ(StringView(reinterpret_cast<const UChar*>(u"12")),
StringView(kChars16, 2));
EXPECT_EQ(2u, StringView(kChars16, 2).length());
EXPECT_EQ(String("12"), StringView(kChars16, 2).ToString());
}
TEST(StringViewTest, IsEmpty) {
EXPECT_FALSE(StringView(kChars).IsEmpty());
EXPECT_TRUE(StringView(kChars, 0).IsEmpty());
EXPECT_FALSE(StringView(String(kChars)).IsEmpty());
EXPECT_TRUE(StringView(String(kChars), 5).IsEmpty());
EXPECT_TRUE(StringView(String(kChars), 4, 0).IsEmpty());
EXPECT_TRUE(StringView().IsEmpty());
EXPECT_TRUE(StringView("").IsEmpty());
EXPECT_TRUE(StringView(reinterpret_cast<const UChar*>(u"")).IsEmpty());
EXPECT_FALSE(StringView(kChars16).IsEmpty());
}
TEST(StringViewTest, ToString) {
EXPECT_EQ(g_empty_string.Impl(), StringView("").ToString().Impl());
EXPECT_EQ(g_null_atom.Impl(), StringView().ToString().Impl());
// NOTE: All the construction tests also check toString().
}
TEST(StringViewTest, ToAtomicString) {
EXPECT_EQ(g_null_atom.Impl(), StringView().ToAtomicString());
EXPECT_EQ(g_empty_atom.Impl(), StringView("").ToAtomicString());
EXPECT_EQ(AtomicString("12"), StringView(kChars8, 2).ToAtomicString());
// AtomicString will convert to 8bit if possible when creating the string.
EXPECT_EQ(AtomicString("12").Impl(),
StringView(kChars16, 2).ToAtomicString().Impl());
}
TEST(StringViewTest, ToStringImplSharing) {
String string(kChars);
EXPECT_EQ(string.Impl(), StringView(string).SharedImpl());
EXPECT_EQ(string.Impl(), StringView(string).ToString().Impl());
EXPECT_EQ(string.Impl(), StringView(string).ToAtomicString().Impl());
}
TEST(StringViewTest, NullString) {
EXPECT_TRUE(StringView().IsNull());
EXPECT_TRUE(StringView(String()).IsNull());
EXPECT_TRUE(StringView(AtomicString()).IsNull());
EXPECT_TRUE(StringView(static_cast<const char*>(nullptr)).IsNull());
StringView view(kChars);
EXPECT_FALSE(view.IsNull());
view.Clear();
EXPECT_TRUE(view.IsNull());
EXPECT_EQ(String(), StringView());
EXPECT_TRUE(StringView().ToString().IsNull());
EXPECT_FALSE(EqualStringView(StringView(), ""));
EXPECT_TRUE(EqualStringView(StringView(), StringView()));
EXPECT_FALSE(EqualStringView(StringView(), "abc"));
EXPECT_FALSE(EqualStringView("abc", StringView()));
EXPECT_FALSE(EqualIgnoringASCIICase(StringView(), ""));
EXPECT_TRUE(EqualIgnoringASCIICase(StringView(), StringView()));
EXPECT_FALSE(EqualIgnoringASCIICase(StringView(), "abc"));
EXPECT_FALSE(EqualIgnoringASCIICase("abc", StringView()));
}
TEST(StringViewTest, IndexAccess) {
StringView view8(kChars8);
EXPECT_EQ('1', view8[0]);
EXPECT_EQ('3', view8[2]);
StringView view16(kChars16);
EXPECT_EQ('1', view16[0]);
EXPECT_EQ('3', view16[2]);
}
TEST(StringViewTest, EqualIgnoringASCIICase) {
static const char* link8 = "link";
static const char* link_caps8 = "LINK";
static const char* non_ascii8 = "a\xE1";
static const char* non_ascii_caps8 = "A\xE1";
static const char* non_ascii_invalid8 = "a\xC1";
static const UChar kLink16[5] = {0x006c, 0x0069, 0x006e, 0x006b, 0}; // link
static const UChar kLinkCaps16[5] = {0x004c, 0x0049, 0x004e, 0x004b,
0}; // LINK
static const UChar kNonASCII16[3] = {0x0061, 0x00e1, 0}; // a\xE1
static const UChar kNonASCIICaps16[3] = {0x0041, 0x00e1, 0}; // A\xE1
static const UChar kNonASCIIInvalid16[3] = {0x0061, 0x00c1, 0}; // a\xC1
EXPECT_TRUE(EqualIgnoringASCIICase(StringView(kLink16), link8));
EXPECT_TRUE(EqualIgnoringASCIICase(StringView(kLink16), kLinkCaps16));
EXPECT_TRUE(EqualIgnoringASCIICase(StringView(kLink16), link_caps8));
EXPECT_TRUE(EqualIgnoringASCIICase(StringView(link8), link_caps8));
EXPECT_TRUE(EqualIgnoringASCIICase(StringView(link8), kLink16));
EXPECT_TRUE(EqualIgnoringASCIICase(StringView(non_ascii8), non_ascii_caps8));
EXPECT_TRUE(EqualIgnoringASCIICase(StringView(non_ascii8), kNonASCIICaps16));
EXPECT_TRUE(EqualIgnoringASCIICase(StringView(kNonASCII16), kNonASCIICaps16));
EXPECT_TRUE(EqualIgnoringASCIICase(StringView(kNonASCII16), non_ascii_caps8));
EXPECT_FALSE(
EqualIgnoringASCIICase(StringView(non_ascii8), non_ascii_invalid8));
EXPECT_FALSE(
EqualIgnoringASCIICase(StringView(non_ascii8), kNonASCIIInvalid16));
EXPECT_TRUE(EqualIgnoringASCIICase(StringView("link"), "lInK"));
EXPECT_FALSE(EqualIgnoringASCIICase(StringView("link"), "INKL"));
EXPECT_FALSE(
EqualIgnoringASCIICase(StringView("link"), "link different length"));
EXPECT_FALSE(
EqualIgnoringASCIICase(StringView("link different length"), "link"));
EXPECT_TRUE(EqualIgnoringASCIICase(StringView(""), ""));
}
} // namespace WTF