Files
packager/test/p4/encode-big-string.test.js
GarboMuffin 2f0010294f Fix packaging very large projects as HTML files in Chrome (#862)
Actually fixes https://github.com/TurboWarp/packager/issues/528

https://github.com/TurboWarp/packager/pull/861 fixed running large projects
in Chrome, but packaging still used string concatenation so it remained broken.
Now the concatenation part is done using TextEncoder & Uint8Arrays and a
template tag function to keep it readable.

This time I have actually tested it with a 1.0GB sb3.

Breaking Node API change: The data property returned by Packager#package() is
now always a Uint8Array instead of sometimes string and sometimes ArrayBuffer.
2024-05-23 23:47:40 -05:00

42 lines
1.8 KiB
JavaScript

import encodeBigString from "../../src/packager/encode-big-string";
test('simple behavior', () => {
expect(encodeBigString``).toEqual(new Uint8Array([]));
expect(encodeBigString`abc`).toEqual(new Uint8Array([97, 98, 99]));
expect(encodeBigString`a${'bc'}`).toEqual(new Uint8Array([97, 98, 99]));
expect(encodeBigString`${'ab'}c`).toEqual(new Uint8Array([97, 98, 99]));
expect(encodeBigString`${'abc'}`).toEqual(new Uint8Array([97, 98, 99]));
expect(encodeBigString`1${'a'}2${'b'}3${'c'}4`).toEqual(new Uint8Array([49, 97, 50, 98, 51, 99, 52]));
expect(encodeBigString`${''}`).toEqual(new Uint8Array([]));
});
test('non-string primitives', () => {
expect(encodeBigString`${1}`).toEqual(new Uint8Array([49]));
expect(encodeBigString`${false}`).toEqual(new Uint8Array([102, 97, 108, 115, 101]));
expect(encodeBigString`${true}`).toEqual(new Uint8Array([116, 114, 117, 101]));
expect(encodeBigString`${null}`).toEqual(new Uint8Array([110, 117, 108, 108]));
expect(encodeBigString`${undefined}`).toEqual(new Uint8Array([117, 110, 100, 101, 102, 105, 110, 101, 100]));
});
test('array', () => {
expect(encodeBigString`${[]}`).toEqual(new Uint8Array([]));
expect(encodeBigString`${['a', 'b', 'c']}`).toEqual(new Uint8Array([97, 98, 99]));
expect(encodeBigString`${[[[['a'], [['b']], 'c']]]}`).toEqual(new Uint8Array([97, 98, 99]));
});
// skipping for now because very slow
test.skip('very big string', () => {
const MAX_LENGTH = 0x1fffffe8;
const maxLength = 'a'.repeat(MAX_LENGTH);
expect(() => maxLength + 'a').toThrow(/Invalid string length/);
const encoded = encodeBigString`${maxLength}aaaaa`;
expect(encoded.byteLength).toBe(MAX_LENGTH + 5);
// very hot loop, don't call into expect if we don't need to
for (let i = 0; i < encoded.length; i++) {
if (encoded[i] !== 97) {
throw new Error(`Wrong encoding at ${i}`);
}
}
});