| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- Object.defineProperty(Object.getPrototypeOf({}), "echo", { value: function () { WScript.Echo(this); } });
- Object.defineProperty(Object.getPrototypeOf({}), "echos", { value: function () { WScript.Echo(JSON.stringify(this)); } });
- function AssertEqual(actual, expected, msg) { ((actual === expected ? "Passed! " : "Failed (actual: " + actual + ", expected: " + expected + "). Message: ") + msg).echo(); };
- Object.defineProperty(Object.getPrototypeOf({}), "equalTo", { value: function (other, msg) { AssertEqual(this.constructor(this), other, msg); } });
- // Range: Bit Mask:
- // 0x000000 - 0x00007F 0xxxxxxx 0 - 128
- // 0x000080 - 0x0007FF 110xxxxx 10xxxxxx 49280 - 65535
- // 0x000800 - 0x00FFFF 1110xxxx 10xxxxxx 10xxxxxx 14712960 - 33554431
- // 0x010000 - 0x1FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx -260013952 - -1
- var strArr = Array(400000);
- for (var j = 0; j < 100000; j++) {
- var val = Math.floor(Math.random() * 0x7F);
- strArr[j] = String.fromCodePoint(val);
- }
- for (; j < 200000; j++) {
- var val = Math.floor(Math.random() * 0x77F) + 0x80;
- strArr[j] = String.fromCodePoint(val);
- }
- for (; j < 300000; j++) {
- var val = Math.floor(Math.random() * 0xF7FF) + 0x800;
- strArr[j] = String.fromCodePoint(val);
- }
- for (; j < 400000; j++) {
- var val = Math.floor(Math.random() * 0x0FFFFF) + 0x010000;
- strArr[j] = String.fromCodePoint(val);
- }
- var str = strArr.join('');
- var output = "";
- var utf8 = [];
- var i = 0;
- var start = Date.now();
- while (i < str.length) {
- var codePoint = str.codePointAt(i);
- utf8.push(convertUTF16ValueToUTF8(codePoint));
- i += (codePoint >= 0x10000 ? 2 : 1);
- }
- for (var i = 0; i < utf8.length; i++) {
- var item = utf8[i];
- var codePoint = convertUTF8ValueToUTF16(item);
- if (String.fromCodePoint(codePoint).length > 2) codePoint.echo();
- output += String.fromCodePoint(codePoint);
- }
- var total = Date.now() - start;
- if (output === str) {
- // total.echo();
- "Pass".echo();
- } else {
- "Failed!".echo();
- }
- function convertUTF16ValueToUTF8(value) {
- if (value < 0x80) return value;
- if (value < 0x800) return (((value >> 6) + 0xC0 /* 11000000 */) << 8) + (value & 0x3F) + 0x80;
- if (value < 0x10000) return (((value >> 12) + 0xE0 /* 11100000 */) << 16) + ((((value >> 6) & 0x3F) + 0x80) << 8) + (value & 0x3F) + 0x80;
- if (value < 0x200000) return (((value >> 18) + 0xF0 /* 11100000 */) << 24) + ((((value >> 12) & 0x3F) + 0x80) << 16) + ((((value >> 6) & 0x3F) + 0x80) << 8) + (value & 0x3F) + 0x80;
- }
- function convertUTF8ValueToUTF16(value) {
- if (value <= -1 && value >= -260013952) return (((value >> 24) & 0x7) << 18) + (((value >> 16) & 0x3F) << 12) + (((value >> 8) & 0x3F) << 6) + (value & 0x3F);
- if (value <= 127 && value >= 0) return value;
- if (value <= 65535 && value >= 49280) return (((value >> 8) & 0x1F) << 6) + (value & 0x3F);
- if (value <= 33554431 && value >= 14712960) return (((value >> 16) & 0xF) << 12) + (((value >> 8) & 0x3F) << 6) + (value & 0x3F);
- throw new Error(value);
- }
|