@selfage/test_runner
Version:
Let each test file be executable on its own.
132 lines • 18.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.TEST_RUNNER = exports.TestRunner = void 0;
const commander_1 = require("commander");
require("source-map-support/register");
class TestRunner {
constructor(setName, caseName, exitFn) {
this.setName = setName;
this.caseName = caseName;
this.exitFn = exitFn;
this.testResults = new Array();
this.prevRunPromise = Promise.resolve();
}
static create(argv, parseOptions, exitFn = () => { }) {
let program = new commander_1.Command();
program
.option("-s, --set-name <name>", "The name of the test set.")
.option("-c, --case-name <name>", "The name of the test case within a test set.");
program.parse(argv, parseOptions);
let options = program.opts();
let runner = new TestRunner(options.setName, options.caseName, exitFn);
// Because run() is designed to be called any number of times without a
// clear signal of when all run() has been called, we use this hack to
// wait for the end of the current event loop, assuming all run() calls
// happen synchronously.
setTimeout(() => runner.summarizeAndExit());
return runner;
}
async summarizeAndExit() {
await this.prevRunPromise;
for (let testSetResult of this.testResults) {
console.log(`\n\x1b[35mTest set ${testSetResult.name} result:\x1b[0m`);
for (let testCaseResult of testSetResult.cases) {
if (testCaseResult.success) {
console.log(`\x1b[32m${testCaseResult.name} success!\x1b[0m`);
}
else {
console.log(`\x1b[31m${testCaseResult.name} failed!\x1b[0m`);
}
}
}
this.exitFn();
}
run(testSet) {
this.prevRunPromise = TestRunner.runAfterPrevRun(this.prevRunPromise, testSet, this.setName, this.caseName, this.testResults);
}
static async runAfterPrevRun(prevRunPromise, testSet, setName, caseName, outputTestResults) {
await prevRunPromise;
if (!setName || setName === testSet.name) {
if (!caseName) {
await TestRunner.runTestSet(testSet, outputTestResults);
}
else {
await TestRunner.runTestCase(testSet, caseName, outputTestResults);
}
}
}
static async runTestCase(testSet, caseName, outputTestResults) {
let testCase = testSet.cases.find((testCase) => {
return caseName === testCase.name;
});
if (!testCase) {
throw new Error(`Test case ${caseName} not found in test set ${testSet.name}.`);
}
if (testSet.environment && testSet.environment.setUp) {
await testSet.environment.setUp();
}
if (testCase.setUp) {
await testCase.setUp(testSet.environment);
}
let success;
try {
await testCase.execute(testSet.environment);
success = true;
}
catch (e) {
console.error(e);
success = false;
}
if (testCase.tearDown) {
await testCase.tearDown(testSet.environment);
}
if (testSet.environment && testSet.environment.tearDown) {
await testSet.environment.tearDown();
}
outputTestResults.push({
name: testSet.name,
cases: [{ name: caseName, success }],
});
}
static async runTestSet(testSet, outputTestResults) {
let testSetResult = {
name: testSet.name,
cases: new Array(),
};
console.log(`\x1b[34mTest set ${testSet.name} starts.\x1b[0m`);
if (testSet.environment && testSet.environment.setUp) {
await testSet.environment.setUp();
}
for (let testCase of testSet.cases) {
console.log(`\x1b[33mTest case ${testCase.name} starts.\x1b[0m`);
if (testCase.setUp) {
await testCase.setUp(testSet.environment);
}
try {
await testCase.execute(testSet.environment);
testSetResult.cases.push({ name: testCase.name, success: true });
}
catch (e) {
console.error(e);
testSetResult.cases.push({ name: testCase.name, success: false });
}
if (testCase.tearDown) {
await testCase.tearDown(testSet.environment);
}
}
if (testSet.environment && testSet.environment.tearDown) {
await testSet.environment.tearDown();
}
outputTestResults.push(testSetResult);
}
}
exports.TestRunner = TestRunner;
exports.TEST_RUNNER = (function () {
if (process) {
return TestRunner.create(process.argv, { from: "node" });
}
else {
return undefined;
}
})();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicnVubmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUFrRDtBQUNsRCx1Q0FBcUM7QUE4QnJDLE1BQWEsVUFBVTtJQUlyQixZQUNVLE9BQTJCLEVBQzNCLFFBQTRCLEVBQzVCLE1BQWtCO1FBRmxCLFlBQU8sR0FBUCxPQUFPLENBQW9CO1FBQzNCLGFBQVEsR0FBUixRQUFRLENBQW9CO1FBQzVCLFdBQU0sR0FBTixNQUFNLENBQVk7UUFOcEIsZ0JBQVcsR0FBRyxJQUFJLEtBQUssRUFBaUIsQ0FBQztRQUN6QyxtQkFBYyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQU14QyxDQUFDO0lBRUcsTUFBTSxDQUFDLE1BQU0sQ0FDbEIsSUFBbUIsRUFDbkIsWUFBMEIsRUFDMUIsU0FBcUIsR0FBRyxFQUFFLEdBQUUsQ0FBQztRQUU3QixJQUFJLE9BQU8sR0FBRyxJQUFJLG1CQUFPLEVBQUUsQ0FBQztRQUM1QixPQUFPO2FBQ0osTUFBTSxDQUFDLHVCQUF1QixFQUFFLDJCQUEyQixDQUFDO2FBQzVELE1BQU0sQ0FDTCx3QkFBd0IsRUFDeEIsOENBQThDLENBQy9DLENBQUM7UUFDSixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNsQyxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0IsSUFBSSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZFLHVFQUF1RTtRQUN2RSxzRUFBc0U7UUFDdEUsdUVBQXVFO1FBQ3ZFLHdCQUF3QjtRQUN4QixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUM1QyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFD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LEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7YUFDbEU7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqQixhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ25FO1lBQ0QsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFO2dCQUNyQixNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzlDO1NBQ0Y7UUFDRCxJQUFJLE9BQU8sQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUU7WUFDdkQsTUFBTSxPQUFPLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ3RDO1FBQ0QsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7Q0FDRjtBQXBKRCxnQ0FvSkM7QUFFVSxRQUFBLFdBQVcsR0FBRyxDQUFDO0lBQ3hCLElBQUksT0FBTyxFQUFFO1FBQ1gsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztLQUMxRDtTQUFNO1FBQ0wsT0FBTyxTQUFTLENBQUM7S0FDbEI7QUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbWFuZCwgUGFyc2VPcHRpb25zIH0gZnJvbSBcImNvbW1hbmRlclwiO1xyXG5pbXBvcnQgXCJzb3VyY2UtbWFwLXN1cHBvcnQvcmVnaXN0ZXJcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGVzdENhc2Uge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBleGVjdXRlOiAoZW52aXJvbm1lbnQ/OiBFbnZpcm9ubWVudCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XHJcbiAgc2V0VXA/OiAoZW52aXJvbm1lbnQ/OiBFbnZpcm9ubWVudCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XHJcbiAgdGVhckRvd24/OiAoZW52aXJvbm1lbnQ/OiBFbnZpcm9ubWVudCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRW52aXJvbm1lbnQge1xyXG4gIHNldFVwPzogKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XHJcbiAgdGVhckRvd24/OiAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUZXN0U2V0IHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgY2FzZXM6IEFycmF5PFRlc3RDYXNlPjtcclxuICBlbnZpcm9ubWVudD86IEVudmlyb25tZW50O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RDYXNlUmVzdWx0IHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgc3VjY2VzczogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUZXN0U2V0UmVzdWx0IHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgY2FzZXM6IEFycmF5PFRlc3RDYXNlUmVzdWx0PjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFRlc3RSdW5uZXIge1xyXG4gIHByaXZhdGUgdGVzdFJlc3VsdHMgPSBuZXcgQXJyYXk8VGVzdFNldFJlc3VsdD4oKTtcclxuICBwcml2YXRlIHByZXZSdW5Qcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XHJcblxyXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgc2V0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxyXG4gICAgcHJpdmF0ZSBjYXNlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxyXG4gICAgcHJpdmF0ZSBleGl0Rm46ICgpID0+IHZvaWRcclxuICApIHt9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKFxyXG4gICAgYXJndjogQXJyYXk8c3RyaW5nPixcclxuICAgIHBhcnNlT3B0aW9uczogUGFyc2VPcHRpb25zLFxyXG4gICAgZXhpdEZuOiAoKSA9PiB2b2lkID0gKCkgPT4ge31cclxuICApOiBUZXN0UnVubmVyIHtcclxuICAgIGxldCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKTtcclxuICAgIHByb2dyYW1cclxuICAgICAgLm9wdGlvbihcIi1zLCAtLXNldC1uYW1lIDxuYW1lPlwiLCBcIlRoZSBuYW1lIG9mIHRoZSB0ZXN0IHNldC5cIilcclxuICAgICAgLm9wdGlvbihcclxuICAgICAgICBcIi1jLCAtLWNhc2UtbmFtZSA8bmFtZT5cIixcclxuICAgICAgICBcIlRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2Ugd2l0aGluIGEgdGVzdCBzZXQuXCJcclxuICAgICAgKTtcclxuICAgIHByb2dyYW0ucGFyc2UoYXJndiwgcGFyc2VPcHRpb25zKTtcclxuICAgIGxldCBvcHRpb25zID0gcHJvZ3JhbS5vcHRzKCk7XHJcbiAgICBsZXQgcnVubmVyID0gbmV3IFRlc3RSdW5uZXIob3B0aW9ucy5zZXROYW1lLCBvcHRpb25zLmNhc2VOYW1lLCBleGl0Rm4pO1xyXG4gICAgLy8gQmVjYXVzZSBydW4oKSBpcyBkZXNpZ25lZCB0byBiZSBjYWxsZWQgYW55IG51bWJlciBvZiB0aW1lcyB3aXRob3V0IGFcclxuICAgIC8vIGNsZWFyIHNpZ25hbCBvZiB3aGVuIGFsbCBydW4oKSBoYXMgYmVlbiBjYWxsZWQsIHdlIHVzZSB0aGlzIGhhY2sgdG9cclxuICAgIC8vIHdhaXQgZm9yIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZXZlbnQgbG9vcCwgYXNzdW1pbmcgYWxsIHJ1bigpIGNhbGxzXHJcbiAgICAvLyBoYXBwZW4gc3luY2hyb25vdXNseS5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4gcnVubmVyLnN1bW1hcml6ZUFuZEV4aXQoKSk7XHJcbiAgICByZXR1cm4gcnVubmVyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBzdW1tYXJpemVBbmRFeGl0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5wcmV2UnVuUHJvbWlzZTtcclxuICAgIGZvciAobGV0IHRlc3RTZXRSZXN1bHQgb2YgdGhpcy50ZXN0UmVzdWx0cykge1xyXG4gICAgICBjb25zb2xlLmxvZyhgXFxuXFx4MWJbMzVtVGVzdCBzZXQgJHt0ZXN0U2V0UmVzdWx0Lm5hbWV9IHJlc3VsdDpcXHgxYlswbWApO1xyXG4gICAgICBmb3IgKGxldCB0ZXN0Q2FzZVJlc3VsdCBvZiB0ZXN0U2V0UmVzdWx0LmNhc2VzKSB7XHJcbiAgICAgICAgaWYgKHRlc3RDYXNlUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGBcXHgxYlszMm0ke3Rlc3RDYXNlUmVzdWx0Lm5hbWV9IHN1Y2Nlc3MhXFx4MWJbMG1gKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coYFxceDFiWzMxbSR7dGVzdENhc2VSZXN1bHQubmFtZX0gZmFpbGVkIVxceDFiWzBtYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmV4aXRGbigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJ1bih0ZXN0U2V0OiBUZXN0U2V0KTogdm9pZCB7XHJcbiAgICB0aGlzLnByZXZSdW5Qcm9taXNlID0gVGVzdFJ1bm5lci5ydW5BZnRlclByZXZSdW4oXHJcbiAgICAgIHRoaXMucHJldlJ1blByb21pc2UsXHJcbiAgICAgIHRlc3RTZXQsXHJcbiAgICAgIHRoaXMuc2V0TmFtZSxcclxuICAgICAgdGhpcy5jYXNlTmFtZSxcclxuICAgICAgdGhpcy50ZXN0UmVzdWx0c1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIHJ1bkFmdGVyUHJldlJ1bihcclxuICAgIHByZXZSdW5Qcm9taXNlOiBQcm9taXNlPHZvaWQ+LFxyXG4gICAgdGVzdFNldDogVGVzdFNldCxcclxuICAgIHNldE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcclxuICAgIGNhc2VOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXHJcbiAgICBvdXRwdXRUZXN0UmVzdWx0czogQXJyYXk8VGVzdFNldFJlc3VsdD5cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHByZXZSdW5Qcm9taXNlO1xyXG4gICAgaWYgKCFzZXROYW1lIHx8IHNldE5hbWUgPT09IHRlc3RTZXQubmFtZSkge1xyXG4gICAgICBpZiAoIWNhc2VOYW1lKSB7XHJcbiAgICAgICAgYXdhaXQgVGVzdFJ1bm5lci5ydW5UZXN0U2V0KHRlc3RTZXQsIG91dHB1dFRlc3RSZXN1bHRzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhd2FpdCBUZXN0UnVubmVyLnJ1blRlc3RDYXNlKHRlc3RTZXQsIGNhc2VOYW1lLCBvdXRwdXRUZXN0UmVzdWx0cyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIHJ1blRlc3RDYXNlKFxyXG4gICAgdGVzdFNldDogVGVzdFNldCxcclxuICAgIGNhc2VOYW1lOiBzdHJpbmcsXHJcbiAgICBvdXRwdXRUZXN0UmVzdWx0czogQXJyYXk8VGVzdFNldFJlc3VsdD5cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0ZXN0Q2FzZSA9IHRlc3RTZXQuY2FzZXMuZmluZCgodGVzdENhc2UpOiBib29sZWFuID0+IHtcclxuICAgICAgcmV0dXJuIGNhc2VOYW1lID09PSB0ZXN0Q2FzZS5uYW1lO1xyXG4gICAgfSk7XHJcbiAgICBpZiAoIXRlc3RDYXNlKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICBgVGVzdCBjYXNlICR7Y2FzZU5hbWV9IG5vdCBmb3VuZCBpbiB0ZXN0IHNldCAke3Rlc3RTZXQubmFtZX0uYFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0ZXN0U2V0LmVudmlyb25tZW50ICYmIHRlc3RTZXQuZW52aXJvbm1lbnQuc2V0VXApIHtcclxuICAgICAgYXdhaXQgdGVzdFNldC5lbnZpcm9ubWVudC5zZXRVcCgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRlc3RDYXNlLnNldFVwKSB7XHJcbiAgICAgIGF3YWl0IHRlc3RDYXNlLnNldFVwKHRlc3RTZXQuZW52aXJvbm1lbnQpO1xyXG4gICAgfVxyXG4gICAgbGV0IHN1Y2Nlc3M6IGJvb2xlYW47XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0ZXN0Q2FzZS5leGVjdXRlKHRlc3RTZXQuZW52aXJvbm1lbnQpO1xyXG4gICAgICBzdWNjZXNzID0gdHJ1ZTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgc3VjY2VzcyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRlc3RDYXNlLnRlYXJEb3duKSB7XHJcbiAgICAgIGF3YWl0IHRlc3RDYXNlLnRlYXJEb3duKHRlc3RTZXQuZW52aXJvbm1lbnQpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRlc3RTZXQuZW52aXJvbm1lbnQgJiYgdGVzdFNldC5lbnZpcm9ubWVudC50ZWFyRG93bikge1xyXG4gICAgICBhd2FpdCB0ZXN0U2V0LmVudmlyb25tZW50LnRlYXJEb3duKCk7XHJcbiAgICB9XHJcbiAgICBvdXRwdXRUZXN0UmVzdWx0cy5wdXNoKHtcclxuICAgICAgbmFtZTogdGVzdFNldC5uYW1lLFxyXG4gICAgICBjYXNlczogW3sgbmFtZTogY2FzZU5hbWUsIHN1Y2Nlc3MgfV0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIHJ1blRlc3RTZXQoXHJcbiAgICB0ZXN0U2V0OiBUZXN0U2V0LFxyXG4gICAgb3V0cHV0VGVzdFJlc3VsdHM6IEFycmF5PFRlc3RTZXRSZXN1bHQ+XHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGVzdFNldFJlc3VsdDogVGVzdFNldFJlc3VsdCA9IHtcclxuICAgICAgbmFtZTogdGVzdFNldC5uYW1lLFxyXG4gICAgICBjYXNlczogbmV3IEFycmF5PFRlc3RDYXNlUmVzdWx0PigpLFxyXG4gICAgfTtcclxuICAgIGNvbnNvbGUubG9nKGBcXHgxYlszNG1UZXN0IHNldCAke3Rlc3RTZXQubmFtZX0gc3RhcnRzLlxceDFiWzBtYCk7XHJcbiAgICBpZiAodGVzdFNldC5lbnZpcm9ubWVudCAmJiB0ZXN0U2V0LmVudmlyb25tZW50LnNldFVwKSB7XHJcbiAgICAgIGF3YWl0IHRlc3RTZXQuZW52aXJvbm1lbnQuc2V0VXAoKTtcclxuICAgIH1cclxuICAgIGZvciAobGV0IHRlc3RDYXNlIG9mIHRlc3RTZXQuY2FzZXMpIHtcclxuICAgICAgY29uc29sZS5sb2coYFxceDFiWzMzbVRlc3QgY2FzZSAke3Rlc3RDYXNlLm5hbWV9IHN0YXJ0cy5cXHgxYlswbWApO1xyXG4gICAgICBpZiAodGVzdENhc2Uuc2V0VXApIHtcclxuICAgICAgICBhd2FpdCB0ZXN0Q2FzZS5zZXRVcCh0ZXN0U2V0LmVudmlyb25tZW50KTtcclxuICAgICAgfVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IHRlc3RDYXNlLmV4ZWN1dGUodGVzdFNldC5lbnZpcm9ubWVudCk7XHJcbiAgICAgICAgdGVzdFNldFJlc3VsdC5jYXNlcy5wdXNoKHsgbmFtZTogdGVzdENhc2UubmFtZSwgc3VjY2VzczogdHJ1ZSB9KTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgdGVzdFNldFJlc3VsdC5jYXNlcy5wdXNoKHsgbmFtZTogdGVzdENhc2UubmFtZSwgc3VjY2VzczogZmFsc2UgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRlc3RDYXNlLnRlYXJEb3duKSB7XHJcbiAgICAgICAgYXdhaXQgdGVzdENhc2UudGVhckRvd24odGVzdFNldC5lbnZpcm9ubWVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0ZXN0U2V0LmVudmlyb25tZW50ICYmIHRlc3RTZXQuZW52aXJvbm1lbnQudGVhckRvd24pIHtcclxuICAgICAgYXdhaXQgdGVzdFNldC5lbnZpcm9ubWVudC50ZWFyRG93bigpO1xyXG4gICAgfVxyXG4gICAgb3V0cHV0VGVzdFJlc3VsdHMucHVzaCh0ZXN0U2V0UmVzdWx0KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBsZXQgVEVTVF9SVU5ORVIgPSAoZnVuY3Rpb24gKCkge1xyXG4gIGlmIChwcm9jZXNzKSB7XHJcbiAgICByZXR1cm4gVGVzdFJ1bm5lci5jcmVhdGUocHJvY2Vzcy5hcmd2LCB7IGZyb206IFwibm9kZVwiIH0pO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxufSkoKTtcclxuIl19