193fb6ee3Sopenharmony_ciimport { Tokenizer } from 'parse5';
293fb6ee3Sopenharmony_ciimport { generateTokenizationTests } from 'parse5-test-utils/utils/generate-tokenization-tests.js';
393fb6ee3Sopenharmony_ciimport * as assert from 'node:assert';
493fb6ee3Sopenharmony_ci
593fb6ee3Sopenharmony_ciconst dataPath = new URL('../../../../test/data/html5lib-tests/tokenizer', import.meta.url);
693fb6ee3Sopenharmony_ciconst tokenizerOpts = {
793fb6ee3Sopenharmony_ci    sourceCodeLocationInfo: true,
893fb6ee3Sopenharmony_ci};
993fb6ee3Sopenharmony_ci
1093fb6ee3Sopenharmony_cigenerateTokenizationTests('Tokenizer', dataPath.pathname, (handler) => new Tokenizer(tokenizerOpts, handler));
1193fb6ee3Sopenharmony_ci
1293fb6ee3Sopenharmony_cifunction noop(): void {
1393fb6ee3Sopenharmony_ci    // Noop
1493fb6ee3Sopenharmony_ci}
1593fb6ee3Sopenharmony_ci
1693fb6ee3Sopenharmony_cidescribe('Tokenizer methods', () => {
1793fb6ee3Sopenharmony_ci    it('should pause and resume', () => {
1893fb6ee3Sopenharmony_ci        let count = 0;
1993fb6ee3Sopenharmony_ci        const tokenizer = new Tokenizer(tokenizerOpts, {
2093fb6ee3Sopenharmony_ci            onComment(t): void {
2193fb6ee3Sopenharmony_ci                assert.strictEqual(t.data, 'INIT');
2293fb6ee3Sopenharmony_ci                assert.strictEqual(count++, 0);
2393fb6ee3Sopenharmony_ci
2493fb6ee3Sopenharmony_ci                tokenizer.pause();
2593fb6ee3Sopenharmony_ci                tokenizer.write('<!doctype foo>', false);
2693fb6ee3Sopenharmony_ci            },
2793fb6ee3Sopenharmony_ci            onDoctype(t): void {
2893fb6ee3Sopenharmony_ci                assert.strictEqual(t.name, 'foo');
2993fb6ee3Sopenharmony_ci                assert.strictEqual(count++, 2);
3093fb6ee3Sopenharmony_ci
3193fb6ee3Sopenharmony_ci                expect(() => tokenizer.resume()).toThrow('Parser was already resumed');
3293fb6ee3Sopenharmony_ci                tokenizer.write('<next>', true);
3393fb6ee3Sopenharmony_ci            },
3493fb6ee3Sopenharmony_ci            onStartTag(t): void {
3593fb6ee3Sopenharmony_ci                assert.strictEqual(count++, 3);
3693fb6ee3Sopenharmony_ci                assert.strictEqual(t.tagName, 'next');
3793fb6ee3Sopenharmony_ci            },
3893fb6ee3Sopenharmony_ci            onEndTag: noop,
3993fb6ee3Sopenharmony_ci            onEof: noop,
4093fb6ee3Sopenharmony_ci            onCharacter: noop,
4193fb6ee3Sopenharmony_ci            onNullCharacter: noop,
4293fb6ee3Sopenharmony_ci            onWhitespaceCharacter: noop,
4393fb6ee3Sopenharmony_ci        });
4493fb6ee3Sopenharmony_ci
4593fb6ee3Sopenharmony_ci        tokenizer.write('<!--INIT-->', false);
4693fb6ee3Sopenharmony_ci        assert.strictEqual(count++, 1);
4793fb6ee3Sopenharmony_ci        expect(tokenizer).toHaveProperty('paused', true);
4893fb6ee3Sopenharmony_ci
4993fb6ee3Sopenharmony_ci        tokenizer.resume();
5093fb6ee3Sopenharmony_ci
5193fb6ee3Sopenharmony_ci        assert.strictEqual(count, 4);
5293fb6ee3Sopenharmony_ci    });
5393fb6ee3Sopenharmony_ci
5493fb6ee3Sopenharmony_ci    it('should throw if setting the state to an unknown value', () => {
5593fb6ee3Sopenharmony_ci        const tokenizer = new Tokenizer(tokenizerOpts, {} as any);
5693fb6ee3Sopenharmony_ci        tokenizer.state = -1;
5793fb6ee3Sopenharmony_ci        expect(() => tokenizer.write('foo', true)).toThrow('Unknown state');
5893fb6ee3Sopenharmony_ci    });
5993fb6ee3Sopenharmony_ci});
60