'use strict';
const path = require('path');
const ParserStream = require('../lib');
const generateParsingTests = require('../../../test/utils/generate-parsing-tests');
const { makeChunks, generateTestsForEachTreeAdapter } = require('../../../test/utils/common');
function pause() {
return new Promise(resolve => setTimeout(resolve, 5));
}
generateParsingTests(
module.exports,
'ParserStream - Scripting',
{
skipFragments: true,
withoutErrors: true,
testSuite: [path.join(__dirname, '../../../test/data/tree-construction-scripting')]
},
async (test, opts) => {
const chunks = makeChunks(test.input);
const parser = new ParserStream(opts);
const document = parser.document;
const completionPromise = new Promise((resolve, reject) => {
parser.once('finish', () => resolve({ node: document }));
parser.on('script', async (scriptElement, documentWrite, resume) => {
const scriptTextNode = opts.treeAdapter.getChildNodes(scriptElement)[0];
const script = scriptTextNode && opts.treeAdapter.getTextNodeContent(scriptTextNode);
document.write = documentWrite;
//NOTE: emulate postponed script execution
await pause();
try {
/* eslint-disable no-eval */
eval(script);
/* eslint-enable no-eval */
resume();
} catch (err) {
reject(err);
}
});
});
//NOTE: emulate async input stream behavior
for (const chunk of chunks) {
parser.write(chunk);
await pause();
}
parser.end();
return completionPromise;
}
);
generateTestsForEachTreeAdapter(module.exports, (_test, treeAdapter) => {
_test['Regression - Synchronously calling resume() leads to crash (GH-98)'] = function(done) {
const parser = new ParserStream({ treeAdapter: treeAdapter });
parser.on('script', (el, docWrite, resume) => {
resume();
});
parser.end('');
process.nextTick(done);
};
_test['Regression - Parsing loop lock causes accidental hang ups (GH-101)'] = function(done) {
const parser = new ParserStream({ treeAdapter: treeAdapter });
parser.once('finish', () => {
done();
});
parser.on('script', (scriptElement, documentWrite, resume) => {
process.nextTick(() => {
resume();
});
});
parser.write('');
parser.end('dawg');
};
});