// Copyright 2022 The Tint Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "src/tint/text/unicode.h"

#include <string>
#include <vector>

#include "gmock/gmock.h"

/// Helper for constructing a CodePoint
#define C(x) CodePoint(x)

namespace tint::text {

////////////////////////////////////////////////////////////////////////////////
// CodePoint character set tests
////////////////////////////////////////////////////////////////////////////////
namespace {

struct CodePointCase {
  CodePoint code_point;
  bool is_xid_start;
  bool is_xid_continue;
};

std::ostream& operator<<(std::ostream& out, CodePointCase c) {
  return out << c.code_point;
}

class CodePointTest : public testing::TestWithParam<CodePointCase> {};

TEST_P(CodePointTest, CharacterSets) {
  auto param = GetParam();
  EXPECT_EQ(param.code_point.IsXIDStart(), param.is_xid_start);
  EXPECT_EQ(param.code_point.IsXIDContinue(), param.is_xid_continue);
}

INSTANTIATE_TEST_SUITE_P(
    CodePointTest,
    CodePointTest,
    ::testing::ValuesIn({
        CodePointCase{C(' '), /* start */ false, /* continue */ false},
        CodePointCase{C('\t'), /* start */ false, /* continue */ false},
        CodePointCase{C('\n'), /* start */ false, /* continue */ false},
        CodePointCase{C('\r'), /* start */ false, /* continue */ false},
        CodePointCase{C('!'), /* start */ false, /* continue */ false},
        CodePointCase{C('"'), /* start */ false, /* continue */ false},
        CodePointCase{C('#'), /* start */ false, /* continue */ false},
        CodePointCase{C('$'), /* start */ false, /* continue */ false},
        CodePointCase{C('%'), /* start */ false, /* continue */ false},
        CodePointCase{C('&'), /* start */ false, /* continue */ false},
        CodePointCase{C('\\'), /* start */ false, /* continue */ false},
        CodePointCase{C('/'), /* start */ false, /* continue */ false},
        CodePointCase{C('('), /* start */ false, /* continue */ false},
        CodePointCase{C(')'), /* start */ false, /* continue */ false},
        CodePointCase{C('*'), /* start */ false, /* continue */ false},
        CodePointCase{C(','), /* start */ false, /* continue */ false},
        CodePointCase{C('-'), /* start */ false, /* continue */ false},
        CodePointCase{C('/'), /* start */ false, /* continue */ false},
        CodePointCase{C('`'), /* start */ false, /* continue */ false},
        CodePointCase{C('@'), /* start */ false, /* continue */ false},
        CodePointCase{C('^'), /* start */ false, /* continue */ false},
        CodePointCase{C('['), /* start */ false, /* continue */ false},
        CodePointCase{C(']'), /* start */ false, /* continue */ false},
        CodePointCase{C('|'), /* start */ false, /* continue */ false},
        CodePointCase{C('('), /* start */ false, /* continue */ false},
        CodePointCase{C(','), /* start */ false, /* continue */ false},
        CodePointCase{C('}'), /* start */ false, /* continue */ false},
        CodePointCase{C('a'), /* start */ true, /* continue */ true},
        CodePointCase{C('b'), /* start */ true, /* continue */ true},
        CodePointCase{C('c'), /* start */ true, /* continue */ true},
        CodePointCase{C('x'), /* start */ true, /* continue */ true},
        CodePointCase{C('y'), /* start */ true, /* continue */ true},
        CodePointCase{C('z'), /* start */ true, /* continue */ true},
        CodePointCase{C('A'), /* start */ true, /* continue */ true},
        CodePointCase{C('B'), /* start */ true, /* continue */ true},
        CodePointCase{C('C'), /* start */ true, /* continue */ true},
        CodePointCase{C('X'), /* start */ true, /* continue */ true},
        CodePointCase{C('Y'), /* start */ true, /* continue */ true},
        CodePointCase{C('Z'), /* start */ true, /* continue */ true},
        CodePointCase{C('_'), /* start */ false, /* continue */ true},
        CodePointCase{C('0'), /* start */ false, /* continue */ true},
        CodePointCase{C('1'), /* start */ false, /* continue */ true},
        CodePointCase{C('2'), /* start */ false, /* continue */ true},
        CodePointCase{C('8'), /* start */ false, /* continue */ true},
        CodePointCase{C('9'), /* start */ false, /* continue */ true},
        CodePointCase{C('0'), /* start */ false, /* continue */ true},

        // First in XID_Start
        CodePointCase{C(0x00041), /* start */ true, /* continue */ true},
        // Last in XID_Start
        CodePointCase{C(0x3134a), /* start */ true, /* continue */ true},

        // Random selection from XID_Start, using the interval's first
        CodePointCase{C(0x002ee), /* start */ true, /* continue */ true},
        CodePointCase{C(0x005ef), /* start */ true, /* continue */ true},
        CodePointCase{C(0x009f0), /* start */ true, /* continue */ true},
        CodePointCase{C(0x00d3d), /* start */ true, /* continue */ true},
        CodePointCase{C(0x00d54), /* start */ true, /* continue */ true},
        CodePointCase{C(0x00e86), /* start */ true, /* continue */ true},
        CodePointCase{C(0x00edc), /* start */ true, /* continue */ true},
        CodePointCase{C(0x01c00), /* start */ true, /* continue */ true},
        CodePointCase{C(0x01c80), /* start */ true, /* continue */ true},
        CodePointCase{C(0x02071), /* start */ true, /* continue */ true},
        CodePointCase{C(0x02dd0), /* start */ true, /* continue */ true},
        CodePointCase{C(0x0a4d0), /* start */ true, /* continue */ true},
        CodePointCase{C(0x0aac0), /* start */ true, /* continue */ true},
        CodePointCase{C(0x0ab5c), /* start */ true, /* continue */ true},
        CodePointCase{C(0x0ffda), /* start */ true, /* continue */ true},
        CodePointCase{C(0x11313), /* start */ true, /* continue */ true},
        CodePointCase{C(0x1ee49), /* start */ true, /* continue */ true},

        // Random selection from XID_Start, using the interval's last
        CodePointCase{C(0x00710), /* start */ true, /* continue */ true},
        CodePointCase{C(0x00b83), /* start */ true, /* continue */ true},
        CodePointCase{C(0x00b9a), /* start */ true, /* continue */ true},
        CodePointCase{C(0x00ec4), /* start */ true, /* continue */ true},
        CodePointCase{C(0x01081), /* start */ true, /* continue */ true},
        CodePointCase{C(0x012be), /* start */ true, /* continue */ true},
        CodePointCase{C(0x02107), /* start */ true, /* continue */ true},
        CodePointCase{C(0x03029), /* start */ true, /* continue */ true},
        CodePointCase{C(0x03035), /* start */ true, /* continue */ true},
        CodePointCase{C(0x0aadd), /* start */ true, /* continue */ true},
        CodePointCase{C(0x10805), /* start */ true, /* continue */ true},
        CodePointCase{C(0x11075), /* start */ true, /* continue */ true},
        CodePointCase{C(0x1d4a2), /* start */ true, /* continue */ true},
        CodePointCase{C(0x1e7fe), /* start */ true, /* continue */ true},
        CodePointCase{C(0x1ee27), /* start */ true, /* continue */ true},
        CodePointCase{C(0x2b738), /* start */ true, /* continue */ true},

        // Random selection from XID_Continue, using the interval's first
        CodePointCase{C(0x16ac0), /* start */ false, /* continue */ true},
        CodePointCase{C(0x00dca), /* start */ false, /* continue */ true},
        CodePointCase{C(0x16f4f), /* start */ false, /* continue */ true},
        CodePointCase{C(0x0fe00), /* start */ false, /* continue */ true},
        CodePointCase{C(0x00ec8), /* start */ false, /* continue */ true},
        CodePointCase{C(0x009be), /* start */ false, /* continue */ true},
        CodePointCase{C(0x11d47), /* start */ false, /* continue */ true},
        CodePointCase{C(0x11d50), /* start */ false, /* continue */ true},
        CodePointCase{C(0x0a926), /* start */ false, /* continue */ true},
        CodePointCase{C(0x0aac1), /* start */ false, /* continue */ true},
        CodePointCase{C(0x00f18), /* start */ false, /* continue */ true},
        CodePointCase{C(0x11145), /* start */ false, /* continue */ true},
        CodePointCase{C(0x017dd), /* start */ false, /* continue */ true},
        CodePointCase{C(0x0aaeb), /* start */ false, /* continue */ true},
        CodePointCase{C(0x11173), /* start */ false, /* continue */ true},
        CodePointCase{C(0x00a51), /* start */ false, /* continue */ true},

        // Random selection from XID_Continue, using the interval's last
        CodePointCase{C(0x00f84), /* start */ false, /* continue */ true},
        CodePointCase{C(0x10a3a), /* start */ false, /* continue */ true},
        CodePointCase{C(0x1e018), /* start */ false, /* continue */ true},
        CodePointCase{C(0x0a827), /* start */ false, /* continue */ true},
        CodePointCase{C(0x01abd), /* start */ false, /* continue */ true},
        CodePointCase{C(0x009d7), /* start */ false, /* continue */ true},
        CodePointCase{C(0x00b6f), /* start */ false, /* continue */ true},
        CodePointCase{C(0x0096f), /* start */ false, /* continue */ true},
        CodePointCase{C(0x11146), /* start */ false, /* continue */ true},
        CodePointCase{C(0x10eac), /* start */ false, /* continue */ true},
        CodePointCase{C(0x00f39), /* start */ false, /* continue */ true},
        CodePointCase{C(0x1e136), /* start */ false, /* continue */ true},
        CodePointCase{C(0x00def), /* start */ false, /* continue */ true},
        CodePointCase{C(0x0fe34), /* start */ false, /* continue */ true},
        CodePointCase{C(0x009c8), /* start */ false, /* continue */ true},
        CodePointCase{C(0x00fbc), /* start */ false, /* continue */ true},

        // Random code points that are one less than an interval of XID_Start
        CodePointCase{C(0x003f6), /* start */ false, /* continue */ false},
        CodePointCase{C(0x005ee), /* start */ false, /* continue */ false},
        CodePointCase{C(0x009ef), /* start */ false, /* continue */ true},
        CodePointCase{C(0x00d3c), /* start */ false, /* continue */ true},
        CodePointCase{C(0x00d53), /* start */ false, /* continue */ false},
        CodePointCase{C(0x00e85), /* start */ false, /* continue */ false},
        CodePointCase{C(0x00edb), /* start */ false, /* continue */ false},
        CodePointCase{C(0x01bff), /* start */ false, /* continue */ false},
        CodePointCase{C(0x02070), /* start */ false, /* continue */ false},
        CodePointCase{C(0x02dcf), /* start */ false, /* continue */ false},
        CodePointCase{C(0x0a4cf), /* start */ false, /* continue */ false},
        CodePointCase{C(0x0aabf), /* start */ false, /* continue */ true},
        CodePointCase{C(0x0ab5b), /* start */ false, /* continue */ false},
        CodePointCase{C(0x0ffd9), /* start */ false, /* continue */ false},
        CodePointCase{C(0x11312), /* start */ false, /* continue */ false},
        CodePointCase{C(0x1ee48), /* start */ false, /* continue */ false},

        // Random code points that are one more than an interval of XID_Continue
        CodePointCase{C(0x00060), /* start */ false, /* continue */ false},
        CodePointCase{C(0x00a4e), /* start */ false, /* continue */ false},
        CodePointCase{C(0x00a84), /* start */ false, /* continue */ false},
        CodePointCase{C(0x00cce), /* start */ false, /* continue */ false},
        CodePointCase{C(0x00eda), /* start */ false, /* continue */ false},
        CodePointCase{C(0x00f85), /* start */ false, /* continue */ false},
        CodePointCase{C(0x01b74), /* start */ false, /* continue */ false},
        CodePointCase{C(0x01c38), /* start */ false, /* continue */ false},
        CodePointCase{C(0x0fe30), /* start */ false, /* continue */ false},
        CodePointCase{C(0x11174), /* start */ false, /* continue */ false},
        CodePointCase{C(0x112eb), /* start */ false, /* continue */ false},
        CodePointCase{C(0x115de), /* start */ false, /* continue */ false},
        CodePointCase{C(0x1172c), /* start */ false, /* continue */ false},
        CodePointCase{C(0x11a3f), /* start */ false, /* continue */ false},
        CodePointCase{C(0x11c37), /* start */ false, /* continue */ false},
        CodePointCase{C(0x11d92), /* start */ false, /* continue */ false},
        CodePointCase{C(0x1e2af), /* start */ false, /* continue */ false},
    }));

}  // namespace

////////////////////////////////////////////////////////////////////////////////
// DecodeUTF8 valid tests
////////////////////////////////////////////////////////////////////////////////
namespace {

struct CodePointAndWidth {
  CodePoint code_point;
  size_t width;
};

bool operator==(const CodePointAndWidth& a, const CodePointAndWidth& b) {
  return a.code_point == b.code_point && a.width == b.width;
}

std::ostream& operator<<(std::ostream& out, CodePointAndWidth cpw) {
  return out << "code_point: " << cpw.code_point << ", width: " << cpw.width;
}

struct DecodeUTF8Case {
  std::string string;
  std::vector<CodePointAndWidth> expected;
};

std::ostream& operator<<(std::ostream& out, DecodeUTF8Case c) {
  return out << "'" << c.string << "'";
}

class DecodeUTF8Test : public testing::TestWithParam<DecodeUTF8Case> {};

TEST_P(DecodeUTF8Test, Valid) {
  auto param = GetParam();

  const uint8_t* data = reinterpret_cast<const uint8_t*>(param.string.data());
  const size_t len = param.string.size();

  std::vector<CodePointAndWidth> got;
  size_t offset = 0;
  while (offset < len) {
    auto [code_point, width] = utf8::Decode(data + offset, len - offset);
    if (width == 0) {
      FAIL() << "Decode() failed at byte offset " << offset;
    }
    offset += width;
    got.emplace_back(CodePointAndWidth{code_point, width});
  }

  EXPECT_THAT(got, ::testing::ElementsAreArray(param.expected));
}

INSTANTIATE_TEST_SUITE_P(
    AsciiLetters,
    DecodeUTF8Test,
    ::testing::ValuesIn({
        DecodeUTF8Case{"a", {{C('a'), 1}}},
        DecodeUTF8Case{"abc", {{C('a'), 1}, {C('b'), 1}, {C('c'), 1}}},
        DecodeUTF8Case{"def", {{C('d'), 1}, {C('e'), 1}, {C('f'), 1}}},
        DecodeUTF8Case{"gh", {{C('g'), 1}, {C('h'), 1}}},
        DecodeUTF8Case{"ij", {{C('i'), 1}, {C('j'), 1}}},
        DecodeUTF8Case{"klm", {{C('k'), 1}, {C('l'), 1}, {C('m'), 1}}},
        DecodeUTF8Case{"nop", {{C('n'), 1}, {C('o'), 1}, {C('p'), 1}}},
        DecodeUTF8Case{"qr", {{C('q'), 1}, {C('r'), 1}}},
        DecodeUTF8Case{"stu", {{C('s'), 1}, {C('t'), 1}, {C('u'), 1}}},
        DecodeUTF8Case{"vw", {{C('v'), 1}, {C('w'), 1}}},
        DecodeUTF8Case{"xyz", {{C('x'), 1}, {C('y'), 1}, {C('z'), 1}}},
        DecodeUTF8Case{"A", {{C('A'), 1}}},
        DecodeUTF8Case{"ABC", {{C('A'), 1}, {C('B'), 1}, {C('C'), 1}}},
        DecodeUTF8Case{"DEF", {{C('D'), 1}, {C('E'), 1}, {C('F'), 1}}},
        DecodeUTF8Case{"GH", {{C('G'), 1}, {C('H'), 1}}},
        DecodeUTF8Case{"IJ", {{C('I'), 1}, {C('J'), 1}}},
        DecodeUTF8Case{"KLM", {{C('K'), 1}, {C('L'), 1}, {C('M'), 1}}},
        DecodeUTF8Case{"NOP", {{C('N'), 1}, {C('O'), 1}, {C('P'), 1}}},
        DecodeUTF8Case{"QR", {{C('Q'), 1}, {C('R'), 1}}},
        DecodeUTF8Case{"STU", {{C('S'), 1}, {C('T'), 1}, {C('U'), 1}}},
        DecodeUTF8Case{"VW", {{C('V'), 1}, {C('W'), 1}}},
        DecodeUTF8Case{"XYZ", {{C('X'), 1}, {C('Y'), 1}, {C('Z'), 1}}},
    }));

INSTANTIATE_TEST_SUITE_P(
    AsciiNumbers,
    DecodeUTF8Test,
    ::testing::ValuesIn({
        DecodeUTF8Case{"012", {{C('0'), 1}, {C('1'), 1}, {C('2'), 1}}},
        DecodeUTF8Case{"345", {{C('3'), 1}, {C('4'), 1}, {C('5'), 1}}},
        DecodeUTF8Case{"678", {{C('6'), 1}, {C('7'), 1}, {C('8'), 1}}},
        DecodeUTF8Case{"9", {{C('9'), 1}}},
    }));

INSTANTIATE_TEST_SUITE_P(
    AsciiSymbols,
    DecodeUTF8Test,
    ::testing::ValuesIn({
        DecodeUTF8Case{"!\"#", {{C('!'), 1}, {C('"'), 1}, {C('#'), 1}}},
        DecodeUTF8Case{"$%&", {{C('$'), 1}, {C('%'), 1}, {C('&'), 1}}},
        DecodeUTF8Case{"'()", {{C('\''), 1}, {C('('), 1}, {C(')'), 1}}},
        DecodeUTF8Case{"*,-", {{C('*'), 1}, {C(','), 1}, {C('-'), 1}}},
        DecodeUTF8Case{"/`@", {{C('/'), 1}, {C('`'), 1}, {C('@'), 1}}},
        DecodeUTF8Case{"^\\[", {{C('^'), 1}, {C('\\'), 1}, {C('['), 1}}},
        DecodeUTF8Case{"]_|", {{C(']'), 1}, {C('_'), 1}, {C('|'), 1}}},
        DecodeUTF8Case{"{}", {{C('{'), 1}, {C('}'), 1}}},
    }));

INSTANTIATE_TEST_SUITE_P(
    AsciiSpecial,
    DecodeUTF8Test,
    ::testing::ValuesIn({
        DecodeUTF8Case{"", {}},
        DecodeUTF8Case{" \t\n", {{C(' '), 1}, {C('\t'), 1}, {C('\n'), 1}}},
        DecodeUTF8Case{"\a\b\f", {{C('\a'), 1}, {C('\b'), 1}, {C('\f'), 1}}},
        DecodeUTF8Case{"\n\r\t", {{C('\n'), 1}, {C('\r'), 1}, {C('\t'), 1}}},
        DecodeUTF8Case{"\v", {{C('\v'), 1}}},
    }));

INSTANTIATE_TEST_SUITE_P(
    Hindi,
    DecodeUTF8Test,
    ::testing::ValuesIn({DecodeUTF8Case{
        // नमस्ते दुनिया
        "\xe0\xa4\xa8\xe0\xa4\xae\xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa5"
        "\x87\x20\xe0\xa4\xa6\xe0\xa5\x81\xe0\xa4\xa8\xe0\xa4\xbf\xe0\xa4\xaf"
        "\xe0\xa4\xbe",
        {
            {C(0x0928), 3},  // न
            {C(0x092e), 3},  // म
            {C(0x0938), 3},  // स
            {C(0x094d), 3},  // ्
            {C(0x0924), 3},  // त
            {C(0x0947), 3},  // े
            {C(' '), 1},
            {C(0x0926), 3},  // द
            {C(0x0941), 3},  // ु
            {C(0x0928), 3},  // न
            {C(0x093f), 3},  // ि
            {C(0x092f), 3},  // य
            {C(0x093e), 3},  // ा
        },
    }}));

INSTANTIATE_TEST_SUITE_P(Mandarin,
                         DecodeUTF8Test,
                         ::testing::ValuesIn({DecodeUTF8Case{
                             // 你好世界
                             "\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c",
                             {
                                 {C(0x4f60), 3},  // 你
                                 {C(0x597d), 3},  // 好
                                 {C(0x4e16), 3},  // 世
                                 {C(0x754c), 3},  // 界
                             },
                         }}));

INSTANTIATE_TEST_SUITE_P(Japanese,
                         DecodeUTF8Test,
                         ::testing::ValuesIn({DecodeUTF8Case{
                             // こんにちは世界
                             "\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1"
                             "\xe3\x81\xaf\xe4\xb8\x96\xe7\x95\x8c",
                             {
                                 {C(0x3053), 3},  // こ
                                 {C(0x3093), 3},  // ん
                                 {C(0x306B), 3},  // に
                                 {C(0x3061), 3},  // ち
                                 {C(0x306F), 3},  // は
                                 {C(0x4E16), 3},  // 世
                                 {C(0x754C), 3},  // 界
                             },
                         }}));

INSTANTIATE_TEST_SUITE_P(Korean,
                         DecodeUTF8Test,
                         ::testing::ValuesIn({DecodeUTF8Case{
                             // 안녕하세요 세계
                             "\xec\x95\x88\xeb\x85\x95\xed\x95\x98\xec\x84\xb8"
                             "\xec\x9a\x94\x20\xec\x84\xb8\xea\xb3\x84",
                             {
                                 {C(0xc548), 3},  // 안
                                 {C(0xb155), 3},  // 녕
                                 {C(0xd558), 3},  // 하
                                 {C(0xc138), 3},  // 세
                                 {C(0xc694), 3},  // 요
                                 {C(' '), 1},     //
                                 {C(0xc138), 3},  // 세
                                 {C(0xacc4), 3},  // 계
                             },
                         }}));

INSTANTIATE_TEST_SUITE_P(Emoji,
                         DecodeUTF8Test,
                         ::testing::ValuesIn({DecodeUTF8Case{
                             // 👋🌎
                             "\xf0\x9f\x91\x8b\xf0\x9f\x8c\x8e",
                             {
                                 {C(0x1f44b), 4},  // 👋
                                 {C(0x1f30e), 4},  // 🌎
                             },
                         }}));

INSTANTIATE_TEST_SUITE_P(
    Random,
    DecodeUTF8Test,
    ::testing::ValuesIn({DecodeUTF8Case{
        // Øⓑꚫ쁹Ǵ𐌒岾🥍ⴵ㍨又ᮗ
        "\xc3\x98\xe2\x93\x91\xea\x9a\xab\xec\x81\xb9\xc7\xb4\xf0\x90\x8c\x92"
        "\xe5\xb2\xbe\xf0\x9f\xa5\x8d\xe2\xb4\xb5\xe3\x8d\xa8\xe5\x8f\x88\xe1"
        "\xae\x97",
        {
            {C(0x000d8), 2},  // Ø
            {C(0x024d1), 3},  // ⓑ
            {C(0x0a6ab), 3},  // ꚫ
            {C(0x0c079), 3},  // 쁹
            {C(0x001f4), 2},  // Ǵ
            {C(0x10312), 4},  // 𐌒
            {C(0x05cbe), 3},  // 岾
            {C(0x1f94d), 4},  // 🥍
            {C(0x02d35), 3},  // ⴵ
            {C(0x03368), 3},  // ㍨
            {C(0x053c8), 3},  // 又
            {C(0x01b97), 3},  // ᮗ
        },
    }}));

}  // namespace

////////////////////////////////////////////////////////////////////////////////
// DecodeUTF8 invalid tests
////////////////////////////////////////////////////////////////////////////////
namespace {
class DecodeUTF8InvalidTest : public testing::TestWithParam<const char*> {};

TEST_P(DecodeUTF8InvalidTest, Invalid) {
  auto* param = GetParam();

  const uint8_t* data = reinterpret_cast<const uint8_t*>(param);
  const size_t len = std::string(param).size();

  auto [code_point, width] = utf8::Decode(data, len);
  EXPECT_EQ(code_point, CodePoint(0));
  EXPECT_EQ(width, 0u);
}

INSTANTIATE_TEST_SUITE_P(
    Invalid,
    DecodeUTF8InvalidTest,
    ::testing::ValuesIn({
        "\x80\x80\x80\x80",  // 10000000
        "\x81\x80\x80\x80",  // 10000001
        "\x8f\x80\x80\x80",  // 10001111
        "\x90\x80\x80\x80",  // 10010000
        "\x91\x80\x80\x80",  // 10010001
        "\x9f\x80\x80\x80",  // 10011111
        "\xa0\x80\x80\x80",  // 10100000
        "\xa1\x80\x80\x80",  // 10100001
        "\xaf\x80\x80\x80",  // 10101111
        "\xb0\x80\x80\x80",  // 10110000
        "\xb1\x80\x80\x80",  // 10110001
        "\xbf\x80\x80\x80",  // 10111111
        "\xc0\x80\x80\x80",  // 11000000
        "\xc1\x80\x80\x80",  // 11000001
        "\xf5\x80\x80\x80",  // 11110101
        "\xf6\x80\x80\x80",  // 11110110
        "\xf7\x80\x80\x80",  // 11110111
        "\xf8\x80\x80\x80",  // 11111000
        "\xfe\x80\x80\x80",  // 11111110
        "\xff\x80\x80\x80",  // 11111111

        "\xd0",          // 2-bytes, missing second byte
        "\xe8\x8f",      // 3-bytes, missing third byte
        "\xf4\x8f\x8f",  // 4-bytes, missing fourth byte

        "\xd0\x7f",          // 2-bytes, second byte MSB unset
        "\xe8\x7f\x8f",      // 3-bytes, second byte MSB unset
        "\xe8\x8f\x7f",      // 3-bytes, third byte MSB unset
        "\xf4\x7f\x8f\x8f",  // 4-bytes, second byte MSB unset
        "\xf4\x8f\x7f\x8f",  // 4-bytes, third byte MSB unset
        "\xf4\x8f\x8f\x7f",  // 4-bytes, fourth byte MSB unset
    }));

}  // namespace

}  // namespace tint::text
