apex-mutation-testing 1.6.1 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -4
- package/lib/commands/apex/mutation/test/run.d.ts +1 -0
- package/lib/commands/apex/mutation/test/run.js +4 -0
- package/lib/commands/apex/mutation/test/run.js.map +1 -1
- package/lib/mutator/unaryOperatorInsertionMutator.d.ts +1 -1
- package/lib/mutator/unaryOperatorInsertionMutator.js +12 -17
- package/lib/mutator/unaryOperatorInsertionMutator.js.map +1 -1
- package/lib/service/configReader.js +1 -0
- package/lib/service/configReader.js.map +1 -1
- package/lib/service/exactColoring.d.ts +25 -0
- package/lib/service/exactColoring.js +143 -0
- package/lib/service/exactColoring.js.map +1 -0
- package/lib/service/groupExecutor.d.ts +29 -0
- package/lib/service/groupExecutor.js +194 -0
- package/lib/service/groupExecutor.js.map +1 -0
- package/lib/service/mutantGenerator.d.ts +2 -0
- package/lib/service/mutantGenerator.js +26 -1
- package/lib/service/mutantGenerator.js.map +1 -1
- package/lib/service/mutationGrouper.d.ts +22 -0
- package/lib/service/mutationGrouper.js +130 -0
- package/lib/service/mutationGrouper.js.map +1 -0
- package/lib/service/mutationLocation.d.ts +12 -0
- package/lib/service/mutationLocation.js +54 -0
- package/lib/service/mutationLocation.js.map +1 -0
- package/lib/service/mutationTestingService.d.ts +3 -6
- package/lib/service/mutationTestingService.js +71 -177
- package/lib/service/mutationTestingService.js.map +1 -1
- package/lib/service/timeUtils.d.ts +1 -0
- package/lib/service/timeUtils.js +8 -0
- package/lib/service/timeUtils.js.map +1 -1
- package/lib/type/ApexMutationParameter.d.ts +1 -0
- package/messages/apex.mutation.test.run.md +13 -1
- package/npm-shrinkwrap.json +2487 -4351
- package/oclif.manifest.json +7 -1
- package/package.json +18 -15
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { calculateMutationPosition, extractMutationOriginalText, } from './mutationLocation.js';
|
|
2
|
+
import { formatRemainingTime } from './timeUtils.js';
|
|
3
|
+
// Classify a deploy/test-run error into a per-mutant outcome plus a progress
|
|
4
|
+
// message. The three branches match Salesforce-side failure modes: a compile
|
|
5
|
+
// error from the Tooling API deploy, a governor-limit kill (which is a real
|
|
6
|
+
// kill, not a runtime error), and any other thrown error.
|
|
7
|
+
const classifyError = (error, mutation) => {
|
|
8
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
9
|
+
if (message.startsWith('Deployment failed:')) {
|
|
10
|
+
return {
|
|
11
|
+
status: 'CompileError',
|
|
12
|
+
statusReason: message,
|
|
13
|
+
progressMessage: `Mutation result: compile error at line ${mutation.target.startToken.line}`,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
if (message.includes('LIMIT_USAGE_FOR_NS')) {
|
|
17
|
+
return {
|
|
18
|
+
status: 'Killed',
|
|
19
|
+
progressMessage: `Mutation result: mutant killed (${message})`,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
status: 'RuntimeError',
|
|
24
|
+
statusReason: message,
|
|
25
|
+
progressMessage: `Mutation result: runtime error (${message})`,
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
// Owns per-iteration evaluation: deploy mutated source, run union of covering
|
|
29
|
+
// tests, attribute outcomes per mutation. A singleton group (k=1) is the leaf
|
|
30
|
+
// case — error classification and status determination live here. Multi-mutation
|
|
31
|
+
// groups (k>1) recurse into singletons on any failure (deploy, run, missing
|
|
32
|
+
// outcome). All progress UI for a single iteration is emitted from this class
|
|
33
|
+
// so the lifecycle service stays focused on orchestration.
|
|
34
|
+
export class GroupExecutor {
|
|
35
|
+
apexClass;
|
|
36
|
+
apexClassName;
|
|
37
|
+
apexTestClassName;
|
|
38
|
+
apexClassContent;
|
|
39
|
+
tokenStream;
|
|
40
|
+
testMethodsPerLine;
|
|
41
|
+
mutantGenerator;
|
|
42
|
+
apexTestRunner;
|
|
43
|
+
apexClassRepository;
|
|
44
|
+
progress;
|
|
45
|
+
messages;
|
|
46
|
+
constructor(apexClass, apexClassName, apexTestClassName, apexClassContent, tokenStream, testMethodsPerLine, mutantGenerator, apexTestRunner, apexClassRepository, progress, messages) {
|
|
47
|
+
this.apexClass = apexClass;
|
|
48
|
+
this.apexClassName = apexClassName;
|
|
49
|
+
this.apexTestClassName = apexTestClassName;
|
|
50
|
+
this.apexClassContent = apexClassContent;
|
|
51
|
+
this.tokenStream = tokenStream;
|
|
52
|
+
this.testMethodsPerLine = testMethodsPerLine;
|
|
53
|
+
this.mutantGenerator = mutantGenerator;
|
|
54
|
+
this.apexTestRunner = apexTestRunner;
|
|
55
|
+
this.apexClassRepository = apexClassRepository;
|
|
56
|
+
this.progress = progress;
|
|
57
|
+
this.messages = messages;
|
|
58
|
+
}
|
|
59
|
+
async evaluate(group, completedSoFar, loopStartTime, totalMutations) {
|
|
60
|
+
const remainingText = formatRemainingTime(loopStartTime, completedSoFar, totalMutations);
|
|
61
|
+
this.announceGroup(group, remainingText, completedSoFar);
|
|
62
|
+
const { mutantResults, progressMessage } = await this.evaluateGroup(group, completedSoFar);
|
|
63
|
+
const newCompleted = completedSoFar + group.mutations.length;
|
|
64
|
+
const updatedRemainingText = formatRemainingTime(loopStartTime, newCompleted, totalMutations);
|
|
65
|
+
this.progress.update(newCompleted, {
|
|
66
|
+
info: `${updatedRemainingText}${progressMessage}`,
|
|
67
|
+
});
|
|
68
|
+
return mutantResults;
|
|
69
|
+
}
|
|
70
|
+
announceGroup(group, remainingText, completedSoFar) {
|
|
71
|
+
if (group.mutations.length === 1) {
|
|
72
|
+
const m = group.mutations[0];
|
|
73
|
+
this.progress.update(completedSoFar, {
|
|
74
|
+
info: `${remainingText}Deploying "${m.replacement}" mutation at line ${m.target.startToken.line}`,
|
|
75
|
+
});
|
|
76
|
+
const testMethods = this.testMethodsPerLine.get(m.target.startToken.line);
|
|
77
|
+
if (testMethods) {
|
|
78
|
+
this.progress.update(completedSoFar, {
|
|
79
|
+
info: `${remainingText}Running ${testMethods.size} tests methods for "${m.replacement}" mutation at line ${m.target.startToken.line}`,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const lines = group.mutations
|
|
85
|
+
.map(m => m.target.startToken.line)
|
|
86
|
+
.sort((a, b) => a - b)
|
|
87
|
+
.join(', ');
|
|
88
|
+
this.progress.update(completedSoFar, {
|
|
89
|
+
info: `${remainingText}Evaluating ${group.mutations.length} mutations on lines ${lines}`,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
async evaluateGroup(group, completedSoFar) {
|
|
93
|
+
const mutated = this.mutantGenerator.mutateMany(group.mutations, this.tokenStream);
|
|
94
|
+
let testResult;
|
|
95
|
+
let batchError;
|
|
96
|
+
try {
|
|
97
|
+
await this.apexClassRepository.update({
|
|
98
|
+
Id: this.apexClass.Id,
|
|
99
|
+
Body: mutated,
|
|
100
|
+
});
|
|
101
|
+
testResult = await this.apexTestRunner.runTestMethods(this.apexTestClassName, group.testMethods);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
batchError = error;
|
|
105
|
+
}
|
|
106
|
+
// For k>1, a batch error or a coverage gap (test runner did not report
|
|
107
|
+
// every expected method) makes attribution ambiguous. Recurse with each
|
|
108
|
+
// mutation as its own singleton group; each child call hits the leaf and
|
|
109
|
+
// either succeeds or classifies its error directly.
|
|
110
|
+
if (group.mutations.length > 1 &&
|
|
111
|
+
(batchError !== undefined ||
|
|
112
|
+
this.hasCoverageGap(testResult, group.testMethods))) {
|
|
113
|
+
this.progress.update(completedSoFar, {
|
|
114
|
+
info: this.messages.getMessage('info.groupingFallback', [
|
|
115
|
+
String(group.mutations.length),
|
|
116
|
+
]),
|
|
117
|
+
});
|
|
118
|
+
const fallbackResults = [];
|
|
119
|
+
for (const m of group.mutations) {
|
|
120
|
+
const singleton = {
|
|
121
|
+
mutations: [m],
|
|
122
|
+
// extractCoveredLines guarantees the line is in the map.
|
|
123
|
+
testMethods: this.testMethodsPerLine.get(m.target.startToken.line),
|
|
124
|
+
};
|
|
125
|
+
const { mutantResults } = await this.evaluateGroup(singleton, completedSoFar);
|
|
126
|
+
fallbackResults.push(...mutantResults);
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
mutantResults: fallbackResults,
|
|
130
|
+
progressMessage: `Fallback for group of ${group.mutations.length} complete`,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
// Leaf for k=1 with caught error: classify the error directly. (k>1 with
|
|
134
|
+
// an error was handled above by recursing into singletons.)
|
|
135
|
+
if (batchError !== undefined) {
|
|
136
|
+
const mutation = group.mutations[0];
|
|
137
|
+
const c = classifyError(batchError, mutation);
|
|
138
|
+
return {
|
|
139
|
+
mutantResults: [
|
|
140
|
+
this.buildMutantResult(mutation, c.status, c.statusReason),
|
|
141
|
+
],
|
|
142
|
+
progressMessage: c.progressMessage,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
// Success path. Per-method outcomes when present (required for k>1
|
|
146
|
+
// attribution); fall back to summary-derived outcome when the test
|
|
147
|
+
// runner did not report per-method data (legacy behaviour for k=1).
|
|
148
|
+
const outcomeByMethod = new Map((testResult.tests ?? []).map(t => [t.methodName, t.outcome]));
|
|
149
|
+
const summaryFallback = testResult.summary.outcome === 'Passed' ? 'Pass' : 'Fail';
|
|
150
|
+
const mutantResults = group.mutations.map(m => {
|
|
151
|
+
const myMethods = this.testMethodsPerLine.get(m.target.startToken.line) ??
|
|
152
|
+
new Set();
|
|
153
|
+
// No covering tests (only possible in mocked or uncovered-line scenarios)
|
|
154
|
+
// → fall back to the summary outcome so behaviour matches the legacy
|
|
155
|
+
// evaluateMutation path.
|
|
156
|
+
const killed = myMethods.size === 0
|
|
157
|
+
? summaryFallback !== 'Pass'
|
|
158
|
+
: [...myMethods].some(name => (outcomeByMethod.get(name) ?? summaryFallback) !== 'Pass');
|
|
159
|
+
return this.buildMutantResult(m, killed ? 'Killed' : 'Survived');
|
|
160
|
+
});
|
|
161
|
+
return {
|
|
162
|
+
mutantResults,
|
|
163
|
+
progressMessage: this.buildGroupProgressMessage(mutantResults),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
hasCoverageGap(testResult, expectedMethods) {
|
|
167
|
+
const reported = new Set(testResult.tests.map(t => t.methodName));
|
|
168
|
+
for (const name of expectedMethods) {
|
|
169
|
+
if (!reported.has(name))
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
buildGroupProgressMessage(mutantResults) {
|
|
175
|
+
if (mutantResults.length === 1) {
|
|
176
|
+
return `Mutation result: ${mutantResults[0].status === 'Survived' ? 'zombie' : 'mutant killed'}`;
|
|
177
|
+
}
|
|
178
|
+
const killed = mutantResults.filter(r => r.status === 'Killed').length;
|
|
179
|
+
return `Group of ${mutantResults.length} evaluated: ${killed} killed, ${mutantResults.length - killed} survived`;
|
|
180
|
+
}
|
|
181
|
+
buildMutantResult(mutation, status, statusReason) {
|
|
182
|
+
const start = mutation.target.startToken;
|
|
183
|
+
return {
|
|
184
|
+
id: `${this.apexClassName}-${start.line}-${start.charPositionInLine}-${start.tokenIndex}-${Date.now()}`,
|
|
185
|
+
mutatorName: mutation.mutationName,
|
|
186
|
+
status,
|
|
187
|
+
...(statusReason && { statusReason }),
|
|
188
|
+
location: calculateMutationPosition(mutation),
|
|
189
|
+
replacement: mutation.replacement,
|
|
190
|
+
original: extractMutationOriginalText(mutation, this.apexClassContent),
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=groupExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groupExecutor.js","sourceRoot":"","sources":["../../src/service/groupExecutor.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAEpD,6EAA6E;AAC7E,6EAA6E;AAC7E,4EAA4E;AAC5E,0DAA0D;AAC1D,MAAM,aAAa,GAAG,CACpB,KAAc,EACd,QAAsB,EAKtB,EAAE;IACF,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACtE,IAAI,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC7C,OAAO;YACL,MAAM,EAAE,cAAc;YACtB,YAAY,EAAE,OAAO;YACrB,eAAe,EAAE,0CAA0C,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE;SAC7F,CAAA;IACH,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC3C,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,eAAe,EAAE,mCAAmC,OAAO,GAAG;SAC/D,CAAA;IACH,CAAC;IACD,OAAO;QACL,MAAM,EAAE,cAAc;QACtB,YAAY,EAAE,OAAO;QACrB,eAAe,EAAE,mCAAmC,OAAO,GAAG;KAC/D,CAAA;AACH,CAAC,CAAA;AAED,8EAA8E;AAC9E,8EAA8E;AAC9E,iFAAiF;AACjF,4EAA4E;AAC5E,8EAA8E;AAC9E,2DAA2D;AAC3D,MAAM,OAAO,aAAa;IAEL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAXnB,YACmB,SAAoB,EACpB,aAAqB,EACrB,iBAAyB,EACzB,gBAAwB,EACxB,WAA8B,EAC9B,kBAA4C,EAC5C,eAAgC,EAChC,cAA8B,EAC9B,mBAAwC,EACxC,QAAkB,EAClB,QAA0B;QAV1B,cAAS,GAAT,SAAS,CAAW;QACpB,kBAAa,GAAb,aAAa,CAAQ;QACrB,sBAAiB,GAAjB,iBAAiB,CAAQ;QACzB,qBAAgB,GAAhB,gBAAgB,CAAQ;QACxB,gBAAW,GAAX,WAAW,CAAmB;QAC9B,uBAAkB,GAAlB,kBAAkB,CAA0B;QAC5C,oBAAe,GAAf,eAAe,CAAiB;QAChC,mBAAc,GAAd,cAAc,CAAgB;QAC9B,wBAAmB,GAAnB,mBAAmB,CAAqB;QACxC,aAAQ,GAAR,QAAQ,CAAU;QAClB,aAAQ,GAAR,QAAQ,CAAkB;IAC1C,CAAC;IAEG,KAAK,CAAC,QAAQ,CACnB,KAAoB,EACpB,cAAsB,EACtB,aAAqB,EACrB,cAAsB;QAEtB,MAAM,aAAa,GAAG,mBAAmB,CACvC,aAAa,EACb,cAAc,EACd,cAAc,CACf,CAAA;QACD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,cAAc,CAAC,CAAA;QAExD,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CACjE,KAAK,EACL,cAAc,CACf,CAAA;QAED,MAAM,YAAY,GAAG,cAAc,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAA;QAC5D,MAAM,oBAAoB,GAAG,mBAAmB,CAC9C,aAAa,EACb,YAAY,EACZ,cAAc,CACf,CAAA;QACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE;YACjC,IAAI,EAAE,GAAG,oBAAoB,GAAG,eAAe,EAAE;SAClD,CAAC,CAAA;QACF,OAAO,aAAa,CAAA;IACtB,CAAC;IAEO,aAAa,CACnB,KAAoB,EACpB,aAAqB,EACrB,cAAsB;QAEtB,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAC5B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE;gBACnC,IAAI,EAAE,GAAG,aAAa,cAAc,CAAC,CAAC,WAAW,sBAAsB,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE;aAClG,CAAC,CAAA;YACF,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;YACzE,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE;oBACnC,IAAI,EAAE,GAAG,aAAa,WAAW,WAAW,CAAC,IAAI,uBAAuB,CAAC,CAAC,WAAW,sBAAsB,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE;iBACtI,CAAC,CAAA;YACJ,CAAC;YACD,OAAM;QACR,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS;aAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;aAClC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;aACrB,IAAI,CAAC,IAAI,CAAC,CAAA;QACb,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE;YACnC,IAAI,EAAE,GAAG,aAAa,cAAc,KAAK,CAAC,SAAS,CAAC,MAAM,uBAAuB,KAAK,EAAE;SACzF,CAAC,CAAA;IACJ,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,KAAoB,EACpB,cAAsB;QAKtB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAC7C,KAAK,CAAC,SAAS,EACf,IAAI,CAAC,WAAW,CACjB,CAAA;QACD,IAAI,UAAkC,CAAA;QACtC,IAAI,UAAmB,CAAA;QACvB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;gBACpC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,EAAY;gBAC/B,IAAI,EAAE,OAAO;aACd,CAAC,CAAA;YACF,UAAU,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CACnD,IAAI,CAAC,iBAAiB,EACtB,KAAK,CAAC,WAAW,CAClB,CAAA;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,UAAU,GAAG,KAAK,CAAA;QACpB,CAAC;QAED,uEAAuE;QACvE,wEAAwE;QACxE,yEAAyE;QACzE,oDAAoD;QACpD,IACE,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;YAC1B,CAAC,UAAU,KAAK,SAAS;gBACvB,IAAI,CAAC,cAAc,CAAC,UAAW,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,EACtD,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE;gBACnC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,uBAAuB,EAAE;oBACtD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;iBAC/B,CAAC;aACH,CAAC,CAAA;YACF,MAAM,eAAe,GAAsC,EAAE,CAAA;YAC7D,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBAChC,MAAM,SAAS,GAAkB;oBAC/B,SAAS,EAAE,CAAC,CAAC,CAAC;oBACd,yDAAyD;oBACzD,WAAW,EAAE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAE;iBACpE,CAAA;gBACD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAChD,SAAS,EACT,cAAc,CACf,CAAA;gBACD,eAAe,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAA;YACxC,CAAC;YACD,OAAO;gBACL,aAAa,EAAE,eAAe;gBAC9B,eAAe,EAAE,yBAAyB,KAAK,CAAC,SAAS,CAAC,MAAM,WAAW;aAC5E,CAAA;QACH,CAAC;QAED,yEAAyE;QACzE,4DAA4D;QAC5D,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YACnC,MAAM,CAAC,GAAG,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;YAC7C,OAAO;gBACL,aAAa,EAAE;oBACb,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,YAAY,CAAC;iBAC3D;gBACD,eAAe,EAAE,CAAC,CAAC,eAAe;aACnC,CAAA;QACH,CAAC;QAED,mEAAmE;QACnE,mEAAmE;QACnE,oEAAoE;QACpE,MAAM,eAAe,GAAG,IAAI,GAAG,CAC7B,CAAC,UAAW,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAC9D,CAAA;QACD,MAAM,eAAe,GACnB,UAAW,CAAC,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;QAC5D,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAC5C,MAAM,SAAS,GACb,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;gBACrD,IAAI,GAAG,EAAU,CAAA;YACnB,0EAA0E;YAC1E,qEAAqE;YACrE,yBAAyB;YACzB,MAAM,MAAM,GACV,SAAS,CAAC,IAAI,KAAK,CAAC;gBAClB,CAAC,CAAC,eAAe,KAAK,MAAM;gBAC5B,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CACjB,IAAI,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,KAAK,MAAM,CAClE,CAAA;YACP,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;QAClE,CAAC,CAAC,CAAA;QAEF,OAAO;YACL,aAAa;YACb,eAAe,EAAE,IAAI,CAAC,yBAAyB,CAAC,aAAa,CAAC;SAC/D,CAAA;IACH,CAAC;IAEO,cAAc,CACpB,UAAsB,EACtB,eAA4B;QAE5B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAA;QACjE,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAA;QACtC,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAEO,yBAAyB,CAC/B,aAAgD;QAEhD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,oBAAoB,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,EAAE,CAAA;QAClG,CAAC;QACD,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAA;QACtE,OAAO,YAAY,aAAa,CAAC,MAAM,eAAe,MAAM,YAAY,aAAa,CAAC,MAAM,GAAG,MAAM,WAAW,CAAA;IAClH,CAAC;IAEO,iBAAiB,CACvB,QAAsB,EACtB,MAA+D,EAC/D,YAAqB;QAErB,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAA;QACxC,OAAO;YACL,EAAE,EAAE,GAAG,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,kBAAkB,IAAI,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE;YACvG,WAAW,EAAE,QAAQ,CAAC,YAAY;YAClC,MAAM;YACN,GAAG,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,CAAC;YACrC,QAAQ,EAAE,yBAAyB,CAAC,QAAQ,CAAC;YAC7C,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,QAAQ,EAAE,2BAA2B,CAAC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC;SACvE,CAAA;IACH,CAAC;CACF"}
|
|
@@ -17,6 +17,8 @@ export declare class MutantGenerator {
|
|
|
17
17
|
exclude?: string[];
|
|
18
18
|
}, skipPatterns?: RE2Instance[], allowedLines?: Set<number>, preParsed?: PreParsedInput): MutantGeneratorComputeResult;
|
|
19
19
|
mutate(mutation: ApexMutation, tokenStream: CommonTokenStream): string;
|
|
20
|
+
mutateMany(mutations: ReadonlyArray<ApexMutation>, tokenStream: CommonTokenStream): string;
|
|
21
|
+
private assertNonOverlappingRanges;
|
|
20
22
|
private filterRegistry;
|
|
21
23
|
private warnUnknownMutators;
|
|
22
24
|
}
|
|
@@ -183,10 +183,35 @@ export class MutantGenerator {
|
|
|
183
183
|
return { mutations: listener.getMutations(), tokenStream };
|
|
184
184
|
}
|
|
185
185
|
mutate(mutation, tokenStream) {
|
|
186
|
+
return this.mutateMany([mutation], tokenStream);
|
|
187
|
+
}
|
|
188
|
+
// Apply N non-overlapping mutations on a single rewriter, producing one
|
|
189
|
+
// mutated source. Used by the grouping path to deploy a batch of independent
|
|
190
|
+
// mutations in one Tooling-API class update.
|
|
191
|
+
//
|
|
192
|
+
// Caller guarantees mutations have non-overlapping token ranges (groupers
|
|
193
|
+
// enforce this naturally — same-line mutations always share covering tests
|
|
194
|
+
// and therefore conflict in the conflict graph). Defensively asserted.
|
|
195
|
+
mutateMany(mutations, tokenStream) {
|
|
196
|
+
this.assertNonOverlappingRanges(mutations);
|
|
186
197
|
const rewriter = new TokenStreamRewriter(tokenStream);
|
|
187
|
-
|
|
198
|
+
for (const mutation of mutations) {
|
|
199
|
+
rewriter.replace(mutation.target.startToken.tokenIndex, mutation.target.endToken.tokenIndex, mutation.replacement);
|
|
200
|
+
}
|
|
188
201
|
return rewriter.getText();
|
|
189
202
|
}
|
|
203
|
+
assertNonOverlappingRanges(mutations) {
|
|
204
|
+
if (mutations.length < 2)
|
|
205
|
+
return;
|
|
206
|
+
const sorted = [...mutations].sort((a, b) => a.target.startToken.tokenIndex - b.target.startToken.tokenIndex);
|
|
207
|
+
for (let i = 1; i < sorted.length; ++i) {
|
|
208
|
+
const prevEnd = sorted[i - 1].target.endToken.tokenIndex;
|
|
209
|
+
const currStart = sorted[i].target.startToken.tokenIndex;
|
|
210
|
+
if (currStart <= prevEnd) {
|
|
211
|
+
throw new Error(`mutateMany: overlapping token ranges (token ${currStart} ≤ ${prevEnd})`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
190
215
|
filterRegistry(mutatorFilter) {
|
|
191
216
|
if (!mutatorFilter) {
|
|
192
217
|
return MUTATOR_REGISTRY;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutantGenerator.js","sourceRoot":"","sources":["../../src/service/mutantGenerator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mutantGenerator.js","sourceRoot":"","sources":["../../src/service/mutantGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ApexMutation } from '../type/ApexMutation.js';
|
|
2
|
+
export interface MutationGroup {
|
|
3
|
+
mutations: ApexMutation[];
|
|
4
|
+
testMethods: Set<string>;
|
|
5
|
+
}
|
|
6
|
+
export interface GroupingResult {
|
|
7
|
+
groups: MutationGroup[];
|
|
8
|
+
lowerBound: number;
|
|
9
|
+
}
|
|
10
|
+
interface GroupingInternals {
|
|
11
|
+
adjacency: number[][];
|
|
12
|
+
witness: number[];
|
|
13
|
+
coloring: number[];
|
|
14
|
+
tests: ReadonlyArray<Set<string>>;
|
|
15
|
+
}
|
|
16
|
+
type GroupingResultWithInternals = GroupingResult & {
|
|
17
|
+
internals: GroupingInternals;
|
|
18
|
+
};
|
|
19
|
+
export declare const groupMutations: (mutations: ReadonlyArray<ApexMutation>, testMethodsPerLine: Map<number, Set<string>>) => GroupingResult;
|
|
20
|
+
export declare const groupMutationsWithInternals: (mutations: ReadonlyArray<ApexMutation>, testMethodsPerLine: Map<number, Set<string>>) => GroupingResultWithInternals;
|
|
21
|
+
export declare const assembleGroups: (mutations: ReadonlyArray<ApexMutation>, tests: ReadonlyArray<Set<string>>, color: ReadonlyArray<number>) => MutationGroup[];
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { buildAdjacency } from './exactColoring.js';
|
|
2
|
+
// Partition mutations into the smallest number of conflict-free groups using
|
|
3
|
+
// DSATUR (Brélaz, 1979): the strongest polynomial-time graph-coloring
|
|
4
|
+
// heuristic. At each step, color the uncolored vertex whose **saturation**
|
|
5
|
+
// (count of distinct colors already used by its colored neighbors) is highest;
|
|
6
|
+
// tiebreak on raw degree, then input order. Provably optimal on bipartite
|
|
7
|
+
// graphs and several other structured classes; near-optimal on the rest.
|
|
8
|
+
//
|
|
9
|
+
// Each color = one batched deployment + one batched test run. Two mutations
|
|
10
|
+
// share a color iff their covering tests are pairwise disjoint, so test
|
|
11
|
+
// outcomes can be reverse-mapped per mutation without ambiguity.
|
|
12
|
+
//
|
|
13
|
+
// The conflict graph is the intersection graph of per-mutation test sets:
|
|
14
|
+
// every test method T induces a clique among the mutations it covers. The
|
|
15
|
+
// largest such test-induced set is a free lower bound on the chromatic
|
|
16
|
+
// number; pre-coloring it before DSATUR runs both gives the heuristic a
|
|
17
|
+
// maximally-constrained start and surfaces an optimality certificate
|
|
18
|
+
// (groups.length === lowerBound implies provably optimal).
|
|
19
|
+
export const groupMutations = (mutations, testMethodsPerLine) => {
|
|
20
|
+
const { groups, lowerBound } = groupMutationsWithInternals(mutations, testMethodsPerLine);
|
|
21
|
+
return { groups, lowerBound };
|
|
22
|
+
};
|
|
23
|
+
// Like `groupMutations` but additionally exposes the conflict graph, witness
|
|
24
|
+
// clique, DSATUR coloring, and per-mutation test sets. Used by the optional
|
|
25
|
+
// SAT-based exact-coloring path so it can re-use the work without rebuilding
|
|
26
|
+
// the graph.
|
|
27
|
+
export const groupMutationsWithInternals = (mutations, testMethodsPerLine) => {
|
|
28
|
+
const n = mutations.length;
|
|
29
|
+
if (n === 0) {
|
|
30
|
+
return {
|
|
31
|
+
groups: [],
|
|
32
|
+
lowerBound: 0,
|
|
33
|
+
internals: { adjacency: [], witness: [], coloring: [], tests: [] },
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const tests = mutations.map(m => testMethodsPerLine.get(m.target.startToken.line) ?? new Set());
|
|
37
|
+
const adjacency = buildAdjacency(tests);
|
|
38
|
+
const degree = adjacency.map(neighbors => neighbors.length);
|
|
39
|
+
const witness = computeLowerBoundClique(tests);
|
|
40
|
+
const color = new Array(n).fill(-1);
|
|
41
|
+
const saturation = new Array(n).fill(0);
|
|
42
|
+
const neighborColors = Array.from({ length: n }, () => new Set());
|
|
43
|
+
for (let k = 0; k < witness.length; ++k) {
|
|
44
|
+
const v = witness[k];
|
|
45
|
+
color[v] = k;
|
|
46
|
+
propagate(v, k, adjacency, color, neighborColors, saturation);
|
|
47
|
+
}
|
|
48
|
+
for (let step = 0; step < n - witness.length; ++step) {
|
|
49
|
+
const pick = pickNextVertex(color, saturation, degree);
|
|
50
|
+
const chosenColor = pickSmallestAvailableColor(neighborColors[pick]);
|
|
51
|
+
color[pick] = chosenColor;
|
|
52
|
+
propagate(pick, chosenColor, adjacency, color, neighborColors, saturation);
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
groups: assembleGroups(mutations, tests, color),
|
|
56
|
+
lowerBound: witness.length,
|
|
57
|
+
internals: { adjacency, witness, coloring: color, tests },
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
// Returns the indices of the largest test-induced clique. Each test method T
|
|
61
|
+
// induces a clique among {m : T ∈ tests(m)}; we pick the largest such bucket.
|
|
62
|
+
// O(n · k) where k = avg tests per mutation. Indexes by mutation (not by
|
|
63
|
+
// line) so two mutations sharing the same Set reference still produce two
|
|
64
|
+
// distinct witness entries.
|
|
65
|
+
const computeLowerBoundClique = (tests) => {
|
|
66
|
+
const testToMutations = new Map();
|
|
67
|
+
for (let i = 0; i < tests.length; ++i) {
|
|
68
|
+
for (const t of tests[i]) {
|
|
69
|
+
const bucket = testToMutations.get(t);
|
|
70
|
+
if (bucket === undefined)
|
|
71
|
+
testToMutations.set(t, [i]);
|
|
72
|
+
else
|
|
73
|
+
bucket.push(i);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
let best = [];
|
|
77
|
+
for (const indices of testToMutations.values()) {
|
|
78
|
+
if (indices.length > best.length)
|
|
79
|
+
best = indices;
|
|
80
|
+
}
|
|
81
|
+
// Stable canonical order: ascending by mutation index. Combined with the
|
|
82
|
+
// strict-`>` tiebreak in pickNextVertex, makes the entire pipeline
|
|
83
|
+
// deterministic for fixed input.
|
|
84
|
+
return best.slice().sort((a, b) => a - b);
|
|
85
|
+
};
|
|
86
|
+
const propagate = (v, c, adjacency, color, neighborColors, saturation) => {
|
|
87
|
+
for (const neighbor of adjacency[v]) {
|
|
88
|
+
if (color[neighbor] === -1 && !neighborColors[neighbor].has(c)) {
|
|
89
|
+
neighborColors[neighbor].add(c);
|
|
90
|
+
++saturation[neighbor];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
// Strict `>` comparisons mean equal-key candidates retain the first-encountered
|
|
95
|
+
// pick — which is the lowest unprocessed index. Switching to `>=` would
|
|
96
|
+
// silently invert determinism on every tied pair; keep the contract.
|
|
97
|
+
const pickNextVertex = (color, saturation, degree) => {
|
|
98
|
+
let pick = -1;
|
|
99
|
+
for (let i = 0; i < color.length; ++i) {
|
|
100
|
+
if (color[i] !== -1)
|
|
101
|
+
continue;
|
|
102
|
+
if (pick === -1 ||
|
|
103
|
+
saturation[i] > saturation[pick] ||
|
|
104
|
+
(saturation[i] === saturation[pick] && degree[i] > degree[pick])) {
|
|
105
|
+
pick = i;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return pick;
|
|
109
|
+
};
|
|
110
|
+
const pickSmallestAvailableColor = (neighborColors) => {
|
|
111
|
+
let candidate = 0;
|
|
112
|
+
while (neighborColors.has(candidate)) {
|
|
113
|
+
++candidate;
|
|
114
|
+
}
|
|
115
|
+
return candidate;
|
|
116
|
+
};
|
|
117
|
+
export const assembleGroups = (mutations, tests, color) => {
|
|
118
|
+
const groups = [];
|
|
119
|
+
for (let i = 0; i < mutations.length; ++i) {
|
|
120
|
+
const c = color[i];
|
|
121
|
+
while (groups.length <= c) {
|
|
122
|
+
groups.push({ mutations: [], testMethods: new Set() });
|
|
123
|
+
}
|
|
124
|
+
groups[c].mutations.push(mutations[i]);
|
|
125
|
+
for (const t of tests[i])
|
|
126
|
+
groups[c].testMethods.add(t);
|
|
127
|
+
}
|
|
128
|
+
return groups;
|
|
129
|
+
};
|
|
130
|
+
//# sourceMappingURL=mutationGrouper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutationGrouper.js","sourceRoot":"","sources":["../../src/service/mutationGrouper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ApexMutation } from '../type/ApexMutation.js';
|
|
2
|
+
export declare const calculateMutationPosition: (mutation: ApexMutation) => {
|
|
3
|
+
start: {
|
|
4
|
+
line: number;
|
|
5
|
+
column: number;
|
|
6
|
+
};
|
|
7
|
+
end: {
|
|
8
|
+
line: number;
|
|
9
|
+
column: number;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
export declare const extractMutationOriginalText: (mutation: ApexMutation, sourceContent: string) => string;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Advance a 1-indexed (line, column) cursor through `text`, returning the
|
|
2
|
+
// position immediately AFTER the last character. Handles tokens whose text
|
|
3
|
+
// spans newlines (multi-line string literals, block comments).
|
|
4
|
+
//
|
|
5
|
+
// Used to compute the Stryker `end` position for a mutation: ANTLR tokens
|
|
6
|
+
// expose `line` and `charPositionInLine` for the START of the token but not
|
|
7
|
+
// past the end; walking `endToken.text` closes that gap without needing a
|
|
8
|
+
// separate line-offset index over the whole source.
|
|
9
|
+
const advancePosition = (text, startLine, startColumn) => {
|
|
10
|
+
let line = startLine;
|
|
11
|
+
let column = startColumn;
|
|
12
|
+
for (let i = 0; i < text.length; i++) {
|
|
13
|
+
if (text.charCodeAt(i) === 10 /* \n */) {
|
|
14
|
+
line++;
|
|
15
|
+
column = 1;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
column++;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return { line, column };
|
|
22
|
+
};
|
|
23
|
+
export const calculateMutationPosition = (mutation) => {
|
|
24
|
+
const start = mutation.target.startToken;
|
|
25
|
+
const end = mutation.target.endToken;
|
|
26
|
+
if (start.startIndex === undefined ||
|
|
27
|
+
end.stopIndex === undefined ||
|
|
28
|
+
end.text === undefined) {
|
|
29
|
+
throw new Error(`Failed to calculate position for mutation: ${mutation.mutationName}`);
|
|
30
|
+
}
|
|
31
|
+
// ANTLR tokens expose the position of the FIRST character directly.
|
|
32
|
+
// The Stryker `end` position is exclusive (one past the last char), so
|
|
33
|
+
// we walk endToken.text to advance from the end token's own start.
|
|
34
|
+
// This correctly handles tokens that span newlines (multi-line string
|
|
35
|
+
// literals, block comments).
|
|
36
|
+
return {
|
|
37
|
+
start: {
|
|
38
|
+
line: start.line,
|
|
39
|
+
column: start.charPositionInLine + 1,
|
|
40
|
+
},
|
|
41
|
+
end: advancePosition(end.text, end.line, end.charPositionInLine + 1),
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
export const extractMutationOriginalText = (mutation, sourceContent) => {
|
|
45
|
+
const start = mutation.target.startToken;
|
|
46
|
+
const end = mutation.target.endToken;
|
|
47
|
+
if (start.startIndex !== undefined &&
|
|
48
|
+
end.stopIndex !== undefined &&
|
|
49
|
+
sourceContent) {
|
|
50
|
+
return sourceContent.substring(start.startIndex, end.stopIndex + 1);
|
|
51
|
+
}
|
|
52
|
+
throw new Error(`Failed to extract original text for mutation: ${mutation.mutationName}`);
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=mutationLocation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutationLocation.js","sourceRoot":"","sources":["../../src/service/mutationLocation.ts"],"names":[],"mappings":"AAEA,0EAA0E;AAC1E,2EAA2E;AAC3E,+DAA+D;AAC/D,EAAE;AACF,0EAA0E;AAC1E,4EAA4E;AAC5E,0EAA0E;AAC1E,oDAAoD;AACpD,MAAM,eAAe,GAAG,CACtB,IAAY,EACZ,SAAiB,EACjB,WAAmB,EACe,EAAE;IACpC,IAAI,IAAI,GAAG,SAAS,CAAA;IACpB,IAAI,MAAM,GAAG,WAAW,CAAA;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC;YACvC,IAAI,EAAE,CAAA;YACN,MAAM,GAAG,CAAC,CAAA;QACZ,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,CAAA;QACV,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AACzB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,QAAsB,EAItB,EAAE;IACF,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAA;IACxC,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAA;IAEpC,IACE,KAAK,CAAC,UAAU,KAAK,SAAS;QAC9B,GAAG,CAAC,SAAS,KAAK,SAAS;QAC3B,GAAG,CAAC,IAAI,KAAK,SAAS,EACtB,CAAC;QACD,MAAM,IAAI,KAAK,CACb,8CAA8C,QAAQ,CAAC,YAAY,EAAE,CACtE,CAAA;IACH,CAAC;IAED,oEAAoE;IACpE,uEAAuE;IACvE,mEAAmE;IACnE,sEAAsE;IACtE,6BAA6B;IAC7B,OAAO;QACL,KAAK,EAAE;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,CAAC,kBAAkB,GAAG,CAAC;SACrC;QACD,GAAG,EAAE,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,kBAAkB,GAAG,CAAC,CAAC;KACrE,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,QAAsB,EACtB,aAAqB,EACb,EAAE;IACV,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAA;IACxC,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAA;IAEpC,IACE,KAAK,CAAC,UAAU,KAAK,SAAS;QAC9B,GAAG,CAAC,SAAS,KAAK,SAAS;QAC3B,aAAa,EACb,CAAC;QACD,OAAO,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;IACrE,CAAC;IAED,MAAM,IAAI,KAAK,CACb,iDAAiD,QAAQ,CAAC,YAAY,EAAE,CACzE,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -16,12 +16,12 @@ export declare class MutationTestingService {
|
|
|
16
16
|
protected readonly excludeTestMethods: string[] | undefined;
|
|
17
17
|
private readonly skipPatterns;
|
|
18
18
|
private readonly allowedLines;
|
|
19
|
+
private readonly mutationGroupingEnabled;
|
|
19
20
|
private apexClassContent;
|
|
20
|
-
constructor(progress: Progress, spinner: Spinner, connection: Connection, { apexClassName, apexTestClassName, dryRun, includeMutators, excludeMutators, includeTestMethods, excludeTestMethods, skipPatterns, lines, }: ApexMutationParameter, messages: Messages<string>);
|
|
21
|
+
constructor(progress: Progress, spinner: Spinner, connection: Connection, { apexClassName, apexTestClassName, dryRun, includeMutators, excludeMutators, includeTestMethods, excludeTestMethods, skipPatterns, lines, mutationGrouping, }: ApexMutationParameter, messages: Messages<string>);
|
|
21
22
|
process(): Promise<ApexMutationTestResult>;
|
|
23
|
+
private planGroups;
|
|
22
24
|
calculateScore(mutationResult: ApexMutationTestResult): number;
|
|
23
|
-
private buildMutantResult;
|
|
24
|
-
private calculateMutationPosition;
|
|
25
25
|
private filterTestMethods;
|
|
26
26
|
private createAdapters;
|
|
27
27
|
private fetchApexClass;
|
|
@@ -35,8 +35,5 @@ export declare class MutationTestingService {
|
|
|
35
35
|
private displayTimeEstimate;
|
|
36
36
|
private buildDryRunResult;
|
|
37
37
|
private executeMutationLoop;
|
|
38
|
-
private evaluateMutation;
|
|
39
|
-
private formatRemainingTime;
|
|
40
38
|
private rollback;
|
|
41
|
-
private extractMutationOriginalText;
|
|
42
39
|
}
|