Socket
Socket
Sign inDemoInstall

mutation-testing-metrics

Package Overview
Dependencies
1
Maintainers
2
Versions
35
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 1.7.14 to 2.0.0

5

dist/src/calculateMetrics.d.ts
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

22

dist/src/calculateMetrics.js
"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"
}
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Packages

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc