apex-mutation-testing 1.1.0 → 1.2.0-dev-53.17212276159-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 +3 -2
- package/lib/adapter/apexClassRepository.d.ts +5 -1
- package/lib/adapter/apexClassRepository.js +23 -1
- package/lib/adapter/apexClassRepository.js.map +1 -1
- package/lib/adapter/apexTestRunner.d.ts +7 -2
- package/lib/adapter/apexTestRunner.js +28 -7
- package/lib/adapter/apexTestRunner.js.map +1 -1
- package/lib/mutator/arithmeticOperatorMutator.d.ts +9 -0
- package/lib/mutator/arithmeticOperatorMutator.js +36 -0
- package/lib/mutator/arithmeticOperatorMutator.js.map +1 -0
- package/lib/mutator/baseListener.d.ts +5 -0
- package/lib/mutator/baseListener.js +21 -0
- package/lib/mutator/baseListener.js.map +1 -1
- package/lib/mutator/boundaryConditionMutator.d.ts +3 -3
- package/lib/mutator/boundaryConditionMutator.js +21 -19
- package/lib/mutator/boundaryConditionMutator.js.map +1 -1
- package/lib/mutator/emptyReturnMutator.d.ts +7 -0
- package/lib/mutator/emptyReturnMutator.js +94 -0
- package/lib/mutator/emptyReturnMutator.js.map +1 -0
- package/lib/mutator/equalityConditionMutator.d.ts +6 -0
- package/lib/mutator/equalityConditionMutator.js +25 -0
- package/lib/mutator/equalityConditionMutator.js.map +1 -0
- package/lib/mutator/falseReturnMutator.d.ts +5 -0
- package/lib/mutator/falseReturnMutator.js +29 -0
- package/lib/mutator/falseReturnMutator.js.map +1 -0
- package/lib/mutator/incrementMutator.d.ts +1 -1
- package/lib/mutator/incrementMutator.js +6 -10
- package/lib/mutator/incrementMutator.js.map +1 -1
- package/lib/mutator/methodTypeListener.d.ts +12 -0
- package/lib/mutator/methodTypeListener.js +114 -0
- package/lib/mutator/methodTypeListener.js.map +1 -0
- package/lib/mutator/mutationListener.d.ts +4 -2
- package/lib/mutator/mutationListener.js +11 -1
- package/lib/mutator/mutationListener.js.map +1 -1
- package/lib/mutator/nullReturnMutator.d.ts +5 -0
- package/lib/mutator/nullReturnMutator.js +26 -0
- package/lib/mutator/nullReturnMutator.js.map +1 -0
- package/lib/mutator/returnTypeAwareBaseListener.d.ts +12 -0
- package/lib/mutator/returnTypeAwareBaseListener.js +24 -0
- package/lib/mutator/returnTypeAwareBaseListener.js.map +1 -0
- package/lib/mutator/trueReturnMutator.d.ts +5 -0
- package/lib/mutator/trueReturnMutator.js +29 -0
- package/lib/mutator/trueReturnMutator.js.map +1 -0
- package/lib/reporter/HTMLReporter.js +1 -1
- package/lib/reporter/HTMLReporter.js.map +1 -1
- package/lib/service/apexTypeResolver.d.ts +9 -0
- package/lib/service/apexTypeResolver.js +18 -0
- package/lib/service/apexTypeResolver.js.map +1 -0
- package/lib/service/mutantGenerator.d.ts +4 -1
- package/lib/service/mutantGenerator.js +30 -6
- package/lib/service/mutantGenerator.js.map +1 -1
- package/lib/service/mutationTestingService.d.ts +4 -0
- package/lib/service/mutationTestingService.js +105 -26
- package/lib/service/mutationTestingService.js.map +1 -1
- package/lib/type/ApexMethod.d.ts +29 -0
- package/lib/type/ApexMethod.js +24 -0
- package/lib/type/ApexMethod.js.map +1 -0
- package/lib/type/ApexMutation.d.ts +7 -2
- package/lib/type/MetadataComponentDependency.d.ts +6 -0
- package/lib/type/MetadataComponentDependency.js +2 -0
- package/lib/type/MetadataComponentDependency.js.map +1 -0
- package/messages/apex.mutation.test.run.md +1 -1
- package/npm-shrinkwrap.json +3992 -3112
- package/oclif.manifest.json +2 -2
- package/package.json +22 -21
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { ApexType } from '../type/ApexMethod.js';
|
|
2
|
+
export class MethodTypeListener {
|
|
3
|
+
_apexClassTypes;
|
|
4
|
+
_standardEntityTypes;
|
|
5
|
+
_customObjectTypes;
|
|
6
|
+
_methodTypeTable = new Map();
|
|
7
|
+
constructor(_apexClassTypes, _standardEntityTypes, _customObjectTypes) {
|
|
8
|
+
this._apexClassTypes = _apexClassTypes;
|
|
9
|
+
this._standardEntityTypes = _standardEntityTypes;
|
|
10
|
+
this._customObjectTypes = _customObjectTypes;
|
|
11
|
+
}
|
|
12
|
+
getMethodTypeTable() {
|
|
13
|
+
return this._methodTypeTable;
|
|
14
|
+
}
|
|
15
|
+
enterMethodDeclaration(ctx) {
|
|
16
|
+
if (ctx.children && ctx.children.length >= 4) {
|
|
17
|
+
const returnType = ctx.children[0].text;
|
|
18
|
+
const methodName = ctx.children[1].text;
|
|
19
|
+
if (returnType && methodName) {
|
|
20
|
+
const lowerReturnType = returnType.toLowerCase();
|
|
21
|
+
let elementType;
|
|
22
|
+
if (lowerReturnType.startsWith('list<') ||
|
|
23
|
+
lowerReturnType.startsWith('set<')) {
|
|
24
|
+
const match = returnType.match(/<(.+)>/);
|
|
25
|
+
if (match && match[1]) {
|
|
26
|
+
elementType = match[1];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
else if (lowerReturnType.startsWith('map<')) {
|
|
30
|
+
const match = returnType.match(/<(.+),(.+)>/);
|
|
31
|
+
if (match && match[1] && match[2]) {
|
|
32
|
+
elementType = `${match[1]},${match[2]}`;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else if (returnType.endsWith('[]')) {
|
|
36
|
+
elementType = returnType.substring(0, returnType.length - 2);
|
|
37
|
+
}
|
|
38
|
+
let type = ApexType.VOID;
|
|
39
|
+
if (lowerReturnType === 'void') {
|
|
40
|
+
type = ApexType.VOID;
|
|
41
|
+
}
|
|
42
|
+
else if (lowerReturnType === 'boolean') {
|
|
43
|
+
type = ApexType.BOOLEAN;
|
|
44
|
+
}
|
|
45
|
+
else if (lowerReturnType === 'integer') {
|
|
46
|
+
type = ApexType.INTEGER;
|
|
47
|
+
}
|
|
48
|
+
else if (lowerReturnType === 'long') {
|
|
49
|
+
type = ApexType.LONG;
|
|
50
|
+
}
|
|
51
|
+
else if (lowerReturnType === 'double') {
|
|
52
|
+
type = ApexType.DOUBLE;
|
|
53
|
+
}
|
|
54
|
+
else if (lowerReturnType === 'decimal') {
|
|
55
|
+
type = ApexType.DECIMAL;
|
|
56
|
+
}
|
|
57
|
+
else if (lowerReturnType === 'string') {
|
|
58
|
+
type = ApexType.STRING;
|
|
59
|
+
}
|
|
60
|
+
else if (lowerReturnType === 'id') {
|
|
61
|
+
type = ApexType.ID;
|
|
62
|
+
}
|
|
63
|
+
else if (lowerReturnType === 'blob') {
|
|
64
|
+
type = ApexType.BLOB;
|
|
65
|
+
}
|
|
66
|
+
else if (lowerReturnType === 'date') {
|
|
67
|
+
type = ApexType.DATE;
|
|
68
|
+
}
|
|
69
|
+
else if (lowerReturnType === 'datetime') {
|
|
70
|
+
type = ApexType.DATETIME;
|
|
71
|
+
}
|
|
72
|
+
else if (lowerReturnType === 'time') {
|
|
73
|
+
type = ApexType.TIME;
|
|
74
|
+
}
|
|
75
|
+
else if (lowerReturnType === 'sobject') {
|
|
76
|
+
type = ApexType.SOBJECT;
|
|
77
|
+
}
|
|
78
|
+
else if (lowerReturnType === 'object') {
|
|
79
|
+
type = ApexType.OBJECT;
|
|
80
|
+
}
|
|
81
|
+
else if (lowerReturnType.startsWith('list<') ||
|
|
82
|
+
returnType.endsWith('[]')) {
|
|
83
|
+
type = ApexType.LIST;
|
|
84
|
+
}
|
|
85
|
+
else if (lowerReturnType.startsWith('set<')) {
|
|
86
|
+
type = ApexType.SET;
|
|
87
|
+
}
|
|
88
|
+
else if (lowerReturnType.startsWith('map<')) {
|
|
89
|
+
type = ApexType.MAP;
|
|
90
|
+
}
|
|
91
|
+
else if (this._apexClassTypes.has(returnType)) {
|
|
92
|
+
type = ApexType.APEX_CLASS;
|
|
93
|
+
}
|
|
94
|
+
else if (this._standardEntityTypes.has(returnType)) {
|
|
95
|
+
type = ApexType.STANDARD_ENTITY;
|
|
96
|
+
}
|
|
97
|
+
else if (this._customObjectTypes.has(returnType)) {
|
|
98
|
+
type = ApexType.CUSTOM_OBJECT;
|
|
99
|
+
}
|
|
100
|
+
const methodInfo = {
|
|
101
|
+
returnType,
|
|
102
|
+
startLine: ctx.start?.line || 0,
|
|
103
|
+
endLine: ctx.stop?.line || 0,
|
|
104
|
+
type,
|
|
105
|
+
};
|
|
106
|
+
if (elementType !== undefined) {
|
|
107
|
+
methodInfo.elementType = elementType;
|
|
108
|
+
}
|
|
109
|
+
this._methodTypeTable.set(methodName, methodInfo);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=methodTypeListener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"methodTypeListener.js","sourceRoot":"","sources":["../../src/mutator/methodTypeListener.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAC5D,MAAM,OAAO,kBAAkB;IAInB;IACA;IACA;IALF,gBAAgB,GAA4B,IAAI,GAAG,EAAE,CAAA;IAE7D,YACU,eAA4B,EAC5B,oBAAiC,EACjC,kBAA+B;QAF/B,oBAAe,GAAf,eAAe,CAAa;QAC5B,yBAAoB,GAApB,oBAAoB,CAAa;QACjC,uBAAkB,GAAlB,kBAAkB,CAAa;IACtC,CAAC;IAEG,kBAAkB;QACvB,OAAO,IAAI,CAAC,gBAAgB,CAAA;IAC9B,CAAC;IAED,sBAAsB,CAAC,GAAsB;QAC3C,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC7C,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YACvC,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YAEvC,IAAI,UAAU,IAAI,UAAU,EAAE,CAAC;gBAC7B,MAAM,eAAe,GAAG,UAAU,CAAC,WAAW,EAAE,CAAA;gBAChD,IAAI,WAA+B,CAAA;gBAEnC,IACE,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC;oBACnC,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC,EAClC,CAAC;oBACD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;oBACxC,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;wBACtB,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;oBACxB,CAAC;gBACH,CAAC;qBAAM,IAAI,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;oBAC7C,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;wBAClC,WAAW,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;oBACzC,CAAC;gBACH,CAAC;qBAAM,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrC,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;gBAC9D,CAAC;gBAED,IAAI,IAAI,GAAa,QAAQ,CAAC,IAAI,CAAA;gBAElC,IAAI,eAAe,KAAK,MAAM,EAAE,CAAC;oBAC/B,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAA;gBACtB,CAAC;qBAAM,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;oBACzC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAA;gBACzB,CAAC;qBAAM,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;oBACzC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAA;gBACzB,CAAC;qBAAM,IAAI,eAAe,KAAK,MAAM,EAAE,CAAC;oBACtC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAA;gBACtB,CAAC;qBAAM,IAAI,eAAe,KAAK,QAAQ,EAAE,CAAC;oBACxC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAA;gBACxB,CAAC;qBAAM,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;oBACzC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAA;gBACzB,CAAC;qBAAM,IAAI,eAAe,KAAK,QAAQ,EAAE,CAAC;oBACxC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAA;gBACxB,CAAC;qBAAM,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;oBACpC,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAA;gBACpB,CAAC;qBAAM,IAAI,eAAe,KAAK,MAAM,EAAE,CAAC;oBACtC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAA;gBACtB,CAAC;qBAAM,IAAI,eAAe,KAAK,MAAM,EAAE,CAAC;oBACtC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAA;gBACtB,CAAC;qBAAM,IAAI,eAAe,KAAK,UAAU,EAAE,CAAC;oBAC1C,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAA;gBAC1B,CAAC;qBAAM,IAAI,eAAe,KAAK,MAAM,EAAE,CAAC;oBACtC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAA;gBACtB,CAAC;qBAAM,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;oBACzC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAA;gBACzB,CAAC;qBAAM,IAAI,eAAe,KAAK,QAAQ,EAAE,CAAC;oBACxC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAA;gBACxB,CAAC;qBAAM,IACL,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC;oBACnC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EACzB,CAAC;oBACD,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAA;gBACtB,CAAC;qBAAM,IAAI,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC9C,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAA;gBACrB,CAAC;qBAAM,IAAI,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC9C,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAA;gBACrB,CAAC;qBAAM,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;oBAChD,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAA;gBAC5B,CAAC;qBAAM,IAAI,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;oBACrD,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAA;gBACjC,CAAC;qBAAM,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;oBACnD,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAA;gBAC/B,CAAC;gBAED,MAAM,UAAU,GAAe;oBAC7B,UAAU;oBACV,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC;oBAC/B,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;oBAC5B,IAAI;iBACL,CAAA;gBAED,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;oBAC9B,UAAU,CAAC,WAAW,GAAG,WAAW,CAAA;gBACtC,CAAC;gBAED,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;YACnD,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
import { ApexParserListener } from 'apex-parser';
|
|
2
|
+
import { ApexMethod } from '../type/ApexMethod.js';
|
|
1
3
|
import { ApexMutation } from '../type/ApexMutation.js';
|
|
2
4
|
import { BaseListener } from './baseListener.js';
|
|
3
|
-
import { ApexParserListener } from 'apex-parser';
|
|
4
5
|
export declare class MutationListener implements ApexParserListener {
|
|
5
6
|
protected readonly coveredLines: Set<number>;
|
|
7
|
+
protected readonly typeTable?: Map<string, ApexMethod> | undefined;
|
|
6
8
|
private listeners;
|
|
7
9
|
_mutations: ApexMutation[];
|
|
8
10
|
getMutations(): ApexMutation[];
|
|
9
|
-
constructor(listeners: BaseListener[], coveredLines: Set<number>);
|
|
11
|
+
constructor(listeners: BaseListener[], coveredLines: Set<number>, typeTable?: Map<string, ApexMethod> | undefined);
|
|
10
12
|
}
|
|
@@ -1,14 +1,24 @@
|
|
|
1
|
+
import { ReturnTypeAwareBaseListener } from './returnTypeAwareBaseListener.js';
|
|
1
2
|
// @ts-ignore: Just a proxy doing accumulation of mutations
|
|
2
3
|
export class MutationListener {
|
|
3
4
|
coveredLines;
|
|
5
|
+
typeTable;
|
|
4
6
|
listeners;
|
|
5
7
|
_mutations = [];
|
|
6
8
|
getMutations() {
|
|
7
9
|
return this._mutations;
|
|
8
10
|
}
|
|
9
|
-
constructor(listeners, coveredLines) {
|
|
11
|
+
constructor(listeners, coveredLines, typeTable) {
|
|
10
12
|
this.coveredLines = coveredLines;
|
|
13
|
+
this.typeTable = typeTable;
|
|
11
14
|
this.listeners = listeners;
|
|
15
|
+
if (typeTable) {
|
|
16
|
+
this.listeners.forEach(listener => {
|
|
17
|
+
if (listener instanceof ReturnTypeAwareBaseListener) {
|
|
18
|
+
listener.setTypeTable(typeTable);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
12
22
|
// Share mutations array across all listeners
|
|
13
23
|
this.listeners
|
|
14
24
|
.filter(listener => '_mutations' in listener)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutationListener.js","sourceRoot":"","sources":["../../src/mutator/mutationListener.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mutationListener.js","sourceRoot":"","sources":["../../src/mutator/mutationListener.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAA;AAE9E,2DAA2D;AAC3D,MAAM,OAAO,gBAAgB;IAUN;IACA;IAVb,SAAS,CAAgB;IACjC,UAAU,GAAmB,EAAE,CAAA;IAExB,YAAY;QACjB,OAAO,IAAI,CAAC,UAAU,CAAA;IACxB,CAAC;IAED,YACE,SAAyB,EACN,YAAyB,EACzB,SAAmC;QADnC,iBAAY,GAAZ,YAAY,CAAa;QACzB,cAAS,GAAT,SAAS,CAA0B;QAEtD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAE1B,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAChC,IAAI,QAAQ,YAAY,2BAA2B,EAAE,CAAC;oBACpD,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;gBAClC,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,6CAA6C;QAC7C,IAAI,CAAC,SAAS;aACX,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,YAAY,IAAI,QAAQ,CAAC;aAC5C,OAAO,CAAC,QAAQ,CAAC,EAAE;YAClB,CAAC;YAAC,QAAyB,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;QAC1D,CAAC,CAAC,CAAA;QAEJ,2EAA2E;QAC3E,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE;YACrB,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;gBACpB,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;oBACnB,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;gBACrB,CAAC;gBAED,wEAAwE;gBACxE,OAAO,CAAC,GAAG,IAAe,EAAE,EAAE;oBAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAsB,CAAA;wBACxC,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;4BAC5C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gCAChC,IAAI,IAAI,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;oCAC7D,CAAC;oCAAC,QAAQ,CAAC,IAAI,CAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;gCACrD,CAAC;4BACH,CAAC,CAAC,CAAA;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC,CAAA;YACH,CAAC;SACF,CAAC,CAAA;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ParserRuleContext } from 'antlr4ts';
|
|
2
|
+
import { ApexType } from '../type/ApexMethod.js';
|
|
3
|
+
import { ReturnTypeAwareBaseListener } from './returnTypeAwareBaseListener.js';
|
|
4
|
+
export class NullReturnMutator extends ReturnTypeAwareBaseListener {
|
|
5
|
+
enterReturnStatement(ctx) {
|
|
6
|
+
if (!this.isCurrentMethodTypeKnown()) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const typeInfo = this.getCurrentMethodReturnTypeInfo();
|
|
10
|
+
if (!typeInfo || typeInfo.type === ApexType.VOID) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
if (!ctx.children || ctx.children.length < 2) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const expressionNode = ctx.children[1];
|
|
17
|
+
if (!(expressionNode instanceof ParserRuleContext)) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (expressionNode.text.trim().toLowerCase() === 'null') {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
this.createMutationFromParserRuleContext(expressionNode, 'null');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=nullReturnMutator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nullReturnMutator.js","sourceRoot":"","sources":["../../src/mutator/nullReturnMutator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAA;AAE9E,MAAM,OAAO,iBAAkB,SAAQ,2BAA2B;IAChE,oBAAoB,CAAC,GAAsB;QACzC,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,CAAC;YACrC,OAAM;QACR,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,8BAA8B,EAAE,CAAA;QACtD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;YACjD,OAAM;QACR,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,OAAM;QACR,CAAC;QAED,MAAM,cAAc,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QACtC,IAAI,CAAC,CAAC,cAAc,YAAY,iBAAiB,CAAC,EAAE,CAAC;YACnD,OAAM;QACR,CAAC;QAED,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;YACxD,OAAM;QACR,CAAC;QAED,IAAI,CAAC,mCAAmC,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;IAClE,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ParserRuleContext } from 'antlr4ts';
|
|
2
|
+
import { ApexMethod } from '../type/ApexMethod.js';
|
|
3
|
+
import { BaseListener } from './baseListener.js';
|
|
4
|
+
export declare class ReturnTypeAwareBaseListener extends BaseListener {
|
|
5
|
+
protected typeTable: Map<string, ApexMethod>;
|
|
6
|
+
protected currentMethodName: string | null;
|
|
7
|
+
setTypeTable(typeTable: Map<string, ApexMethod>): void;
|
|
8
|
+
enterMethodDeclaration(ctx: ParserRuleContext): void;
|
|
9
|
+
exitMethodDeclaration(): void;
|
|
10
|
+
protected isCurrentMethodTypeKnown(): boolean;
|
|
11
|
+
protected getCurrentMethodReturnTypeInfo(): ApexMethod | null;
|
|
12
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { BaseListener } from './baseListener.js';
|
|
2
|
+
export class ReturnTypeAwareBaseListener extends BaseListener {
|
|
3
|
+
typeTable = new Map();
|
|
4
|
+
currentMethodName = null;
|
|
5
|
+
setTypeTable(typeTable) {
|
|
6
|
+
this.typeTable = typeTable;
|
|
7
|
+
}
|
|
8
|
+
enterMethodDeclaration(ctx) {
|
|
9
|
+
if (ctx.children && ctx.children.length >= 4) {
|
|
10
|
+
this.currentMethodName = ctx.children[1].text;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exitMethodDeclaration() {
|
|
14
|
+
this.currentMethodName = null;
|
|
15
|
+
}
|
|
16
|
+
isCurrentMethodTypeKnown() {
|
|
17
|
+
return (this.currentMethodName !== null &&
|
|
18
|
+
this.typeTable.has(this.currentMethodName));
|
|
19
|
+
}
|
|
20
|
+
getCurrentMethodReturnTypeInfo() {
|
|
21
|
+
return this.typeTable.get(this.currentMethodName) ?? null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=returnTypeAwareBaseListener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"returnTypeAwareBaseListener.js","sourceRoot":"","sources":["../../src/mutator/returnTypeAwareBaseListener.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,MAAM,OAAO,2BAA4B,SAAQ,YAAY;IACjD,SAAS,GAA4B,IAAI,GAAG,EAAE,CAAA;IAC9C,iBAAiB,GAAkB,IAAI,CAAA;IAEjD,YAAY,CAAC,SAAkC;QAC7C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAED,sBAAsB,CAAC,GAAsB;QAC3C,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAC/C,CAAC;IACH,CAAC;IAED,qBAAqB;QACnB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAA;IAC/B,CAAC;IAES,wBAAwB;QAChC,OAAO,CACL,IAAI,CAAC,iBAAiB,KAAK,IAAI;YAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAC3C,CAAA;IACH,CAAC;IAES,8BAA8B;QACtC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAkB,CAAC,IAAI,IAAI,CAAA;IAC5D,CAAC;CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ParserRuleContext } from 'antlr4ts';
|
|
2
|
+
import { ApexType } from '../type/ApexMethod.js';
|
|
3
|
+
import { ReturnTypeAwareBaseListener } from './returnTypeAwareBaseListener.js';
|
|
4
|
+
export class TrueReturnMutator extends ReturnTypeAwareBaseListener {
|
|
5
|
+
enterReturnStatement(ctx) {
|
|
6
|
+
if (!this.isCurrentMethodTypeKnown()) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const typeInfo = this.getCurrentMethodReturnTypeInfo();
|
|
10
|
+
if (!typeInfo) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
if (typeInfo.type !== ApexType.BOOLEAN) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (!ctx.children || ctx.children.length < 2) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const expressionNode = ctx.children[1];
|
|
20
|
+
if (!(expressionNode instanceof ParserRuleContext)) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (expressionNode.text.trim().toLowerCase() === 'true') {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
this.createMutationFromParserRuleContext(expressionNode, 'true');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=trueReturnMutator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trueReturnMutator.js","sourceRoot":"","sources":["../../src/mutator/trueReturnMutator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAA;AAE9E,MAAM,OAAO,iBAAkB,SAAQ,2BAA2B;IAChE,oBAAoB,CAAC,GAAsB;QACzC,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,CAAC;YACrC,OAAM;QACR,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,8BAA8B,EAAE,CAAA;QACtD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAM;QACR,CAAC;QAED,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC;YACvC,OAAM;QACR,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,OAAM;QACR,CAAC;QAED,MAAM,cAAc,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QACtC,IAAI,CAAC,CAAC,cAAc,YAAY,iBAAiB,CAAC,EAAE,CAAC;YACnD,OAAM;QACR,CAAC;QAED,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;YACxD,OAAM;QACR,CAAC;QAED,IAAI,CAAC,mCAAmC,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;IAClE,CAAC;CACF"}
|
|
@@ -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;gBAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;gBACxD,cAAc,EAAE,CAAC;gBACjB,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,
|
|
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;gBAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;gBACxD,cAAc,EAAE,CAAC;gBACjB,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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ParserRuleContext } from 'antlr4ts';
|
|
2
|
+
import { ApexMethod } from '../type/ApexMethod.js';
|
|
3
|
+
export declare class ApexTypeResolver {
|
|
4
|
+
private apexClassTypes;
|
|
5
|
+
private standardEntityTypes;
|
|
6
|
+
private customObjectTypes;
|
|
7
|
+
constructor(apexClassTypes?: string[], standardEntityTypes?: string[], customObjectTypes?: string[]);
|
|
8
|
+
analyzeMethodTypes(tree: ParserRuleContext): Map<string, ApexMethod>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ParseTreeWalker } from 'antlr4ts/tree/index.js';
|
|
2
|
+
import { MethodTypeListener } from '../mutator/methodTypeListener.js';
|
|
3
|
+
export class ApexTypeResolver {
|
|
4
|
+
apexClassTypes = new Set();
|
|
5
|
+
standardEntityTypes = new Set();
|
|
6
|
+
customObjectTypes = new Set();
|
|
7
|
+
constructor(apexClassTypes = [], standardEntityTypes = [], customObjectTypes = []) {
|
|
8
|
+
this.apexClassTypes = new Set(apexClassTypes);
|
|
9
|
+
this.standardEntityTypes = new Set(standardEntityTypes);
|
|
10
|
+
this.customObjectTypes = new Set(customObjectTypes);
|
|
11
|
+
}
|
|
12
|
+
analyzeMethodTypes(tree) {
|
|
13
|
+
const listener = new MethodTypeListener(this.apexClassTypes, this.standardEntityTypes, this.customObjectTypes);
|
|
14
|
+
ParseTreeWalker.DEFAULT.walk(listener, tree);
|
|
15
|
+
return listener.getMethodTypeTable();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=apexTypeResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apexTypeResolver.js","sourceRoot":"","sources":["../../src/service/apexTypeResolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAExD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AAGrE,MAAM,OAAO,gBAAgB;IACnB,cAAc,GAAgB,IAAI,GAAG,EAAE,CAAA;IACvC,mBAAmB,GAAgB,IAAI,GAAG,EAAE,CAAA;IAC5C,iBAAiB,GAAgB,IAAI,GAAG,EAAE,CAAA;IAElD,YACE,iBAA2B,EAAE,EAC7B,sBAAgC,EAAE,EAClC,oBAA8B,EAAE;QAEhC,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAA;QAC7C,IAAI,CAAC,mBAAmB,GAAG,IAAI,GAAG,CAAC,mBAAmB,CAAC,CAAA;QACvD,IAAI,CAAC,iBAAiB,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAA;IACrD,CAAC;IAEM,kBAAkB,CAAC,IAAuB;QAC/C,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CACrC,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,iBAAiB,CACvB,CAAA;QAED,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,QAA8B,EAAE,IAAI,CAAC,CAAA;QAElE,OAAO,QAAQ,CAAC,kBAAkB,EAAE,CAAA;IACtC,CAAC;CACF"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import { CommonTokenStream } from 'apex-parser';
|
|
1
2
|
import { ApexMutation } from '../type/ApexMutation.js';
|
|
3
|
+
import { ApexTypeResolver } from './apexTypeResolver.js';
|
|
2
4
|
export declare class MutantGenerator {
|
|
3
5
|
private tokenStream?;
|
|
4
|
-
|
|
6
|
+
getTokenStream(): CommonTokenStream | undefined;
|
|
7
|
+
compute(classContent: string, coveredLines: Set<number>, typeResolver?: ApexTypeResolver): ApexMutation[];
|
|
5
8
|
mutate(mutation: ApexMutation): string;
|
|
6
9
|
}
|
|
@@ -1,26 +1,50 @@
|
|
|
1
|
+
import { TokenStreamRewriter } from 'antlr4ts';
|
|
2
|
+
import { ApexLexer, ApexParser, CaseInsensitiveInputStream, CommonTokenStream, ParseTreeWalker, } from 'apex-parser';
|
|
3
|
+
import { ArithmeticOperatorMutator } from '../mutator/arithmeticOperatorMutator.js';
|
|
1
4
|
import { BoundaryConditionMutator } from '../mutator/boundaryConditionMutator.js';
|
|
5
|
+
import { EmptyReturnMutator } from '../mutator/emptyReturnMutator.js';
|
|
6
|
+
import { EqualityConditionMutator } from '../mutator/equalityConditionMutator.js';
|
|
7
|
+
import { FalseReturnMutator } from '../mutator/falseReturnMutator.js';
|
|
2
8
|
import { IncrementMutator } from '../mutator/incrementMutator.js';
|
|
3
9
|
import { MutationListener } from '../mutator/mutationListener.js';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
10
|
+
import { NullReturnMutator } from '../mutator/nullReturnMutator.js';
|
|
11
|
+
import { TrueReturnMutator } from '../mutator/trueReturnMutator.js';
|
|
6
12
|
export class MutantGenerator {
|
|
7
13
|
tokenStream;
|
|
8
|
-
|
|
14
|
+
getTokenStream() {
|
|
15
|
+
return this.tokenStream;
|
|
16
|
+
}
|
|
17
|
+
compute(classContent, coveredLines, typeResolver) {
|
|
9
18
|
const lexer = new ApexLexer(new CaseInsensitiveInputStream('other', classContent));
|
|
10
19
|
this.tokenStream = new CommonTokenStream(lexer);
|
|
11
20
|
const parser = new ApexParser(this.tokenStream);
|
|
12
21
|
const tree = parser.compilationUnit();
|
|
22
|
+
const methodTypeTable = typeResolver?.analyzeMethodTypes(tree);
|
|
13
23
|
const incrementListener = new IncrementMutator();
|
|
14
24
|
const boundaryListener = new BoundaryConditionMutator();
|
|
15
|
-
const
|
|
25
|
+
const emptyReturnListener = new EmptyReturnMutator();
|
|
26
|
+
const trueReturnListener = new TrueReturnMutator();
|
|
27
|
+
const falseReturnListener = new FalseReturnMutator();
|
|
28
|
+
const nullReturnListener = new NullReturnMutator();
|
|
29
|
+
const equalityListener = new EqualityConditionMutator();
|
|
30
|
+
const arithmeticListener = new ArithmeticOperatorMutator();
|
|
31
|
+
const listener = new MutationListener([
|
|
32
|
+
boundaryListener,
|
|
33
|
+
incrementListener,
|
|
34
|
+
equalityListener,
|
|
35
|
+
emptyReturnListener,
|
|
36
|
+
trueReturnListener,
|
|
37
|
+
falseReturnListener,
|
|
38
|
+
nullReturnListener,
|
|
39
|
+
arithmeticListener,
|
|
40
|
+
], coveredLines, methodTypeTable);
|
|
16
41
|
ParseTreeWalker.DEFAULT.walk(listener, tree);
|
|
17
42
|
return listener.getMutations();
|
|
18
43
|
}
|
|
19
44
|
mutate(mutation) {
|
|
20
45
|
// Create a new token stream rewriter
|
|
21
46
|
const rewriter = new TokenStreamRewriter(this.tokenStream);
|
|
22
|
-
|
|
23
|
-
rewriter.replace(mutation.token.symbol.tokenIndex, mutation.token.symbol.tokenIndex, mutation.replacement);
|
|
47
|
+
rewriter.replace(mutation.target.startToken.tokenIndex, mutation.target.endToken.tokenIndex, mutation.replacement);
|
|
24
48
|
// Get the mutated code
|
|
25
49
|
return rewriter.getText();
|
|
26
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutantGenerator.js","sourceRoot":"","sources":["../../src/service/mutantGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAA;AACjF,OAAO,EAAE,
|
|
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,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAA;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAInE,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;QAE1D,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CACnC;YACE,gBAAgB;YAChB,iBAAiB;YACjB,gBAAgB;YAChB,mBAAmB;YACnB,kBAAkB;YAClB,mBAAmB;YACnB,kBAAkB;YAClB,kBAAkB;SACnB,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"}
|
|
@@ -8,8 +8,12 @@ export declare class MutationTestingService {
|
|
|
8
8
|
protected readonly connection: Connection;
|
|
9
9
|
protected readonly apexClassName: string;
|
|
10
10
|
protected readonly apexTestClassName: string;
|
|
11
|
+
private apexClassContent;
|
|
11
12
|
constructor(progress: Progress, spinner: Spinner, connection: Connection, { apexClassName, apexTestClassName }: ApexMutationParameter);
|
|
12
13
|
process(): Promise<ApexMutationTestResult>;
|
|
13
14
|
calculateScore(mutationResult: ApexMutationTestResult): number;
|
|
14
15
|
private buildMutantResult;
|
|
16
|
+
private calculateMutationPosition;
|
|
17
|
+
private convertAbsoluteIndexToLineColumn;
|
|
18
|
+
private extractMutationOriginalText;
|
|
15
19
|
}
|