From 67f46a54b8bf35053c0ad2082b2b07d556cfa687 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Sat, 19 Aug 2023 15:17:11 -0700 Subject: [PATCH 1/3] Split up StringToUtf32 decoder tests Part of #4696 --- src/common/input/TextDecoder.test.ts | 81 +++++++++++++++------------- 1 file changed, 44 insertions(+), 37 deletions(-) diff --git a/src/common/input/TextDecoder.test.ts b/src/common/input/TextDecoder.test.ts index b8db8a03..20fd3508 100644 --- a/src/common/input/TextDecoder.test.ts +++ b/src/common/input/TextDecoder.test.ts @@ -29,6 +29,8 @@ function fromByteString(s: string): Uint8Array { return result; } +const BATCH_SIZE = 2048; + const TEST_STRINGS = [ 'Лорем ипсум долор сит амет, ех сеа аццусам диссентиет. Ан еос стет еирмод витуперата. Иус дицерет урбанитас ет. Ан при алтера долорес сплендиде, цу яуо интегре денияуе, игнота волуптариа инструцтиор цу вим.', 'ლორემ იფსუმ დოლორ სით ამეთ, ფაცერ მუციუს ცონსეთეთურ ყუო იდ, ფერ ვივენდუმ ყუაერენდუმ ეა, ესთ ამეთ მოვეთ სუავითათე ცუ. ვითაე სენსიბუს ან ვიხ. ეხერცი დეთერრუისსეთ უთ ყუი. ვოცენთ დებითის ადიფისცი ეთ ფერ. ნეც ან ფეუგაით ფორენსიბუს ინთერესსეთ. იდ დიცო რიდენს იუს. დისსენთიეთ ცონსეყუუნთურ სედ ნე, ნოვუმ მუნერე ეუმ ათ, ნე ეუმ ნიჰილ ირაცუნდია ურბანითას.', @@ -52,38 +54,42 @@ describe('text encodings', () => { assert.equal(utf32ToString(data), s); }); - describe('StringToUtf32 decoder', () => { + describe.only('StringToUtf32 decoder', () => { describe('full codepoint test', () => { - it('0..65535', () => { - const decoder = new StringToUtf32(); - const target = new Uint32Array(5); - for (let i = 0; i < 65536; ++i) { - // skip surrogate pairs and a BOM - if ((i >= 0xD800 && i <= 0xDFFF) || i === 0xFEFF) { - continue; + for (let min = 0; min < 65535; min += BATCH_SIZE) { + const max = Math.min(min + BATCH_SIZE, 65536); + it(`${formatRange(min, max)}`, () => { + const decoder = new StringToUtf32(); + const target = new Uint32Array(5); + for (let i = min; i < max; ++i) { + // skip surrogate pairs and a BOM + if ((i >= 0xD800 && i <= 0xDFFF) || i === 0xFEFF) { + continue; + } + const length = decoder.decode(String.fromCharCode(i), target); + assert.equal(length, 1); + assert.equal(target[0], i); + assert.equal(utf32ToString(target, 0, length), String.fromCharCode(i)); + decoder.clear(); } - const length = decoder.decode(String.fromCharCode(i), target); - assert.equal(length, 1); - assert.equal(target[0], i); - assert.equal(utf32ToString(target, 0, length), String.fromCharCode(i)); - decoder.clear(); - } - }); - - it('65536..0x10FFFF (surrogates)', function (): void { - this.timeout(20000); - const decoder = new StringToUtf32(); - const target = new Uint32Array(5); - for (let i = 65536; i < 0x10FFFF; ++i) { - const codePoint = i - 0x10000; - const s = String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00); - const length = decoder.decode(s, target); - assert.equal(length, 1); - assert.equal(target[0], i); - assert.equal(utf32ToString(target, 0, length), s); - decoder.clear(); - } - }); + }); + } + for (let min = 65536; min < 0x10FFFF; min += BATCH_SIZE) { + const max = Math.min(min + BATCH_SIZE, 0x10FFFF); + it(`${formatRange(min, max)} (surrogates)`, () => { + const decoder = new StringToUtf32(); + const target = new Uint32Array(5); + for (let i = min; i < max; ++i) { + const codePoint = i - 0x10000; + const s = String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00); + const length = decoder.decode(s, target); + assert.equal(length, 1); + assert.equal(target[0], i); + assert.equal(utf32ToString(target, 0, length), s); + decoder.clear(); + } + }); + } it('0xFEFF(BOM)', () => { const decoder = new StringToUtf32(); @@ -121,11 +127,8 @@ describe('text encodings', () => { describe('Utf8ToUtf32 decoder', () => { describe('full codepoint test', () => { - function formatRange(min: number, max: number): string { - return `${min}..${max} (0x${min.toString(16).toUpperCase()}..0x${max.toString(16).toUpperCase()})`; - } - for (let min = 0; min < 65535; min += 10000) { - const max = Math.min(min + 10000, 65536); + for (let min = 0; min < 65535; min += BATCH_SIZE) { + const max = Math.min(min + BATCH_SIZE, 65536); it(`${formatRange(min, max)} (1/2/3 byte sequences)`, () => { const decoder = new Utf8ToUtf32(); const target = new Uint32Array(5); @@ -142,9 +145,9 @@ describe('text encodings', () => { } }); } - for (let minRaw = 60000; minRaw < 0x10FFFF; minRaw += 10000) { + for (let minRaw = 60000; minRaw < 0x10FFFF; minRaw += BATCH_SIZE) { const min = Math.max(minRaw, 65536); - const max = Math.min(minRaw + 10000, 0x10FFFF); + const max = Math.min(minRaw + BATCH_SIZE, 0x10FFFF); it(`${formatRange(min, max)} (4 byte sequences)`, function (): void { const decoder = new Utf8ToUtf32(); const target = new Uint32Array(5); @@ -265,3 +268,7 @@ describe('text encodings', () => { }); }); }); + +function formatRange(min: number, max: number): string { + return `${min}..${max} (0x${min.toString(16).toUpperCase()}..0x${max.toString(16).toUpperCase()})`; +} From 905707284dc72cf9d975657ea81894579a5a8824 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Sat, 19 Aug 2023 15:18:44 -0700 Subject: [PATCH 2/3] Up parser unti test timeout 10s -> 30s --- src/common/parser/DcsParser.test.ts | 4 ++-- src/common/parser/OscParser.test.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common/parser/DcsParser.test.ts b/src/common/parser/DcsParser.test.ts index 096ebb58..c6cc0994 100644 --- a/src/common/parser/DcsParser.test.ts +++ b/src/common/parser/DcsParser.test.ts @@ -227,7 +227,7 @@ describe('DcsParser', () => { assert.deepEqual(reports, [['two', [1, 2, 3], 'Here comes the mouse!'], ['one', [1, 2, 3], 'Here comes the mouse!']]); }); it('should work up to payload limit', function(): void { - this.timeout(10000); + this.timeout(30000); parser.registerHandler(identifier({intermediates: '+', final: 'p'}), new DcsHandler((data, params) => { reports.push([params.toArray(), data]); return true; })); parser.hook(identifier({intermediates: '+', final: 'p'}), Params.fromArray([1, 2, 3])); const data = toUtf32('A'.repeat(1000)); @@ -238,7 +238,7 @@ describe('DcsParser', () => { assert.deepEqual(reports, [[[1, 2, 3], 'A'.repeat(PAYLOAD_LIMIT)]]); }); it('should abort for payload limit +1', function(): void { - this.timeout(10000); + this.timeout(30000); parser.registerHandler(identifier({intermediates: '+', final: 'p'}), new DcsHandler((data, params) => { reports.push([params.toArray(), data]); return true; })); parser.hook(identifier({intermediates: '+', final: 'p'}), Params.fromArray([1, 2, 3])); let data = toUtf32('A'.repeat(1000)); diff --git a/src/common/parser/OscParser.test.ts b/src/common/parser/OscParser.test.ts index 5c7f5777..b88171c8 100644 --- a/src/common/parser/OscParser.test.ts +++ b/src/common/parser/OscParser.test.ts @@ -221,7 +221,7 @@ describe('OscParser', () => { assert.deepEqual(reports, [['two', 'Here comes the mouse!'], ['one', 'Here comes the mouse!']]); }); it('should work up to payload limit', function(): void { - this.timeout(10000); + this.timeout(30000); parser.registerHandler(1234, new OscHandler(data => { reports.push([1234, data]); return true; })); parser.start(); let data = toUtf32('1234;'); @@ -234,7 +234,7 @@ describe('OscParser', () => { assert.deepEqual(reports, [[1234, 'A'.repeat(PAYLOAD_LIMIT)]]); }); it('should abort for payload limit +1', function(): void { - this.timeout(10000); + this.timeout(30000); parser.registerHandler(1234, new OscHandler(data => { reports.push([1234, data]); return true; })); parser.start(); let data = toUtf32('1234;'); From 1c5596de66de859c45a23cd213a49a56c1650966 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Sat, 19 Aug 2023 15:21:42 -0700 Subject: [PATCH 3/3] Split up Base64Decoder decoding tests Fixes #4696 --- addons/xterm-addon-image/src/base64.test.ts | 33 ++++++++++----------- src/common/input/TextDecoder.test.ts | 2 +- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/addons/xterm-addon-image/src/base64.test.ts b/addons/xterm-addon-image/src/base64.test.ts index 6b82893a..2d4e6d76 100644 --- a/addons/xterm-addon-image/src/base64.test.ts +++ b/addons/xterm-addon-image/src/base64.test.ts @@ -45,10 +45,9 @@ describe('Base64Decoder', () => { assert.deepEqual(dec.data8, inp); } }); - it('1+2 bytes', function() { - this.timeout(20000); - const dec = new Base64Decoder(0); - for (let a = 0; a < 256; ++a) { + for (let a = 0; a < 256; ++a) { + it(`1+2 bytes (${a})`, function() { + const dec = new Base64Decoder(0); for (let b = 0; b < 256; ++b) { dec.init(2); const inp = new Uint8Array([a, b]); @@ -57,12 +56,11 @@ describe('Base64Decoder', () => { assert.strictEqual(dec.end(), 0); assert.deepEqual(dec.data8, inp); } - } - }); - it('2+3 bytes', function() { - this.timeout(20000); - const dec = new Base64Decoder(0); - for (let a = 0; a < 256; ++a) { + }); + } + for (let a = 0; a < 256; ++a) { + it(`2+3 bytes (${a})`, function() { + const dec = new Base64Decoder(0); for (let b = 0; b < 256; ++b) { dec.init(3); const inp = new Uint8Array([0, a, b]); @@ -71,12 +69,11 @@ describe('Base64Decoder', () => { assert.strictEqual(dec.end(), 0); assert.deepEqual(dec.data8, inp); } - } - }); - it('3+4 bytes', function() { - this.timeout(20000); - const dec = new Base64Decoder(0); - for (let a = 0; a < 256; ++a) { + }); + } + for (let a = 0; a < 256; ++a) { + it(`3+4 bytes (${a})`, function() { + const dec = new Base64Decoder(0); for (let b = 0; b < 256; ++b) { dec.init(4); const inp = new Uint8Array([0, 0, a, b]); @@ -85,8 +82,8 @@ describe('Base64Decoder', () => { assert.strictEqual(dec.end(), 0); assert.deepEqual(dec.data8, inp); } - } - }); + }); + } it('padding', () => { const dec = new Base64Decoder(0); const d = fromBs('Hello, here comes the mouse'); diff --git a/src/common/input/TextDecoder.test.ts b/src/common/input/TextDecoder.test.ts index 20fd3508..abf9e47f 100644 --- a/src/common/input/TextDecoder.test.ts +++ b/src/common/input/TextDecoder.test.ts @@ -54,7 +54,7 @@ describe('text encodings', () => { assert.equal(utf32ToString(data), s); }); - describe.only('StringToUtf32 decoder', () => { + describe('StringToUtf32 decoder', () => { describe('full codepoint test', () => { for (let min = 0; min < 65535; min += BATCH_SIZE) { const max = Math.min(min + BATCH_SIZE, 65536);