1import { Tokenizer } from 'parse5'; 2import { generateTokenizationTests } from 'parse5-test-utils/utils/generate-tokenization-tests.js'; 3import * as assert from 'node:assert'; 4 5const dataPath = new URL('../../../../test/data/html5lib-tests/tokenizer', import.meta.url); 6const tokenizerOpts = { 7 sourceCodeLocationInfo: true, 8}; 9 10generateTokenizationTests('Tokenizer', dataPath.pathname, (handler) => new Tokenizer(tokenizerOpts, handler)); 11 12function noop(): void { 13 // Noop 14} 15 16describe('Tokenizer methods', () => { 17 it('should pause and resume', () => { 18 let count = 0; 19 const tokenizer = new Tokenizer(tokenizerOpts, { 20 onComment(t): void { 21 assert.strictEqual(t.data, 'INIT'); 22 assert.strictEqual(count++, 0); 23 24 tokenizer.pause(); 25 tokenizer.write('<!doctype foo>', false); 26 }, 27 onDoctype(t): void { 28 assert.strictEqual(t.name, 'foo'); 29 assert.strictEqual(count++, 2); 30 31 expect(() => tokenizer.resume()).toThrow('Parser was already resumed'); 32 tokenizer.write('<next>', true); 33 }, 34 onStartTag(t): void { 35 assert.strictEqual(count++, 3); 36 assert.strictEqual(t.tagName, 'next'); 37 }, 38 onEndTag: noop, 39 onEof: noop, 40 onCharacter: noop, 41 onNullCharacter: noop, 42 onWhitespaceCharacter: noop, 43 }); 44 45 tokenizer.write('<!--INIT-->', false); 46 assert.strictEqual(count++, 1); 47 expect(tokenizer).toHaveProperty('paused', true); 48 49 tokenizer.resume(); 50 51 assert.strictEqual(count, 4); 52 }); 53 54 it('should throw if setting the state to an unknown value', () => { 55 const tokenizer = new Tokenizer(tokenizerOpts, {} as any); 56 tokenizer.state = -1; 57 expect(() => tokenizer.write('foo', true)).toThrow('Unknown state'); 58 }); 59}); 60