193fb6ee3Sopenharmony_ciimport type { ParserOptions, TreeAdapterTypeMap } from 'parse5';
293fb6ee3Sopenharmony_ciimport { ParserStream } from '../../lib/index.js';
393fb6ee3Sopenharmony_ciimport { makeChunks } from 'parse5-test-utils/utils/common.js';
493fb6ee3Sopenharmony_ci
593fb6ee3Sopenharmony_ciexport function parseChunked<T extends TreeAdapterTypeMap>(
693fb6ee3Sopenharmony_ci    test: { input: string; fragmentContext?: T['parentNode'] },
793fb6ee3Sopenharmony_ci    opts: ParserOptions<T>,
893fb6ee3Sopenharmony_ci    minChunkSize?: number,
993fb6ee3Sopenharmony_ci    maxChunkSize?: number
1093fb6ee3Sopenharmony_ci): { node: TreeAdapterTypeMap['document']; chunks: string[] } {
1193fb6ee3Sopenharmony_ci    const parserStream = test.fragmentContext
1293fb6ee3Sopenharmony_ci        ? ParserStream.getFragmentStream(test.fragmentContext, opts)
1393fb6ee3Sopenharmony_ci        : new ParserStream(opts);
1493fb6ee3Sopenharmony_ci    const chunks = makeChunks(test.input, minChunkSize, maxChunkSize);
1593fb6ee3Sopenharmony_ci
1693fb6ee3Sopenharmony_ci    // NOTE: set small waterline for testing purposes
1793fb6ee3Sopenharmony_ci    parserStream.parser.tokenizer.preprocessor.bufferWaterline = 8;
1893fb6ee3Sopenharmony_ci
1993fb6ee3Sopenharmony_ci    for (let i = 0; i < chunks.length - 1; i++) {
2093fb6ee3Sopenharmony_ci        parserStream.write(chunks[i]);
2193fb6ee3Sopenharmony_ci    }
2293fb6ee3Sopenharmony_ci
2393fb6ee3Sopenharmony_ci    parserStream.end(chunks[chunks.length - 1]);
2493fb6ee3Sopenharmony_ci
2593fb6ee3Sopenharmony_ci    return {
2693fb6ee3Sopenharmony_ci        node: test.fragmentContext ? parserStream.getFragment() : parserStream.document,
2793fb6ee3Sopenharmony_ci        chunks,
2893fb6ee3Sopenharmony_ci    };
2993fb6ee3Sopenharmony_ci}
30