How to use testToIdentifyingKey method in stryker-parent

Best JavaScript code snippet using stryker-parent

incremental-differ.ts

Source:incremental-differ.ts Github

copy

Full Screen

...68 const { oldCoverageByMutantKey: oldCoverageTestKeysByMutantKey, oldKilledByMutantKey: oldKilledTestKeysByMutantKey } =69 collectOldKilledAndCoverageMatrix();70 const oldTestKeys = new Set([...oldTestsById.values()].map(({ key }) => key));71 const newTestKeys = new Set(72 [...testCoverage.testsById].map(([, test]) => testToIdentifyingKey(test, toRelativeNormalizedFileName(test.fileName)))73 );74 // Create a dictionary to more easily get test information75 const testInfoByKey = collectCurrentTestInfo();76 // Mark which tests are added77 for (const [key, { relativeFileName }] of testInfoByKey) {78 if (!oldTestKeys.has(key)) {79 testStatisticsCollector.count(relativeFileName, 'added');80 }81 }82 // Make sure that tests that didn't run this time around aren't forgotten83 for (const [84 testKey,85 {86 test: { name, location },87 relativeFileName,88 },89 ] of oldTestInfoByKey) {90 if (!testInfoByKey.has(testKey)) {91 const test: TestResult = {92 status: TestStatus.Success,93 id: testKey,94 name,95 startPosition: location?.start,96 timeSpentMs: 0,97 fileName: path.resolve(relativeFileName),98 };99 testInfoByKey.set(testKey, { test, relativeFileName: relativeFileName });100 testCoverage.addTest(test);101 }102 }103 // Done with preparations, time to map over the mutants104 let reusedMutantCount = 0;105 const currentMutantKeys = new Set<string>();106 const mutants = currentMutants.map((mutant) => {107 const relativeFileName = toRelativeNormalizedFileName(mutant.fileName);108 const mutantKey = mutantToIdentifyingKey(mutant, relativeFileName);109 currentMutantKeys.add(mutantKey);110 if (!mutant.status && !this.options.force) {111 const oldMutant = reusableMutantsByKey.get(mutantKey);112 if (oldMutant) {113 const coveringTests = testCoverage.forMutant(mutant.id);114 const killedByTestKeys = oldKilledTestKeysByMutantKey.get(mutantKey);115 if (mutantCanBeReused(mutant, oldMutant, mutantKey, coveringTests, killedByTestKeys)) {116 reusedMutantCount++;117 const { status, statusReason, testsCompleted } = oldMutant;118 return {119 ...mutant,120 status,121 statusReason,122 testsCompleted,123 coveredBy: [...(coveringTests ?? [])].map(({ id }) => id),124 killedBy: testKeysToId(killedByTestKeys),125 };126 }127 } else {128 mutantStatisticsCollector.count(relativeFileName, 'added');129 }130 }131 return mutant;132 });133 // Make sure that old mutants that didn't run this time around aren't forgotten134 for (const [mutantKey, oldResult] of reusableMutantsByKey) {135 // Do an additional check to see if the mutant is in mutated range.136 //137 // For example:138 // ```diff139 // - return a || b;140 // + return a && b;141 // ```142 // The conditional expression mutator here decides to _not_ mutate b to `false` the second time around. (even though the text of "b" itself didn't change)143 // Not doing this additional check would result in a sticky mutant that is never removed144 if (!currentMutantKeys.has(mutantKey) && !this.isInMutatedScope(oldResult.relativeFileName, oldResult)) {145 const coverage = oldCoverageTestKeysByMutantKey.get(mutantKey) ?? [];146 const killed = oldKilledTestKeysByMutantKey.get(mutantKey) ?? [];147 const coveredBy = testKeysToId(coverage);148 const killedBy = testKeysToId(killed);149 const reusedMutant = {150 ...oldResult,151 id: mutantKey,152 fileName: path.resolve(oldResult.relativeFileName),153 replacement: oldResult.replacement ?? oldResult.mutatorName,154 coveredBy,155 killedBy,156 };157 mutants.push(reusedMutant);158 testCoverage.addCoverage(reusedMutant.id, coveredBy);159 }160 }161 if (this.logger.isInfoEnabled()) {162 const testInfo = testCoverage.hasCoverage ? `\n\tTests:\t\t${testStatisticsCollector.createTotalsReport()}` : '';163 this.logger.info(164 `Incremental report:\n\tMutants:\t${mutantStatisticsCollector.createTotalsReport()}` +165 testInfo +166 `\n\tResult:\t\t${chalk.yellowBright(reusedMutantCount)} of ${currentMutants.length} mutant result(s) are reused.`167 );168 }169 if (this.logger.isDebugEnabled()) {170 const lineSeparator = '\n\t\t';171 const noChanges = 'No changes';172 const detailedMutantSummary = `${lineSeparator}${mutantStatisticsCollector.createDetailedReport().join(lineSeparator) || noChanges}`;173 const detailedTestsSummary = `${lineSeparator}${testStatisticsCollector.createDetailedReport().join(lineSeparator) || noChanges}`;174 this.logger.debug(`Detailed incremental report:\n\tMutants: ${detailedMutantSummary}\n\tTests: ${detailedTestsSummary}`);175 }176 return mutants;177 function testKeysToId(testKeys: Iterable<string> | undefined) {178 return [...(testKeys ?? [])]179 .map((id) => testInfoByKey.get(id))180 .filter(notEmpty)181 .map(({ test: { id } }) => id);182 }183 function collectReusableMutantsByKey(log: Logger) {184 return new Map(185 Object.entries(files).flatMap(([fileName, oldFile]) => {186 const relativeFileName = toRelativeNormalizedFileName(fileName);187 const currentFileSource = currentRelativeFiles.get(relativeFileName);188 if (currentFileSource) {189 log.trace('Diffing %s', relativeFileName);190 const { results, removeCount } = performFileDiff(oldFile.source, currentFileSource, oldFile.mutants);191 mutantStatisticsCollector.count(relativeFileName, 'removed', removeCount);192 return results.map((m) => [193 mutantToIdentifyingKey(m, relativeFileName),194 {195 ...m,196 relativeFileName,197 },198 ]);199 }200 mutantStatisticsCollector.count(relativeFileName, 'removed', oldFile.mutants.length);201 // File has since been deleted, these mutants are not reused202 return [];203 })204 );205 }206 function collectReusableTestInfo(log: Logger) {207 const byId = new Map<string, { relativeFileName: string; test: TestDefinition; key: string }>();208 const byKey = new Map<string, TestInfo>();209 Object.entries(testFiles ?? {}).forEach(([fileName, oldTestFile]) => {210 const relativeFileName = toRelativeNormalizedFileName(fileName);211 const currentFileSource = currentRelativeFiles.get(relativeFileName);212 if (currentFileSource !== undefined && oldTestFile.source !== undefined) {213 log.trace('Diffing %s', relativeFileName);214 const locatedTests = closeLocations(oldTestFile);215 const { results, removeCount } = performFileDiff(oldTestFile.source, currentFileSource, locatedTests);216 testStatisticsCollector.count(relativeFileName, 'removed', removeCount);217 results.forEach((test) => {218 const key = testToIdentifyingKey(test, relativeFileName);219 const testInfo = { key, test, relativeFileName };220 byId.set(test.id, testInfo);221 byKey.set(key, testInfo);222 });223 } else {224 // No sources to compare, we should do our best with the info we do have225 oldTestFile.tests.map((test) => {226 const key = testToIdentifyingKey(test, relativeFileName);227 const testInfo = { key, test, relativeFileName };228 byId.set(test.id, testInfo);229 byKey.set(key, testInfo);230 });231 }232 });233 return { byId, byKey };234 }235 function collectOldKilledAndCoverageMatrix() {236 const oldCoverageByMutantKey = new Map<string, Set<string>>();237 const oldKilledByMutantKey = new Map<string, Set<string>>();238 for (const [key, mutant] of reusableMutantsByKey) {239 const killedRow = new Set(mutant.killedBy?.map((testId) => oldTestsById.get(testId)?.key).filter(notEmpty));240 const coverageRow = new Set(mutant.coveredBy?.map((testId) => oldTestsById.get(testId)?.key).filter(notEmpty));241 killedRow.forEach((killed) => coverageRow.add(killed));242 oldCoverageByMutantKey.set(key, coverageRow);243 oldKilledByMutantKey.set(key, killedRow);244 }245 return { oldCoverageByMutantKey, oldKilledByMutantKey };246 }247 function collectCurrentTestInfo() {248 const byTestKey = new Map<string, { relativeFileName: string; test: TestResult }>();249 for (const testResult of testCoverage.testsById.values()) {250 const relativeFileName = toRelativeNormalizedFileName(testResult.fileName);251 const key = testToIdentifyingKey(testResult, relativeFileName);252 const info = { relativeFileName, test: testResult, key: key };253 byTestKey.set(key, info);254 }255 return byTestKey;256 }257 function mutantCanBeReused(258 mutant: Mutant,259 oldMutant: schema.MutantResult,260 mutantKey: string,261 coveringTests: ReadonlySet<TestResult> | undefined,262 oldKillingTests: Set<string> | undefined263 ): boolean {264 if (!testCoverage.hasCoverage) {265 // This is the best we can do when the test runner didn't report coverage.266 // We assume that all mutant test results can be reused,267 // End users can use --force to force retesting of certain mutants268 return true;269 }270 if (oldMutant.status === MutantStatus.Ignored) {271 // Was previously ignored, but not anymore, we need to run it now272 return false;273 }274 const testsDiff = diffTestCoverage(mutant.id, oldCoverageTestKeysByMutantKey.get(mutantKey), coveringTests);275 if (oldMutant.status === MutantStatus.Killed) {276 if (oldKillingTests) {277 for (const killingTest of oldKillingTests) {278 if (testsDiff.get(killingTest) === 'same') {279 return true;280 }281 }282 }283 // Killing tests has changed or no longer exists284 return false;285 }286 for (const action of testsDiff.values()) {287 if (action === 'added') {288 // A non-killed mutant got a new test, we need to run it289 return false;290 }291 }292 // A non-killed mutant did not get new tests, no need to rerun it293 return true;294 }295 /**296 * Determines if there is a diff between old test coverage and new test coverage.297 */298 function diffTestCoverage(299 mutantId: string,300 oldCoveringTestKeys: Set<string> | undefined,301 newCoveringTests: ReadonlySet<TestResult> | undefined302 ): Map<string, DiffAction> {303 const result = new Map<string, DiffAction>();304 if (newCoveringTests) {305 for (const newTest of newCoveringTests) {306 const key = testToIdentifyingKey(newTest, toRelativeNormalizedFileName(newTest.fileName));307 result.set(key, oldCoveringTestKeys?.has(key) ? 'same' : 'added');308 }309 }310 if (oldCoveringTestKeys) {311 const isStatic = testCoverage.hasStaticCoverage(mutantId);312 for (const oldTestKey of oldCoveringTestKeys) {313 if (!result.has(oldTestKey)) {314 // Static mutants might not have covering tests, but the test might still exist315 if (isStatic && newTestKeys.has(oldTestKey)) {316 result.set(oldTestKey, 'same');317 } else {318 result.set(oldTestKey, 'removed');319 }320 }321 }322 }323 return result;324 }325 }326}327/**328 * Finds the diff of mutants and tests. Removes mutants / tests that no longer exist (changed or removed). Updates locations of mutants or tests that do still exist.329 * @param oldCode The old code to use for the diff330 * @param newCode The new (current) code to use for the diff331 * @param items The mutants or tests to be looked . These will be treated as immutable.332 * @returns A list of items with updated locations, without items that are changed.333 */334function performFileDiff<T extends { location: Location }>(oldCode: string, newCode: string, items: T[]): { results: T[]; removeCount: number } {335 const oldSourceNormalized = normalizeLineEndings(oldCode);336 const currentSrcNormalized = normalizeLineEndings(newCode);337 const diffChanges = diffMatchPatch.diff_main(oldSourceNormalized, currentSrcNormalized);338 const toDo = new Set(items.map((m) => ({ ...m, location: deepClone(m.location) })));339 const [added, removed] = [1, -1];340 const done: T[] = [];341 const currentPosition: Position = { column: 0, line: 0 };342 let removeCount = 0;343 for (const [change, text] of diffChanges) {344 if (toDo.size === 0) {345 // There are more changes, but nothing left to update.346 break;347 }348 const offset = calculateOffset(text);349 if (change === added) {350 for (const test of toDo) {351 const { location } = test;352 if (gte(currentPosition, location.start) && gte(location.end, currentPosition)) {353 // This item cannot be reused, code was added here354 removeCount++;355 toDo.delete(test);356 } else {357 locationAdd(location, offset, currentPosition.line === location.start.line);358 }359 }360 positionMove(currentPosition, offset);361 } else if (change === removed) {362 for (const item of toDo) {363 const {364 location: { start },365 } = item;366 const endOffset = positionMove({ ...currentPosition }, offset);367 if (gte(endOffset, start)) {368 // This item cannot be reused, the code it covers has changed369 removeCount++;370 toDo.delete(item);371 } else {372 locationAdd(item.location, negate(offset), currentPosition.line === start.line);373 }374 }375 } else {376 positionMove(currentPosition, offset);377 toDo.forEach((item) => {378 const { end } = item.location;379 if (gte(currentPosition, end)) {380 // We're done with this item, it can be reused381 toDo.delete(item);382 done.push(item);383 }384 });385 }386 }387 done.push(...toDo);388 return { results: done, removeCount };389}390/**391 * A greater-than-equals implementation for positions392 */393function gte(a: Position, b: Position) {394 return a.line > b.line || (a.line === b.line && a.column >= b.column);395}396function locationIncluded(haystack: Location, needle: Location) {397 const startIncluded = gte(needle.start, haystack.start);398 const endIncluded = gte(haystack.end, needle.end);399 return startIncluded && endIncluded;400}401function deepClone(loc: Location): Location {402 return { start: { ...loc.start }, end: { ...loc.end } };403}404/**405 * Reduces a mutant to a string that identifies the mutant across reports.406 * Consists of the relative file name, mutator name, replacement, and location407 */408function mutantToIdentifyingKey(409 { mutatorName, replacement, location: { start, end } }: Pick<Mutant, 'location' | 'mutatorName'> & { replacement?: string },410 relativeFileName: string411) {412 return `${relativeFileName}@${start.line}:${start.column}-${end.line}:${end.column}\n${mutatorName}: ${replacement}`;413}414function testToIdentifyingKey(415 { name, location, startPosition }: Pick<schema.TestDefinition, 'location' | 'name'> & Pick<TestResult, 'startPosition'>,416 relativeFileName: string | undefined417) {418 startPosition = startPosition ?? location?.start ?? { line: 0, column: 0 };419 return `${relativeFileName}@${startPosition.line}:${startPosition.column}\n${name}`;420}421export function toRelativeNormalizedFileName(fileName: string | undefined): string {422 return normalizeFileName(path.relative(process.cwd(), fileName ?? ''));423}424function calculateOffset(text: string): Position {425 const pos: Position = { line: 0, column: 0 };426 for (const char of text) {427 if (char === '\n') {428 pos.line++;...

Full Screen

Full Screen

Using AI Code Generation

copy

Full Screen

1const strykerParent = require('stryker-parent');2const test = require('test');3const testToIdentifyingKey = strykerParent.testToIdentifyingKey;4const identifyingKey = testToIdentifyingKey(test);5const strykerParent = require('stryker-parent');6const test = require('test');7const testToIdentifyingKey = strykerParent.testToIdentifyingKey;8const identifyingKey = testToIdentifyingKey(test);9const strykerParent = require('stryker-parent');10const test = require('test');11const testToIdentifyingKey = strykerParent.testToIdentifyingKey;12const identifyingKey = testToIdentifyingKey(test);13const strykerParent = require('stryker-parent');14const test = require('test');15const testToIdentifyingKey = strykerParent.testToIdentifyingKey;16const identifyingKey = testToIdentifyingKey(test);17const strykerParent = require('stryker-parent');18const test = require('test');19const testToIdentifyingKey = strykerParent.testToIdentifyingKey;20const identifyingKey = testToIdentifyingKey(test);21const strykerParent = require('stryker-parent');22const test = require('test');23const testToIdentifyingKey = strykerParent.testToIdentifyingKey;24const identifyingKey = testToIdentifyingKey(test);25const strykerParent = require('stryker-parent');26const test = require('test');27const testToIdentifyingKey = strykerParent.testToIdentifyingKey;28const identifyingKey = testToIdentifyingKey(test);29const strykerParent = require('stryker-parent');30const test = require('test');31const testToIdentifyingKey = strykerParent.testToIdentifyingKey;32const identifyingKey = testToIdentifyingKey(test);

Full Screen

Using AI Code Generation

copy

Full Screen

1var testToIdentifyingKey = require('stryker-parent').testToIdentifyingKey;2var test = {id: 123, name: 'my test'};3var key = testToIdentifyingKey(test);4var testToIdentifyingKey = require('stryker-parent').testToIdentifyingKey;5var test = {id: 123, name: 'my test'};6var key = testToIdentifyingKey(test);7var testToIdentifyingKey = require('stryker-parent').testToIdentifyingKey;8var test = {id: 123, name: 'my test'};9var key = testToIdentifyingKey(test);10var testToIdentifyingKey = require('stryker-parent').testToIdentifyingKey;11var test = {id: 123, name: 'my test'};12var key = testToIdentifyingKey(test);13var testToIdentifyingKey = require('stryker-parent').testToIdentifyingKey;14var test = {id: 123, name: 'my test'};15var key = testToIdentifyingKey(test);16var testToIdentifyingKey = require('stryker-parent').testToIdentifyingKey;17var test = {id: 123, name: 'my test'};18var key = testToIdentifyingKey(test);19var testToIdentifyingKey = require('stryker-parent').testToIdentifyingKey;20var test = {id: 123, name: 'my test'};21var key = testToIdentifyingKey(test);

Full Screen

Using AI Code Generation

copy

Full Screen

1const { testToIdentifyingKey } = require('@stryker-mutator/util');2const test = {3};4console.log(testToIdentifyingKey(test));5const { testToIdentifyingKey } = require('@stryker-mutator/util');6const test = {7};8console.log(testToIdentifyingKey(test));9const { testToIdentifyingKey } = require('@stryker-mutator/util');10const test = {11};12console.log(testToIdentifyingKey(test));13const { testToIdentifyingKey } = require('@stryker-mutator/util');14const test = {15};16console.log(testToIdentifyingKey(test));17const { testToIdentifyingKey } = require('@stryker-mutator/util');18const test = {

Full Screen

Using AI Code Generation

copy

Full Screen

1var stryker = require('stryker-parent');2var test = require('test');3var testIdentifier = stryker.testToIdentifyingKey(test);4var stryker = require('stryker');5var test = require('test');6var testIdentifier = stryker.testToIdentifyingKey(test);7var stryker = require('stryker-api');8var test = require('test');9var testIdentifier = stryker.testToIdentifyingKey(test);10var stryker = require('stryker-mocha-runner');11var test = require('test');12var testIdentifier = stryker.testToIdentifyingKey(test);13var stryker = require('stryker-mocha-framework');14var test = require('test');15var testIdentifier = stryker.testToIdentifyingKey(test);16var stryker = require('stryker-jasmine-runner');17var test = require('test');18var testIdentifier = stryker.testToIdentifyingKey(test);19var stryker = require('stryker-jasmine-framework');20var test = require('test');21var testIdentifier = stryker.testToIdentifyingKey(test);22var stryker = require('stryker-karma-runner');23var test = require('test');24var testIdentifier = stryker.testToIdentifyingKey(test);25var stryker = require('stryker-karma-framework');26var test = require('test');27var testIdentifier = stryker.testToIdentifyingKey(test);28var stryker = require('stryker-typescript');29var test = require('test');30var testIdentifier = stryker.testToIdentifyingKey(test);

Full Screen

Using AI Code Generation

copy

Full Screen

1var testToIdentifyingKey = require('stryker-parent').testToIdentifyingKey;2var testFile = 'test.js';3var identifyingKey = testToIdentifyingKey(testFile);4console.log(identifyingKey);5var identifyingKeyToTest = require('stryker-parent').identifyingKeyToTest;6var identifyingKey = 'test.js';7var testFile = identifyingKeyToTest(identifyingKey);8console.log(testFile);9var testToIdentifyingKey = require('stryker-parent').testToIdentifyingKey;10var testFile = 'test.js';11var identifyingKey = testToIdentifyingKey(testFile);12console.log(identifyingKey);13var identifyingKeyToTest = require('stryker-parent').identifyingKeyToTest;14var identifyingKey = 'test.js';15var testFile = identifyingKeyToTest(identifyingKey);16console.log(testFile);17var testToIdentifyingKey = require('stryker-parent').testToIdentifyingKey;18var testFile = 'test.js';19var identifyingKey = testToIdentifyingKey(testFile);20console.log(identifyingKey);21var identifyingKeyToTest = require('stryker-parent').identifyingKeyToTest;22var identifyingKey = 'test.js';23var testFile = identifyingKeyToTest(identifyingKey);24console.log(testFile);

Full Screen

Using AI Code Generation

copy

Full Screen

1const { testToIdentifyingKey } = require('stryker-parent');2console.log(testToIdentifyingKey('test.js', 'testName'));3const { testToIdentifyingKey } = require('stryker-parent');4console.log(testToIdentifyingKey('test.js', 'testName'));5const { testToIdentifyingKey } = require('stryker-parent');6console.log(testToIdentifyingKey('test.js', 'testName'));7const { testToIdentifyingKey } = require('stryker-parent');8console.log(testToIdentifyingKey('test.js', 'testName'));9const { testToIdentifyingKey } = require('stryker-parent');10console.log(testToIdentifyingKey('test.js', 'testName'));11const { testToIdentifyingKey } = require('stryker-parent');12console.log(testToIdentifyingKey('test.js', 'testName'));13const { testToIdentifyingKey } = require('stryker-parent');14console.log(testToIdentifyingKey('test.js', 'testName'));15const { testToIdentifyingKey } = require('stryker-parent');16console.log(testToIdentifyingKey('test.js', 'testName'));17const { testToIdentifyingKey } = require('

Full Screen

Using AI Code Generation

copy

Full Screen

1var stryker = require('stryker-parent');2var test = require('test');3var testKey = stryker.testToIdentifyingKey(test);4var stryker = require('stryker-parent');5var test = require('test');6var testKey = stryker.testToIdentifyingKey(test);

Full Screen

Using AI Code Generation

copy

Full Screen

1var test = require('stryker-parent').testToIdentifyingKey;2console.log(test('test.js', 'name of test'));3var test = require('stryker-parent').testToIdentifyingKey;4console.log(test('test.js', 'name of test'));5var test = require('stryker-parent').testToIdentifyingKey;6console.log(test('test.js', 'name of test'));7var test = require('stryker-parent').testToIdentifyingKey;8console.log(test('test.js', 'name of test'));9var test = require('stryker-parent').testToIdentifyingKey;10console.log(test('test.js', 'name of test'));11var test = require('stryker-parent').testToIdentifyingKey;12console.log(test('test.js', 'name of test'));13var test = require('stryker-parent').testToIdentifyingKey;14console.log(test('test.js', 'name of test'));15var test = require('stryker-parent').testToIdentifyingKey;16console.log(test('test.js', 'name of test'));17var test = require('stryker-parent').testToIdentifyingKey;18console.log(test('test.js', 'name of test'));

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run stryker-parent automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful