106c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner//===- llvm/unittest/Support/ConvertUTFTest.cpp - ConvertUTF tests --------===//
206c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner//
306c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner//                     The LLVM Compiler Infrastructure
406c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner//
506c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner// This file is distributed under the University of Illinois Open Source
606c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner// License. See LICENSE.TXT for details.
706c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner//
806c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner//===----------------------------------------------------------------------===//
906c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner
1006c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner#include "llvm/Support/ConvertUTF.h"
1106c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner#include "gtest/gtest.h"
1206c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner#include <string>
13cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include <vector>
14cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include <utility>
1506c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner
1606c847e83e558f0cc6fea742498b2730eb6837c6Reid Klecknerusing namespace llvm;
1706c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner
1806c847e83e558f0cc6fea742498b2730eb6837c6Reid KlecknerTEST(ConvertUTFTest, ConvertUTF16LittleEndianToUTF8String) {
1906c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  // Src is the look of disapproval.
2006c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  static const char Src[] = "\xff\xfe\xa0\x0c_\x00\xa0\x0c";
2106c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  ArrayRef<char> Ref(Src, sizeof(Src) - 1);
2206c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  std::string Result;
2306c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  bool Success = convertUTF16ToUTF8String(Ref, Result);
2406c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  EXPECT_TRUE(Success);
2506c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  std::string Expected("\xe0\xb2\xa0_\xe0\xb2\xa0");
2606c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  EXPECT_EQ(Expected, Result);
2706c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner}
2806c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner
2906c847e83e558f0cc6fea742498b2730eb6837c6Reid KlecknerTEST(ConvertUTFTest, ConvertUTF16BigEndianToUTF8String) {
3006c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  // Src is the look of disapproval.
3106c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  static const char Src[] = "\xfe\xff\x0c\xa0\x00_\x0c\xa0";
3206c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  ArrayRef<char> Ref(Src, sizeof(Src) - 1);
3306c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  std::string Result;
3406c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  bool Success = convertUTF16ToUTF8String(Ref, Result);
3506c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  EXPECT_TRUE(Success);
3606c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  std::string Expected("\xe0\xb2\xa0_\xe0\xb2\xa0");
3706c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  EXPECT_EQ(Expected, Result);
3806c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner}
3906c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner
4006c847e83e558f0cc6fea742498b2730eb6837c6Reid KlecknerTEST(ConvertUTFTest, OddLengthInput) {
4106c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  std::string Result;
4206c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  bool Success = convertUTF16ToUTF8String(ArrayRef<char>("xxxxx", 5), Result);
4306c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  EXPECT_FALSE(Success);
4406c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner}
4506c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner
4606c847e83e558f0cc6fea742498b2730eb6837c6Reid KlecknerTEST(ConvertUTFTest, Empty) {
4706c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  std::string Result;
4806c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  bool Success = convertUTF16ToUTF8String(ArrayRef<char>(), Result);
4906c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  EXPECT_TRUE(Success);
5006c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  EXPECT_TRUE(Result.empty());
5106c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner}
5206c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner
5306c847e83e558f0cc6fea742498b2730eb6837c6Reid KlecknerTEST(ConvertUTFTest, HasUTF16BOM) {
5406c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  bool HasBOM = hasUTF16ByteOrderMark(ArrayRef<char>("\xff\xfe", 2));
5506c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  EXPECT_TRUE(HasBOM);
5606c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  HasBOM = hasUTF16ByteOrderMark(ArrayRef<char>("\xfe\xff", 2));
5706c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  EXPECT_TRUE(HasBOM);
5806c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  HasBOM = hasUTF16ByteOrderMark(ArrayRef<char>("\xfe\xff ", 3));
5906c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  EXPECT_TRUE(HasBOM); // Don't care about odd lengths.
6006c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  HasBOM = hasUTF16ByteOrderMark(ArrayRef<char>("\xfe\xff\x00asdf", 6));
6106c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  EXPECT_TRUE(HasBOM);
6206c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner
6306c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  HasBOM = hasUTF16ByteOrderMark(ArrayRef<char>());
6406c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  EXPECT_FALSE(HasBOM);
6506c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  HasBOM = hasUTF16ByteOrderMark(ArrayRef<char>("\xfe", 1));
6606c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner  EXPECT_FALSE(HasBOM);
6706c847e83e558f0cc6fea742498b2730eb6837c6Reid Kleckner}
68cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
69cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstruct ConvertUTFResultContainer {
70cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  ConversionResult ErrorCode;
71cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::vector<unsigned> UnicodeScalars;
72cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
73cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  ConvertUTFResultContainer(ConversionResult ErrorCode)
74cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      : ErrorCode(ErrorCode) {}
75cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
76cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  ConvertUTFResultContainer
77cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  withScalars(unsigned US0 = 0x110000, unsigned US1 = 0x110000,
78cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines              unsigned US2 = 0x110000, unsigned US3 = 0x110000,
79cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines              unsigned US4 = 0x110000, unsigned US5 = 0x110000,
80cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines              unsigned US6 = 0x110000, unsigned US7 = 0x110000) {
81cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    ConvertUTFResultContainer Result(*this);
82cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (US0 != 0x110000)
83cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Result.UnicodeScalars.push_back(US0);
84cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (US1 != 0x110000)
85cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Result.UnicodeScalars.push_back(US1);
86cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (US2 != 0x110000)
87cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Result.UnicodeScalars.push_back(US2);
88cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (US3 != 0x110000)
89cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Result.UnicodeScalars.push_back(US3);
90cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (US4 != 0x110000)
91cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Result.UnicodeScalars.push_back(US4);
92cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (US5 != 0x110000)
93cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Result.UnicodeScalars.push_back(US5);
94cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (US6 != 0x110000)
95cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Result.UnicodeScalars.push_back(US6);
96cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (US7 != 0x110000)
97cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Result.UnicodeScalars.push_back(US7);
98cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return Result;
99cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
100cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines};
101cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
102cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstd::pair<ConversionResult, std::vector<unsigned>>
103cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesConvertUTF8ToUnicodeScalarsLenient(StringRef S) {
104cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const UTF8 *SourceStart = reinterpret_cast<const UTF8 *>(S.data());
105cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
106cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const UTF8 *SourceNext = SourceStart;
107cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::vector<UTF32> Decoded(S.size(), 0);
108cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  UTF32 *TargetStart = Decoded.data();
109cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
110cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  auto ErrorCode =
111cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTF8toUTF32(&SourceNext, SourceStart + S.size(), &TargetStart,
112cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                         Decoded.data() + Decoded.size(), lenientConversion);
113cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
114cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  Decoded.resize(TargetStart - Decoded.data());
115cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
116cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return std::make_pair(ErrorCode, Decoded);
117cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
118cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
119cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstd::pair<ConversionResult, std::vector<unsigned>>
120cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesConvertUTF8ToUnicodeScalarsPartialLenient(StringRef S) {
121cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const UTF8 *SourceStart = reinterpret_cast<const UTF8 *>(S.data());
122cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
123cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const UTF8 *SourceNext = SourceStart;
124cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::vector<UTF32> Decoded(S.size(), 0);
125cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  UTF32 *TargetStart = Decoded.data();
126cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
127cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  auto ErrorCode = ConvertUTF8toUTF32Partial(
128cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      &SourceNext, SourceStart + S.size(), &TargetStart,
129cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Decoded.data() + Decoded.size(), lenientConversion);
130cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
131cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  Decoded.resize(TargetStart - Decoded.data());
132cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
133cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return std::make_pair(ErrorCode, Decoded);
134cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
135cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
136cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines::testing::AssertionResult
137cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesCheckConvertUTF8ToUnicodeScalars(ConvertUTFResultContainer Expected,
138cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                 StringRef S, bool Partial = false) {
139cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  ConversionResult ErrorCode;
140cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::vector<unsigned> Decoded;
141cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (!Partial)
142cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    std::tie(ErrorCode, Decoded) = ConvertUTF8ToUnicodeScalarsLenient(S);
143cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  else
144cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
145cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    std::tie(ErrorCode, Decoded) = ConvertUTF8ToUnicodeScalarsPartialLenient(S);
146cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (Expected.ErrorCode != ErrorCode)
147cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return ::testing::AssertionFailure() << "Expected error code "
148cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                         << Expected.ErrorCode << ", actual "
149cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                         << ErrorCode;
150cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
151cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (Expected.UnicodeScalars != Decoded)
152cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return ::testing::AssertionFailure()
153cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines           << "Expected lenient decoded result:\n"
154cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines           << ::testing::PrintToString(Expected.UnicodeScalars) << "\n"
155cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines           << "Actual result:\n" << ::testing::PrintToString(Decoded);
156cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
157cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return ::testing::AssertionSuccess();
158cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
159cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
160cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesTEST(ConvertUTFTest, UTF8ToUTF32Lenient) {
161cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
162cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
163cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // 1-byte sequences
164cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
165cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
166cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+0041 LATIN CAPITAL LETTER A
167cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
168cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x0041), "\x41"));
169cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
170cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
171cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // 2-byte sequences
172cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
173cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
174cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+0283 LATIN SMALL LETTER ESH
175cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
176cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x0283),
177cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xca\x83"));
178cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
179cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+03BA GREEK SMALL LETTER KAPPA
180cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+1F79 GREEK SMALL LETTER OMICRON WITH OXIA
181cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+03C3 GREEK SMALL LETTER SIGMA
182cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+03BC GREEK SMALL LETTER MU
183cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+03B5 GREEK SMALL LETTER EPSILON
184cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
185cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK)
186cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0x03ba, 0x1f79, 0x03c3, 0x03bc, 0x03b5),
187cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5"));
188cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
189cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
190cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // 3-byte sequences
191cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
192cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
193cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+4F8B CJK UNIFIED IDEOGRAPH-4F8B
194cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+6587 CJK UNIFIED IDEOGRAPH-6587
195cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
196cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x4f8b, 0x6587),
197cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xe4\xbe\x8b\xe6\x96\x87"));
198cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
199cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+D55C HANGUL SYLLABLE HAN
200cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+AE00 HANGUL SYLLABLE GEUL
201cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
202cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xd55c, 0xae00),
203cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\x95\x9c\xea\xb8\x80"));
204cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
205cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+1112 HANGUL CHOSEONG HIEUH
206cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+1161 HANGUL JUNGSEONG A
207cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+11AB HANGUL JONGSEONG NIEUN
208cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+1100 HANGUL CHOSEONG KIYEOK
209cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+1173 HANGUL JUNGSEONG EU
210cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+11AF HANGUL JONGSEONG RIEUL
211cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
212cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK)
213cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0x1112, 0x1161, 0x11ab, 0x1100, 0x1173, 0x11af),
214cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xe1\x84\x92\xe1\x85\xa1\xe1\x86\xab\xe1\x84\x80\xe1\x85\xb3"
215cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xe1\x86\xaf"));
216cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
217cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
218cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // 4-byte sequences
219cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
220cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
221cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+E0100 VARIATION SELECTOR-17
222cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
223cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x000E0100),
224cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf3\xa0\x84\x80"));
225cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
226cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
227cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // First possible sequence of a certain length
228cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
229cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
230cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+0000 NULL
231cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
232cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x0000),
233cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      StringRef("\x00", 1)));
234cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
235cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+0080 PADDING CHARACTER
236cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
237cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x0080),
238cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xc2\x80"));
239cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
240cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+0800 SAMARITAN LETTER ALAF
241cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
242cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x0800),
243cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xe0\xa0\x80"));
244cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
245cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+10000 LINEAR B SYLLABLE B008 A
246cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
247cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x10000),
248cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\x90\x80\x80"));
249cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
250cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+200000 (invalid)
251cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
252cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
253cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
254cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf8\x88\x80\x80\x80"));
255cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
256cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+4000000 (invalid)
257cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
258cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
259cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
260cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfc\x84\x80\x80\x80\x80"));
261cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
262cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
263cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Last possible sequence of a certain length
264cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
265cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
266cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+007F DELETE
267cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
268cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x007f), "\x7f"));
269cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
270cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+07FF (unassigned)
271cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
272cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x07ff),
273cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xdf\xbf"));
274cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
275cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FFFF (noncharacter)
276cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
277cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xffff),
278cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xbf\xbf"));
279cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
280cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+1FFFFF (invalid)
281cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
282cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
283cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
284cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf7\xbf\xbf\xbf"));
285cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
286cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+3FFFFFF (invalid)
287cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
288cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
289cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
290cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfb\xbf\xbf\xbf\xbf"));
291cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
292cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+7FFFFFFF (invalid)
293cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
294cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
295cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
296cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfd\xbf\xbf\xbf\xbf\xbf"));
297cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
298cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
299cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Other boundary conditions
300cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
301cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
302cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+D7FF (unassigned)
303cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
304cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xd7ff),
305cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\x9f\xbf"));
306cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
307cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+E000 (private use)
308cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
309cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xe000),
310cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xee\x80\x80"));
311cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
312cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FFFD REPLACEMENT CHARACTER
313cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
314cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfffd),
315cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xbf\xbd"));
316cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
317cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+10FFFF (noncharacter)
318cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
319cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x10ffff),
320cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf4\x8f\xbf\xbf"));
321cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
322cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+110000 (invalid)
323cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
324cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
325cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
326cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf4\x90\x80\x80"));
327cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
328cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
329cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Unexpected continuation bytes
330cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
331cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
332cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // A sequence of unexpected continuation bytes that don't follow a first
333cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // byte, every byte is a maximal subpart.
334cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
335cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
336cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\x80"));
337cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
338cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xbf"));
339cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
340cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
341cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\x80\x80"));
342cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
343cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
344cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\x80\xbf"));
345cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
346cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
347cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xbf\x80"));
348cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
349cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
350cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd),
351cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\x80\xbf\x80"));
352cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
353cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
354cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
355cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\x80\xbf\x80\xbf"));
356cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
357cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
358cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
359cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\x80\xbf\x82\xbf\xaa"));
360cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
361cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
362cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
363cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xaa\xb0\xbb\xbf\xaa\xa0"));
364cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
365cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
366cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
367cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xaa\xb0\xbb\xbf\xaa\xa0\x8f"));
368cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
369cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // All continuation bytes (0x80--0xbf).
370cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
371cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
372cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd,
373cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0xfffd, 0xfffd, 0xfffd)
374cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd,
375cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0xfffd, 0xfffd, 0xfffd)
376cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd,
377cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0xfffd, 0xfffd, 0xfffd)
378cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd,
379cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0xfffd, 0xfffd, 0xfffd)
380cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd,
381cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0xfffd, 0xfffd, 0xfffd)
382cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd,
383cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0xfffd, 0xfffd, 0xfffd)
384cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd,
385cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0xfffd, 0xfffd, 0xfffd)
386cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd,
387cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0xfffd, 0xfffd, 0xfffd),
388cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
389cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
390cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
391cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"));
392cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
393cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
394cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Lonely start bytes
395cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
396cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
397cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Start bytes of 2-byte sequences (0xc0--0xdf).
398cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
399cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
400cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd,
401cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0xfffd, 0xfffd, 0xfffd)
402cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd,
403cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0xfffd, 0xfffd, 0xfffd)
404cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd,
405cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0xfffd, 0xfffd, 0xfffd)
406cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd,
407cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0xfffd, 0xfffd, 0xfffd),
408cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
409cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"));
410cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
411cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
412cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
413cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0x0020, 0xfffd, 0x0020,
414cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0x0020, 0xfffd, 0x0020)
415cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0x0020, 0xfffd, 0x0020,
416cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0x0020, 0xfffd, 0x0020)
417cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0x0020, 0xfffd, 0x0020,
418cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0x0020, 0xfffd, 0x0020)
419cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0x0020, 0xfffd, 0x0020,
420cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0x0020, 0xfffd, 0x0020)
421cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0x0020, 0xfffd, 0x0020,
422cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0x0020, 0xfffd, 0x0020)
423cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0x0020, 0xfffd, 0x0020,
424cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0x0020, 0xfffd, 0x0020)
425cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0x0020, 0xfffd, 0x0020,
426cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0x0020, 0xfffd, 0x0020)
427cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0x0020, 0xfffd, 0x0020,
428cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0x0020, 0xfffd, 0x0020),
429cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xc0\x20\xc1\x20\xc2\x20\xc3\x20\xc4\x20\xc5\x20\xc6\x20\xc7\x20"
430cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xc8\x20\xc9\x20\xca\x20\xcb\x20\xcc\x20\xcd\x20\xce\x20\xcf\x20"
431cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xd0\x20\xd1\x20\xd2\x20\xd3\x20\xd4\x20\xd5\x20\xd6\x20\xd7\x20"
432cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xd8\x20\xd9\x20\xda\x20\xdb\x20\xdc\x20\xdd\x20\xde\x20\xdf\x20"));
433cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
434cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Start bytes of 3-byte sequences (0xe0--0xef).
435cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
436cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
437cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd,
438cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0xfffd, 0xfffd, 0xfffd)
439cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd,
440cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0xfffd, 0xfffd, 0xfffd),
441cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"));
442cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
443cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
444cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
445cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0x0020, 0xfffd, 0x0020,
446cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0x0020, 0xfffd, 0x0020)
447cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0x0020, 0xfffd, 0x0020,
448cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0x0020, 0xfffd, 0x0020)
449cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0x0020, 0xfffd, 0x0020,
450cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0x0020, 0xfffd, 0x0020)
451cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0x0020, 0xfffd, 0x0020,
452cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0x0020, 0xfffd, 0x0020),
453cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xe0\x20\xe1\x20\xe2\x20\xe3\x20\xe4\x20\xe5\x20\xe6\x20\xe7\x20"
454cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xe8\x20\xe9\x20\xea\x20\xeb\x20\xec\x20\xed\x20\xee\x20\xef\x20"));
455cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
456cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Start bytes of 4-byte sequences (0xf0--0xf7).
457cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
458cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
459cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd,
460cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0xfffd, 0xfffd, 0xfffd),
461cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"));
462cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
463cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
464cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
465cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0x0020, 0xfffd, 0x0020,
466cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0x0020, 0xfffd, 0x0020)
467cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0x0020, 0xfffd, 0x0020,
468cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0x0020, 0xfffd, 0x0020),
469cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\x20\xf1\x20\xf2\x20\xf3\x20\xf4\x20\xf5\x20\xf6\x20\xf7\x20"));
470cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
471cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Start bytes of 5-byte sequences (0xf8--0xfb).
472cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
473cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
474cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
475cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf8\xf9\xfa\xfb"));
476cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
477cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
478cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
479cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0x0020, 0xfffd, 0x0020,
480cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0x0020, 0xfffd, 0x0020),
481cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf8\x20\xf9\x20\xfa\x20\xfb\x20"));
482cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
483cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Start bytes of 6-byte sequences (0xfc--0xfd).
484cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
485cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
486cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfc\xfd"));
487cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
488cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
489cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
490cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0x0020, 0xfffd, 0x0020),
491cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfc\x20\xfd\x20"));
492cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
493cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
494cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Other bytes (0xc0--0xc1, 0xfe--0xff).
495cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
496cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
497cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
498cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xc0"));
499cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
500cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xc1"));
501cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
502cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xfe"));
503cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
504cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xff"));
505cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
506cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
507cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
508cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
509cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xc0\xc1\xfe\xff"));
510cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
511cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
512cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
513cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
514cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfe\xfe\xff\xff"));
515cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
516cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
517cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
518cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
519cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfe\x80\x80\x80\x80\x80"));
520cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
521cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
522cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
523cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
524cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xff\x80\x80\x80\x80\x80"));
525cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
526cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
527cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
528cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0x0020, 0xfffd, 0x0020,
529cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       0xfffd, 0x0020, 0xfffd, 0x0020),
530cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xc0\x20\xc1\x20\xfe\x20\xff\x20"));
531cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
532cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
533cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Sequences with one continuation byte missing
534cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
535cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
536cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
537cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xc2"));
538cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
539cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xdf"));
540cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
541cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
542cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xe0\xa0"));
543cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
544cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
545cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xe0\xbf"));
546cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
547cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
548cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xe1\x80"));
549cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
550cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
551cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xec\xbf"));
552cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
553cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
554cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\x80"));
555cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
556cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
557cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\x9f"));
558cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
559cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
560cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xee\x80"));
561cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
562cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
563cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xbf"));
564cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
565cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
566cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\x90\x80"));
567cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
568cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
569cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\xbf\xbf"));
570cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
571cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
572cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf1\x80\x80"));
573cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
574cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
575cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf3\xbf\xbf"));
576cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
577cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
578cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf4\x80\x80"));
579cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
580cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
581cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf4\x8f\xbf"));
582cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
583cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Overlong sequences with one trailing byte missing.
584cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
585cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
586cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xc0"));
587cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
588cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
589cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xc1"));
590cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
591cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
592cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xe0\x80"));
593cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
594cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
595cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xe0\x9f"));
596cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
597cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
598cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd),
599cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\x80\x80"));
600cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
601cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
602cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd),
603cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\x8f\x80"));
604cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
605cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
606cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
607cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf8\x80\x80\x80"));
608cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
609cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
610cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
611cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfc\x80\x80\x80\x80"));
612cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
613cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Sequences that represent surrogates with one trailing byte missing.
614cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // High surrogates
615cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
616cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
617cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xa0"));
618cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
619cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
620cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xac"));
621cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
622cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
623cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xaf"));
624cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Low surrogates
625cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
626cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
627cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xb0"));
628cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
629cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
630cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xb4"));
631cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
632cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
633cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xbf"));
634cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
635cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Ill-formed 4-byte sequences.
636cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // 11110zzz 10zzyyyy 10yyyyxx 10xxxxxx
637cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+1100xx (invalid)
638cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
639cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
640cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd),
641cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf4\x90\x80"));
642cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+13FBxx (invalid)
643cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
644cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
645cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd),
646cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf4\xbf\xbf"));
647cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
648cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
649cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd),
650cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf5\x80\x80"));
651cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
652cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
653cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd),
654cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf6\x80\x80"));
655cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
656cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
657cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd),
658cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf7\x80\x80"));
659cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+1FFBxx (invalid)
660cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
661cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
662cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd),
663cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf7\xbf\xbf"));
664cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
665cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Ill-formed 5-byte sequences.
666cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // 111110uu 10zzzzzz 10zzyyyy 10yyyyxx 10xxxxxx
667cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+2000xx (invalid)
668cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
669cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
670cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
671cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf8\x88\x80\x80"));
672cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
673cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
674cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
675cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf8\xbf\xbf\xbf"));
676cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
677cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
678cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
679cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf9\x80\x80\x80"));
680cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
681cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
682cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
683cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfa\x80\x80\x80"));
684cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
685cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
686cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
687cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfb\x80\x80\x80"));
688cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+3FFFFxx (invalid)
689cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
690cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
691cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
692cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfb\xbf\xbf\xbf"));
693cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
694cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Ill-formed 6-byte sequences.
695cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // 1111110u 10uuuuuu 10uzzzzz 10zzzyyyy 10yyyyxx 10xxxxxx
696cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+40000xx (invalid)
697cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
698cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
699cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
700cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfc\x84\x80\x80\x80"));
701cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
702cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
703cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
704cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfc\xbf\xbf\xbf\xbf"));
705cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
706cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
707cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
708cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfd\x80\x80\x80\x80"));
709cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+7FFFFFxx (invalid)
710cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
711cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
712cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
713cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfd\xbf\xbf\xbf\xbf"));
714cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
715cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
716cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Sequences with two continuation bytes missing
717cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
718cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
719cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
720cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
721cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\x90"));
722cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
723cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
724cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\xbf"));
725cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
726cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
727cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf1\x80"));
728cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
729cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
730cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf3\xbf"));
731cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
732cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
733cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf4\x80"));
734cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
735cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd),
736cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf4\x8f"));
737cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
738cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Overlong sequences with two trailing byte missing.
739cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
740cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xe0"));
741cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
742cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
743cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\x80"));
744cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
745cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
746cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\x8f"));
747cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
748cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
749cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd),
750cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf8\x80\x80"));
751cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
752cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
753cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
754cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfc\x80\x80\x80"));
755cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
756cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Sequences that represent surrogates with two trailing bytes missing.
757cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
758cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xed"));
759cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
760cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Ill-formed 4-byte sequences.
761cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // 11110zzz 10zzyyyy 10yyyyxx 10xxxxxx
762cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+110yxx (invalid)
763cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
764cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
765cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf4\x90"));
766cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+13Fyxx (invalid)
767cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
768cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
769cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf4\xbf"));
770cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
771cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
772cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf5\x80"));
773cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
774cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
775cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf6\x80"));
776cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
777cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
778cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf7\x80"));
779cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+1FFyxx (invalid)
780cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
781cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
782cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf7\xbf"));
783cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
784cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Ill-formed 5-byte sequences.
785cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // 111110uu 10zzzzzz 10zzyyyy 10yyyyxx 10xxxxxx
786cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+200yxx (invalid)
787cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
788cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd, 0xfffd),
789cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf8\x88\x80"));
790cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
791cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd, 0xfffd),
792cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf8\xbf\xbf"));
793cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
794cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd, 0xfffd),
795cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf9\x80\x80"));
796cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
797cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd, 0xfffd),
798cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfa\x80\x80"));
799cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
800cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd, 0xfffd),
801cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfb\x80\x80"));
802cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+3FFFyxx (invalid)
803cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
804cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd, 0xfffd),
805cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfb\xbf\xbf"));
806cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
807cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Ill-formed 6-byte sequences.
808cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // 1111110u 10uuuuuu 10zzzzzz 10zzyyyy 10yyyyxx 10xxxxxx
809cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+4000yxx (invalid)
810cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
811cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
812cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfc\x84\x80\x80"));
813cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
814cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
815cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfc\xbf\xbf\xbf"));
816cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
817cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
818cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfd\x80\x80\x80"));
819cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+7FFFFyxx (invalid)
820cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
821cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
822cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfd\xbf\xbf\xbf"));
823cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
824cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
825cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Sequences with three continuation bytes missing
826cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
827cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
828cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
829cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xf0"));
830cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
831cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xf1"));
832cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
833cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xf2"));
834cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
835cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xf3"));
836cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
837cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xf4"));
838cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
839cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Broken overlong sequences.
840cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
841cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xf0"));
842cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
843cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
844cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf8\x80"));
845cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
846cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd, 0xfffd),
847cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfc\x80\x80"));
848cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
849cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Ill-formed 4-byte sequences.
850cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // 11110zzz 10zzyyyy 10yyyyxx 10xxxxxx
851cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+14yyxx (invalid)
852cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
853cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xf5"));
854cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
855cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xf6"));
856cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+1Cyyxx (invalid)
857cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
858cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xf7"));
859cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
860cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Ill-formed 5-byte sequences.
861cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // 111110uu 10zzzzzz 10zzyyyy 10yyyyxx 10xxxxxx
862cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+20yyxx (invalid)
863cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
864cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
865cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf8\x88"));
866cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
867cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
868cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf8\xbf"));
869cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
870cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
871cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf9\x80"));
872cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
873cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
874cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfa\x80"));
875cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
876cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
877cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfb\x80"));
878cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+3FCyyxx (invalid)
879cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
880cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
881cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfb\xbf"));
882cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
883cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Ill-formed 6-byte sequences.
884cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // 1111110u 10uuuuuu 10zzzzzz 10zzyyyy 10yyyyxx 10xxxxxx
885cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+400yyxx (invalid)
886cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
887cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd, 0xfffd),
888cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfc\x84\x80"));
889cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
890cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd, 0xfffd),
891cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfc\xbf\xbf"));
892cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
893cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd, 0xfffd),
894cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfd\x80\x80"));
895cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+7FFCyyxx (invalid)
896cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
897cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd, 0xfffd),
898cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfd\xbf\xbf"));
899cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
900cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
901cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Sequences with four continuation bytes missing
902cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
903cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
904cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Ill-formed 5-byte sequences.
905cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // 111110uu 10zzzzzz 10zzyyyy 10yyyyxx 10xxxxxx
906cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+uzyyxx (invalid)
907cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
908cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xf8"));
909cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
910cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xf9"));
911cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
912cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xfa"));
913cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
914cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xfb"));
915cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+3zyyxx (invalid)
916cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
917cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xfb"));
918cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
919cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Broken overlong sequences.
920cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
921cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xf8"));
922cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
923cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
924cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfc\x80"));
925cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
926cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Ill-formed 6-byte sequences.
927cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // 1111110u 10uuuuuu 10zzzzzz 10zzyyyy 10yyyyxx 10xxxxxx
928cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+uzzyyxx (invalid)
929cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
930cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
931cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfc\x84"));
932cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
933cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
934cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfc\xbf"));
935cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
936cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
937cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfd\x80"));
938cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+7Fzzyyxx (invalid)
939cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
940cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
941cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfd\xbf"));
942cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
943cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
944cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Sequences with five continuation bytes missing
945cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
946cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
947cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Ill-formed 6-byte sequences.
948cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // 1111110u 10uuuuuu 10zzzzzz 10zzyyyy 10yyyyxx 10xxxxxx
949cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+uzzyyxx (invalid)
950cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
951cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xfc"));
952cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+uuzzyyxx (invalid)
953cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
954cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd), "\xfd"));
955cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
956cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
957cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Consecutive sequences with trailing bytes missing
958cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
959cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
960cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
961cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
962cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, /**/ 0xfffd, 0xfffd, /**/ 0xfffd, 0xfffd, 0xfffd)
963cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd)
964cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd)
965cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, /**/ 0xfffd, /**/ 0xfffd, 0xfffd, 0xfffd)
966cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd)
967cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
968cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xc0" "\xe0\x80" "\xf0\x80\x80"
969cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf8\x80\x80\x80"
970cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfc\x80\x80\x80\x80"
971cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xdf" "\xef\xbf" "\xf7\xbf\xbf"
972cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfb\xbf\xbf\xbf"
973cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfd\xbf\xbf\xbf\xbf"));
974cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
975cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
976cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Overlong UTF-8 sequences
977cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
978cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
979cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+002F SOLIDUS
980cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
981cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x002f), "\x2f"));
982cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
983cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Overlong sequences of the above.
984cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
985cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
986cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xc0\xaf"));
987cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
988cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
989cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd),
990cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xe0\x80\xaf"));
991cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
992cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
993cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
994cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\x80\x80\xaf"));
995cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
996cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
997cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
998cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf8\x80\x80\x80\xaf"));
999cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1000cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1001cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
1002cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfc\x80\x80\x80\x80\xaf"));
1003cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1004cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+0000 NULL
1005cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1006cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x0000),
1007cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      StringRef("\x00", 1)));
1008cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1009cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Overlong sequences of the above.
1010cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1011cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
1012cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xc0\x80"));
1013cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1014cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1015cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd),
1016cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xe0\x80\x80"));
1017cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1018cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1019cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
1020cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\x80\x80\x80"));
1021cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1022cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1023cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
1024cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf8\x80\x80\x80\x80"));
1025cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1026cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1027cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
1028cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfc\x80\x80\x80\x80\x80"));
1029cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1030cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Other overlong sequences.
1031cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1032cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
1033cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xc0\xbf"));
1034cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1035cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
1036cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xc1\x80"));
1037cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1038cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal).withScalars(0xfffd, 0xfffd),
1039cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xc1\xbf"));
1040cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1041cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1042cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd),
1043cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xe0\x9f\xbf"));
1044cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1045cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1046cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd),
1047cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xa0\x80"));
1048cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1049cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1050cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd),
1051cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xbf\xbf"));
1052cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1053cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1054cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
1055cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\x8f\x80\x80"));
1056cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1057cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1058cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd),
1059cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\x8f\xbf\xbf"));
1060cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1061cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1062cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
1063cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf8\x87\xbf\xbf\xbf"));
1064cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1065cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1066cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
1067cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xfc\x83\xbf\xbf\xbf\xbf"));
1068cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1069cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
1070cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Isolated surrogates
1071cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
1072cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1073cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Unicode 6.3.0:
1074cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
1075cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //    D71.  High-surrogate code point: A Unicode code point in the range
1076cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //    U+D800 to U+DBFF.
1077cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
1078cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //    D73.  Low-surrogate code point: A Unicode code point in the range
1079cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //    U+DC00 to U+DFFF.
1080cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1081cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Note: U+E0100 is <DB40 DD00> in UTF16.
1082cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1083cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // High surrogates
1084cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1085cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+D800
1086cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1087cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1088cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd),
1089cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xa0\x80"));
1090cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1091cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+DB40
1092cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1093cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1094cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd),
1095cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xac\xa0"));
1096cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1097cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+DBFF
1098cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1099cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1100cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd),
1101cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xaf\xbf"));
1102cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1103cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Low surrogates
1104cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1105cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+DC00
1106cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1107cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1108cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd),
1109cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xb0\x80"));
1110cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1111cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+DD00
1112cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1113cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1114cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd),
1115cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xb4\x80"));
1116cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1117cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+DFFF
1118cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1119cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1120cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd),
1121cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xbf\xbf"));
1122cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1123cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Surrogate pairs
1124cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1125cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+D800 U+DC00
1126cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1127cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1128cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
1129cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xa0\x80\xed\xb0\x80"));
1130cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1131cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+D800 U+DD00
1132cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1133cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1134cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
1135cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xa0\x80\xed\xb4\x80"));
1136cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1137cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+D800 U+DFFF
1138cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1139cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1140cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
1141cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xa0\x80\xed\xbf\xbf"));
1142cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1143cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+DB40 U+DC00
1144cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1145cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1146cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
1147cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xac\xa0\xed\xb0\x80"));
1148cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1149cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+DB40 U+DD00
1150cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1151cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1152cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
1153cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xac\xa0\xed\xb4\x80"));
1154cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1155cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+DB40 U+DFFF
1156cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1157cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1158cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
1159cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xac\xa0\xed\xbf\xbf"));
1160cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1161cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+DBFF U+DC00
1162cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1163cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1164cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
1165cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xaf\xbf\xed\xb0\x80"));
1166cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1167cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+DBFF U+DD00
1168cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1169cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1170cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
1171cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xaf\xbf\xed\xb4\x80"));
1172cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1173cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+DBFF U+DFFF
1174cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1175cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceIllegal)
1176cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          .withScalars(0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd),
1177cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\xaf\xbf\xed\xbf\xbf"));
1178cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1179cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
1180cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Noncharacters
1181cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
1182cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1183cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Unicode 6.3.0:
1184cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
1185cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //    D14.  Noncharacter: A code point that is permanently reserved for
1186cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //    internal use and that should never be interchanged. Noncharacters
1187cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //    consist of the values U+nFFFE and U+nFFFF (where n is from 0 to 1016)
1188cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //    and the values U+FDD0..U+FDEF.
1189cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1190cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FFFE
1191cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1192cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfffe),
1193cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xbf\xbe"));
1194cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1195cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FFFF
1196cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1197cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xffff),
1198cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xbf\xbf"));
1199cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1200cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+1FFFE
1201cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1202cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x1fffe),
1203cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\x9f\xbf\xbe"));
1204cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1205cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+1FFFF
1206cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1207cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x1ffff),
1208cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\x9f\xbf\xbf"));
1209cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1210cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+2FFFE
1211cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1212cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x2fffe),
1213cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\xaf\xbf\xbe"));
1214cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1215cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+2FFFF
1216cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1217cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x2ffff),
1218cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\xaf\xbf\xbf"));
1219cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1220cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+3FFFE
1221cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1222cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x3fffe),
1223cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\xbf\xbf\xbe"));
1224cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1225cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+3FFFF
1226cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1227cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x3ffff),
1228cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\xbf\xbf\xbf"));
1229cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1230cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+4FFFE
1231cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1232cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x4fffe),
1233cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf1\x8f\xbf\xbe"));
1234cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1235cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+4FFFF
1236cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1237cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x4ffff),
1238cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf1\x8f\xbf\xbf"));
1239cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1240cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+5FFFE
1241cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1242cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x5fffe),
1243cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf1\x9f\xbf\xbe"));
1244cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1245cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+5FFFF
1246cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1247cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x5ffff),
1248cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf1\x9f\xbf\xbf"));
1249cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1250cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+6FFFE
1251cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1252cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x6fffe),
1253cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf1\xaf\xbf\xbe"));
1254cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1255cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+6FFFF
1256cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1257cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x6ffff),
1258cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf1\xaf\xbf\xbf"));
1259cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1260cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+7FFFE
1261cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1262cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x7fffe),
1263cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf1\xbf\xbf\xbe"));
1264cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1265cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+7FFFF
1266cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1267cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x7ffff),
1268cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf1\xbf\xbf\xbf"));
1269cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1270cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+8FFFE
1271cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1272cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x8fffe),
1273cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf2\x8f\xbf\xbe"));
1274cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1275cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+8FFFF
1276cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1277cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x8ffff),
1278cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf2\x8f\xbf\xbf"));
1279cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1280cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+9FFFE
1281cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1282cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x9fffe),
1283cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf2\x9f\xbf\xbe"));
1284cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1285cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+9FFFF
1286cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1287cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x9ffff),
1288cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf2\x9f\xbf\xbf"));
1289cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1290cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+AFFFE
1291cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1292cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xafffe),
1293cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf2\xaf\xbf\xbe"));
1294cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1295cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+AFFFF
1296cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1297cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xaffff),
1298cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf2\xaf\xbf\xbf"));
1299cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1300cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+BFFFE
1301cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1302cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xbfffe),
1303cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf2\xbf\xbf\xbe"));
1304cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1305cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+BFFFF
1306cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1307cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xbffff),
1308cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf2\xbf\xbf\xbf"));
1309cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1310cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+CFFFE
1311cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1312cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xcfffe),
1313cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf3\x8f\xbf\xbe"));
1314cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1315cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+CFFFF
1316cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1317cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xcfffF),
1318cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf3\x8f\xbf\xbf"));
1319cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1320cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+DFFFE
1321cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1322cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xdfffe),
1323cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf3\x9f\xbf\xbe"));
1324cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1325cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+DFFFF
1326cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1327cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xdffff),
1328cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf3\x9f\xbf\xbf"));
1329cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1330cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+EFFFE
1331cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1332cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xefffe),
1333cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf3\xaf\xbf\xbe"));
1334cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1335cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+EFFFF
1336cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1337cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xeffff),
1338cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf3\xaf\xbf\xbf"));
1339cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1340cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FFFFE
1341cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1342cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xffffe),
1343cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf3\xbf\xbf\xbe"));
1344cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1345cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FFFFF
1346cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1347cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfffff),
1348cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf3\xbf\xbf\xbf"));
1349cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1350cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+10FFFE
1351cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1352cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x10fffe),
1353cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf4\x8f\xbf\xbe"));
1354cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1355cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+10FFFF
1356cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1357cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x10ffff),
1358cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf4\x8f\xbf\xbf"));
1359cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1360cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDD0
1361cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1362cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdd0),
1363cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\x90"));
1364cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1365cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDD1
1366cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1367cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdd1),
1368cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\x91"));
1369cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1370cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDD2
1371cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1372cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdd2),
1373cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\x92"));
1374cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1375cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDD3
1376cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1377cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdd3),
1378cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\x93"));
1379cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1380cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDD4
1381cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1382cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdd4),
1383cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\x94"));
1384cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1385cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDD5
1386cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1387cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdd5),
1388cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\x95"));
1389cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1390cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDD6
1391cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1392cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdd6),
1393cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\x96"));
1394cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1395cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDD7
1396cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1397cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdd7),
1398cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\x97"));
1399cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1400cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDD8
1401cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1402cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdd8),
1403cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\x98"));
1404cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1405cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDD9
1406cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1407cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdd9),
1408cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\x99"));
1409cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1410cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDDA
1411cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1412cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdda),
1413cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\x9a"));
1414cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1415cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDDB
1416cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1417cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfddb),
1418cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\x9b"));
1419cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1420cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDDC
1421cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1422cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfddc),
1423cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\x9c"));
1424cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1425cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDDD
1426cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1427cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfddd),
1428cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\x9d"));
1429cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1430cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDDE
1431cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1432cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdde),
1433cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\x9e"));
1434cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1435cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDDF
1436cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1437cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfddf),
1438cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\x9f"));
1439cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1440cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDE0
1441cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1442cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfde0),
1443cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xa0"));
1444cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1445cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDE1
1446cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1447cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfde1),
1448cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xa1"));
1449cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1450cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDE2
1451cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1452cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfde2),
1453cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xa2"));
1454cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1455cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDE3
1456cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1457cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfde3),
1458cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xa3"));
1459cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1460cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDE4
1461cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1462cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfde4),
1463cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xa4"));
1464cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1465cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDE5
1466cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1467cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfde5),
1468cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xa5"));
1469cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1470cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDE6
1471cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1472cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfde6),
1473cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xa6"));
1474cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1475cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDE7
1476cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1477cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfde7),
1478cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xa7"));
1479cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1480cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDE8
1481cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1482cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfde8),
1483cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xa8"));
1484cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1485cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDE9
1486cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1487cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfde9),
1488cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xa9"));
1489cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1490cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDEA
1491cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1492cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdea),
1493cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xaa"));
1494cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1495cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDEB
1496cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1497cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdeb),
1498cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xab"));
1499cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1500cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDEC
1501cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1502cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdec),
1503cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xac"));
1504cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1505cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDED
1506cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1507cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfded),
1508cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xad"));
1509cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1510cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDEE
1511cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1512cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdee),
1513cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xae"));
1514cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1515cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDEF
1516cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1517cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdef),
1518cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xaf"));
1519cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1520cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDF0
1521cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1522cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdf0),
1523cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xb0"));
1524cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1525cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDF1
1526cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1527cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdf1),
1528cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xb1"));
1529cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1530cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDF2
1531cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1532cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdf2),
1533cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xb2"));
1534cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1535cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDF3
1536cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1537cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdf3),
1538cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xb3"));
1539cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1540cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDF4
1541cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1542cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdf4),
1543cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xb4"));
1544cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1545cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDF5
1546cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1547cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdf5),
1548cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xb5"));
1549cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1550cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDF6
1551cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1552cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdf6),
1553cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xb6"));
1554cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1555cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDF7
1556cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1557cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdf7),
1558cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xb7"));
1559cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1560cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDF8
1561cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1562cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdf8),
1563cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xb8"));
1564cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1565cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDF9
1566cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1567cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdf9),
1568cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xb9"));
1569cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1570cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDFA
1571cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1572cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdfa),
1573cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xba"));
1574cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1575cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDFB
1576cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1577cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdfb),
1578cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xbb"));
1579cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1580cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDFC
1581cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1582cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdfc),
1583cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xbc"));
1584cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1585cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDFD
1586cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1587cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdfd),
1588cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xbd"));
1589cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1590cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDFE
1591cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1592cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdfe),
1593cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xbe"));
1594cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1595cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+FDFF
1596cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1597cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0xfdff),
1598cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xb7\xbf"));
1599cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
1600cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1601cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesTEST(ConvertUTFTest, UTF8ToUTF32PartialLenient) {
1602cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // U+0041 LATIN CAPITAL LETTER A
1603cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1604cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(conversionOK).withScalars(0x0041),
1605cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\x41", true));
1606cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1607cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
1608cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Sequences with one continuation byte missing
1609cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
1610cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1611cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1612cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceExhausted),
1613cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xc2", true));
1614cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1615cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceExhausted),
1616cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xdf", true));
1617cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1618cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceExhausted),
1619cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xe0\xa0", true));
1620cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1621cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceExhausted),
1622cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xe0\xbf", true));
1623cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1624cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceExhausted),
1625cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xe1\x80", true));
1626cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1627cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceExhausted),
1628cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xec\xbf", true));
1629cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1630cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceExhausted),
1631cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\x80", true));
1632cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1633cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceExhausted),
1634cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xed\x9f", true));
1635cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1636cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceExhausted),
1637cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xee\x80", true));
1638cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1639cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceExhausted),
1640cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xef\xbf", true));
1641cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1642cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceExhausted),
1643cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\x90\x80", true));
1644cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1645cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceExhausted),
1646cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf0\xbf\xbf", true));
1647cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1648cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceExhausted),
1649cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf1\x80\x80", true));
1650cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1651cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceExhausted),
1652cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf3\xbf\xbf", true));
1653cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1654cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceExhausted),
1655cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf4\x80\x80", true));
1656cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1657cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceExhausted),
1658cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\xf4\x8f\xbf", true));
1659cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1660cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(CheckConvertUTF8ToUnicodeScalars(
1661cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ConvertUTFResultContainer(sourceExhausted).withScalars(0x0041),
1662cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      "\x41\xc2", true));
1663cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
1664cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1665