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