pulsar/script/run-tests.js
2023-01-05 13:57:35 -03:00

77 lines
1.7 KiB
JavaScript

const cp = require('child_process')
function runAllSpecs(files) {
runSpecs(files, [])
}
function runSpecs(files, retries) {
let env = process.env
env.ATOM_JASMINE_REPORTER='list'
if(retries.length > 0) {
// Escape possible tests that can generate a regexp that will not match...
const escaped = retries.map(str => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
env.SPEC_FILTER = escaped.join("|")
}
const res = cp.spawn('yarn', ['start', '--test', ...files], {
cwd: process.cwd(),
env: env
})
let out;
res.stdout.on('data', data => {
process.stdout.write(data.toString());
});
res.stderr.on('data', data => {
const strData = data.toString();
process.stderr.write(strData);
if(strData.match(/ALL TESTS THAT FAILED:/)) {
out = '';
} else if(out !== undefined) {
out += strData;
}
});
res.on('close', code => {
if(code !== 0 && retries.length === 0) {
const failed = filterSpecs(out)
console.log(`*********************
Tests failed. Retrying failed tests...
*********************
`)
runSpecs(files, failed)
} else {
process.exit(code)
}
});
}
function filterSpecs(output) {
if(!output) return ''
let descriptions = []
let start = true
for(let out of output.split("\n")) {
if(start) {
if(out !== '') {
start = false
descriptions.push(out)
}
} else if(out !== '') {
descriptions.push(out)
} else {
return descriptions
}
}
}
if(process.argv[0] === __filename) {
runAllSpecs(process.argv.splice(1))
} else if(process.argv[1] === __filename) {
runAllSpecs(process.argv.splice(2))
} else {
module.exports = runAllSpecs
}