@@ -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 >| ; =</code > |
62- | <code >| ; =</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 >| ; =</code > |
62+ | BitwiseOrAssignmentNegation | <code >| ; =</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
7474function 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
101101Stryker.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