// META: global=window,worker // META: script=/common/sab.js [ { "input": "Hi", "read": 0, "destinationLength": 0, "written": [] }, { "input": "A", "read": 1, "destinationLength": 10, "written": [0x41] }, { "input": "\u{1D306}", // "\uD834\uDF06" "read": 2, "destinationLength": 4, "written": [0xF0, 0x9D, 0x8C, 0x86] }, { "input": "\u{1D306}A", "read": 0, "destinationLength": 3, "written": [] }, { "input": "\uD834A\uDF06A¥Hi", "read": 5, "destinationLength": 10, "written": [0xEF, 0xBF, 0xBD, 0x41, 0xEF, 0xBF, 0xBD, 0x41, 0xC2, 0xA5] }, { "input": "A\uDF06", "read": 2, "destinationLength": 4, "written": [0x41, 0xEF, 0xBF, 0xBD] }, { "input": "¥¥", "read": 2, "destinationLength": 4, "written": [0xC2, 0xA5, 0xC2, 0xA5] } ].forEach(testData => { [ { "bufferIncrease": 0, "destinationOffset": 0, "filler": 0 }, { "bufferIncrease": 10, "destinationOffset": 4, "filler": 0 }, { "bufferIncrease": 0, "destinationOffset": 0, "filler": 0x80 }, { "bufferIncrease": 10, "destinationOffset": 4, "filler": 0x80 }, { "bufferIncrease": 0, "destinationOffset": 0, "filler": "random" }, { "bufferIncrease": 10, "destinationOffset": 4, "filler": "random" } ].forEach(destinationData => { ["ArrayBuffer", "SharedArrayBuffer"].forEach(arrayBufferOrSharedArrayBuffer => { test(() => { // Setup const bufferLength = testData.destinationLength + destinationData.bufferIncrease; const destinationOffset = destinationData.destinationOffset; const destinationLength = testData.destinationLength; const destinationFiller = destinationData.filler; const encoder = new TextEncoder(); const buffer = createBuffer(arrayBufferOrSharedArrayBuffer, bufferLength); const view = new Uint8Array(buffer, destinationOffset, destinationLength); const fullView = new Uint8Array(buffer); const control = new Array(bufferLength); let byte = destinationFiller; for (let i = 0; i < bufferLength; i++) { if (destinationFiller === "random") { byte = Math.floor(Math.random() * 256); } control[i] = byte; fullView[i] = byte; } // It's happening const result = encoder.encodeInto(testData.input, view); // Basics assert_equals(view.byteLength, destinationLength); assert_equals(view.length, destinationLength); // Remainder assert_equals(result.read, testData.read); assert_equals(result.written, testData.written.length); for (let i = 0; i < bufferLength; i++) { if (i < destinationOffset || i >= (destinationOffset + testData.written.length)) { assert_equals(fullView[i], control[i]); } else { assert_equals(fullView[i], testData.written[i - destinationOffset]); } } }, "encodeInto() into " + arrayBufferOrSharedArrayBuffer + " with " + testData.input + " and destination length " + testData.destinationLength + ", offset " + destinationData.destinationOffset + ", filler " + destinationData.filler); }) }); }); ["DataView", "Int8Array", "Int16Array", "Int32Array", "Uint16Array", "Uint32Array", "Uint8ClampedArray", "BigInt64Array", "BigUint64Array", "Float32Array", "Float64Array"].forEach(type => { ["ArrayBuffer", "SharedArrayBuffer"].forEach((arrayBufferOrSharedArrayBuffer) => { test(() => { const viewInstance = new self[type](createBuffer(arrayBufferOrSharedArrayBuffer, 0)); assert_throws_js(TypeError, () => new TextEncoder().encodeInto("", viewInstance)); }, "Invalid encodeInto() destination: " + type + ", backed by: " + arrayBufferOrSharedArrayBuffer); }); }); ["ArrayBuffer", "SharedArrayBuffer"].forEach((arrayBufferOrSharedArrayBuffer) => { test(() => { assert_throws_js(TypeError, () => new TextEncoder().encodeInto("", createBuffer(arrayBufferOrSharedArrayBuffer, 10))); }, "Invalid encodeInto() destination: " + arrayBufferOrSharedArrayBuffer); }); test(() => { const buffer = new ArrayBuffer(10), view = new Uint8Array(buffer); let { read, written } = new TextEncoder().encodeInto("", view); assert_equals(read, 0); assert_equals(written, 0); new MessageChannel().port1.postMessage(buffer, [buffer]); ({ read, written } = new TextEncoder().encodeInto("", view)); assert_equals(read, 0); assert_equals(written, 0); ({ read, written } = new TextEncoder().encodeInto("test", view)); assert_equals(read, 0); assert_equals(written, 0); }, "encodeInto() and a detached output buffer");