| 430 | } |
| 431 | |
| 432 | static void utf16_string(void) |
| 433 | { |
| 434 | JSRuntime *rt = new_runtime(); |
| 435 | JSContext *ctx = JS_NewContext(rt); |
| 436 | { |
| 437 | JSValue v = JS_NewStringUTF16(ctx, NULL, 0); |
| 438 | assert(!JS_IsException(v)); |
| 439 | const char *s = JS_ToCString(ctx, v); |
| 440 | assert(s); |
| 441 | assert(!strcmp(s, "")); |
| 442 | JS_FreeCString(ctx, s); |
| 443 | JS_FreeValue(ctx, v); |
| 444 | } |
| 445 | { |
| 446 | JSValue v = JS_NewStringUTF16(ctx, (uint16_t[]){'o','k'}, 2); |
| 447 | assert(!JS_IsException(v)); |
| 448 | const char *s = JS_ToCString(ctx, v); |
| 449 | assert(s); |
| 450 | assert(!strcmp(s, "ok")); |
| 451 | JS_FreeCString(ctx, s); |
| 452 | size_t n; |
| 453 | const uint16_t *u = JS_ToCStringLenUTF16(ctx, &n, v); |
| 454 | assert(u); |
| 455 | assert(n == 2); |
| 456 | assert(u[0] == 'o'); |
| 457 | assert(u[1] == 'k'); |
| 458 | JS_FreeCStringUTF16(ctx, u); |
| 459 | JS_FreeValue(ctx, v); |
| 460 | } |
| 461 | { |
| 462 | JSValue v = JS_NewStringUTF16(ctx, (uint16_t[]){0xD800}, 1); |
| 463 | assert(!JS_IsException(v)); |
| 464 | const char *s = JS_ToCString(ctx, v); |
| 465 | assert(s); |
| 466 | // questionable but surrogates don't map to UTF-8 without WTF-8 |
| 467 | assert(!strcmp(s, "\xED\xA0\x80")); |
| 468 | JS_FreeCString(ctx, s); |
| 469 | size_t n; |
| 470 | const uint16_t *u = JS_ToCStringLenUTF16(ctx, &n, v); |
| 471 | assert(u); |
| 472 | assert(n == 1); |
| 473 | assert(u[0] == 0xD800); |
| 474 | JS_FreeCStringUTF16(ctx, u); |
| 475 | JS_FreeValue(ctx, v); |
| 476 | } |
| 477 | { |
| 478 | JSValue v = JS_NewStringLen(ctx, "ok", 2); // ascii -> ucs |
| 479 | assert(!JS_IsException(v)); |
| 480 | size_t n; |
| 481 | const uint16_t *u = JS_ToCStringLenUTF16(ctx, &n, v); |
| 482 | assert(u); |
| 483 | assert(n == 2); |
| 484 | assert(u[0] == 'o'); |
| 485 | assert(u[1] == 'k'); |
| 486 | JS_FreeCStringUTF16(ctx, u); |
| 487 | JS_FreeValue(ctx, v); |
| 488 | } |
| 489 | { |
no test coverage detected