Skip to content

Commit e09464c

Browse files
authored
Merge pull request #107 from DurieuxPol/enh/mutantGeneration
Refactor mutant selection strategies
2 parents 582881a + 06b8c50 commit e09464c

22 files changed

+264
-274
lines changed

src/MuTalk-CI/MTCI.class.st

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ MTCI >> mutateAll [
145145
runMutalkTargets: targets
146146
tests: tests
147147
generationStrategy:
148-
MTSelectingFromCoverageMutantSelectionStrategy new
148+
MTSelectingFromCoverageMutantGenerationStrategy new
149149
]
150150

151151
{ #category : 'as yet unclassified' }
@@ -162,7 +162,7 @@ MTCI >> mutateDiff [
162162
self
163163
runMutalkTargets: targets
164164
tests: tests
165-
generationStrategy: MTSelectingFromAlivesMutantSelectionStrategy new
165+
generationStrategy: MTSelectingFromAlivesMutantGenerationStrategy new
166166
]
167167

168168
{ #category : 'as yet unclassified' }
@@ -202,7 +202,7 @@ MTCI >> runMutalkTargets: targets tests: tests generationStrategy: generationStr
202202
classesToMutate: targets;
203203
testSelectionStrategy:
204204
MTSelectingFromCoverageTestSelectionStrategy new;
205-
mutantSelectionStrategy: generationStrategy.
205+
mutantGenerationStrategy: generationStrategy.
206206
analysis run.
207207
coverageInfo := self prepareCoverageInfo: analysis.
208208
self exportResultJson: analysis coverageInfo: coverageInfo

src/MuTalk-CI/MTSelectingFromAlivesMutantSelectionStrategy.class.st renamed to src/MuTalk-CI/MTSelectingFromAlivesMutantGenerationStrategy.class.st

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Class {
2-
#name : 'MTSelectingFromAlivesMutantSelectionStrategy',
3-
#superclass : 'MTMutantSelectionStrategy',
2+
#name : 'MTSelectingFromAlivesMutantGenerationStrategy',
3+
#superclass : 'MTMutantGenerationStrategy',
44
#instVars : [
55
'analysis'
66
],
@@ -9,13 +9,13 @@ Class {
99
}
1010

1111
{ #category : 'accessing' }
12-
MTSelectingFromAlivesMutantSelectionStrategy >> analysis: anObject [
12+
MTSelectingFromAlivesMutantGenerationStrategy >> analysis: anObject [
1313

1414
analysis := anObject
1515
]
1616

1717
{ #category : 'generating' }
18-
MTSelectingFromAlivesMutantSelectionStrategy >> methodsToMutateFrom: aMutationTestingAnalysis [
18+
MTSelectingFromAlivesMutantGenerationStrategy >> methodsToMutateFrom: aMutationTestingAnalysis [
1919

2020
^ (analysis generalResult aliveMutants collect: [ :alive |
2121
alive mutant originalMethod ]) asSet

src/MuTalk-Model/MTAllMutantSelectionStrategy.class.st renamed to src/MuTalk-Model/MTAllMutantGenerationStrategy.class.st

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
Class {
2-
#name : 'MTAllMutantSelectionStrategy',
3-
#superclass : 'MTMutantSelectionStrategy',
4-
#category : 'MuTalk-Model-Mutant selection strategies',
2+
#name : 'MTAllMutantGenerationStrategy',
3+
#superclass : 'MTMutantGenerationStrategy',
4+
#category : 'MuTalk-Model-Mutant generation strategies',
55
#package : 'MuTalk-Model',
6-
#tag : 'Mutant selection strategies'
6+
#tag : 'Mutant generation strategies'
77
}
88

99
{ #category : 'generating' }
10-
MTAllMutantSelectionStrategy >> classesAndMetaclassesFrom: modelClasses [
10+
MTAllMutantGenerationStrategy >> classesAndMetaclassesFrom: modelClasses [
1111
^ modelClasses
1212
inject: OrderedCollection new
1313
into: [:classes :aClass |
@@ -17,7 +17,7 @@ MTAllMutantSelectionStrategy >> classesAndMetaclassesFrom: modelClasses [
1717
]
1818

1919
{ #category : 'generating' }
20-
MTAllMutantSelectionStrategy >> methodsToMutateFrom: aMutationTestingAnalysis [
20+
MTAllMutantGenerationStrategy >> methodsToMutateFrom: aMutationTestingAnalysis [
2121
^ (self classesAndMetaclassesFrom: aMutationTestingAnalysis modelClasses)
2222
inject: OrderedCollection new
2323
into: [:methods :aClass |

src/MuTalk-Model/MTAnalysis.class.st

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ Class {
1313
'mutantResults',
1414
'stopOnErrorOrFail',
1515
'testSelectionStrategy',
16-
'mutantSelectionStrategy',
17-
'testFilter'
16+
'testFilter',
17+
'mutantGenerationStrategy'
1818
],
1919
#category : 'MuTalk-Model-Core',
2020
#package : 'MuTalk-Model',
@@ -64,9 +64,9 @@ MTAnalysis >> defaultLogger [
6464
]
6565

6666
{ #category : 'accessing - defaults' }
67-
MTAnalysis >> defaultMutantSelectionStrategy [
67+
MTAnalysis >> defaultMutantGenerationStrategy [
6868

69-
^ MTAllMutantSelectionStrategy new
69+
^ MTAllMutantGenerationStrategy new
7070
]
7171

7272
{ #category : 'accessing - defaults' }
@@ -118,7 +118,7 @@ MTAnalysis >> generateMutations [
118118

119119
logger logStartMutationGeneration.
120120
^ mutations ifNil: [
121-
mutations := mutantSelectionStrategy
121+
mutations := mutantGenerationStrategy
122122
mutationsFor: self
123123
loggingIn: logger.
124124
logger logTotalNumberOfMutations: mutations.
@@ -160,7 +160,7 @@ MTAnalysis >> initialize [
160160

161161
super initialize.
162162
operators := self defaultOperators.
163-
mutantSelectionStrategy := self defaultMutantSelectionStrategy.
163+
mutantGenerationStrategy := self defaultMutantGenerationStrategy.
164164
testSelectionStrategy := self defaultTestSelectionStrategy.
165165
mutantResults := OrderedCollection new.
166166
elapsedTime := 0.
@@ -193,22 +193,22 @@ MTAnalysis >> modelClasses [
193193
class includesBehavior: classToFilter ] ]
194194
]
195195

196-
{ #category : 'results' }
197-
MTAnalysis >> mutantResults [
196+
{ #category : 'accessing' }
197+
MTAnalysis >> mutantGenerationStrategy [
198198

199-
^ mutantResults
199+
^ mutantGenerationStrategy
200200
]
201201

202202
{ #category : 'accessing' }
203-
MTAnalysis >> mutantSelectionStrategy [
203+
MTAnalysis >> mutantGenerationStrategy: anObject [
204204

205-
^ mutantSelectionStrategy
205+
mutantGenerationStrategy := anObject
206206
]
207207

208-
{ #category : 'accessing' }
209-
MTAnalysis >> mutantSelectionStrategy: anObject [
208+
{ #category : 'results' }
209+
MTAnalysis >> mutantResults [
210210

211-
mutantSelectionStrategy := anObject
211+
^ mutantResults
212212
]
213213

214214
{ #category : 'accessing' }
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
Class {
2+
#name : 'MTManualMutatedMethodGenerationStrategy',
3+
#superclass : 'MTMutantGenerationStrategy',
4+
#instVars : [
5+
'targetMethods'
6+
],
7+
#category : 'MuTalk-Model-Mutant generation strategies',
8+
#package : 'MuTalk-Model',
9+
#tag : 'Mutant generation strategies'
10+
}
11+
12+
{ #category : 'generating' }
13+
MTManualMutatedMethodGenerationStrategy >> methodsToMutateFrom: aMutationTestingAnalysis [
14+
15+
^ targetMethods
16+
]
17+
18+
{ #category : 'accessing' }
19+
MTManualMutatedMethodGenerationStrategy >> targetMethods: anObject [
20+
21+
targetMethods := anObject
22+
]

src/MuTalk-Model/MTManualMutatedMethodSelectionStrategy.class.st

Lines changed: 0 additions & 22 deletions
This file was deleted.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
"
2+
This strategy uses a fixed list of mutations pre-computed by the user
3+
"
4+
Class {
5+
#name : 'MTManualMutationGenerationStrategy',
6+
#superclass : 'MTMutantGenerationStrategy',
7+
#instVars : [
8+
'mutations'
9+
],
10+
#category : 'MuTalk-Model-Mutant generation strategies',
11+
#package : 'MuTalk-Model',
12+
#tag : 'Mutant generation strategies'
13+
}
14+
15+
{ #category : 'instance creation' }
16+
MTManualMutationGenerationStrategy class >> with: aCollection [
17+
18+
^ self new
19+
mutations: aCollection;
20+
yourself
21+
]
22+
23+
{ #category : 'accessing' }
24+
MTManualMutationGenerationStrategy >> mutations: anInfiniteReadStream [
25+
mutations := anInfiniteReadStream
26+
]
27+
28+
{ #category : 'generating' }
29+
MTManualMutationGenerationStrategy >> mutationsFor: aMutationTestingAnalysis loggingIn: aLogger [
30+
31+
"Do not compute a list of mutations, just use the explicit one"
32+
^ mutations
33+
]

src/MuTalk-Model/MTManualMutationSelectionStrategy.class.st

Lines changed: 0 additions & 33 deletions
This file was deleted.
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
Class {
2+
#name : 'MTMutantGenerationStrategy',
3+
#superclass : 'Object',
4+
#instVars : [
5+
'mutantSelectionStrategy'
6+
],
7+
#category : 'MuTalk-Model-Mutant generation strategies',
8+
#package : 'MuTalk-Model',
9+
#tag : 'Mutant generation strategies'
10+
}
11+
12+
{ #category : 'instance creation' }
13+
MTMutantGenerationStrategy class >> withRandomClassMutantSelection [
14+
15+
^ self new
16+
mutantSelectionStrategy: MTRandomClassMutantSelectionStrategy new;
17+
yourself
18+
]
19+
20+
{ #category : 'instance creation' }
21+
MTMutantGenerationStrategy class >> withRandomMethodMutantSelection [
22+
23+
^ self new
24+
mutantSelectionStrategy: MTRandomMethodMutantSelectionStrategy new;
25+
yourself
26+
]
27+
28+
{ #category : 'instance creation' }
29+
MTMutantGenerationStrategy class >> withRandomMutantSelection [
30+
31+
^ self new
32+
mutantSelectionStrategy: MTRandomMutantSelectionStrategy new;
33+
yourself
34+
]
35+
36+
{ #category : 'instance creation' }
37+
MTMutantGenerationStrategy class >> withRandomOperatorMutantSelection [
38+
39+
^ self new
40+
mutantSelectionStrategy: MTRandomOperatorMutantSelectionStrategy new;
41+
yourself
42+
]
43+
44+
{ #category : 'accessing - defaults' }
45+
MTMutantGenerationStrategy >> defaultMutantSelectionStrategy [
46+
47+
^ MTMutantSelectionStrategy new
48+
]
49+
50+
{ #category : 'initialization' }
51+
MTMutantGenerationStrategy >> initialize [
52+
53+
super initialize.
54+
mutantSelectionStrategy := self defaultMutantSelectionStrategy
55+
]
56+
57+
{ #category : 'generating' }
58+
MTMutantGenerationStrategy >> methodsToMutateFrom:aMutationTestingAnalysis [
59+
self subclassResponsibility.
60+
]
61+
62+
{ #category : 'accessing' }
63+
MTMutantGenerationStrategy >> mutantSelectionStrategy [
64+
65+
^ mutantSelectionStrategy
66+
]
67+
68+
{ #category : 'accessing' }
69+
MTMutantGenerationStrategy >> mutantSelectionStrategy: anObject [
70+
71+
mutantSelectionStrategy := anObject
72+
]
73+
74+
{ #category : 'generating' }
75+
MTMutantGenerationStrategy >> mutationsFor: aMutationTestingAnalysis [
76+
^ self
77+
mutationsFor: aMutationTestingAnalysis
78+
loggingIn: self nullLogger
79+
]
80+
81+
{ #category : 'generating' }
82+
MTMutantGenerationStrategy >> mutationsFor: aMutationTestingAnalysis loggingIn: aLogger [
83+
84+
| mutations |
85+
mutations := OrderedCollection new.
86+
(self methodsToMutateFrom: aMutationTestingAnalysis)
87+
do: [ :aMethod |
88+
mutations addAll: (self
89+
mutationsFor: aMethod
90+
usingAll: aMutationTestingAnalysis operators
91+
logginIn: aLogger) ]
92+
displayingProgress: 'Building Mutants'.
93+
^ mutantSelectionStrategy shuffleMutants: mutations
94+
]
95+
96+
{ #category : 'generating' }
97+
MTMutantGenerationStrategy >> mutationsFor: aMethod usingAll: aCollectionOfMutantOperators logginIn: aLogger [
98+
99+
| parseTree |
100+
parseTree := aMethod parseTree.
101+
^ aCollectionOfMutantOperators
102+
inject: OrderedCollection new
103+
into: [ :mutations :anOperator |
104+
aLogger logStartBuildingMutantionsFor: aMethod using: anOperator.
105+
(aMethod ignoredMutationOperators includes: anOperator class)
106+
ifFalse: [
107+
| newMutations |
108+
newMutations := anOperator
109+
mutationsFor: aMethod
110+
with: parseTree.
111+
aLogger logNumberOfGeneratedMutations: newMutations size.
112+
mutations addAll: newMutations ].
113+
mutations ]
114+
]
115+
116+
{ #category : 'logging' }
117+
MTMutantGenerationStrategy >> nullLogger [
118+
119+
^ MTNullLogger new.
120+
]

0 commit comments

Comments
 (0)