stryker
Version:
The extendable JavaScript mutation testing framework
150 lines • 8.22 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var MutantTestMatcher_1 = require("./mutants/MutantTestMatcher");
var InputFileResolver_1 = require("./input/InputFileResolver");
var ScoreResultCalculator_1 = require("./ScoreResultCalculator");
var objectUtils_1 = require("./utils/objectUtils");
var TempFolder_1 = require("./utils/TempFolder");
var MutatorFacade_1 = require("./mutants/MutatorFacade");
var InitialTestExecutor_1 = require("./process/InitialTestExecutor");
var MutationTestExecutor_1 = require("./process/MutationTestExecutor");
var LogConfigurator_1 = require("./logging/LogConfigurator");
var TranspilerFacade_1 = require("./transpiler/TranspilerFacade");
var di_1 = require("./di");
var plugin_1 = require("stryker-api/plugin");
var MutantTranspileScheduler_1 = require("./transpiler/MutantTranspileScheduler");
var SandboxPool_1 = require("./SandboxPool");
var transpiler_1 = require("./transpiler");
var Stryker = /** @class */ (function () {
/**
* The Stryker mutation tester.
* @constructor
* @param {Object} [cliOptions] - Optional options.
*/
function Stryker(cliOptions) {
LogConfigurator_1.default.configureMainProcess(cliOptions.logLevel, cliOptions.fileLogLevel, cliOptions.allowConsoleColors);
this.injector = di_1.buildMainInjector(cliOptions);
this.log = this.injector.resolve(plugin_1.commonTokens.getLogger)(Stryker.name);
// Log level may have changed
var options = this.config;
LogConfigurator_1.default.configureMainProcess(options.logLevel, options.fileLogLevel, options.allowConsoleColors);
}
Object.defineProperty(Stryker.prototype, "reporter", {
get: function () {
return this.injector.resolve(di_1.coreTokens.reporter);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Stryker.prototype, "config", {
get: function () {
return this.injector.resolve(plugin_1.commonTokens.config);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Stryker.prototype, "timer", {
get: function () {
return this.injector.resolve(di_1.coreTokens.timer);
},
enumerable: true,
configurable: true
});
Stryker.prototype.runMutationTest = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var loggingContext, inputFiles, inputFileInjector, initialTestRunProcess, initialRunResult, mutator, transpilerProvider, transpiler, transpiledFiles, mutationTestProcessInjector, testableMutants, mutationTestExecutor, mutantResults;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, LogConfigurator_1.default.configureLoggingServer(this.config.logLevel, this.config.fileLogLevel, this.config.allowConsoleColors)];
case 1:
loggingContext = _a.sent();
this.timer.reset();
return [4 /*yield*/, this.injector.injectClass(InputFileResolver_1.default).resolve()];
case 2:
inputFiles = _a.sent();
if (!inputFiles.files.length) return [3 /*break*/, 12];
TempFolder_1.TempFolder.instance().initialize();
inputFileInjector = this.injector
.provideValue(di_1.coreTokens.loggingContext, loggingContext)
.provideValue(di_1.coreTokens.inputFiles, inputFiles);
initialTestRunProcess = inputFileInjector
.provideValue(plugin_1.commonTokens.produceSourceMaps, this.config.coverageAnalysis !== 'off')
.provideFactory(di_1.coreTokens.pluginCreatorTranspiler, di_1.PluginCreator.createFactory(plugin_1.PluginKind.Transpiler))
.provideClass(di_1.coreTokens.transpiler, TranspilerFacade_1.TranspilerFacade)
.injectClass(InitialTestExecutor_1.default);
return [4 /*yield*/, initialTestRunProcess.run()];
case 3:
initialRunResult = _a.sent();
mutator = inputFileInjector.injectClass(MutatorFacade_1.MutatorFacade);
transpilerProvider = inputFileInjector
.provideValue(di_1.coreTokens.initialRunResult, initialRunResult)
.provideValue(plugin_1.commonTokens.produceSourceMaps, false)
.provideFactory(di_1.coreTokens.transpiler, transpiler_1.transpilerFactory);
transpiler = transpilerProvider.resolve(di_1.coreTokens.transpiler);
return [4 /*yield*/, transpiler.transpile(inputFiles.files)];
case 4:
transpiledFiles = _a.sent();
mutationTestProcessInjector = transpilerProvider
.provideValue(di_1.coreTokens.transpiledFiles, transpiledFiles)
.provideClass(di_1.coreTokens.mutantTranspileScheduler, MutantTranspileScheduler_1.MutantTranspileScheduler)
.provideClass(di_1.coreTokens.sandboxPool, SandboxPool_1.SandboxPool);
return [4 /*yield*/, mutationTestProcessInjector
.injectClass(MutantTestMatcher_1.MutantTestMatcher)
.matchWithMutants(mutator.mutate(inputFiles.filesToMutate))];
case 5:
testableMutants = _a.sent();
if (!(initialRunResult.runResult.tests.length && testableMutants.length)) return [3 /*break*/, 11];
mutationTestExecutor = mutationTestProcessInjector.injectClass(MutationTestExecutor_1.MutationTestExecutor);
return [4 /*yield*/, mutationTestExecutor.run(testableMutants)];
case 6:
mutantResults = _a.sent();
this.reportScore(mutantResults);
return [4 /*yield*/, this.wrapUpReporter()];
case 7:
_a.sent();
return [4 /*yield*/, TempFolder_1.TempFolder.instance().clean()];
case 8:
_a.sent();
return [4 /*yield*/, this.logDone()];
case 9:
_a.sent();
return [4 /*yield*/, LogConfigurator_1.default.shutdown()];
case 10:
_a.sent();
return [2 /*return*/, mutantResults];
case 11:
this.logRemark();
_a.label = 12;
case 12: return [2 /*return*/, Promise.resolve([])];
}
});
});
};
Stryker.prototype.wrapUpReporter = function () {
var maybePromise = this.reporter.wrapUp();
if (objectUtils_1.isPromise(maybePromise)) {
return maybePromise;
}
else {
return Promise.resolve();
}
};
Stryker.prototype.logDone = function () {
this.log.info('Done in %s.', this.timer.humanReadableElapsed());
};
Stryker.prototype.logRemark = function () {
if (!this.log.isTraceEnabled()) {
this.log.info('Trouble figuring out what went wrong? Try `npx stryker run --fileLogLevel trace --logLevel debug` to get some more info.');
}
};
Stryker.prototype.reportScore = function (mutantResults) {
var calculator = this.injector.injectClass(ScoreResultCalculator_1.default);
var score = calculator.calculate(mutantResults);
this.reporter.onScoreCalculated(score);
calculator.determineExitCode(score, this.config.thresholds);
};
return Stryker;
}());
exports.default = Stryker;
//# sourceMappingURL=Stryker.js.map