mutation-testing-metrics
Advanced tools
Comparing version 1.7.14 to 2.0.0
import { FileResult, MutationTestResult } from 'mutation-testing-report-schema/api'; | ||
import { FileUnderTestModel, Metrics, MetricsResult, MutationTestMetricsResult } from './model'; | ||
import { FileUnderTestModel, Metrics, MetricsResult, MutationTestMetricsResult, TestFileModel, TestMetrics } from './model'; | ||
/** | ||
@@ -15,2 +15,5 @@ * Calculates the files-under-test metrics inside of a mutation testing report | ||
export declare function calculateMutationTestMetrics(result: MutationTestResult): MutationTestMetricsResult; | ||
export declare function calculateFileMetrics<TFileModel, TMetrics>(fileName: string, file: TFileModel, calculateMetrics: (files: TFileModel[]) => TMetrics): MetricsResult<TFileModel, TMetrics>; | ||
export declare function countTestFileMetrics(testFile: TestFileModel[]): TestMetrics; | ||
export declare function countFileMetrics(fileResult: FileUnderTestModel[]): Metrics; | ||
//# sourceMappingURL=calculateMetrics.d.ts.map |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.calculateMutationTestMetrics = exports.calculateMetrics = void 0; | ||
exports.countFileMetrics = exports.countTestFileMetrics = exports.calculateFileMetrics = exports.calculateMutationTestMetrics = exports.calculateMetrics = void 0; | ||
const helpers_1 = require("./helpers"); | ||
@@ -60,16 +60,8 @@ const api_1 = require("mutation-testing-report-schema/api"); | ||
const childResults = toChildModels(files, calculateMetrics); | ||
return { | ||
name, | ||
childResults, | ||
metrics, | ||
}; | ||
return new model_1.MetricsResult(name, childResults, metrics); | ||
} | ||
function calculateFileMetrics(fileName, file, calculateMetrics) { | ||
return { | ||
file, | ||
name: fileName, | ||
childResults: [], | ||
metrics: calculateMetrics([file]), | ||
}; | ||
return new model_1.MetricsResult(fileName, [], calculateMetrics([file]), file); | ||
} | ||
exports.calculateFileMetrics = calculateFileMetrics; | ||
function toChildModels(files, calculateMetrics) { | ||
@@ -121,5 +113,7 @@ const filesByDirectory = (0, helpers_2.groupBy)(Object.entries(files), (namedFile) => namedFile[0].split('/')[0]); | ||
} | ||
exports.countTestFileMetrics = countTestFileMetrics; | ||
function countFileMetrics(fileResult) { | ||
const mutants = fileResult.flatMap((_) => _.mutants); | ||
const count = (status) => mutants.filter((_) => _.status === status).length; | ||
const pending = count(api_1.MutantStatus.Pending); | ||
const killed = count(api_1.MutantStatus.Killed); | ||
@@ -138,2 +132,3 @@ const timeout = count(api_1.MutantStatus.Timeout); | ||
return { | ||
pending, | ||
killed, | ||
@@ -152,6 +147,7 @@ timeout, | ||
mutationScore: totalValid > 0 ? (totalDetected / totalValid) * 100 : DEFAULT_SCORE, | ||
totalMutants: totalValid + totalInvalid + ignored, | ||
totalMutants: totalValid + totalInvalid + ignored + pending, | ||
mutationScoreBasedOnCoveredCode: totalValid > 0 ? (totalDetected / totalCovered) * 100 || 0 : DEFAULT_SCORE, | ||
}; | ||
} | ||
exports.countFileMetrics = countFileMetrics; | ||
//# sourceMappingURL=calculateMetrics.js.map |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.TestStatus = exports.MutantModel = exports.TestFileModel = exports.FileUnderTestModel = exports.TestModel = exports.normalizeFileNames = exports.aggregateResultsByModule = exports.calculateMutationTestMetrics = exports.calculateMetrics = void 0; | ||
exports.TestStatus = exports.MutantModel = exports.TestFileModel = exports.FileUnderTestModel = exports.TestModel = exports.MetricsResult = exports.normalizeFileNames = exports.aggregateResultsByModule = exports.calculateMutationTestMetrics = exports.calculateMetrics = void 0; | ||
var calculateMetrics_1 = require("./calculateMetrics"); | ||
@@ -12,2 +12,3 @@ Object.defineProperty(exports, "calculateMetrics", { enumerable: true, get: function () { return calculateMetrics_1.calculateMetrics; } }); | ||
var model_1 = require("./model"); | ||
Object.defineProperty(exports, "MetricsResult", { enumerable: true, get: function () { return model_1.MetricsResult; } }); | ||
Object.defineProperty(exports, "TestModel", { enumerable: true, get: function () { return model_1.TestModel; } }); | ||
@@ -14,0 +15,0 @@ Object.defineProperty(exports, "FileUnderTestModel", { enumerable: true, get: function () { return model_1.FileUnderTestModel; } }); |
import { FileResult, MutantResult } from 'mutation-testing-report-schema/api'; | ||
import { MutantModel } from './mutant-model'; | ||
import { SourceFile } from './source-file'; | ||
import { MetricsResult } from './metrics-result'; | ||
/** | ||
@@ -22,2 +23,6 @@ * Represents a file which was mutated (your production code). | ||
/** | ||
* The associated MetricsResult of this file. | ||
*/ | ||
result?: MetricsResult; | ||
/** | ||
* @param input The file result content | ||
@@ -24,0 +29,0 @@ * @param name The file name |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.TestStatus = exports.TestModel = exports.TestFileModel = exports.MutantModel = exports.FileUnderTestModel = void 0; | ||
exports.TestStatus = exports.TestModel = exports.TestFileModel = exports.MutantModel = exports.MetricsResult = exports.FileUnderTestModel = void 0; | ||
var file_under_test_model_1 = require("./file-under-test-model"); | ||
Object.defineProperty(exports, "FileUnderTestModel", { enumerable: true, get: function () { return file_under_test_model_1.FileUnderTestModel; } }); | ||
var metrics_result_1 = require("./metrics-result"); | ||
Object.defineProperty(exports, "MetricsResult", { enumerable: true, get: function () { return metrics_result_1.MetricsResult; } }); | ||
var mutant_model_1 = require("./mutant-model"); | ||
@@ -7,0 +9,0 @@ Object.defineProperty(exports, "MutantModel", { enumerable: true, get: function () { return mutant_model_1.MutantModel; } }); |
@@ -8,4 +8,9 @@ import { FileUnderTestModel } from './file-under-test-model'; | ||
*/ | ||
export interface MetricsResult<TFile = FileUnderTestModel, TMetrics = Metrics> { | ||
export declare class MetricsResult<TFile = FileUnderTestModel, TMetrics = Metrics> { | ||
#private; | ||
/** | ||
* The parent of this result (if it has one) | ||
*/ | ||
parent: MetricsResult<TFile, TMetrics> | undefined; | ||
/** | ||
* The name of this result | ||
@@ -26,3 +31,7 @@ */ | ||
metrics: TMetrics; | ||
constructor(name: string, childResults: MetricsResult<TFile, TMetrics>[], metrics: TMetrics, file?: TFile); | ||
updateParent(value?: MetricsResult<TFile, TMetrics>): void; | ||
updateAllMetrics(): void; | ||
updateMetrics(): void; | ||
} | ||
//# sourceMappingURL=metrics-result.d.ts.map |
"use strict"; | ||
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { | ||
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); | ||
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); | ||
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); | ||
}; | ||
var _MetricsResult_instances, _MetricsResult_getFileModelsRecursively; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.MetricsResult = void 0; | ||
const calculateMetrics_1 = require("../calculateMetrics"); | ||
/** | ||
* A metrics result of T for a directory or file | ||
* @type {TFile} Either a file under test, or a test file | ||
* @type {TMetrics} Either test file metrics or file under test metrics | ||
*/ | ||
class MetricsResult { | ||
constructor(name, childResults, metrics, file) { | ||
_MetricsResult_instances.add(this); | ||
this.name = name; | ||
this.childResults = childResults; | ||
this.metrics = metrics; | ||
this.file = file; | ||
} | ||
updateParent(value) { | ||
this.parent = value; | ||
this.childResults.forEach((result) => result.updateParent(this)); | ||
} | ||
updateAllMetrics() { | ||
if (this.parent !== undefined) { | ||
this.parent.updateAllMetrics(); | ||
return; | ||
} | ||
this.updateMetrics(); | ||
} | ||
updateMetrics() { | ||
if (this.file === undefined) { | ||
this.childResults.forEach((childResult) => { | ||
childResult.updateMetrics(); | ||
}); | ||
const files = __classPrivateFieldGet(this, _MetricsResult_instances, "m", _MetricsResult_getFileModelsRecursively).call(this, this.childResults); | ||
if (files.length === 0) { | ||
return; | ||
} | ||
if (files[0].tests) { | ||
this.metrics = (0, calculateMetrics_1.countTestFileMetrics)(files); | ||
} | ||
else { | ||
this.metrics = (0, calculateMetrics_1.countFileMetrics)(files); | ||
} | ||
return; | ||
} | ||
if (this.file.tests) { | ||
this.metrics = (0, calculateMetrics_1.countTestFileMetrics)([this.file]); | ||
} | ||
else { | ||
this.metrics = (0, calculateMetrics_1.countFileMetrics)([this.file]); | ||
} | ||
} | ||
} | ||
exports.MetricsResult = MetricsResult; | ||
_MetricsResult_instances = new WeakSet(), _MetricsResult_getFileModelsRecursively = function _MetricsResult_getFileModelsRecursively(childResults) { | ||
const flattenedFiles = []; | ||
if (childResults.length === 0) { | ||
return flattenedFiles; | ||
} | ||
childResults.forEach((child) => { | ||
if (child.file) { | ||
flattenedFiles.push(child.file); | ||
return; | ||
} | ||
flattenedFiles.push(...__classPrivateFieldGet(this, _MetricsResult_instances, "m", _MetricsResult_getFileModelsRecursively).call(this, child.childResults)); | ||
}); | ||
return flattenedFiles; | ||
}; | ||
//# sourceMappingURL=metrics-result.js.map |
@@ -6,2 +6,6 @@ /** | ||
/** | ||
* The total number of mutants that are pending, meaning that they have been generated but not yet run | ||
*/ | ||
pending: number; | ||
/** | ||
* The total number of mutants that were killed | ||
@@ -8,0 +12,0 @@ */ |
@@ -8,2 +8,3 @@ import { Location, MutantResult, MutantStatus } from 'mutation-testing-report-schema/api'; | ||
export declare class MutantModel implements MutantResult { | ||
#private; | ||
coveredBy: string[] | undefined; | ||
@@ -40,3 +41,4 @@ description: string | undefined; | ||
get fileName(): string; | ||
update(): void; | ||
} | ||
//# sourceMappingURL=mutant-model.d.ts.map |
"use strict"; | ||
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { | ||
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); | ||
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); | ||
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); | ||
}; | ||
var _MutantModel_coveredByTests, _MutantModel_killedByTests; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -14,2 +20,4 @@ exports.MutantModel = void 0; | ||
constructor(input) { | ||
_MutantModel_coveredByTests.set(this, new Map()); | ||
_MutantModel_killedByTests.set(this, new Map()); | ||
this.coveredBy = input.coveredBy; | ||
@@ -32,3 +40,7 @@ this.description = input.description; | ||
} | ||
this.coveredByTests.push(test); | ||
if (__classPrivateFieldGet(this, _MutantModel_coveredByTests, "f").has(test.id)) { | ||
return; | ||
} | ||
__classPrivateFieldGet(this, _MutantModel_coveredByTests, "f").set(test.id, test); | ||
this.coveredByTests?.push(test); | ||
} | ||
@@ -39,3 +51,7 @@ addKilledBy(test) { | ||
} | ||
this.killedByTests.push(test); | ||
if (__classPrivateFieldGet(this, _MutantModel_killedByTests, "f").has(test.id)) { | ||
return; | ||
} | ||
__classPrivateFieldGet(this, _MutantModel_killedByTests, "f").set(test.id, test); | ||
this.killedByTests?.push(test); | ||
} | ||
@@ -64,4 +80,12 @@ /** | ||
} | ||
// TODO: https://github.com/stryker-mutator/mutation-testing-elements/pull/2453#discussion_r1178769871 | ||
update() { | ||
if (!this.sourceFile?.result?.file) { | ||
return; | ||
} | ||
this.sourceFile.result.updateAllMetrics(); | ||
} | ||
} | ||
exports.MutantModel = MutantModel; | ||
_MutantModel_coveredByTests = new WeakMap(), _MutantModel_killedByTests = new WeakMap(); | ||
//# sourceMappingURL=mutant-model.js.map |
import { TestFile as TestFile } from 'mutation-testing-report-schema/api'; | ||
import { SourceFile } from './source-file'; | ||
import { TestModel } from './test-model'; | ||
import { MetricsResult, TestMetrics } from '.'; | ||
/** | ||
@@ -12,2 +13,6 @@ * Represents a file that contains tests | ||
/** | ||
* The associated MetricsResult of this file. | ||
*/ | ||
result?: MetricsResult<TestFileModel, TestMetrics>; | ||
/** | ||
* @param input the test file content | ||
@@ -14,0 +19,0 @@ * @param name the file name |
@@ -10,2 +10,3 @@ import { OpenEndLocation, TestDefinition } from 'mutation-testing-report-schema/api'; | ||
export declare class TestModel implements TestDefinition { | ||
#private; | ||
id: string; | ||
@@ -31,3 +32,4 @@ name: string; | ||
get status(): TestStatus; | ||
update(): void; | ||
} | ||
//# sourceMappingURL=test-model.d.ts.map |
"use strict"; | ||
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { | ||
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); | ||
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); | ||
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); | ||
}; | ||
var _TestModel_killedMutants, _TestModel_coveredMutants; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -25,2 +31,6 @@ exports.TestModel = exports.TestStatus = void 0; | ||
} | ||
if (__classPrivateFieldGet(this, _TestModel_coveredMutants, "f").has(mutant.id)) { | ||
return; | ||
} | ||
__classPrivateFieldGet(this, _TestModel_coveredMutants, "f").set(mutant.id, mutant); | ||
this.coveredMutants.push(mutant); | ||
@@ -32,5 +42,11 @@ } | ||
} | ||
if (__classPrivateFieldGet(this, _TestModel_killedMutants, "f").has(mutant.id)) { | ||
return; | ||
} | ||
__classPrivateFieldGet(this, _TestModel_killedMutants, "f").set(mutant.id, mutant); | ||
this.killedMutants.push(mutant); | ||
} | ||
constructor(input) { | ||
_TestModel_killedMutants.set(this, new Map()); | ||
_TestModel_coveredMutants.set(this, new Map()); | ||
Object.entries(input).forEach(([key, value]) => { | ||
@@ -69,4 +85,11 @@ // @ts-expect-error dynamic assignment so we won't forget to add new properties | ||
} | ||
update() { | ||
if (!this.sourceFile?.result?.file) { | ||
return; | ||
} | ||
this.sourceFile.result.updateAllMetrics(); | ||
} | ||
} | ||
exports.TestModel = TestModel; | ||
_TestModel_killedMutants = new WeakMap(), _TestModel_coveredMutants = new WeakMap(); | ||
//# sourceMappingURL=test-model.js.map |
{ | ||
"name": "mutation-testing-metrics", | ||
"version": "1.7.14", | ||
"version": "2.0.0", | ||
"description": "Utility functions to calculate mutation testing metrics.", | ||
@@ -21,5 +21,5 @@ "main": "dist/src/index.js", | ||
"dependencies": { | ||
"mutation-testing-report-schema": "1.7.14" | ||
"mutation-testing-report-schema": "2.0.0" | ||
}, | ||
"gitHead": "deb605dda044f7b3df4a8535bfcc3b483b611b9b" | ||
"gitHead": "3588711007ec9367c1f01274e0fd87e3a79cbce1" | ||
} |
62302
1059
+ Addedmutation-testing-report-schema@2.0.0(transitive)
- Removedmutation-testing-report-schema@1.7.14(transitive)