Best JavaScript code snippet using stryker-parent
4-mutation-test-executor.ts
Source:4-mutation-test-executor.ts
1import { from, partition, merge, Observable, lastValueFrom } from 'rxjs';2import { toArray, map, tap, shareReplay } from 'rxjs/operators';3import { tokens, commonTokens } from '@stryker-mutator/api/plugin';4import { MutantTestCoverage, MutantResult, StrykerOptions, MutantStatus } from '@stryker-mutator/api/core';5import { MutantRunOptions, TestRunner } from '@stryker-mutator/api/test-runner';6import { Logger } from '@stryker-mutator/api/logging';7import { I } from '@stryker-mutator/util';8import { CheckStatus, Checker, CheckResult, PassedCheckResult } from '@stryker-mutator/api/check';9import { coreTokens } from '../di';10import { StrictReporter } from '../reporters/strict-reporter';11import { MutationTestReportHelper } from '../reporters/mutation-test-report-helper';12import { Timer } from '../utils/timer';13import { Pool, ConcurrencyTokenProvider } from '../concurrent';14import { Sandbox } from '../sandbox';15import { DryRunContext } from './3-dry-run-executor';16export interface MutationTestContext extends DryRunContext {17 [coreTokens.testRunnerPool]: I<Pool<TestRunner>>;18 [coreTokens.timeOverheadMS]: number;19 [coreTokens.mutationTestReportHelper]: MutationTestReportHelper;20 [coreTokens.mutantsWithTestCoverage]: MutantTestCoverage[];21}22/**23 * The factor by which hit count from dry run is multiplied to calculate the hit limit for a mutant.24 * This is intentionally a high value to prevent false positives.25 *26 * For example, a property testing library might execute a failing scenario multiple times to determine the smallest possible counterexample.27 * @see https://jsverify.github.io/#minimal-counterexample28 */29const HIT_LIMIT_FACTOR = 100;30export class MutationTestExecutor {31 public static inject = tokens(32 commonTokens.options,33 coreTokens.reporter,34 coreTokens.checkerPool,35 coreTokens.testRunnerPool,36 coreTokens.timeOverheadMS,37 coreTokens.mutantsWithTestCoverage,38 coreTokens.mutationTestReportHelper,39 coreTokens.sandbox,40 commonTokens.logger,41 coreTokens.timer,42 coreTokens.concurrencyTokenProvider43 );44 constructor(45 private readonly options: StrykerOptions,46 private readonly reporter: StrictReporter,47 private readonly checkerPool: I<Pool<Checker>>,48 private readonly testRunnerPool: I<Pool<TestRunner>>,49 private readonly timeOverheadMS: number,50 private readonly matchedMutants: readonly MutantTestCoverage[],51 private readonly mutationTestReportHelper: I<MutationTestReportHelper>,52 private readonly sandbox: I<Sandbox>,53 private readonly log: Logger,54 private readonly timer: I<Timer>,55 private readonly concurrencyTokenProvider: I<ConcurrencyTokenProvider>56 ) {}57 public async execute(): Promise<MutantResult[]> {58 const { ignoredResult$, notIgnoredMutant$ } = this.executeIgnore(from(this.matchedMutants));59 const { passedMutant$, checkResult$ } = this.executeCheck(from(notIgnoredMutant$));60 const { coveredMutant$, noCoverageResult$ } = this.executeNoCoverage(passedMutant$);61 const testRunnerResult$ = this.executeRunInTestRunner(coveredMutant$);62 const results = await lastValueFrom(merge(testRunnerResult$, checkResult$, noCoverageResult$, ignoredResult$).pipe(toArray()));63 this.mutationTestReportHelper.reportAll(results);64 await this.reporter.wrapUp();65 this.logDone();66 return results;67 }68 private executeIgnore(input$: Observable<MutantTestCoverage>) {69 const [ignoredMutant$, notIgnoredMutant$] = partition(input$.pipe(shareReplay()), (mutant) => mutant.status === MutantStatus.Ignored);70 const ignoredResult$ = ignoredMutant$.pipe(map((mutant) => this.mutationTestReportHelper.reportMutantStatus(mutant, MutantStatus.Ignored)));71 return { ignoredResult$, notIgnoredMutant$ };72 }73 private executeNoCoverage(input$: Observable<MutantTestCoverage>) {74 const [noCoverageMatchedMutant$, coveredMutant$] = partition(75 input$.pipe(shareReplay()),76 (mutant) => !mutant.static && (mutant.coveredBy?.length ?? 0) === 077 );78 const noCoverageResult$ = noCoverageMatchedMutant$.pipe(79 map((mutant) => this.mutationTestReportHelper.reportMutantStatus(mutant, MutantStatus.NoCoverage))80 );81 return { noCoverageResult$, coveredMutant$ };82 }83 private executeCheck(input$: Observable<MutantTestCoverage>) {84 const checkTask$ = this.checkerPool85 .schedule(input$, async (checker, mutant) => {86 const checkResult = await checker.check(mutant);87 return {88 checkResult,89 mutant,90 };91 })92 .pipe(93 // Dispose when all checks are completed.94 // This will allow resources to be freed up and more test runners to be spined up.95 tap({96 complete: () => {97 this.checkerPool.dispose();98 this.concurrencyTokenProvider.freeCheckers();99 },100 }),101 shareReplay()102 );103 const [passedCheckResult$, failedCheckResult$] = partition(checkTask$, ({ checkResult }) => checkResult.status === CheckStatus.Passed);104 const checkResult$ = failedCheckResult$.pipe(105 map((failedMutant) =>106 this.mutationTestReportHelper.reportCheckFailed(failedMutant.mutant, failedMutant.checkResult as Exclude<CheckResult, PassedCheckResult>)107 )108 );109 const passedMutant$ = passedCheckResult$.pipe(map(({ mutant }) => mutant));110 return { checkResult$, passedMutant$ };111 }112 private executeRunInTestRunner(input$: Observable<MutantTestCoverage>): Observable<MutantResult> {113 return this.testRunnerPool.schedule(input$, async (testRunner, mutant) => {114 const mutantRunOptions = this.createMutantRunOptions(mutant);115 const result = await testRunner.mutantRun(mutantRunOptions);116 return this.mutationTestReportHelper.reportMutantRunResult(mutant, result);117 });118 }119 private createMutantRunOptions(activeMutant: MutantTestCoverage): MutantRunOptions {120 const timeout = this.options.timeoutFactor * activeMutant.estimatedNetTime + this.options.timeoutMS + this.timeOverheadMS;121 const hitLimit = activeMutant.hitCount === undefined ? undefined : activeMutant.hitCount * HIT_LIMIT_FACTOR;122 return {123 activeMutant,124 timeout,125 testFilter: activeMutant.coveredBy,126 sandboxFileName: this.sandbox.sandboxFileFor(activeMutant.fileName),127 hitLimit,128 disableBail: this.options.disableBail,129 };130 }131 private logDone() {132 this.log.info('Done in %s.', this.timer.humanReadableElapsed());133 }...
Using AI Code Generation
1const { notIgnoredMutant } = require('stryker-parent');2const { notIgnoredMutant } = require('stryker-parent');3const { notIgnoredMutant } = require('stryker-parent');4const { notIgnoredMutant } = require('stryker-parent');5const { notIgnoredMutant } = require('stryker-parent');6const { notIgnoredMutant } = require('stryker-parent');7const { notIgnoredMutant } = require('stryker-parent');8const { notIgnoredMutant } = require('stryker-parent');9const { notIgnoredMutant } = require('stryker-parent');10const { notIgnoredMutant } = require('stryker-parent');11const { notIgnoredMutant } = require('stryker-parent');12const { notIgnoredMutant } = require('stryker-parent');13const { notIgnoredMutant } = require('stryker-parent');14const { notIgnoredMutant } = require('stryker-parent');
Using AI Code Generation
1const strykerParent = require('stryker-parent');2const childProcess = require('child_process');3const path = require('path');4const fs = require('fs');5const child = childProcess.spawn('node', [path.resolve(__dirname, 'child.js')]);6const childStdout = [];7child.stdout.on('data', (data) => {8 childStdout.push(data.toString());9});10child.stdout.on('end', () => {11 const mutant = JSON.parse(childStdout.join(''));12 const notIgnoredMutant = strykerParent.notIgnoredMutant(mutant);13 fs.writeFileSync(path.resolve(__dirname, 'result.json'), JSON.stringify(notIgnoredMutant));14});15const strykerApi = require('stryker-api/core');16const mutant = strykerApi.mutants.createMutant({17});18console.log(JSON.stringify(mutant));19{20 "originalLines": {21 },22}
Using AI Code Generation
1const { Stryker } = require('stryker-parent');2const { ConfigReader } = require('stryker-api/config');3const { getLogger } = require('stryker-api/logging');4const log = getLogger('stryker');5const config = new ConfigReader().readConfig();6const stryker = new Stryker(config);7stryker.runMutationTest().then(() => {8 log.info('Done!');9});10const { Stryker } = require('stryker');11const { ConfigReader } = require('stryker-api/config');12const { getLogger } = require('stryker-api/logging');13const log = getLogger('stryker');14const config = new ConfigReader().readConfig();15const stryker = new Stryker(config);16stryker.runMutationTest().then(() => {17 log.info('Done!');18});19module.exports = ({ env }) => ({20 email: {21 providerOptions: {22 host: env('SMTP_HOST', 'smtp.gmail.com'),23 port: env.int('SMTP_PORT', 587),24 auth: {25 user: env('SMTP_USERNAME'),26 pass: env('SMTP_PASSWORD'),27 },28 },29 settings: {
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.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!