UNPKG

@selfage/test_runner

Version:

Let each test file be executable on its own.

132 lines 18.9 kB
"use strict"; 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