Skip to content

Commit 9f8e129

Browse files
authored
docs(mutators): add mutant operator name proposal (#1458)
* docs(mutantors): add mutant operator name proposal * Fix typo * Document new mutant operator naming proposal * Implemented review comments
1 parent ade7d94 commit 9f8e129

1 file changed

Lines changed: 148 additions & 145 deletions

File tree

docs/supported-mutators.md

Lines changed: 148 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -28,47 +28,47 @@ All Stryker versions support a variety of different mutators. We've aligned on a
2828

2929
## Arithmetic Operator
3030

31-
| Original | Mutated |
32-
| -------- | ------- |
33-
| `a + b` | `a - b` |
34-
| `a - b` | `a + b` |
35-
| `a * b` | `a / b` |
36-
| `a / b` | `a * b` |
37-
| `a % b` | `a * b` |
31+
| Mutant operator | Original | Mutated |
32+
| ------------------------- | -------- | ------- |
33+
| AdditionNegation | `a + b` | `a - b` |
34+
| SubtractionNegation | `a - b` | `a + b` |
35+
| MultiplicationNegation | `a * b` | `a / b` |
36+
| DivisionNegation | `a / b` | `a * b` |
37+
| RemainderToMultiplication | `a % b` | `a * b` |
3838

3939
[🔝 Back to Top](#)
4040

4141
## Array Declaration
4242

43-
| Original | Mutated |
44-
| ----------------------- | ------------- |
45-
| `new Array(1, 2, 3, 4)` | `new Array()` |
46-
| `[1, 2, 3, 4]` | `[ ]` |
43+
| Mutant operator | Original | Mutated |
44+
| ---------------------------- | ----------------------- | ------------- |
45+
| ArrayConstructorItemsRemoval | `new Array(1, 2, 3, 4)` | `new Array()` |
46+
| ArrayLiteralItemsRemoval | `[1, 2, 3, 4]` | `[ ]` |
4747

4848
[🔝 Back to Top](#)
4949

5050
## Assignment Expression
5151

52-
| Original | Mutated |
53-
| -------------------- | -------------------- |
54-
| `+=` | `-=` |
55-
| `-=` | `+=` |
56-
| `*=` | `/=` |
57-
| `/=` | `*=` |
58-
| `%=` | `*=` |
59-
| `<<=` | `>>=` |
60-
| `>>=` | `<<=` |
61-
| `&=` | <code>&#124;=</code> |
62-
| <code>&#124;=</code> | `&=` |
63-
| `??=` | `&&=`¹ |
52+
| Mutant operator | Original | Mutated |
53+
| --------------------------------------------- | -------------------- | -------------------- |
54+
| AdditionAssignmentNegation | `+=` | `-=` |
55+
| SubtractionAssignmentNegation | `-=` | `+=` |
56+
| MultiplicationAssignmentNegation | `*=` | `/=` |
57+
| DivisionAssignmentNegation | `/=` | `*=` |
58+
| RemainderAssignmentToMultiplicationAssignment | `%=` | `*=` |
59+
| LeftShiftAssignmentNegation | `<<=` | `>>=` |
60+
| RightShiftAssignmentNegation | `>>=` | `<<=` |
61+
| BitwiseAndAssignmentNegation | `&=` | <code>&#124;=</code> |
62+
| BitwiseOrAssignmentNegation | <code>&#124;=</code> | `&=` |
63+
| NullCoalescingAssignmentToAndAssignment | `??=` | `&&=`¹ |
6464

6565
- ¹: Only supported by Stryker-JS
6666

6767
[🔝 Back to Top](#)
6868

6969
## Block Statement
7070

71-
Removes the content of every block statement. For example the code:
71+
This group has one mutant operator, the `BlockRemoval` mutant operator. This mutant operator removes the content of every block statement. For example the code:
7272

7373
```javascript
7474
function saySomething() {
@@ -86,11 +86,11 @@ function saySomething() {}
8686

8787
## Boolean Literal
8888

89-
| Original | Mutated |
90-
| ----------- | ---------- |
91-
| `true` | `false` |
92-
| `false` | `true` |
93-
| `!(a == b)` | `a == b` ¹ |
89+
| Mutant operator | Original | Mutated |
90+
| --------------- | ----------- | ---------- |
91+
| TrueNegation | `true` | `false` |
92+
| FalseNegation | `false` | `true` |
93+
| NotRemoval | `!(a == b)` | `a == b` ¹ |
9494

9595
- ¹: Not supported by Stryker4s
9696

@@ -100,56 +100,56 @@ function saySomething() {}
100100

101101
Stryker.NET _specific mutator_
102102

103-
| Original | Mutated |
104-
| ---------------- | ------- |
105-
| `checked(2 + 4)` | `2 + 4` |
103+
| Mutant operator | Original | Mutated |
104+
| --------------- | ---------------- | ------- |
105+
| CheckedRemoval | `checked(2 + 4)` | `2 + 4` |
106106

107107
[🔝 Back to Top](#)
108108

109109
## Conditional Expression
110110

111-
| Original | Mutated |
112-
| ---------------------------------- | ----------------------------------- |
113-
| `for (var i = 0; i < 10; i++) { }` | `for (var i = 0; false; i++) { }` ¹ |
114-
| `while (a > b) { }` | `while (false) { }` |
115-
| `do { } while (a > b);` | `do { } while (false);` |
116-
| `if (a > b) { }` | `if (true) { }` |
117-
| `if (a > b) { }` | `if (false) { }` |
118-
| `var x = a > b ? 1 : 2;` | `var x = true ? 1 : 2;` ¹ |
119-
| `var x = a > b ? 1 : 2;` | `var x = false ? 1 : 2;` ¹ |
111+
| Mutant Operator | Original | Mutated |
112+
| ------------------ | ---------------------------------- | ----------------------------------- |
113+
| LessThanToFalse | `for (var i = 0; i < 10; i++) { }` | `for (var i = 0; false; i++) { }` ¹ |
114+
| GreaterThanToFalse | `while (a > b) { }` | `while (false) { }` |
115+
| GreaterThanToFalse | `do { } while (a > b);` | `do { } while (false);` |
116+
| GreaterThanToTrue | `if (a > b) { }` | `if (true) { }` |
117+
| GreaterThanToFalse | `if (a > b) { }` | `if (false) { }` |
118+
| GreaterThanToTrue | `var x = a > b ? 1 : 2;` | `var x = true ? 1 : 2;` ¹ |
119+
| GreaterThanToFalse | `var x = a > b ? 1 : 2;` | `var x = false ? 1 : 2;` ¹ |
120120

121121
- ¹: Not supported by Stryker4s
122122

123123
[🔝 Back to Top](#)
124124

125125
## Equality Operator
126126

127-
| Original | Mutated |
128-
| --------- | ----------- |
129-
| `a < b` | `a <= b` |
130-
| `a < b` | `a >= b` |
131-
| `a <= b` | `a < b` |
132-
| `a <= b` | `a > b` |
133-
| `a > b` | `a >= b` |
134-
| `a > b` | `a <= b` |
135-
| `a >= b` | `a > b` |
136-
| `a >= b` | `a < b` |
137-
| `a == b` | `a != b` |
138-
| `a != b` | `a == b` |
139-
| `a === b` | `a !== b` ¹ |
140-
| `a !== b` | `a === b` ¹ |
127+
| Mutant operator | Original | Mutated |
128+
| ------------------------ | --------- | ----------- |
129+
| LessThanBoundary | `a < b` | `a <= b` |
130+
| LessThanNegation | `a < b` | `a >= b` |
131+
| LessThanEqualBoundary | `a <= b` | `a < b` |
132+
| LessThanEqualNegation | `a <= b` | `a > b` |
133+
| GreaterThanBoundary | `a > b` | `a >= b` |
134+
| GreaterThanNegation | `a > b` | `a <= b` |
135+
| GreaterThanEqualBoundary | `a >= b` | `a > b` |
136+
| GreaterThanEqualNegation | `a >= b` | `a < b` |
137+
| EqualityNegation | `a == b` | `a != b` |
138+
| InequalityNegation | `a != b` | `a == b` |
139+
| StrictEqualityNegation | `a === b` | `a !== b` ¹ |
140+
| StrictInequalityNegation | `a !== b` | `a === b` ¹ |
141141

142142
- ¹: Only supported on StrykerJS and Stryker4s
143143

144144
[🔝 Back to Top](#)
145145

146146
## Logical Operator
147147

148-
| Original | Mutated |
149-
| ----------------------------- | ----------------------------- |
150-
| `a && b` | <code>a &vert;&vert; b</code> |
151-
| <code>a &vert;&vert; b</code> | `a && b` |
152-
| `a ?? b` | `a && b` |
148+
| Mutant operator | Original | Mutated |
149+
| ------------------- | ----------------------------- | ----------------------------- |
150+
| AndNegation | `a && b` | <code>a &vert;&vert; b</code> |
151+
| OrNegation | <code>a &vert;&vert; b</code> | `a && b` |
152+
| NullCoalescingToAnd | `a ?? b` | `a && b` |
153153

154154
[🔝 Back to Top](#)
155155

@@ -159,92 +159,94 @@ Due to differences in language syntax, method expressions are implemented differ
159159

160160
### StrykerJS
161161

162-
| Original | Mutated |
163-
| -------------------- | --------------------- |
164-
| `endsWith()` | `startsWith()` |
165-
| `startsWith()` | `endsWith()` |
166-
| `trim()` | ` ` |
167-
| `trimEnd()` | `trimStart()` |
168-
| `trimStart()` | `trimEnd()` |
169-
| `substr()` | ` ` |
170-
| `substring()` | ` ` |
171-
| `toUpperCase()` | ` toLowerCase()` |
172-
| `toLowerCase()` | ` toUpperCase()` |
173-
| `toLocalLowerCase()` | `toLocalUpperCase()` |
174-
| `toLocalUpperCase()` | ` toLocalLowerCase()` |
175-
| `sort()` | ` ` |
176-
| `some()` | `every()` |
177-
| `every()` | `some()` |
178-
| `reverse()` | ` ` |
179-
| `filter()` | ` ` |
180-
| `slice()` | ` ` |
181-
| `charAt()` | ` ` |
182-
| `min()` | `max()` |
183-
| `max()` | `min()` |
162+
| Mutant operator | Original | Mutated |
163+
| ------------------------------ | -------------------- | -------------------- |
164+
| EndsWithToStartsWith | `endsWith()` | `startsWith()` |
165+
| StartsWithToEndsWith | `startsWith()` | `endsWith()` |
166+
| TrimToTrimEnd | `trim()` | `trimEnd()` |
167+
| TrimToTrimStart | `trimEnd()` | `trimStart()` |
168+
| TrimToTrimEnd | `trimStart()` | `trimEnd()` |
169+
| SubstrRemoval | `substr()` | ` ` |
170+
| SubstringRemoval | `substring()` | ` ` |
171+
| UpperCaseToLowerCase | `toUpperCase()` | `toLowerCase()` |
172+
| LowerCaseToUpperCase | `toLowerCase()` | `toUpperCase()` |
173+
| LocalLowerCaseToLocalUpperCase | `toLocalLowerCase()` | `toLocalUpperCase()` |
174+
| LocalUpperCaseToLocalLowerCase | `toLocalUpperCase()` | `toLocalLowerCase()` |
175+
| SortRemoval | `sort()` | ` ` |
176+
| SomeToEvery | `some()` | `every()` |
177+
| EveryToSome | `every()` | `some()` |
178+
| ReverseRemoval | `reverse()` | ` ` |
179+
| FilterRemoval | `filter()` | ` ` |
180+
| SliceRemoval | `slice()` | ` ` |
181+
| CharAtRemoval | `charAt()` | ` ` |
182+
| MinToMax | `min()` | `max()` |
183+
| MaxToMin | `max()` | `min()` |
184184

185185
### Stryker.NET
186186

187-
| Original | Mutated |
188-
| --------------------- | ------------------- |
189-
| `Distinct()` | ` ` |
190-
| `Reverse()` | ` ` |
191-
| `OrderBy()` | ` ` |
192-
| `OrderByDescending()` | ` ` |
193-
| `SingleOrDefault()` | `FirstOrDefault()` |
194-
| `FirstOrDefault()` | `SingleOrDefault()` |
195-
| `First()` | `Last()` |
196-
| `Last()` | `First()` |
197-
| `All()` | `Any()` |
198-
| `Any()` | `All()` |
199-
| `Skip()` | `Take()` |
200-
| `Take()` | `Skip()` |
201-
| `SkipWhile()` | `TakeWhile()` |
202-
| `TakeWhile()` | `SkipWhile()` |
203-
| `Min()` | `Max()` |
204-
| `Max()` | `Min()` |
205-
| `Sum()` | `Count()` |
206-
| `Count()` | `Sum()` |
187+
| Mutant operator | Original | Mutated |
188+
| ------------------------------- | --------------------- | ------------------- |
189+
| DistinctRemoval | `Distinct()` | ` ` |
190+
| ReverseRemoval | `Reverse()` | ` ` |
191+
| OrderByRemoval | `OrderBy()` | ` ` |
192+
| OrderByDescendingRemoval | `OrderByDescending()` | ` ` |
193+
| SingleOrDefaultToFirstOrDefault | `SingleOrDefault()` | `FirstOrDefault()` |
194+
| FirstOrDefaultToSingleOrDefault | `FirstOrDefault()` | `SingleOrDefault()` |
195+
| FirstToLast | `First()` | `Last()` |
196+
| LastToFirst | `Last()` | `First()` |
197+
| AllToAny | `All()` | `Any()` |
198+
| AnyToAll | `Any()` | `All()` |
199+
| SkipToTake | `Skip()` | `Take()` |
200+
| TakeToSkip | `Take()` | `Skip()` |
201+
| SkipWhileToTakeWhile | `SkipWhile()` | `TakeWhile()` |
202+
| TakeWhileToSkipWhile | `TakeWhile()` | `SkipWhile()` |
203+
| MinToMax | `Min()` | `Max()` |
204+
| MaxToMin | `Max()` | `Min()` |
205+
| SumToCount | `Sum()` | `Count()` |
206+
| CountToSum | `Count()` | `Sum()` |
207207

208208
### Stryker4s
209209

210-
| Original | Mutated |
211-
| ------------------ | ------------------ |
212-
| `a.filter(b)` | `a.filterNot(b)` |
213-
| `a.filterNot(b)` | `a.filter(b)` |
214-
| `a.exists(b)` | `a.forall(b)` |
215-
| `a.forall(b)` | `a.exists(b)` |
216-
| `a.take(b)` | `a.drop(b)` |
217-
| `a.drop(b)` | `a.take(b)` |
218-
| `a.takeRight(b)` | `a.dropRight(b)` |
219-
| `a.dropRight(b)` | `a.takeRight(b)` |
220-
| `a.takeWhile(b)` | `a.dropWhile(b)` |
221-
| `a.dropWhile(b)` | `a.takeWhile(b)` |
222-
| `a.isEmpty` | `a.nonEmpty` |
223-
| `a.nonEmpty` | `a.isEmpty` |
224-
| `a.indexOf` | `a.lastIndexOf(b)` |
225-
| `a.lastIndexOf(b)` | `a.indexOf(b)` |
226-
| `a.max` | `a.min` |
227-
| `a.min` | `a.max` |
228-
| `a.maxBy(b)` | `a.minBy(b)` |
229-
| `a.minBy(b)` | `a.maxBy(b)` |
210+
| Mutant operator | Original | Mutated |
211+
| -------------------- | ------------------ | ------------------ |
212+
| FilterNegation | `a.filter(b)` | `a.filterNot(b)` |
213+
| FilterNotNegation | `a.filterNot(b)` | `a.filter(b)` |
214+
| ExistsToForAll | `a.exists(b)` | `a.forall(b)` |
215+
| ForAllToExists | `a.forall(b)` | `a.exists(b)` |
216+
| TakeToDrop | `a.take(b)` | `a.drop(b)` |
217+
| DropToTake | `a.drop(b)` | `a.take(b)` |
218+
| TakeRightNegation | `a.takeRight(b)` | `a.dropRight(b)` |
219+
| DropRightNegation | `a.dropRight(b)` | `a.takeRight(b)` |
220+
| TakeWhileToDropWile | `a.takeWhile(b)` | `a.dropWhile(b)` |
221+
| DropWhileToTakeWhile | `a.dropWhile(b)` | `a.takeWhile(b)` |
222+
| IsEmptyNegation | `a.isEmpty` | `a.nonEmpty` |
223+
| IsNonEmptyNegation | `a.nonEmpty` | `a.isEmpty` |
224+
| IndexOfToLastIndexOf | `a.indexOf` | `a.lastIndexOf(b)` |
225+
| LastIndexOfToIndexOf | `a.lastIndexOf(b)` | `a.indexOf(b)` |
226+
| MaxToMin | `a.max` | `a.min` |
227+
| MinToMax | `a.min` | `a.max` |
228+
| MaxByToMinBy | `a.maxBy(b)` | `a.minBy(b)` |
229+
| MinByToMaxBy | `a.minBy(b)` | `a.maxBy(b)` |
230230

231231
[🔝 Back to Top](#)
232232

233233
## Object literal
234234

235-
| Original | Mutated |
236-
| ---------------- | ------- |
237-
| `{ foo: 'bar' }` | `{ }` |
235+
| Mutant operator | Original | Mutated |
236+
| ----------------------- | ---------------- | ------- |
237+
| ObjectPropertiesRemoval | `{ foo: 'bar' }` | `{ }` |
238238

239239
[🔝 Back to Top](#)
240240

241241
## Optional chaining
242242

243-
| Original | Mutated |
244-
| ---------- | --------- |
245-
| `foo?.bar` | `foo.bar` |
246-
| `foo?.[1]` | `foo[1]` |
247-
| `foo?.()` | `foo()` |
243+
StrykerJS _specific mutator_
244+
245+
| Mutant operator | Original | Mutated |
246+
| -------------------------- | ---------- | --------- |
247+
| OptionalMemberToRequired | `foo?.bar` | `foo.bar` |
248+
| OptionalComputedToRequired | `foo?.[1]` | `foo[1]` |
249+
| OptionalCallToRequired | `foo?.()` | `foo()` |
248250

249251
[🔝 Back to Top](#)
250252

@@ -293,32 +295,33 @@ Strings and literals identified to a regex are mutated in the following way:
293295

294296
## String Literal
295297

296-
| Original | Mutated |
297-
| -------------------------------------- | --------------------- |
298-
| `"foo"` (non-empty string) | `""` (empty string) |
299-
| `""` (empty string) | `"Stryker was here!"` |
300-
| `s"foo ${bar}"` (string interpolation) | `s""` ¹ |
298+
| Mutant operator | Original | Mutated |
299+
| ------------------------------- | -------------------------------------- | --------------------- |
300+
| FilledStringToEmpty | `"foo"` (filled string) | `""` (empty string) |
301+
| EmptyStringToFilled | `""` (empty string) | `"Stryker was here!"` |
302+
| FilledInterpolatedStringToEmpty | `s"foo ${bar}"` (string interpolation) | `s""` ¹ |
303+
| FilledInterpolatedStringToEmpty | `\`foo ${bar}\`` | `\`\`` |
301304

302305
¹ For Stryker4s, only works with string interpolation and not other types of interpolation (like [Scalameta quasiquotes](https://scalameta.org/docs/trees/guide.html#with-quasiquotes)) to avoid compile errors
303306

304307
[🔝 Back to Top](#)
305308

306309
## Unary Operator
307310

308-
| Original | Mutated |
309-
| -------- | ------- |
310-
| `+a` | `-a` |
311-
| `-a` | `+a` |
311+
| Mutant operator | Original | Mutated |
312+
| --------------- | -------- | ------- |
313+
| PlusNegation | `+a` | `-a` |
314+
| MinusNegation | `-a` | `+a` |
312315

313316
[🔝 Back to Top](#)
314317

315318
## Update Operator
316319

317-
| Original | Mutated |
318-
| -------- | ------- |
319-
| `a++` | `a--` |
320-
| `a--` | `a++` |
321-
| `++a` | `--a` |
322-
| `--a` | `++a` |
320+
| Mutant operator | Original | Mutated |
321+
| ------------------------ | -------- | ------- |
322+
| PostfixIncrementNegation | `a++` | `a--` |
323+
| PostfixDecrementNegation | `a--` | `a++` |
324+
| PrefixIncrementNegation | `++a` | `--a` |
325+
| PrefixDecrementNegation | `--a` | `++a` |
323326

324327
[🔝 Back to Top](#)

0 commit comments

Comments
 (0)