1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // <codecvt> 10 11 // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS 12 13 // template <class Elem, unsigned long Maxcode = 0x10ffff, 14 // codecvt_mode Mode = (codecvt_mode)0> 15 // class codecvt_utf16 16 // : public codecvt<Elem, char, mbstate_t> 17 // { 18 // // unspecified 19 // }; 20 21 // int length(stateT& state, const externT* from, const externT* from_end, 22 // size_t max) const; 23 24 #include <codecvt> 25 #include <cassert> 26 27 #include "test_macros.h" 28 29 template <class CharT, size_t = sizeof(CharT)> 30 struct TestHelper; 31 32 template <class CharT> 33 struct TestHelper<CharT, 2> { 34 static void test(); 35 }; 36 37 template <class CharT> 38 struct TestHelper<CharT, 4> { 39 static void test(); 40 }; 41 42 template <class CharT> 43 void TestHelper<CharT, 2>::test() { 44 { 45 typedef std::codecvt_utf16<char16_t> C; 46 C c; 47 char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)}; 48 std::mbstate_t m; 49 int r = c.length(m, n, n + 4, 2); 50 assert(r == 0); 51 52 n[0] = char(0x10); 53 n[1] = char(0x05); 54 r = c.length(m, n, n + 2, 2); 55 assert(r == 2); 56 57 n[0] = char(0x04); 58 n[1] = char(0x53); 59 r = c.length(m, n, n + 2, 2); 60 assert(r == 2); 61 62 n[0] = char(0x00); 63 n[1] = char(0x56); 64 r = c.length(m, n, n + 2, 2); 65 assert(r == 2); 66 } 67 { 68 typedef std::codecvt_utf16<char16_t, 0x1000> C; 69 C c; 70 char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)}; 71 std::mbstate_t m; 72 int r = c.length(m, n, n + 4, 2); 73 assert(r == 0); 74 75 n[0] = char(0x10); 76 n[1] = char(0x05); 77 r = c.length(m, n, n + 2, 2); 78 assert(r == 0); 79 80 n[0] = char(0x04); 81 n[1] = char(0x53); 82 r = c.length(m, n, n + 2, 2); 83 assert(r == 2); 84 85 n[0] = char(0x00); 86 n[1] = char(0x56); 87 r = c.length(m, n, n + 2, 2); 88 assert(r == 2); 89 } 90 { 91 typedef std::codecvt_utf16<char16_t, 0x10ffff, std::consume_header> C; 92 C c; 93 char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)}; 94 std::mbstate_t m; 95 int r = c.length(m, n, n + 6, 2); 96 assert(r == 2); 97 98 n[0] = char(0x10); 99 n[1] = char(0x05); 100 r = c.length(m, n, n + 2, 2); 101 assert(r == 2); 102 103 n[0] = char(0x04); 104 n[1] = char(0x53); 105 r = c.length(m, n, n + 2, 2); 106 assert(r == 2); 107 108 n[0] = char(0x00); 109 n[1] = char(0x56); 110 r = c.length(m, n, n + 2, 2); 111 assert(r == 2); 112 } 113 { 114 typedef std::codecvt_utf16<char16_t, 0x10ffff, std::little_endian> C; 115 C c; 116 char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)}; 117 std::mbstate_t m; 118 int r = c.length(m, n, n + 4, 2); 119 assert(r == 0); 120 121 n[1] = char(0x10); 122 n[0] = char(0x05); 123 r = c.length(m, n, n + 2, 2); 124 assert(r == 2); 125 126 n[1] = char(0x04); 127 n[0] = char(0x53); 128 r = c.length(m, n, n + 2, 2); 129 assert(r == 2); 130 131 n[1] = char(0x00); 132 n[0] = char(0x56); 133 r = c.length(m, n, n + 2, 2); 134 assert(r == 2); 135 } 136 { 137 typedef std::codecvt_utf16<char16_t, 0x1000, std::little_endian> C; 138 C c; 139 char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)}; 140 std::mbstate_t m; 141 int r = c.length(m, n, n + 4, 2); 142 assert(r == 0); 143 144 n[1] = char(0x10); 145 n[0] = char(0x05); 146 r = c.length(m, n, n + 2, 2); 147 assert(r == 0); 148 149 n[1] = char(0x04); 150 n[0] = char(0x53); 151 r = c.length(m, n, n + 2, 2); 152 assert(r == 2); 153 154 n[1] = char(0x00); 155 n[0] = char(0x56); 156 r = c.length(m, n, n + 2, 2); 157 assert(r == 2); 158 } 159 { 160 typedef std::codecvt_utf16<char16_t, 0x10ffff, std::codecvt_mode(std::consume_header | std::little_endian)> C; 161 C c; 162 char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)}; 163 std::mbstate_t m; 164 int r = c.length(m, n, n + 6, 2); 165 assert(r == 2); 166 167 n[1] = char(0x10); 168 n[0] = char(0x05); 169 r = c.length(m, n, n + 2, 2); 170 assert(r == 2); 171 172 n[1] = char(0x04); 173 n[0] = char(0x53); 174 r = c.length(m, n, n + 2, 2); 175 assert(r == 2); 176 177 n[1] = char(0x00); 178 n[0] = char(0x56); 179 r = c.length(m, n, n + 2, 2); 180 assert(r == 2); 181 } 182 } 183 184 template <class CharT> 185 void TestHelper<CharT, 4>::test() { 186 { 187 typedef std::codecvt_utf16<char32_t> C; 188 C c; 189 char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)}; 190 std::mbstate_t m; 191 int r = c.length(m, n, n + 4, 2); 192 assert(r == 4); 193 194 n[0] = char(0x10); 195 n[1] = char(0x05); 196 r = c.length(m, n, n + 2, 2); 197 assert(r == 2); 198 199 n[0] = char(0x04); 200 n[1] = char(0x53); 201 r = c.length(m, n, n + 2, 2); 202 assert(r == 2); 203 204 n[0] = char(0x00); 205 n[1] = char(0x56); 206 r = c.length(m, n, n + 2, 2); 207 assert(r == 2); 208 } 209 { 210 typedef std::codecvt_utf16<char32_t, 0x1000> C; 211 C c; 212 char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)}; 213 std::mbstate_t m; 214 int r = c.length(m, n, n + 4, 2); 215 assert(r == 0); 216 217 n[0] = char(0x10); 218 n[1] = char(0x05); 219 r = c.length(m, n, n + 2, 2); 220 assert(r == 0); 221 222 n[0] = char(0x04); 223 n[1] = char(0x53); 224 r = c.length(m, n, n + 2, 2); 225 assert(r == 2); 226 227 n[0] = char(0x00); 228 n[1] = char(0x56); 229 r = c.length(m, n, n + 2, 2); 230 assert(r == 2); 231 } 232 { 233 typedef std::codecvt_utf16<char32_t, 0x10ffff, std::consume_header> C; 234 C c; 235 char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)}; 236 std::mbstate_t m; 237 int r = c.length(m, n, n + 6, 2); 238 assert(r == 6); 239 240 n[0] = char(0x10); 241 n[1] = char(0x05); 242 r = c.length(m, n, n + 2, 2); 243 assert(r == 2); 244 245 n[0] = char(0x04); 246 n[1] = char(0x53); 247 r = c.length(m, n, n + 2, 2); 248 assert(r == 2); 249 250 n[0] = char(0x00); 251 n[1] = char(0x56); 252 r = c.length(m, n, n + 2, 2); 253 assert(r == 2); 254 } 255 { 256 typedef std::codecvt_utf16<char32_t, 0x10ffff, std::little_endian> C; 257 C c; 258 char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)}; 259 std::mbstate_t m; 260 int r = c.length(m, n, n + 4, 2); 261 assert(r == 4); 262 263 n[1] = char(0x10); 264 n[0] = char(0x05); 265 r = c.length(m, n, n + 2, 2); 266 assert(r == 2); 267 268 n[1] = char(0x04); 269 n[0] = char(0x53); 270 r = c.length(m, n, n + 2, 2); 271 assert(r == 2); 272 273 n[1] = char(0x00); 274 n[0] = char(0x56); 275 r = c.length(m, n, n + 2, 2); 276 assert(r == 2); 277 } 278 { 279 typedef std::codecvt_utf16<char32_t, 0x1000, std::little_endian> C; 280 C c; 281 char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)}; 282 std::mbstate_t m; 283 int r = c.length(m, n, n + 4, 2); 284 assert(r == 0); 285 286 n[1] = char(0x10); 287 n[0] = char(0x05); 288 r = c.length(m, n, n + 2, 2); 289 assert(r == 0); 290 291 n[1] = char(0x04); 292 n[0] = char(0x53); 293 r = c.length(m, n, n + 2, 2); 294 assert(r == 2); 295 296 n[1] = char(0x00); 297 n[0] = char(0x56); 298 r = c.length(m, n, n + 2, 2); 299 assert(r == 2); 300 } 301 { 302 typedef std::codecvt_utf16<char32_t, 0x10ffff, std::codecvt_mode(std::consume_header | std::little_endian)> C; 303 C c; 304 char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)}; 305 std::mbstate_t m; 306 int r = c.length(m, n, n + 6, 2); 307 assert(r == 6); 308 309 n[1] = char(0x10); 310 n[0] = char(0x05); 311 r = c.length(m, n, n + 2, 2); 312 assert(r == 2); 313 314 n[1] = char(0x04); 315 n[0] = char(0x53); 316 r = c.length(m, n, n + 2, 2); 317 assert(r == 2); 318 319 n[1] = char(0x00); 320 n[0] = char(0x56); 321 r = c.length(m, n, n + 2, 2); 322 assert(r == 2); 323 } 324 } 325 326 int main(int, char**) { 327 TestHelper<wchar_t>::test(); 328 TestHelper<char16_t>::test(); 329 TestHelper<char32_t>::test(); 330 return 0; 331 } 332