in src/common/runtime/standalone.ts [166:266]
function makeCaseHTML(t: TestTreeLeaf): VisualizedSubtree {
// Becomes set once the case has been run once.
let caseResult: LiveTestCaseResult | undefined;
// Becomes set once the DOM for this case exists.
let clearRenderedResult: (() => void) | undefined;
let updateRenderedResult: (() => void) | undefined;
const name = t.query.toString();
const runSubtree = async () => {
if (clearRenderedResult) clearRenderedResult();
const result: SubtreeResult = emptySubtreeResult();
progressTestNameElem.textContent = name;
const [rec, res] = logger.record(name);
caseResult = res;
if (testWorker) {
await testWorker.run(rec, name);
} else {
await t.run(rec);
}
result.total++;
result.timems += caseResult.timems;
switch (caseResult.status) {
case 'pass':
result.pass++;
break;
case 'fail':
result.fail++;
break;
case 'skip':
result.skip++;
break;
case 'warn':
result.warn++;
break;
default:
unreachable();
}
if (updateRenderedResult) updateRenderedResult();
return result;
};
const generateSubtreeHTML = (div: HTMLElement) => {
div.classList.add('testcase');
const caselogs = $('<div>').addClass('testcaselogs').hide();
const [casehead, setChecked] = makeTreeNodeHeaderHTML(t, runSubtree, 2, checked => {
checked ? caselogs.show() : caselogs.hide();
});
const casetime = $('<div>').addClass('testcasetime').html('ms').appendTo(casehead);
div.appendChild(casehead);
div.appendChild(caselogs[0]);
clearRenderedResult = () => {
div.removeAttribute('data-status');
casetime.text('ms');
caselogs.empty();
};
updateRenderedResult = () => {
if (caseResult) {
div.setAttribute('data-status', caseResult.status);
casetime.text(caseResult.timems.toFixed(4) + ' ms');
if (caseResult.logs) {
caselogs.empty();
// Show exceptions at the top since they are often unexpected can point out an error in the test itself vs the WebGPU implementation.
caseResult.logs
.filter(l => l.name === 'EXCEPTION')
.forEach(l => {
$('<pre>').addClass('testcaselogtext').text(l.toJSON()).appendTo(caselogs);
});
for (const l of caseResult.logs) {
const caselog = $('<div>').addClass('testcaselog').appendTo(caselogs);
$('<button>')
.addClass('testcaselogbtn')
.attr('alt', 'Log stack to console')
.attr('title', 'Log stack to console')
.appendTo(caselog)
.on('click', () => {
consoleLogError(l);
});
$('<pre>').addClass('testcaselogtext').appendTo(caselog).text(l.toJSON());
}
}
}
};
updateRenderedResult();
return setChecked;
};
return { runSubtree, generateSubtreeHTML };
}