tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

encodeInto.any.js (4874B)


      1 // META: global=window,worker
      2 // META: script=/common/sab.js
      3 
      4 [
      5  {
      6    "input": "Hi",
      7    "read": 0,
      8    "destinationLength": 0,
      9    "written": []
     10  },
     11  {
     12    "input": "A",
     13    "read": 1,
     14    "destinationLength": 10,
     15    "written": [0x41]
     16  },
     17  {
     18    "input": "\u{1D306}", // "\uD834\uDF06"
     19    "read": 2,
     20    "destinationLength": 4,
     21    "written": [0xF0, 0x9D, 0x8C, 0x86]
     22  },
     23  {
     24    "input": "\u{1D306}A",
     25    "read": 0,
     26    "destinationLength": 3,
     27    "written": []
     28  },
     29  {
     30    "input": "\uD834A\uDF06A¥Hi",
     31    "read": 5,
     32    "destinationLength": 10,
     33    "written": [0xEF, 0xBF, 0xBD, 0x41, 0xEF, 0xBF, 0xBD, 0x41, 0xC2, 0xA5]
     34  },
     35  {
     36    "input": "A\uDF06",
     37    "read": 2,
     38    "destinationLength": 4,
     39    "written": [0x41, 0xEF, 0xBF, 0xBD]
     40  },
     41  {
     42    "input": "¥¥",
     43    "read": 2,
     44    "destinationLength": 4,
     45    "written": [0xC2, 0xA5, 0xC2, 0xA5]
     46  }
     47 ].forEach(testData => {
     48  [
     49    {
     50      "bufferIncrease": 0,
     51      "destinationOffset": 0,
     52      "filler": 0
     53    },
     54    {
     55      "bufferIncrease": 10,
     56      "destinationOffset": 4,
     57      "filler": 0
     58    },
     59    {
     60      "bufferIncrease": 0,
     61      "destinationOffset": 0,
     62      "filler": 0x80
     63    },
     64    {
     65      "bufferIncrease": 10,
     66      "destinationOffset": 4,
     67      "filler": 0x80
     68    },
     69    {
     70      "bufferIncrease": 0,
     71      "destinationOffset": 0,
     72      "filler": "random"
     73    },
     74    {
     75      "bufferIncrease": 10,
     76      "destinationOffset": 4,
     77      "filler": "random"
     78    }
     79  ].forEach(destinationData => {
     80    ["ArrayBuffer", "SharedArrayBuffer"].forEach(arrayBufferOrSharedArrayBuffer => {
     81      test(() => {
     82        // Setup
     83        const bufferLength = testData.destinationLength + destinationData.bufferIncrease;
     84        const destinationOffset = destinationData.destinationOffset;
     85        const destinationLength = testData.destinationLength;
     86        const destinationFiller = destinationData.filler;
     87        const encoder = new TextEncoder();
     88        const buffer = createBuffer(arrayBufferOrSharedArrayBuffer, bufferLength);
     89        const view = new Uint8Array(buffer, destinationOffset, destinationLength);
     90        const fullView = new Uint8Array(buffer);
     91        const control = new Array(bufferLength);
     92        let byte = destinationFiller;
     93        for (let i = 0; i < bufferLength; i++) {
     94          if (destinationFiller === "random") {
     95            byte = Math.floor(Math.random() * 256);
     96          }
     97          control[i] = byte;
     98          fullView[i] = byte;
     99        }
    100 
    101        // It's happening
    102        const result = encoder.encodeInto(testData.input, view);
    103 
    104        // Basics
    105        assert_equals(view.byteLength, destinationLength);
    106        assert_equals(view.length, destinationLength);
    107 
    108        // Remainder
    109        assert_equals(result.read, testData.read);
    110        assert_equals(result.written, testData.written.length);
    111        for (let i = 0; i < bufferLength; i++) {
    112          if (i < destinationOffset || i >= (destinationOffset + testData.written.length)) {
    113            assert_equals(fullView[i], control[i]);
    114          } else {
    115            assert_equals(fullView[i], testData.written[i - destinationOffset]);
    116          }
    117        }
    118      }, "encodeInto() into "  + arrayBufferOrSharedArrayBuffer + " with " + testData.input + " and destination length " + testData.destinationLength + ", offset " + destinationData.destinationOffset + ", filler " + destinationData.filler);
    119    })
    120  });
    121 });
    122 
    123 ["DataView",
    124 "Int8Array",
    125 "Int16Array",
    126 "Int32Array",
    127 "Uint16Array",
    128 "Uint32Array",
    129 "Uint8ClampedArray",
    130 "BigInt64Array",
    131 "BigUint64Array",
    132 "Float16Array",
    133 "Float32Array",
    134 "Float64Array"].forEach(type => {
    135  ["ArrayBuffer", "SharedArrayBuffer"].forEach((arrayBufferOrSharedArrayBuffer) => {
    136    test(() => {
    137      const viewInstance = new self[type](createBuffer(arrayBufferOrSharedArrayBuffer, 0));
    138      assert_throws_js(TypeError, () => new TextEncoder().encodeInto("", viewInstance));
    139    }, "Invalid encodeInto() destination: " + type + ", backed by: " + arrayBufferOrSharedArrayBuffer);
    140  });
    141 });
    142 
    143 ["ArrayBuffer", "SharedArrayBuffer"].forEach((arrayBufferOrSharedArrayBuffer) => {
    144  test(() => {
    145    assert_throws_js(TypeError, () => new TextEncoder().encodeInto("", createBuffer(arrayBufferOrSharedArrayBuffer, 10)));
    146  }, "Invalid encodeInto() destination: " + arrayBufferOrSharedArrayBuffer);
    147 });
    148 
    149 test(() => {
    150  const buffer = new ArrayBuffer(10),
    151        view = new Uint8Array(buffer);
    152  let { read, written } = new TextEncoder().encodeInto("", view);
    153  assert_equals(read, 0);
    154  assert_equals(written, 0);
    155  new MessageChannel().port1.postMessage(buffer, [buffer]);
    156  ({ read, written } = new TextEncoder().encodeInto("", view));
    157  assert_equals(read, 0);
    158  assert_equals(written, 0);
    159  ({ read, written } = new TextEncoder().encodeInto("test", view));
    160  assert_equals(read, 0);
    161  assert_equals(written, 0);
    162 }, "encodeInto() and a detached output buffer");