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.
Files changed (65) hide show
  1. package/README.md +3 -2
  2. package/lib/adapter/apexClassRepository.d.ts +5 -1
  3. package/lib/adapter/apexClassRepository.js +23 -1
  4. package/lib/adapter/apexClassRepository.js.map +1 -1
  5. package/lib/adapter/apexTestRunner.d.ts +7 -2
  6. package/lib/adapter/apexTestRunner.js +28 -7
  7. package/lib/adapter/apexTestRunner.js.map +1 -1
  8. package/lib/mutator/arithmeticOperatorMutator.d.ts +9 -0
  9. package/lib/mutator/arithmeticOperatorMutator.js +36 -0
  10. package/lib/mutator/arithmeticOperatorMutator.js.map +1 -0
  11. package/lib/mutator/baseListener.d.ts +5 -0
  12. package/lib/mutator/baseListener.js +21 -0
  13. package/lib/mutator/baseListener.js.map +1 -1
  14. package/lib/mutator/boundaryConditionMutator.d.ts +3 -3
  15. package/lib/mutator/boundaryConditionMutator.js +21 -19
  16. package/lib/mutator/boundaryConditionMutator.js.map +1 -1
  17. package/lib/mutator/emptyReturnMutator.d.ts +7 -0
  18. package/lib/mutator/emptyReturnMutator.js +94 -0
  19. package/lib/mutator/emptyReturnMutator.js.map +1 -0
  20. package/lib/mutator/equalityConditionMutator.d.ts +6 -0
  21. package/lib/mutator/equalityConditionMutator.js +25 -0
  22. package/lib/mutator/equalityConditionMutator.js.map +1 -0
  23. package/lib/mutator/falseReturnMutator.d.ts +5 -0
  24. package/lib/mutator/falseReturnMutator.js +29 -0
  25. package/lib/mutator/falseReturnMutator.js.map +1 -0
  26. package/lib/mutator/incrementMutator.d.ts +1 -1
  27. package/lib/mutator/incrementMutator.js +6 -10
  28. package/lib/mutator/incrementMutator.js.map +1 -1
  29. package/lib/mutator/methodTypeListener.d.ts +12 -0
  30. package/lib/mutator/methodTypeListener.js +114 -0
  31. package/lib/mutator/methodTypeListener.js.map +1 -0
  32. package/lib/mutator/mutationListener.d.ts +4 -2
  33. package/lib/mutator/mutationListener.js +11 -1
  34. package/lib/mutator/mutationListener.js.map +1 -1
  35. package/lib/mutator/nullReturnMutator.d.ts +5 -0
  36. package/lib/mutator/nullReturnMutator.js +26 -0
  37. package/lib/mutator/nullReturnMutator.js.map +1 -0
  38. package/lib/mutator/returnTypeAwareBaseListener.d.ts +12 -0
  39. package/lib/mutator/returnTypeAwareBaseListener.js +24 -0
  40. package/lib/mutator/returnTypeAwareBaseListener.js.map +1 -0
  41. package/lib/mutator/trueReturnMutator.d.ts +5 -0
  42. package/lib/mutator/trueReturnMutator.js +29 -0
  43. package/lib/mutator/trueReturnMutator.js.map +1 -0
  44. package/lib/reporter/HTMLReporter.js +1 -1
  45. package/lib/reporter/HTMLReporter.js.map +1 -1
  46. package/lib/service/apexTypeResolver.d.ts +9 -0
  47. package/lib/service/apexTypeResolver.js +18 -0
  48. package/lib/service/apexTypeResolver.js.map +1 -0
  49. package/lib/service/mutantGenerator.d.ts +4 -1
  50. package/lib/service/mutantGenerator.js +30 -6
  51. package/lib/service/mutantGenerator.js.map +1 -1
  52. package/lib/service/mutationTestingService.d.ts +4 -0
  53. package/lib/service/mutationTestingService.js +105 -26
  54. package/lib/service/mutationTestingService.js.map +1 -1
  55. package/lib/type/ApexMethod.d.ts +29 -0
  56. package/lib/type/ApexMethod.js +24 -0
  57. package/lib/type/ApexMethod.js.map +1 -0
  58. package/lib/type/ApexMutation.d.ts +7 -2
  59. package/lib/type/MetadataComponentDependency.d.ts +6 -0
  60. package/lib/type/MetadataComponentDependency.js +2 -0
  61. package/lib/type/MetadataComponentDependency.js.map +1 -0
  62. package/messages/apex.mutation.test.run.md +1 -1
  63. package/npm-shrinkwrap.json +3992 -3112
  64. package/oclif.manifest.json +2 -2
  65. 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":"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"}
@@ -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":"AAMA,2DAA2D;AAC3D,MAAM,OAAO,gBAAgB;IAUN;IATb,SAAS,CAAgB;IACjC,UAAU,GAAmB,EAAE,CAAA;IAExB,YAAY;QACjB,OAAO,IAAI,CAAC,UAAU,CAAA;IACxB,CAAC;IAED,YACE,SAAyB,EACN,YAAyB;QAAzB,iBAAY,GAAZ,YAAY,CAAa;QAE5C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,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"}
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,5 @@
1
+ import { ParserRuleContext } from 'antlr4ts';
2
+ import { ReturnTypeAwareBaseListener } from './returnTypeAwareBaseListener.js';
3
+ export declare class NullReturnMutator extends ReturnTypeAwareBaseListener {
4
+ enterReturnStatement(ctx: ParserRuleContext): void;
5
+ }
@@ -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,5 @@
1
+ import { ParserRuleContext } from 'antlr4ts';
2
+ import { ReturnTypeAwareBaseListener } from './returnTypeAwareBaseListener.js';
3
+ export declare class TrueReturnMutator extends ReturnTypeAwareBaseListener {
4
+ enterReturnStatement(ctx: ParserRuleContext): void;
5
+ }
@@ -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"}
@@ -41,7 +41,7 @@ export class ApexMutationHTMLReporter {
41
41
  },
42
42
  })),
43
43
  };
44
- mutationTestResult.files[`${apexMutationTestResult.sourceFile}.java`] =
44
+ mutationTestResult.files[`${apexMutationTestResult.sourceFile}.cls`] =
45
45
  fileResult;
46
46
  return mutationTestResult;
47
47
  }
@@ -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,OAAO,CAAC;YACnE,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"}
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
- compute(classContent: string, coveredLines: Set<number>): ApexMutation[];
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 { ApexLexer, ApexParser, CaseInsensitiveInputStream, CommonTokenStream, ParseTreeWalker, } from 'apex-parser';
5
- import { TokenStreamRewriter } from 'antlr4ts';
10
+ import { NullReturnMutator } from '../mutator/nullReturnMutator.js';
11
+ import { TrueReturnMutator } from '../mutator/trueReturnMutator.js';
6
12
  export class MutantGenerator {
7
13
  tokenStream;
8
- compute(classContent, coveredLines) {
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 listener = new MutationListener([incrementListener, boundaryListener], coveredLines);
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
- // Apply the mutation by replacing the original token with the replacement text
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,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AAEjE,OAAO,EACL,SAAS,EACT,UAAU,EAEV,0BAA0B,EAC1B,iBAAiB,EACjB,eAAe,GAChB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAG9C,MAAM,OAAO,eAAe;IAClB,WAAW,CAAoB;IAChC,OAAO,CAAC,YAAoB,EAAE,YAAyB;QAC5D,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,iBAAiB,GAAG,IAAI,gBAAgB,EAAE,CAAA;QAChD,MAAM,gBAAgB,GAAG,IAAI,wBAAwB,EAAE,CAAA;QAEvD,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CACnC,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,EACrC,YAAY,CACb,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;QAC3D,+EAA+E;QAC/E,QAAQ,CAAC,OAAO,CACd,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAChC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAChC,QAAQ,CAAC,WAAW,CACrB,CAAA;QAED,uBAAuB;QACvB,OAAO,QAAQ,CAAC,OAAO,EAAE,CAAA;IAC3B,CAAC;CACF"}
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
  }