UNPKG

13.5 kBJavaScriptView Raw
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6const lodash_1 = require("lodash");
7const strip_bom_1 = __importDefault(require("strip-bom"));
8const promisified_functions_1 = require("../utils/promisified-functions");
9const runtime_1 = require("../errors/runtime");
10const types_1 = require("../errors/types");
11const compilers_1 = require("./compilers");
12const SOURCE_CHUNK_LENGTH = 1000;
13class Compiler {
14 constructor(sources, options) {
15 this.sources = sources;
16 compilers_1.initTestFileCompilers(options);
17 }
18 static getSupportedTestFileExtensions() {
19 return lodash_1.uniq(compilers_1.getTestFileCompilers().map(compiler => compiler.getSupportedExtension()));
20 }
21 async _createTestFileInfo(filename) {
22 let code = null;
23 try {
24 code = await promisified_functions_1.readFile(filename);
25 }
26 catch (err) {
27 throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.cannotFindSpecifiedTestSource, filename);
28 }
29 code = strip_bom_1.default(code).toString();
30 const compiler = lodash_1.find(compilers_1.getTestFileCompilers(), someCompiler => someCompiler.canCompile(code, filename));
31 if (!compiler)
32 return null;
33 return {
34 filename,
35 code,
36 compiler,
37 compiledCode: null
38 };
39 }
40 async _createTestFilesInfo(filenames) {
41 const testFilesInfo = await Promise.all(filenames.map(filename => this._createTestFileInfo(filename)));
42 return testFilesInfo.filter(info => !!info);
43 }
44 async _precompileFiles(compiler, testFilesInfo) {
45 if (!compiler.canPrecompile)
46 return;
47 const precompiledCode = await compiler.precompile(testFilesInfo);
48 for (let i = 0; i < testFilesInfo.length; i++)
49 testFilesInfo[i].compiledCode = precompiledCode[i];
50 }
51 _getCompilerTasks(testFilesInfo) {
52 const tasks = new WeakMap();
53 const compilers = [];
54 for (const info of testFilesInfo) {
55 const { compiler } = info;
56 if (!tasks.has(compiler)) {
57 compilers.push(compiler);
58 tasks.set(compiler, []);
59 }
60 tasks.get(info.compiler).push(info);
61 }
62 return compilers.map(compiler => ({ compiler, compilerTestFilesInfo: tasks.get(compiler) }));
63 }
64 async _getTests({ compiler, filename, code, compiledCode }) {
65 if (compiledCode)
66 return await compiler.execute(compiledCode, filename);
67 return await compiler.compile(code, filename);
68 }
69 async _compileTestFiles(filenames) {
70 const testFilesInfo = await this._createTestFilesInfo(filenames);
71 const compilerTasks = this._getCompilerTasks(testFilesInfo);
72 await Promise.all(compilerTasks.map(({ compiler, compilerTestFilesInfo }) => this._precompileFiles(compiler, compilerTestFilesInfo)));
73 const tests = [];
74 for (const info of testFilesInfo)
75 tests.push(await this._getTests(info));
76 return tests;
77 }
78 async getTests() {
79 // NOTE: split sources into chunks because the fs module can't read all files
80 // simultaneously if the number of them is too large (several thousands).
81 const sourceChunks = lodash_1.chunk(this.sources, SOURCE_CHUNK_LENGTH);
82 let tests = [];
83 while (sourceChunks.length)
84 tests = tests.concat(await this._compileTestFiles(sourceChunks.shift()));
85 Compiler.cleanUp();
86 return lodash_1.flattenDeep(tests).filter(test => !!test);
87 }
88 static cleanUp() {
89 compilers_1.getTestFileCompilers().forEach(compiler => compiler.cleanUp());
90 }
91}
92exports.default = Compiler;
93module.exports = exports.default;
94//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcGlsZXIvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtQ0FBd0Q7QUFDeEQsMERBQWlDO0FBQ2pDLDBFQUEwRDtBQUMxRCwrQ0FBaUQ7QUFDakQsMkNBQWlEO0FBQ2pELDJDQUEwRTtBQUcxRSxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQztBQUVqQyxNQUFxQixRQUFRO0lBQ3pCLFlBQWEsT0FBTyxFQUFFLE9BQU87UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFFdkIsaUNBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELE1BQU0sQ0FBQyw4QkFBOEI7UUFDakMsT0FBTyxhQUFJLENBQUMsZ0NBQW9CLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUVELEtBQUssQ0FBQyxtQkFBbUIsQ0FBRSxRQUFRO1FBQy9CLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUVoQixJQUFJO1lBQ0EsSUFBSSxHQUFHLE1BQU0sZ0NBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNuQztRQUNELE9BQU8sR0FBRyxFQUFFO1lBQ1IsTUFBTSxJQUFJLHNCQUFZLENBQUMsc0JBQWMsQ0FBQyw2QkFBNkIsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNsRjtRQUVELElBQUksR0FBRyxtQkFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLGFBQUksQ0FBQyxnQ0FBb0IsRUFBRSxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUV2RyxJQUFJLENBQUMsUUFBUTtZQUNULE9BQU8sSUFBSSxDQUFDO1FBRWhCLE9BQU87WUFDSCxRQUFRO1lBQ1IsSUFBSTtZQUNKLFFBQVE7WUFFUixZQUFZLEVBQUUsSUFBSTtTQUNyQixDQUFDO0lBQ04sQ0FBQztJQUVELEtBQUssQ0FBQyxvQkFBb0IsQ0FBRSxTQUFTO1FBQ2pDLE1BQU0sYUFBYSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV2RyxPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0IsQ0FBRSxRQUFRLEVBQUUsYUFBYTtRQUMzQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWE7WUFDdkIsT0FBTztRQUVYLE1BQU0sZUFBZSxHQUFHLE1BQU0sUUFBUSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUVqRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7WUFDekMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELGlCQUFpQixDQUFFLGFBQWE7UUFDNUIsTUFBTSxLQUFLLEdBQU8sSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNoQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFFckIsS0FBSyxNQUFNLElBQUksSUFBSSxhQUFhLEVBQUU7WUFDOUIsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQztZQUUxQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDdEIsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDekIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDM0I7WUFFRCxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkM7UUFFRCxPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUU7UUFDdkQsSUFBSSxZQUFZO1lBQ1osT0FBTyxNQUFNLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRTFELE9BQU8sTUFBTSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFFLFNBQVM7UUFDOUIsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRTVELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0SSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFFakIsS0FBSyxNQUFNLElBQUksSUFBSSxhQUFhO1lBQzVCLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFM0MsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRO1FBQ1YsNkVBQTZFO1FBQzdFLHlFQUF5RTtRQUN6RSxNQUFNLFlBQVksR0FBRyxjQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBRTlELElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUVmLE9BQU8sWUFBWSxDQUFDLE1BQU07WUFDdEIsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUU3RSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFbkIsT0FBTyxvQkFBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsTUFBTSxDQUFDLE9BQU87UUFDVixnQ0FBb0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLENBQUM7Q0FDSjtBQTlHRCwyQkE4R0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmbGF0dGVuRGVlcCwgZmluZCwgY2h1bmssIHVuaXEgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHN0cmlwQm9tIGZyb20gJ3N0cmlwLWJvbSc7XG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2lmaWVkLWZ1bmN0aW9ucyc7XG5pbXBvcnQgeyBHZW5lcmFsRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvcnVudGltZSc7XG5pbXBvcnQgeyBSVU5USU1FX0VSUk9SUyB9IGZyb20gJy4uL2Vycm9ycy90eXBlcyc7XG5pbXBvcnQgeyBnZXRUZXN0RmlsZUNvbXBpbGVycywgaW5pdFRlc3RGaWxlQ29tcGlsZXJzIH0gZnJvbSAnLi9jb21waWxlcnMnO1xuXG5cbmNvbnN0IFNPVVJDRV9DSFVOS19MRU5HVEggPSAxMDAwO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb21waWxlciB7XG4gICAgY29uc3RydWN0b3IgKHNvdXJjZXMsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zb3VyY2VzID0gc291cmNlcztcblxuICAgICAgICBpbml0VGVzdEZpbGVDb21waWxlcnMob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFN1cHBvcnRlZFRlc3RGaWxlRXh0ZW5zaW9ucyAoKSB7XG4gICAgICAgIHJldHVybiB1bmlxKGdldFRlc3RGaWxlQ29tcGlsZXJzKCkubWFwKGNvbXBpbGVyID0+IGNvbXBpbGVyLmdldFN1cHBvcnRlZEV4dGVuc2lvbigpKSk7XG4gICAgfVxuXG4gICAgYXN5bmMgX2NyZWF0ZVRlc3RGaWxlSW5mbyAoZmlsZW5hbWUpIHtcbiAgICAgICAgbGV0IGNvZGUgPSBudWxsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb2RlID0gYXdhaXQgcmVhZEZpbGUoZmlsZW5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMuY2Fubm90RmluZFNwZWNpZmllZFRlc3RTb3VyY2UsIGZpbGVuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvZGUgPSBzdHJpcEJvbShjb2RlKS50b1N0cmluZygpO1xuXG4gICAgICAgIGNvbnN0IGNvbXBpbGVyID0gZmluZChnZXRUZXN0RmlsZUNvbXBpbGVycygpLCBzb21lQ29tcGlsZXIgPT4gc29tZUNvbXBpbGVyLmNhbkNvbXBpbGUoY29kZSwgZmlsZW5hbWUpKTtcblxuICAgICAgICBpZiAoIWNvbXBpbGVyKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgIGNvbXBpbGVyLFxuXG4gICAgICAgICAgICBjb21waWxlZENvZGU6IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhc3luYyBfY3JlYXRlVGVzdEZpbGVzSW5mbyAoZmlsZW5hbWVzKSB7XG4gICAgICAgIGNvbnN0IHRlc3RGaWxlc0luZm8gPSBhd2FpdCBQcm9taXNlLmFsbChmaWxlbmFtZXMubWFwKGZpbGVuYW1lID0+IHRoaXMuX2NyZWF0ZVRlc3RGaWxlSW5mbyhmaWxlbmFtZSkpKTtcblxuICAgICAgICByZXR1cm4gdGVzdEZpbGVzSW5mby5maWx0ZXIoaW5mbyA9PiAhIWluZm8pO1xuICAgIH1cblxuICAgIGFzeW5jIF9wcmVjb21waWxlRmlsZXMgKGNvbXBpbGVyLCB0ZXN0RmlsZXNJbmZvKSB7XG4gICAgICAgIGlmICghY29tcGlsZXIuY2FuUHJlY29tcGlsZSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBwcmVjb21waWxlZENvZGUgPSBhd2FpdCBjb21waWxlci5wcmVjb21waWxlKHRlc3RGaWxlc0luZm8pO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGVzdEZpbGVzSW5mby5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHRlc3RGaWxlc0luZm9baV0uY29tcGlsZWRDb2RlID0gcHJlY29tcGlsZWRDb2RlW2ldO1xuICAgIH1cblxuICAgIF9nZXRDb21waWxlclRhc2tzICh0ZXN0RmlsZXNJbmZvKSB7XG4gICAgICAgIGNvbnN0IHRhc2tzICAgICA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVycyA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgaW5mbyBvZiB0ZXN0RmlsZXNJbmZvKSB7XG4gICAgICAgICAgICBjb25zdCB7IGNvbXBpbGVyIH0gPSBpbmZvO1xuXG4gICAgICAgICAgICBpZiAoIXRhc2tzLmhhcyhjb21waWxlcikpIHtcbiAgICAgICAgICAgICAgICBjb21waWxlcnMucHVzaChjb21waWxlcik7XG4gICAgICAgICAgICAgICAgdGFza3Muc2V0KGNvbXBpbGVyLCBbXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRhc2tzLmdldChpbmZvLmNvbXBpbGVyKS5wdXNoKGluZm8pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbXBpbGVycy5tYXAoY29tcGlsZXIgPT4gKHsgY29tcGlsZXIsIGNvbXBpbGVyVGVzdEZpbGVzSW5mbzogdGFza3MuZ2V0KGNvbXBpbGVyKSB9KSk7XG4gICAgfVxuXG4gICAgYXN5bmMgX2dldFRlc3RzICh7IGNvbXBpbGVyLCBmaWxlbmFtZSwgY29kZSwgY29tcGlsZWRDb2RlIH0pIHtcbiAgICAgICAgaWYgKGNvbXBpbGVkQ29kZSlcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBjb21waWxlci5leGVjdXRlKGNvbXBpbGVkQ29kZSwgZmlsZW5hbWUpO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCBjb21waWxlci5jb21waWxlKGNvZGUsIGZpbGVuYW1lKTtcbiAgICB9XG5cbiAgICBhc3luYyBfY29tcGlsZVRlc3RGaWxlcyAoZmlsZW5hbWVzKSB7XG4gICAgICAgIGNvbnN0IHRlc3RGaWxlc0luZm8gPSBhd2FpdCB0aGlzLl9jcmVhdGVUZXN0RmlsZXNJbmZvKGZpbGVuYW1lcyk7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVyVGFza3MgPSB0aGlzLl9nZXRDb21waWxlclRhc2tzKHRlc3RGaWxlc0luZm8pO1xuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGNvbXBpbGVyVGFza3MubWFwKCh7IGNvbXBpbGVyLCBjb21waWxlclRlc3RGaWxlc0luZm8gfSkgPT4gdGhpcy5fcHJlY29tcGlsZUZpbGVzKGNvbXBpbGVyLCBjb21waWxlclRlc3RGaWxlc0luZm8pKSk7XG5cbiAgICAgICAgY29uc3QgdGVzdHMgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGluZm8gb2YgdGVzdEZpbGVzSW5mbylcbiAgICAgICAgICAgIHRlc3RzLnB1c2goYXdhaXQgdGhpcy5fZ2V0VGVzdHMoaW5mbykpO1xuXG4gICAgICAgIHJldHVybiB0ZXN0cztcbiAgICB9XG5cbiAgICBhc3luYyBnZXRUZXN0cyAoKSB7XG4gICAgICAgIC8vIE5PVEU6IHNwbGl0IHNvdXJjZXMgaW50byBjaHVua3MgYmVjYXVzZSB0aGUgZnMgbW9kdWxlIGNhbid0IHJlYWQgYWxsIGZpbGVzXG4gICAgICAgIC8vIHNpbXVsdGFuZW91c2x5IGlmIHRoZSBudW1iZXIgb2YgdGhlbSBpcyB0b28gbGFyZ2UgKHNldmVyYWwgdGhvdXNhbmRzKS5cbiAgICAgICAgY29uc3Qgc291cmNlQ2h1bmtzID0gY2h1bmsodGhpcy5zb3VyY2VzLCBTT1VSQ0VfQ0hVTktfTEVOR1RIKTtcblxuICAgICAgICBsZXQgdGVzdHMgPSBbXTtcblxuICAgICAgICB3aGlsZSAoc291cmNlQ2h1bmtzLmxlbmd0aClcbiAgICAgICAgICAgIHRlc3RzID0gdGVzdHMuY29uY2F0KGF3YWl0IHRoaXMuX2NvbXBpbGVUZXN0RmlsZXMoc291cmNlQ2h1bmtzLnNoaWZ0KCkpKTtcblxuICAgICAgICBDb21waWxlci5jbGVhblVwKCk7XG5cbiAgICAgICAgcmV0dXJuIGZsYXR0ZW5EZWVwKHRlc3RzKS5maWx0ZXIodGVzdCA9PiAhIXRlc3QpO1xuICAgIH1cblxuICAgIHN0YXRpYyBjbGVhblVwICgpIHtcbiAgICAgICAgZ2V0VGVzdEZpbGVDb21waWxlcnMoKS5mb3JFYWNoKGNvbXBpbGVyID0+IGNvbXBpbGVyLmNsZWFuVXAoKSk7XG4gICAgfVxufVxuIl19
\No newline at end of file