@typed/test
Version:
Simple test framework
67 lines • 2.63 kB
JavaScript
import { blue } from 'typed-colors';
import { createAssertionsEnvironment } from '../assertions';
export function it(does, test) {
return new It(does, test);
}
var It = (function () {
function It(name, test) {
this.name = blue('it') + " " + name;
this.test = test;
}
It.prototype.run = function (timeout) {
if (timeout === void 0) { timeout = 2000; }
var test = this.test;
var _a = createAssertionsEnvironment(), assertions = _a.assertions, stats = _a.stats;
return failAfterGivenTimeout(timeout, runTest(test, assertions))
.then(function () {
if (stats.count === 0)
throw new Error("No assertions have been made");
return { passed: true, error: void 0 };
})
.catch(function (error) { return ({ passed: false, error: error }); });
};
return It;
}());
function runTest(test, assertions) {
switch (test.length) {
// not using assertions passed in -- always fail
case 0:
return Promise.reject(new Error("No assertions have been made"));
// synchronous test or returning promise -- promise will reject if test throws
case 1:
return new Promise(function (resolve) { return resolve(test(assertions, Function.prototype)); });
// is using done() callback to signal test completion
default: {
return new Promise(function (resolve, reject) {
try {
var result = test(assertions, function (error) {
// use promise to ensure test returns first
new Promise(function (res) { return setTimeout(res, 0, error); }).then(function (err) {
if (err)
return reject(err);
resolve();
});
});
if (result && typeof result.then === 'function')
reject(new Error("A promise-returning test should not use 'done' callback"));
}
catch (err) {
reject(err);
}
});
}
}
}
function failAfterGivenTimeout(time, promise) {
return new Promise(function (resolve, reject) {
var id = setTimeout(function () {
reject(new Error("Timed out after " + time + " ms"));
clearTimeout(id);
}, time);
promise.then(function (value) {
clearTimeout(id);
resolve(value);
}, reject);
});
}
//# sourceMappingURL=it.js.map