apex-mutation-testing 1.2.0 → 1.3.0-dev-83.21870988968-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 +51 -1
- package/lib/mutator/experimentalSwitchMutator.d.ts +7 -0
- package/lib/mutator/experimentalSwitchMutator.js +57 -0
- package/lib/mutator/experimentalSwitchMutator.js.map +1 -0
- package/lib/reporter/HTMLReporter.js +4 -2
- package/lib/reporter/HTMLReporter.js.map +1 -1
- package/lib/service/mutantGenerator.js +3 -0
- package/lib/service/mutantGenerator.js.map +1 -1
- package/lib/service/mutationTestingService.js +49 -26
- package/lib/service/mutationTestingService.js.map +1 -1
- package/lib/type/ApexMutationTestResult.d.ts +2 -1
- package/npm-shrinkwrap.json +2 -2
- package/oclif.manifest.json +1 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -85,6 +85,56 @@ The plugin currently supports the following mutation operators. If your code doe
|
|
|
85
85
|
| **Null Return** | Replaces object returns with null | `return obj` → `return null` |
|
|
86
86
|
| **Empty Return** | Removes return values for void methods | `return value` → `return` |
|
|
87
87
|
|
|
88
|
+
### Mutation Result Statuses
|
|
89
|
+
|
|
90
|
+
Each mutant is assigned a status after evaluation:
|
|
91
|
+
|
|
92
|
+
#### Killed
|
|
93
|
+
|
|
94
|
+
A **Killed** mutant means your tests detected the mutation and failed as a result. This is the ideal outcome. It proves your tests are actively verifying the behavior that was changed. For example, if `subTotal + tax` is mutated to `subTotal - tax` and your test fails, the mutant is killed.
|
|
95
|
+
|
|
96
|
+
**What to look for:** A high number of killed mutants indicates strong, assertion-rich tests that validate actual logic and branch coverage rather than just executing code paths.
|
|
97
|
+
|
|
98
|
+
#### Survived
|
|
99
|
+
|
|
100
|
+
A **Survived** mutant means the mutation was introduced, your tests ran against it, and they all still passed. This is the most actionable status. It reveals a gap in your test assertions. The code was changed, but no test noticed.
|
|
101
|
+
|
|
102
|
+
**What to look for:** Survived mutants highlight areas where you need stronger assertions. Common causes include:
|
|
103
|
+
- Missing assertions on return values or side effects
|
|
104
|
+
- Tests that only check happy-path structure without verifying computed values
|
|
105
|
+
- Assertions that are too broad (e.g. checking not-null instead of checking the exact value)
|
|
106
|
+
|
|
107
|
+
#### CompileError
|
|
108
|
+
|
|
109
|
+
A **CompileError** mutant means the mutated code failed to compile during deployment, so no tests were run against it. This typically happens when a mutation tool produces syntactically invalid Apex code. You may ignore these and report them as an issue to us.
|
|
110
|
+
|
|
111
|
+
**What to look for:** Compile errors are excluded from the score entirely. They do not indicate a problem with your tests. The mutation simply wasn't valid for that code.
|
|
112
|
+
|
|
113
|
+
#### RuntimeError
|
|
114
|
+
|
|
115
|
+
A **RuntimeError** means an unexpected error occurred during the mutation evaluation. These errors are the result of networking issues, authorization issues, or other issues not directly related to your code.
|
|
116
|
+
|
|
117
|
+
**What to look for:** A high number of runtime errors may indicate connectivity or org stability issues. If you see many runtime errors, consider re-running the mutation test when the environment is more stable to get more accurate results.
|
|
118
|
+
|
|
119
|
+
#### NoCoverage
|
|
120
|
+
|
|
121
|
+
A **NoCoverage** mutant means the mutated line is not covered by any of your test methods. Since the test never executes that line, the mutation cannot be detected. These mutants count against your score the same way survived mutants do.
|
|
122
|
+
|
|
123
|
+
**What to look for:** NoCoverage mutants point to lines your tests never reach. Adding tests that exercise those code paths will both improve your code coverage and your mutation score.
|
|
124
|
+
|
|
125
|
+
#### Mutation Score
|
|
126
|
+
|
|
127
|
+
The mutation score measures how effective your tests are at detecting code changes:
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
Score = (Killed + RuntimeError) / (Killed + RuntimeError + Survived + NoCoverage) * 100
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
- **CompileError** mutants are excluded from the total since they represent invalid mutations, not test gaps.
|
|
134
|
+
- **Survived** and **NoCoverage** mutants lower your score because they represent undetected changes.
|
|
135
|
+
|
|
136
|
+
A higher score means your tests are better at catching real bugs. Aim to reduce survived mutants by adding targeted assertions for the specific logic each surviving mutation affected.
|
|
137
|
+
|
|
88
138
|
<!-- commands -->
|
|
89
139
|
* [`sf apex mutation test run`](#sf-apex-mutation-test-run)
|
|
90
140
|
|
|
@@ -124,7 +174,7 @@ EXAMPLES
|
|
|
124
174
|
$ sf apex mutation test run --apex-class MyClass --test-class MyClassTest
|
|
125
175
|
```
|
|
126
176
|
|
|
127
|
-
_See code: [src/commands/apex/mutation/test/run.ts](https://github.com/scolladon/apex-mutation-testing/blob/v1.
|
|
177
|
+
_See code: [src/commands/apex/mutation/test/run.ts](https://github.com/scolladon/apex-mutation-testing/blob/v1.3.0-dev-83.21870988968-1/src/commands/apex/mutation/test/run.ts)_
|
|
128
178
|
<!-- commandsstop -->
|
|
129
179
|
|
|
130
180
|
## Backlog
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ParserRuleContext } from 'antlr4ts';
|
|
2
|
+
import { BaseListener } from './baseListener.js';
|
|
3
|
+
export declare class ExperimentalSwitchMutator extends BaseListener {
|
|
4
|
+
enterSwitchStatement(ctx: ParserRuleContext): void;
|
|
5
|
+
private isElseCase;
|
|
6
|
+
private createSwapAdjacentValuesMutations;
|
|
7
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { BaseListener } from './baseListener.js';
|
|
2
|
+
export class ExperimentalSwitchMutator extends BaseListener {
|
|
3
|
+
enterSwitchStatement(ctx) {
|
|
4
|
+
const switchCtx = ctx;
|
|
5
|
+
const whenControls = switchCtx.whenControl();
|
|
6
|
+
if (!whenControls || whenControls.length === 0) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const elseCase = whenControls.find(whenCtx => {
|
|
10
|
+
const whenValue = whenCtx.getChild(1);
|
|
11
|
+
return whenValue?.ELSE?.() !== undefined;
|
|
12
|
+
});
|
|
13
|
+
if (elseCase) {
|
|
14
|
+
// Mutation 1: Remove else case entirely
|
|
15
|
+
this.createMutationFromParserRuleContext(elseCase, '');
|
|
16
|
+
// Mutation 2: Duplicate first case block into else block
|
|
17
|
+
const firstNonElseCase = whenControls.find(whenCtx => {
|
|
18
|
+
const whenValue = whenCtx.getChild(1);
|
|
19
|
+
return whenValue?.ELSE?.() === undefined;
|
|
20
|
+
});
|
|
21
|
+
if (firstNonElseCase) {
|
|
22
|
+
const firstCaseBlock = firstNonElseCase.getChild(2);
|
|
23
|
+
const elseBlock = elseCase.getChild(2);
|
|
24
|
+
if (firstCaseBlock?.text && elseBlock) {
|
|
25
|
+
this.createMutationFromParserRuleContext(elseBlock, firstCaseBlock.text);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Mutation 3: Swap adjacent when values
|
|
30
|
+
this.createSwapAdjacentValuesMutations(whenControls);
|
|
31
|
+
}
|
|
32
|
+
isElseCase(whenCtx) {
|
|
33
|
+
const whenValue = whenCtx.getChild(1);
|
|
34
|
+
return whenValue?.ELSE?.() !== undefined;
|
|
35
|
+
}
|
|
36
|
+
createSwapAdjacentValuesMutations(whenControls) {
|
|
37
|
+
const nonElseCases = whenControls.filter(whenCtx => !this.isElseCase(whenCtx));
|
|
38
|
+
for (let i = 0; i < nonElseCases.length - 1; i++) {
|
|
39
|
+
const currentCase = nonElseCases[i];
|
|
40
|
+
const nextCase = nonElseCases[i + 1];
|
|
41
|
+
const currentValue = currentCase.getChild(1);
|
|
42
|
+
const nextValue = nextCase.getChild(1);
|
|
43
|
+
const currentBlock = currentCase.getChild(2);
|
|
44
|
+
const nextBlock = nextCase.getChild(2);
|
|
45
|
+
if (currentValue && nextValue && currentBlock && nextBlock) {
|
|
46
|
+
// Create atomic swap: replace entire span of both when clauses
|
|
47
|
+
// with swapped values (keeping blocks in original positions)
|
|
48
|
+
const originalText = currentCase.text + nextCase.text;
|
|
49
|
+
const swappedText = `when ${nextValue.text} ${currentBlock.text}when ${currentValue.text} ${nextBlock.text}`;
|
|
50
|
+
if (currentCase.start && nextCase.stop) {
|
|
51
|
+
this.createMutation(currentCase.start, nextCase.stop, originalText, swappedText);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=experimentalSwitchMutator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"experimentalSwitchMutator.js","sourceRoot":"","sources":["../../src/mutator/experimentalSwitchMutator.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,7 @@ export class ApexMutationHTMLReporter {
|
|
|
17
17
|
},
|
|
18
18
|
files: {},
|
|
19
19
|
};
|
|
20
|
+
const errorStatuses = new Set(['CompileError', 'RuntimeError']);
|
|
20
21
|
const fileResult = {
|
|
21
22
|
language: 'java',
|
|
22
23
|
source: apexMutationTestResult.sourceFileContent,
|
|
@@ -25,10 +26,11 @@ export class ApexMutationHTMLReporter {
|
|
|
25
26
|
mutatorName: mutant.mutatorName,
|
|
26
27
|
replacement: mutant.replacement,
|
|
27
28
|
status: mutant.status,
|
|
29
|
+
statusReason: mutant.statusReason,
|
|
28
30
|
static: false,
|
|
29
|
-
coveredBy: ['0'],
|
|
31
|
+
coveredBy: errorStatuses.has(mutant.status) ? undefined : ['0'],
|
|
30
32
|
killedBy: mutant.status === 'Killed' ? ['0'] : undefined,
|
|
31
|
-
testsCompleted: 1,
|
|
33
|
+
testsCompleted: errorStatuses.has(mutant.status) ? 0 : 1,
|
|
32
34
|
location: {
|
|
33
35
|
start: {
|
|
34
36
|
line: mutant.location.start.line,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HTMLReporter.js","sourceRoot":"","sources":["../../src/reporter/HTMLReporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAG5B,MAAM,OAAO,wBAAwB;IACnC,KAAK,CAAC,cAAc,CAClB,sBAA8C,EAC9C,YAAoB,SAAS;QAE7B,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,CAAA;QACpE,iEAAiE;QACjE,MAAM,WAAW,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAChD,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,CAAA;IAClE,CAAC;IAEO,oBAAoB,CAAC,sBAA8C;QACzE,MAAM,kBAAkB,GAAG;YACzB,aAAa,EAAE,OAAO;YACtB,MAAM,EAAE,EAAE,EAAE,sCAAsC;YAClD,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE;gBACR,GAAG,EAAE,EAAE;aACR;YACD,KAAK,EAAE,EAAE;SACV,CAAA;QAED,MAAM,UAAU,GAAG;YACjB,QAAQ,EAAE,MAAM;YAChB,MAAM,EAAE,sBAAsB,CAAC,iBAAiB;YAChD,OAAO,EAAE,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACrD,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,KAAK;gBACb,SAAS,EAAE,CAAC,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"HTMLReporter.js","sourceRoot":"","sources":["../../src/reporter/HTMLReporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAG5B,MAAM,OAAO,wBAAwB;IACnC,KAAK,CAAC,cAAc,CAClB,sBAA8C,EAC9C,YAAoB,SAAS;QAE7B,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,CAAA;QACpE,iEAAiE;QACjE,MAAM,WAAW,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAChD,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,CAAA;IAClE,CAAC;IAEO,oBAAoB,CAAC,sBAA8C;QACzE,MAAM,kBAAkB,GAAG;YACzB,aAAa,EAAE,OAAO;YACtB,MAAM,EAAE,EAAE,EAAE,sCAAsC;YAClD,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE;gBACR,GAAG,EAAE,EAAE;aACR;YACD,KAAK,EAAE,EAAE;SACV,CAAA;QAED,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAA;QAE/D,MAAM,UAAU,GAAG;YACjB,QAAQ,EAAE,MAAM;YAChB,MAAM,EAAE,sBAAsB,CAAC,iBAAiB;YAChD,OAAO,EAAE,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACrD,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,MAAM,EAAE,KAAK;gBACb,SAAS,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC/D,QAAQ,EAAE,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;gBACxD,cAAc,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxD,QAAQ,EAAE;oBACR,KAAK,EAAE;wBACL,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI;wBAChC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM;qBACrC;oBACD,GAAG,EAAE;wBACH,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI;wBAC9B,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM;qBACnC;iBACF;aACF,CAAC,CAAC;SACJ,CAAA;QAED,kBAAkB,CAAC,KAAK,CAAC,GAAG,sBAAsB,CAAC,UAAU,MAAM,CAAC;YAClE,UAAU,CAAA;QAEZ,OAAO,kBAAkB,CAAA;IAC3B,CAAC;CACF;AAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,EAAE;IAChC,OAAO;;;;;;;;;;;;;qBAaY,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;;;UAGjD,CAAA;AACV,CAAC,CAAA;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACpC,OAAO,CAAC,CAAA;AACV,CAAC"}
|
|
@@ -5,6 +5,7 @@ import { BoundaryConditionMutator } from '../mutator/boundaryConditionMutator.js
|
|
|
5
5
|
import { ConstructorCallMutator } from '../mutator/constructorCallMutator.js';
|
|
6
6
|
import { EmptyReturnMutator } from '../mutator/emptyReturnMutator.js';
|
|
7
7
|
import { EqualityConditionMutator } from '../mutator/equalityConditionMutator.js';
|
|
8
|
+
import { ExperimentalSwitchMutator } from '../mutator/experimentalSwitchMutator.js';
|
|
8
9
|
import { FalseReturnMutator } from '../mutator/falseReturnMutator.js';
|
|
9
10
|
import { IncrementMutator } from '../mutator/incrementMutator.js';
|
|
10
11
|
import { InvertNegativesMutator } from '../mutator/invertNegativesMutator.js';
|
|
@@ -44,6 +45,7 @@ export class MutantGenerator {
|
|
|
44
45
|
const constructorCallListener = new ConstructorCallMutator();
|
|
45
46
|
const removeConditionalsListener = new RemoveConditionalsMutator();
|
|
46
47
|
const switchListener = new SwitchMutator();
|
|
48
|
+
const experimentalSwitchListener = new ExperimentalSwitchMutator();
|
|
47
49
|
const listener = new MutationListener([
|
|
48
50
|
boundaryListener,
|
|
49
51
|
incrementListener,
|
|
@@ -61,6 +63,7 @@ export class MutantGenerator {
|
|
|
61
63
|
constructorCallListener,
|
|
62
64
|
removeConditionalsListener,
|
|
63
65
|
switchListener,
|
|
66
|
+
experimentalSwitchListener,
|
|
64
67
|
], coveredLines, methodTypeTable);
|
|
65
68
|
ParseTreeWalker.DEFAULT.walk(listener, tree);
|
|
66
69
|
return listener.getMutations();
|
|
@@ -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":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,EACL,SAAS,EACT,UAAU,EAEV,0BAA0B,EAC1B,iBAAiB,EACjB,eAAe,GAChB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAA;AACnF,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAA;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAA;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAA;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAA;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAA;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAA;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAA;AACnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAA;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAA;AAI3E,MAAM,OAAO,eAAe;IAClB,WAAW,CAAoB;IAEhC,cAAc;QACnB,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAEM,OAAO,CACZ,YAAoB,EACpB,YAAyB,EACzB,YAA+B;QAE/B,MAAM,KAAK,GAAG,IAAI,SAAS,CACzB,IAAI,0BAA0B,CAAC,OAAO,EAAE,YAAY,CAAC,CACtD,CAAA;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,eAAe,EAAE,CAAA;QAErC,MAAM,eAAe,GAAG,YAAY,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAA;QAE9D,MAAM,iBAAiB,GAAG,IAAI,gBAAgB,EAAE,CAAA;QAChD,MAAM,gBAAgB,GAAG,IAAI,wBAAwB,EAAE,CAAA;QACvD,MAAM,mBAAmB,GAAG,IAAI,kBAAkB,EAAE,CAAA;QACpD,MAAM,kBAAkB,GAAG,IAAI,iBAAiB,EAAE,CAAA;QAClD,MAAM,mBAAmB,GAAG,IAAI,kBAAkB,EAAE,CAAA;QACpD,MAAM,kBAAkB,GAAG,IAAI,iBAAiB,EAAE,CAAA;QAClD,MAAM,gBAAgB,GAAG,IAAI,wBAAwB,EAAE,CAAA;QACvD,MAAM,kBAAkB,GAAG,IAAI,yBAAyB,EAAE,CAAA;QAC1D,MAAM,uBAAuB,GAAG,IAAI,sBAAsB,EAAE,CAAA;QAC5D,MAAM,uBAAuB,GAAG,IAAI,sBAAsB,EAAE,CAAA;QAC5D,MAAM,gBAAgB,GAAG,IAAI,eAAe,EAAE,CAAA;QAC9C,MAAM,wBAAwB,GAAG,IAAI,uBAAuB,EAAE,CAAA;QAC9D,MAAM,sBAAsB,GAAG,IAAI,qBAAqB,EAAE,CAAA;QAC1D,MAAM,uBAAuB,GAAG,IAAI,sBAAsB,EAAE,CAAA;QAC5D,MAAM,0BAA0B,GAAG,IAAI,yBAAyB,EAAE,CAAA;QAClE,MAAM,cAAc,GAAG,IAAI,aAAa,EAAE,CAAA;QAC1C,MAAM,0BAA0B,GAAG,IAAI,yBAAyB,EAAE,CAAA;QAElE,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CACnC;YACE,gBAAgB;YAChB,iBAAiB;YACjB,gBAAgB;YAChB,mBAAmB;YACnB,kBAAkB;YAClB,mBAAmB;YACnB,kBAAkB;YAClB,kBAAkB;YAClB,uBAAuB;YACvB,uBAAuB;YACvB,gBAAgB;YAChB,wBAAwB;YACxB,sBAAsB;YACtB,uBAAuB;YACvB,0BAA0B;YAC1B,cAAc;YACd,0BAA0B;SAC3B,EACD,YAAY,EACZ,eAAe,CAChB,CAAA;QAED,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,QAA8B,EAAE,IAAI,CAAC,CAAA;QAElE,OAAO,QAAQ,CAAC,YAAY,EAAE,CAAA;IAChC,CAAC;IAEM,MAAM,CAAC,QAAsB;QAClC,qCAAqC;QACrC,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,WAAY,CAAC,CAAA;QAE3D,QAAQ,CAAC,OAAO,CACd,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,EACrC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EACnC,QAAQ,CAAC,WAAW,CACrB,CAAA;QAED,uBAAuB;QACvB,OAAO,QAAQ,CAAC,OAAO,EAAE,CAAA;IAC3B,CAAC;CACF"}
|
|
@@ -2,6 +2,31 @@ import { ApexClassRepository } from '../adapter/apexClassRepository.js';
|
|
|
2
2
|
import { ApexTestRunner } from '../adapter/apexTestRunner.js';
|
|
3
3
|
import { ApexTypeResolver } from './apexTypeResolver.js';
|
|
4
4
|
import { MutantGenerator } from './mutantGenerator.js';
|
|
5
|
+
const errorStrategies = [
|
|
6
|
+
{
|
|
7
|
+
matches: msg => msg.startsWith('Deployment failed:'),
|
|
8
|
+
classify: (msg, targetInfo) => ({
|
|
9
|
+
status: 'CompileError',
|
|
10
|
+
statusReason: msg,
|
|
11
|
+
progressMessage: `Mutation result: compile error at line ${targetInfo.line}`,
|
|
12
|
+
}),
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
matches: msg => msg.includes('LIMIT_USAGE_FOR_NS'),
|
|
16
|
+
classify: msg => ({
|
|
17
|
+
status: 'Killed',
|
|
18
|
+
progressMessage: `Mutation result: mutant killed (${msg})`,
|
|
19
|
+
}),
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
matches: () => true,
|
|
23
|
+
classify: msg => ({
|
|
24
|
+
status: 'RuntimeError',
|
|
25
|
+
statusReason: msg,
|
|
26
|
+
progressMessage: `Mutation result: runtime error (${msg})`,
|
|
27
|
+
}),
|
|
28
|
+
},
|
|
29
|
+
];
|
|
5
30
|
export class MutationTestingService {
|
|
6
31
|
progress;
|
|
7
32
|
spinner;
|
|
@@ -119,28 +144,22 @@ export class MutationTestingService {
|
|
|
119
144
|
}
|
|
120
145
|
catch (error) {
|
|
121
146
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
mutationResults.mutants.push(killedMutant);
|
|
139
|
-
progressMessage = `Mutation result: mutant killed (${errorMessage})`;
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
progressMessage = `Issue while computing "${mutation.replacement}" mutation at line ${targetInfo.line}`;
|
|
143
|
-
}
|
|
147
|
+
const location = this.calculateMutationPosition(mutation, this.apexClassContent);
|
|
148
|
+
const originalText = this.extractMutationOriginalText(mutation);
|
|
149
|
+
const strategy = errorStrategies.find(s => s.matches(errorMessage));
|
|
150
|
+
const classification = strategy.classify(errorMessage, targetInfo);
|
|
151
|
+
mutationResults.mutants.push({
|
|
152
|
+
id: `${this.apexClassName}-${targetInfo.line}-${targetInfo.column}-${targetInfo.tokenIndex}-${Date.now()}`,
|
|
153
|
+
mutatorName: mutation.mutationName,
|
|
154
|
+
status: classification.status,
|
|
155
|
+
...(classification.statusReason && {
|
|
156
|
+
statusReason: classification.statusReason,
|
|
157
|
+
}),
|
|
158
|
+
location,
|
|
159
|
+
replacement: mutation.replacement,
|
|
160
|
+
original: originalText,
|
|
161
|
+
});
|
|
162
|
+
progressMessage = classification.progressMessage;
|
|
144
163
|
}
|
|
145
164
|
++mutationCount;
|
|
146
165
|
this.progress.update(mutationCount, {
|
|
@@ -163,10 +182,14 @@ export class MutationTestingService {
|
|
|
163
182
|
return mutationResults;
|
|
164
183
|
}
|
|
165
184
|
calculateScore(mutationResult) {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
185
|
+
const validMutants = mutationResult.mutants.filter(mutant => mutant.status !== 'CompileError');
|
|
186
|
+
if (validMutants.length === 0) {
|
|
187
|
+
return 0;
|
|
188
|
+
}
|
|
189
|
+
const killedStatuses = new Set(['Killed', 'RuntimeError']);
|
|
190
|
+
return ((validMutants.filter(mutant => killedStatuses.has(mutant.status)).length /
|
|
191
|
+
validMutants.length) *
|
|
192
|
+
100);
|
|
170
193
|
}
|
|
171
194
|
buildMutantResult(mutation, testResult, targetInfo) {
|
|
172
195
|
const mutationStatus = testResult.summary.outcome === 'Passed' ? 'Survived' : 'Killed';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutationTestingService.js","sourceRoot":"","sources":["../../src/service/mutationTestingService.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAK7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"mutationTestingService.js","sourceRoot":"","sources":["../../src/service/mutationTestingService.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,8 @@ export interface ApexMutationTestResult {
|
|
|
5
5
|
mutants: {
|
|
6
6
|
id: string;
|
|
7
7
|
mutatorName: string;
|
|
8
|
-
status: 'Killed' | 'Survived' | 'NoCoverage';
|
|
8
|
+
status: 'Killed' | 'Survived' | 'NoCoverage' | 'CompileError' | 'RuntimeError';
|
|
9
|
+
statusReason?: string;
|
|
9
10
|
location: {
|
|
10
11
|
start: {
|
|
11
12
|
line: number;
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "apex-mutation-testing",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0-dev-83.21870988968-1",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "apex-mutation-testing",
|
|
9
|
-
"version": "1.
|
|
9
|
+
"version": "1.3.0-dev-83.21870988968-1",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@oclif/core": "^4.8.0",
|
package/oclif.manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "apex-mutation-testing",
|
|
3
3
|
"description": "Apex mutation testing plugin",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.3.0-dev-83.21870988968-1",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@oclif/core": "^4.8.0",
|
|
7
7
|
"@salesforce/apex-node": "^8.4.5",
|
|
@@ -67,6 +67,8 @@
|
|
|
67
67
|
"compile": "wireit",
|
|
68
68
|
"dependencies:upgrade": "npx npm-check-updates -u ; npm install ; npm audit fix",
|
|
69
69
|
"deploy:testclasses": "sf project deploy start -d test/classes",
|
|
70
|
+
"devops:cleanup:dev-tag": "./tooling/devops-cleanup.sh",
|
|
71
|
+
"devops:move-tag": "./tooling/devops-movetag.sh",
|
|
70
72
|
"lint": "wireit",
|
|
71
73
|
"lint:dependencies": "wireit",
|
|
72
74
|
"lint:fix": "wireit",
|