80 lines
2.3 KiB
JavaScript
80 lines
2.3 KiB
JavaScript
'use strict';
|
|
|
|
/**
|
|
* Execute testharness.js and one or more scripts in an iframe. Report the
|
|
* results of the execution.
|
|
*
|
|
* @param {...function|...string} bodies - a function body. If specified as a
|
|
* function object, it will be
|
|
* serialized to a string using the
|
|
* built-in
|
|
* `Function.prototype.toString` prior
|
|
* to inclusion in the generated
|
|
* iframe.
|
|
*
|
|
* @returns {Promise} eventual value describing the result of the test
|
|
* execution; the summary object has two properties:
|
|
* `harness` (a string describing the harness status) and
|
|
* `tests` (an object whose "own" property names are the
|
|
* titles of the defined sub-tests and whose associated
|
|
* values are the subtest statuses).
|
|
*/
|
|
function makeTest(...bodies) {
|
|
const closeScript = '<' + '/script>';
|
|
let src = `
|
|
<!DOCTYPE HTML>
|
|
<html>
|
|
<head>
|
|
<title>Document title</title>
|
|
<script src="/resources/testharness.js?${Math.random()}">${closeScript}
|
|
</head>
|
|
|
|
<body>
|
|
<div id="log"></div>`;
|
|
bodies.forEach((body) => {
|
|
src += '<script>(' + body + ')();' + closeScript;
|
|
});
|
|
|
|
const iframe = document.createElement('iframe');
|
|
|
|
document.body.appendChild(iframe);
|
|
iframe.contentDocument.write(src);
|
|
|
|
return new Promise((resolve) => {
|
|
window.addEventListener('message', function onMessage(e) {
|
|
if (e.source !== iframe.contentWindow) {
|
|
return;
|
|
}
|
|
if (!e.data || e.data.type !=='complete') {
|
|
return;
|
|
}
|
|
window.removeEventListener('message', onMessage);
|
|
resolve(e.data);
|
|
});
|
|
|
|
iframe.contentDocument.close();
|
|
}).then(({ tests, status }) => {
|
|
const summary = {
|
|
harness: getEnumProp(status, status.status),
|
|
tests: {}
|
|
};
|
|
|
|
tests.forEach((test) => {
|
|
summary.tests[test.name] = getEnumProp(test, test.status);
|
|
});
|
|
|
|
return summary;
|
|
});
|
|
}
|
|
|
|
function getEnumProp(object, value) {
|
|
for (let property in object) {
|
|
if (!/^[A-Z]+$/.test(property)) {
|
|
continue;
|
|
}
|
|
|
|
if (object[property] === value) {
|
|
return property;
|
|
}
|
|
}
|
|
}
|