in packages/flow-dev-tools/src/record/recordRunner.js [98:246]
async function runner(args: Args): Promise<void> {
const builder = new Builder(args.errorCheckCommand);
let suites;
if (args.rerun != null) {
suites = await findTestsByRun(args.rerun, true);
} else {
suites = await findTestsByName(args.suites);
}
const loadedSuites = {};
for (const suiteName of suites) {
loadedSuites[suiteName] = loadSuite(suiteName);
}
const runQueue = new RunQueue(
args.bin,
args.parallelism,
false,
loadedSuites,
builder,
);
await runQueue.go();
await builder.cleanup();
let totalTests = 0,
totalSteps = 0,
testNum = 0,
stepNum = 0,
suiteName = 0;
function printStatus(status: 'RECORDING' | 'RECORDED' | 'FAIL'): void {
let statusText = chalk.bold('[ ] RECORDING: ');
let newline = '';
if (status === 'RECORDED') {
statusText = chalk.green.bold('[✓] RECORDED: ');
newline = '\n';
} else if (status === 'FAIL') {
statusText = chalk.red.bold('[✗] FAILED TO RECORD:');
newline = '\n';
}
if (process.stdout.isTTY) {
// $FlowFixMe - Add this to lib file
process.stdout.clearLine();
process.stdout.write(
format(
'\r%s %s (%d/%d tests %d/%d steps passed)%s',
statusText,
suiteName,
testNum,
totalTests,
stepNum,
totalSteps,
newline,
),
);
} else {
if (status == 'FAIL' || status == 'RECORDED') {
process.stdout.write(
format(
'%s %s (%d/%d tests %d/%d steps passed)\n',
statusText,
suiteName,
testNum,
totalTests,
stepNum,
totalSteps,
),
);
}
}
}
const results = runQueue.results;
for (suiteName in results) {
const suiteResult = results[suiteName];
if (suiteResult.type === 'exceptional') {
printStatus('FAIL');
continue;
}
// TODO - reorder records based on line number
totalTests = suiteResult.testResults.length;
for (testNum = 0; testNum < totalTests; testNum++) {
let testFailed = false;
let testRecorded = false;
totalSteps =
suiteResult.testResults[totalTests - testNum - 1].stepResults.length;
for (stepNum = 0; stepNum < totalSteps; stepNum++) {
printStatus('RECORDING');
// Record starting at the end to avoid messing with line numbers
const stepResult =
suiteResult.testResults[totalTests - testNum - 1].stepResults[
totalSteps - stepNum - 1
];
if (!stepResult.passed) {
// Again, start with the last assertion
for (
let assertionNum = stepResult.assertionResults.length - 1;
assertionNum >= 0;
assertionNum--
) {
const result = stepResult.assertionResults[assertionNum];
if (result.type === 'fail') {
const suggestion = result.suggestion;
if (suggestion.method) {
const assertLoc = result.assertLoc;
if (assertLoc) {
let filename = assertLoc.filename;
if (!isAbsolute(filename)) {
filename = join(getTestsDir(), suiteName, filename);
}
const code = await readFile(filename, 'utf8');
const ast = parser.parse(code, {});
const range =
assertLoc &&
dfsForRange(ast, assertLoc.line, assertLoc.column);
if (range) {
const [start, end] = range;
const out =
code.slice(0, start) +
suggestionToString(suggestion, assertLoc.column) +
code.slice(end);
await writeFile(filename, out);
} else {
process.stderr.write(
'Could not find the assertion in the code\n',
);
}
} else {
process.stderr.write(
'Could not find the assertion in the stack\n',
);
}
} else if (suggestion.file) {
let filename = suggestion.file;
if (!isAbsolute(filename)) {
filename = join(getTestsDir(), suiteName, filename);
}
await writeFile(filename, suggestion.contents);
}
}
}
}
}
}
printStatus('RECORDED');
}
}