Stryker

CoverageInstrumenter.js - Stryker report

Summary

File
Mutation score
# Killed
# Survived
# Timeout
# No coverage
# Errors
Total detected
Total undetected
Total mutants
CoverageInstrumenter.js
84%
21/25 21 4 0 0 0 21 4 25

Code

"use strict";
var log4js = require('log4js');
var stream_1 = require('stream');
var objectUtils_1 = require('../utils/objectUtils');
var CoverageInstrumenterStream_1 = require('./CoverageInstrumenterStream');
var log = log4js.getLogger('CoverageInstrumenter');
var COVERAGE_CURRENT_TEST_VARIABLE_NAME = '__strykerCoverageCurrentTest__';
/**
 * Represents the CoverageInstrumenter
 * Responsible for managing the instrumentation of all files to be mutated.
 * In case of `perTest` coverageAnalysis it will hookin to the test framework to accomplish that.
 */
var CoverageInstrumenter = (function () 0{
    function CoverageInstrumenter(coverageAnalysis, testFramework) 1{
        this.coverageAnalysis = coverageAnalysis;
        this.testFramework = testFramework;
        this.coverageInstrumenterStreamPerFile = Object.create(null);
    }
    CoverageInstrumenter.prototype.instrumenterStreamForFile = function (file) 2{
        if (34file.mutated) 5{
            /*
            Coverage variable *must* have the name '__coverage__'. Only that variable
            is reported back to the TestRunner process when using one of the karma
            test framework adapters (karma-jasmine, karma-mocha, ...).
      
            However, when coverageAnalysis is 'perTest' we don't choose that variable name right away,
            because we need that variable to hold all coverage results per test. Instead, we use __strykerCoverageCurrentTest__
            and after each test copy over the value of that current test to the global coverage object __coverage__
             */
            switch (this.coverageAnalysis) {
                case 'all':
                    return this.createStreamForFile('__coverage__', file.path);
                case 'perTest':
                    return this.createStreamForFile(COVERAGE_CURRENT_TEST_VARIABLE_NAME, file.path);
            }
        }
        // By default, do not instrument for code coverage
        return new stream_1.PassThrough();
    };
    CoverageInstrumenter.prototype.hooksForTestRun = function () 6{
        if (789this.coverageAnalysis === 'perTest') 10{
            log.debug("Adding test hooks file for coverageAnalysis \"perTest\"");
            return objectUtils_1.wrapInClosure(111213141516"\n          var id = 0, coverageStateAtStart;\n          window.__coverage__ = globalCoverage = {};\n\n          " + this.testFramework.beforeEach(beforeEachFragmentPerTest) + "\n          " + this.testFramework.afterEach(afterEachFragmentPerTest) + "\n          " + cloneFunctionFragment + ";\n      ");
        }
        else 17{
            return '';
        }
    };
    CoverageInstrumenter.prototype.retrieveStatementMapsPerFile = function () 18{
        var _this = this;
        var statementMapsPerFile = Object.create(null);
        Object.keys(this.coverageInstrumenterStreamPerFile)
            .forEach(function (key) 19{ return statementMapsPerFile[key] = _this.coverageInstrumenterStreamPerFile[key].statementMap; });
        return statementMapsPerFile;
    };
    CoverageInstrumenter.prototype.createStreamForFile = function (coverageVariable, fileName) 20{
        var stream = new CoverageInstrumenterStream_1.default(coverageVariable, fileName);
        this.coverageInstrumenterStreamPerFile[fileName] = stream;
        return stream;
    };
    return CoverageInstrumenter;
}());
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = CoverageInstrumenter;
var cloneFunctionFragment = "    \n    function clone(source) {\n        var result = source;\n        if (Array.isArray(source)) {\n            result = [];\n            source.forEach(function (child, index) {\n                result[index] = clone(child);\n            });\n        } else if (typeof source == \"object\") {\n            // it is an object literal\n            result = {};\n            for (var i in source) {\n                result[i] = clone(source[i]);\n            }\n        }\n        return result;\n    }";
var beforeEachFragmentPerTest = 2122"\nif (!coverageStateAtStart) {\n  coverageStateAtStart = clone(window." + COVERAGE_CURRENT_TEST_VARIABLE_NAME + ");\n}";
var afterEachFragmentPerTest = 2324"\n       globalCoverage[id] = coverageResult = {};\n      id++;\n           var coveragePerTest = window." + COVERAGE_CURRENT_TEST_VARIABLE_NAME + ";\n            Object.keys(coveragePerTest).forEach(function (file) {\n                var coverage = coveragePerTest[file];\n                coverageResult[file] = { s: coverage.s };\n                coverage.s = clone(coverageStateAtStart[file].s);\n            });";
//# sourceMappingURL=CoverageInstrumenter.js.map