Skip to content

Commit 6556ab9

Browse files
michalusioMichał IsalskiLiam-Rougoorrouke-broersma
authored
feat(mutator): Add conditional operator mutator (#2583)
* feat(Mutators): Add conditional operator mutator Add conditional operator mutator Add tests for conditional operator mutator Include conditional operator mutator in mutations.md * Fixes to unit tests * feat(Mutators): Remove NegateConditionMutator's conditional expression mutation * Fix integration tests * Fix last integration test * ConditionalExpressionMutator should not mutate declaration patterns. Fix tests. * Fix ValidateStrykerResults compilation. --------- Co-authored-by: Michał Isalski <isalski.michal@gmail.com> Co-authored-by: Liam Rougoor <liam.rougoor@infosupport.com> Co-authored-by: Liam Rougoor <35850587+Liam-Rougoor@users.noreply.github.com> Co-authored-by: Rouke Broersma <rouke.broersma@infosupport.com>
1 parent c68c46c commit 6556ab9

File tree

10 files changed

+185
-61
lines changed

10 files changed

+185
-61
lines changed

docs/mutations.md

+6
Original file line numberDiff line numberDiff line change
@@ -256,3 +256,9 @@ For the full list of all available regex mutations, see the [regex mutator docs]
256256
| `a ?? b` | `b ?? a` |
257257
| `a ?? b` | `a` |
258258
| `a ?? b` | `b` |
259+
260+
## Conditional Operators (_conditional_)
261+
| Original | Mutated |
262+
|---------------------|---------------------|
263+
| `x ? a : b` | `true ? a : b` |
264+
| `x ? a : b` | `false ? a : b` |

integrationtest/ValidationProject/ValidateStrykerResults.cs

+4-6
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@
22
using System.IO;
33
using System.Linq;
44
using System.Runtime.InteropServices;
5-
using Microsoft.CodeAnalysis;
65
using Microsoft.CodeAnalysis.CSharp;
76
using Microsoft.CodeAnalysis.Text;
87
using Newtonsoft.Json;
98
using Shouldly;
109
using Stryker.Core.Mutants;
1110
using Stryker.Core.Reporters.Json;
12-
using Stryker.CLI;
1311
using Xunit;
1412

1513
namespace IntegrationTests
@@ -63,7 +61,7 @@ public void NetFullFramework()
6361

6462
var report = JsonConvert.DeserializeObject<JsonReport>(strykerRunOutput);
6563

66-
CheckReportMutants(report, total: 28, ignored: 7, survived: 2, killed: 7, timeout: 0, nocoverage: 11);
64+
CheckReportMutants(report, total: 29, ignored: 7, survived: 3, killed: 7, timeout: 0, nocoverage: 11);
6765
}
6866
}
6967

@@ -82,7 +80,7 @@ public void NetCore()
8280

8381
var report = JsonConvert.DeserializeObject<JsonReport>(strykerRunOutput);
8482

85-
CheckReportMutants(report, total: 117, ignored: 57, survived: 4, killed: 7, timeout: 2, nocoverage: 45);
83+
CheckReportMutants(report, total: 120, ignored: 58, survived: 4, killed: 8, timeout: 2, nocoverage: 46);
8684
CheckReportTestCounts(report, total: 16);
8785
}
8886

@@ -121,7 +119,7 @@ public void NetCoreWithTwoTestProjects()
121119

122120
var report = JsonConvert.DeserializeObject<JsonReport>(strykerRunOutput);
123121

124-
CheckReportMutants(report, total: 117, ignored: 28, survived: 8, killed: 10, timeout: 2, nocoverage: 67);
122+
CheckReportMutants(report, total: 120, ignored: 29, survived: 8, killed: 11, timeout: 2, nocoverage: 68);
125123
CheckReportTestCounts(report, total: 32);
126124
}
127125

@@ -140,7 +138,7 @@ public void SolutionRun()
140138

141139
var report = JsonConvert.DeserializeObject<JsonReport>(strykerRunOutput);
142140

143-
CheckReportMutants(report, total: 117, ignored: 57, survived: 4, killed: 7, timeout: 2, nocoverage: 45);
141+
CheckReportMutants(report, total: 120, ignored: 58, survived: 4, killed: 8, timeout: 2, nocoverage: 46);
144142
CheckReportTestCounts(report, total: 32);
145143
}
146144

src/Stryker.Core/Stryker.Core.UnitTest/Mutants/CsharpMutantOrchestratorTests.cs

+49-46
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ public void ShouldAddReturnDefaultToArrowExpressionOperator()
127127
string source =
128128
@"public static int operator+ (TestClass value, TestClass other) => Sub(out var x, """")?1:2;";
129129
string expected =
130-
@"public static int operator+ (TestClass value, TestClass other) {if(StrykerNamespace.MutantControl.IsActive(0)){return!(Sub(out var x, """"))?1:2;}else{return Sub(out var x, (StrykerNamespace.MutantControl.IsActive(1)?""Stryker was here!"":""""))?1:2;}}";
130+
@"public static int operator+ (TestClass value, TestClass other) {if(StrykerNamespace.MutantControl.IsActive(1)){return(false?1:2);}else{if(StrykerNamespace.MutantControl.IsActive(0)){return(true?1:2);}else{return Sub(out var x, (StrykerNamespace.MutantControl.IsActive(2)?""Stryker was here!"":""""))?1:2;}}}";
131131
ShouldMutateSourceInClassToExpected(source, expected);
132132
}
133133

@@ -156,8 +156,8 @@ public void ShouldMutateExpressionBodiedLocalFunction()
156156
int SomeMethod() => (true && SomeOtherMethod(out var x)) ? x : 5;
157157
}";
158158
string expected = @"void TestMethod(){if(StrykerNamespace.MutantControl.IsActive(0)){}else{
159-
int SomeMethod() {if(StrykerNamespace.MutantControl.IsActive(1)){return!((true && SomeOtherMethod(out var x)) )? x : 5;}else{if(StrykerNamespace.MutantControl.IsActive(2)){return(true || SomeOtherMethod(out var x)) ? x : 5;}else{return ((StrykerNamespace.MutantControl.IsActive(3)?false:true )&& SomeOtherMethod(out var x)) ? x : 5;}}};}}
160-
}";
159+
int SomeMethod() {if(StrykerNamespace.MutantControl.IsActive(2)){return(false?x :5);}else{if(StrykerNamespace.MutantControl.IsActive(1)){return(true?x :5);}else{if(StrykerNamespace.MutantControl.IsActive(3)){return(true || SomeOtherMethod(out var x)) ? x : 5;}else{return((StrykerNamespace.MutantControl.IsActive(4)?false:true )&& SomeOtherMethod(out var x)) ? x : 5;}}}};
160+
}}";
161161

162162
ShouldMutateSourceInClassToExpected(source, expected);
163163
}
@@ -355,28 +355,22 @@ private bool Out(out string test)
355355
return true;
356356
}";
357357
string expected = @"void TestMethod()
358-
{if(StrykerNamespace.MutantControl.IsActive(0)){}else{if(StrykerNamespace.MutantControl.IsActive(1)){
358+
{if(StrykerNamespace.MutantControl.IsActive(0)){}else{if(StrykerNamespace.MutantControl.IsActive(2)){
359359
int i = 0;
360-
var result = !(Out(out var test) )? test : """";
360+
var result = (false?test :"""");
361361
}
362-
else{
362+
else{if(StrykerNamespace.MutantControl.IsActive(1)){
363363
int i = 0;
364-
var result = Out(out var test) ? test : (StrykerNamespace.MutantControl.IsActive(2)?""Stryker was here!"":"""");
365-
}
366-
}
364+
var result = (true?test :"""");
367365
}
368-
private bool Out(out string test)
369-
{
370-
{ test = default(string); }
371-
if (StrykerNamespace.MutantControl.IsActive(3))
372-
{ }
373-
else
374-
{
375-
return (StrykerNamespace.MutantControl.IsActive(4) ? false : true);
376-
}
377-
return default(bool);
366+
else{
367+
int i = 0;
368+
var result = Out(out var test) ? test : (StrykerNamespace.MutantControl.IsActive(3)?""Stryker was here!"":"""");
378369
}
379-
";
370+
}}}private bool Out(out string test)
371+
{{test= default(string);}if(StrykerNamespace.MutantControl.IsActive(4)){}else{
372+
return (StrykerNamespace.MutantControl.IsActive(5)?false:true);
373+
}return default(bool);}";
380374

381375
ShouldMutateSourceInClassToExpected(source, expected);
382376
}
@@ -397,19 +391,13 @@ private bool Out(int test, Func<int, bool>lambda )
397391
string expected = @"void TestMethod()
398392
{if(StrykerNamespace.MutantControl.IsActive(0)){}else{
399393
int i = 0;
400-
var result = (StrykerNamespace.MutantControl.IsActive(1)?!(Out(i, (x) => { int.TryParse(""3"", out int y); return x == y;} ) ):Out(i, (x) => {if(StrykerNamespace.MutantControl.IsActive(2)){}else{ int.TryParse((StrykerNamespace.MutantControl.IsActive(3)?"""":""3""), out int y); return (StrykerNamespace.MutantControl.IsActive(4)?x != y:x == y);} return default;}) )? i.ToString() : (StrykerNamespace.MutantControl.IsActive(5)?""Stryker was here!"":"""");
394+
var result = (StrykerNamespace.MutantControl.IsActive(2)?(false?i.ToString() :""""):(StrykerNamespace.MutantControl.IsActive(1)?(true?i.ToString() :""""):Out(i, (x) => {if(StrykerNamespace.MutantControl.IsActive(3)){}else{ int.TryParse((StrykerNamespace.MutantControl.IsActive(4)?"""":""3""), out int y); return (StrykerNamespace.MutantControl.IsActive(5)?x != y:x == y);} return default;}) ? i.ToString() : (StrykerNamespace.MutantControl.IsActive(6)?""Stryker was here!"":"""")));
401395
}
402-
}
403-
private bool Out(int test, Func<int, bool> lambda)
404-
{
405-
if (StrykerNamespace.MutantControl.IsActive(6))
406-
{ }
407-
else
408-
{
409-
return (StrykerNamespace.MutantControl.IsActive(7) ? false : true);
410-
}
411-
return default(bool);
412-
}";
396+
}private bool Out(int test, Func<int, bool>lambda )
397+
{if(StrykerNamespace.MutantControl.IsActive(7)){}else{
398+
return (StrykerNamespace.MutantControl.IsActive(8)?false:true);
399+
}
400+
return default(bool);}";
413401

414402
ShouldMutateSourceInClassToExpected(source, expected);
415403
}
@@ -426,9 +414,9 @@ public void ShouldMutateWhenDeclarationInInnerScopeInExpressionForm()
426414
var expected = @"void TestMethod()
427415
{if(StrykerNamespace.MutantControl.IsActive(0)){}else{
428416
int i = 0;
429-
var result = Out(i, (x) => {if(StrykerNamespace.MutantControl.IsActive(1)){return!(int.TryParse(""3"", out int y) )? true : false;}else{return int.TryParse((StrykerNamespace.MutantControl.IsActive(2)?"""":""3""), out int y) ? (StrykerNamespace.MutantControl.IsActive(3)?false:true ): (StrykerNamespace.MutantControl.IsActive(4)?true:false);}});
430-
}}
431-
";
417+
var result = Out(i, (x) => (StrykerNamespace.MutantControl.IsActive(2)?(false?true :false):(StrykerNamespace.MutantControl.IsActive(1)?(true?true :false):int.TryParse((StrykerNamespace.MutantControl.IsActive(3)?"""":""3""), out int y) ? (StrykerNamespace.MutantControl.IsActive(4)?false:true ): (StrykerNamespace.MutantControl.IsActive(5)?true:false))));
418+
}
419+
}";
432420

433421
ShouldMutateSourceInClassToExpected(source, expected);
434422
}
@@ -494,7 +482,7 @@ string SomeLocalFunction()
494482

495483
ShouldMutateSourceInClassToExpected(source, expected);
496484
}
497-
485+
498486
[Fact]
499487
public void ShouldMutateConditionalMemberAccessProperly()
500488
{
@@ -509,7 +497,7 @@ public void ShouldMutateConditionalMemberAccessProperly()
509497

510498
ShouldMutateSourceInClassToExpected(source, expected);
511499
}
512-
500+
513501

514502
[Fact]
515503
public void ShouldMutateConditionalExpressionOnArrayDeclaration()
@@ -742,17 +730,17 @@ public void ShouldMutateComplexExpressionBodiedMethod()
742730
{
743731
string source = @"public int SomeMethod() => (true && SomeOtherMethod(out var x)) ? x : 5;";
744732
string expected =
745-
@"public int SomeMethod() {if(StrykerNamespace.MutantControl.IsActive(0)){return!((true && SomeOtherMethod(out var x)) )? x : 5;}else{if(StrykerNamespace.MutantControl.IsActive(1)){return(true || SomeOtherMethod(out var x)) ? x : 5;}else{return ((StrykerNamespace.MutantControl.IsActive(2)?false:true )&& SomeOtherMethod(out var x)) ? x : 5;}}}";
733+
@"public int SomeMethod() {if(StrykerNamespace.MutantControl.IsActive(1)){return(false?x :5);}else{if(StrykerNamespace.MutantControl.IsActive(0)){return(true?x :5);}else{if(StrykerNamespace.MutantControl.IsActive(2)){return(true || SomeOtherMethod(out var x)) ? x : 5;}else{return ((StrykerNamespace.MutantControl.IsActive(3)?false:true )&& SomeOtherMethod(out var x)) ? x : 5;}}}}";
746734

747735
ShouldMutateSourceInClassToExpected(source, expected);
748736
}
749737

750738
[Fact]
751739
public void ShouldMutateExpressionBodiedStaticConstructor()
752740
{
753-
string source = @"static Test() => (true && SomeOtherMethod(out var x)) ? x : 5;";
741+
string source = @"static Test() => (true && SomeOtherMethod(out var x)) ? x : 5;";
754742
string expected =
755-
@"static Test() {using(new StrykerNamespace.MutantContext()){if(StrykerNamespace.MutantControl.IsActive(0)){!((true && SomeOtherMethod(out var x)) )? x : 5;}else{if(StrykerNamespace.MutantControl.IsActive(1)){(true || SomeOtherMethod(out var x)) ? x : 5;}else{((StrykerNamespace.MutantControl.IsActive(2)?false:true )&& SomeOtherMethod(out var x)) ? x : 5;}}}}}";
743+
@"static Test() {using(new StrykerNamespace.MutantContext()){if(StrykerNamespace.MutantControl.IsActive(1)){(false?x :5);}else{if(StrykerNamespace.MutantControl.IsActive(0)){(true?x :5);}else{if(StrykerNamespace.MutantControl.IsActive(2)){(true || SomeOtherMethod(out var x)) ? x : 5;}else{((StrykerNamespace.MutantControl.IsActive(3)?false:true )&& SomeOtherMethod(out var x)) ? x : 5;}}}}}";
756744

757745
ShouldMutateSourceInClassToExpected(source, expected);
758746
}
@@ -1552,12 +1540,29 @@ public void ShouldMutatePropertiesInArrowFormEvenWithComplexConstruction()
15521540
static TestClass(){}}";
15531541

15541542
var expected = @"class Test {
1555-
string Value {get {if(StrykerNamespace.MutantControl.IsActive(0)){return!(Out(out var x))? ""empty"": """";}else{return Out(out var x)? (StrykerNamespace.MutantControl.IsActive(1)?"""":""empty""): (StrykerNamespace.MutantControl.IsActive(2)?""Stryker was here!"":"""");}}}
1543+
string Value {get {if(StrykerNamespace.MutantControl.IsActive(1)){return(false?""empty"":"""");}else{if(StrykerNamespace.MutantControl.IsActive(0)){return(true?""empty"":"""");}else{return Out(out var x)? (StrykerNamespace.MutantControl.IsActive(2)?"""":""empty""): (StrykerNamespace.MutantControl.IsActive(3)?""Stryker was here!"":"""");}}}}
15561544
static TestClass(){using(new StrykerNamespace.MutantContext()){}}}";
15571545

15581546
ShouldMutateSourceInClassToExpected(source, expected);
15591547
}
15601548

1549+
[Fact]
1550+
public void ShouldMutateConditionalExpression()
1551+
{
1552+
string source = @"void TestMethod()
1553+
{
1554+
var a = 1;
1555+
var x = a == 1 ? 5 : 7;
1556+
}";
1557+
string expected = @"void TestMethod()
1558+
{if(StrykerNamespace.MutantControl.IsActive(0)){}else{
1559+
var a = 1;
1560+
var x = (StrykerNamespace.MutantControl.IsActive(2)?(false?5 :7):(StrykerNamespace.MutantControl.IsActive(1)?(true?5 :7):(StrykerNamespace.MutantControl.IsActive(3)?a != 1 :a == 1 )? 5 : 7));
1561+
}}";
1562+
1563+
ShouldMutateSourceInClassToExpected(source, expected);
1564+
}
1565+
15611566
[Fact]
15621567
public void ShouldMutateStaticProperties()
15631568
{
@@ -1601,7 +1606,7 @@ public void ShouldMutateStaticPropertiesInArrowFormEvenWithComplexConstruction()
16011606
static string Value => Out(out var x)? ""empty"": """";}";
16021607

16031608
var expected = @"class Test {
1604-
static string Value {get {if(StrykerNamespace.MutantControl.IsActive(0)){return!(Out(out var x))? ""empty"": """";}else{return Out(out var x)? (StrykerNamespace.MutantControl.IsActive(1)?"""":""empty""): (StrykerNamespace.MutantControl.IsActive(2)?""Stryker was here!"":"""");}}}}";
1609+
static string Value {get{if(StrykerNamespace.MutantControl.IsActive(1)){return(false?""empty"":"""");}else{if(StrykerNamespace.MutantControl.IsActive(0)){return(true?""empty"":"""");}else{return Out(out var x)? (StrykerNamespace.MutantControl.IsActive(2)?"""":""empty""): (StrykerNamespace.MutantControl.IsActive(3)?""Stryker was here!"":"""");}}}}}";
16051610

16061611
ShouldMutateSourceInClassToExpected(source, expected);
16071612
}
@@ -1614,8 +1619,7 @@ public void ShouldMutatePropertiesAsArrowExpression()
16141619
}";
16151620

16161621
var expected = @"class Test {
1617-
string Value {get{if(StrykerNamespace.MutantControl.IsActive(0)){return!(Generator(out var x) )? """" :""test"";}else{return Generator(out var x) ? (StrykerNamespace.MutantControl.IsActive(1)?""Stryker was here!"":"""" ):(StrykerNamespace.MutantControl.IsActive(2)?"""":""test"");}}}
1618-
}";
1622+
string Value {get{if(StrykerNamespace.MutantControl.IsActive(1)){return(false?"""" :""test"");}else{if(StrykerNamespace.MutantControl.IsActive(0)){return(true?"""" :""test"");}else{return Generator(out var x) ? (StrykerNamespace.MutantControl.IsActive(2)?""Stryker was here!"":"""" ):(StrykerNamespace.MutantControl.IsActive(3)?"""":""test"");}}}}}";
16191623
ShouldMutateSourceInClassToExpected(source, expected);
16201624
}
16211625

@@ -1666,8 +1670,7 @@ public void ShouldNotLeakMutationsAcrossDefinitions()
16661670
}";
16671671

16681672
var expected = @"class Test {
1669-
int GetId(string input) {if(StrykerNamespace.MutantControl.IsActive(0)){return!(int.TryParse(input, out var result) )? result : 0;}else{return int.TryParse(input, out var result) ? result : 0;}}
1670-
string Value {get{if(StrykerNamespace.MutantControl.IsActive(1)){return!(Generator(out var x) )? """" :""test"";}else{return Generator(out var x) ? (StrykerNamespace.MutantControl.IsActive(2)?""Stryker was here!"":"""" ):(StrykerNamespace.MutantControl.IsActive(3)?"""":""test"");}}}}}}";
1673+
int GetId(string input) {if(StrykerNamespace.MutantControl.IsActive(1)){return(false?result :0);}else{if(StrykerNamespace.MutantControl.IsActive(0)){return(true?result :0);}else{return int.TryParse(input, out var result) ? result : 0;}}}string Value {get{if(StrykerNamespace.MutantControl.IsActive(3)){return(false?"""" :""test"");}else{if(StrykerNamespace.MutantControl.IsActive(2)){return(true?"""" :""test"");}else{return Generator(out var x) ? (StrykerNamespace.MutantControl.IsActive(4)?""Stryker was here!"":"""" ):(StrykerNamespace.MutantControl.IsActive(5)?"""":""test"");}}}}}";
16711674
ShouldMutateSourceInClassToExpected(source, expected);
16721675
}
16731676

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
using Microsoft.CodeAnalysis.CSharp;
2+
using Microsoft.CodeAnalysis.CSharp.Syntax;
3+
using Shouldly;
4+
using Stryker.Core.Mutators;
5+
using System.Linq;
6+
using Microsoft.CodeAnalysis;
7+
using Xunit;
8+
9+
namespace Stryker.Core.UnitTest.Mutators
10+
{
11+
public class ConditionalExpressionMutatorTests : TestBase
12+
{
13+
[Fact]
14+
public void ShouldBeMutationLevelStandard()
15+
{
16+
var target = new ConditionalExpressionMutator();
17+
target.MutationLevel.ShouldBe(MutationLevel.Standard);
18+
}
19+
20+
[Fact]
21+
public void ShouldMutate_TwoMutations()
22+
{
23+
var target = new ConditionalExpressionMutator();
24+
var source = @"251 == 73 ? 1 : 0";
25+
var tree = CSharpSyntaxTree.ParseText(source);
26+
var originalNode = tree.GetRoot().DescendantNodes().OfType<ConditionalExpressionSyntax>().Single();
27+
28+
var result = target.ApplyMutations(originalNode, null).ToList();
29+
30+
result.Count.ShouldBe(2, "Two mutations should have been made");
31+
Assert.Collection(
32+
result,
33+
m1 => (m1.ReplacementNode is ParenthesizedExpressionSyntax pes && pes.Expression is ConditionalExpressionSyntax ces && ces.Condition.Kind() is SyntaxKind.TrueLiteralExpression).ShouldBeTrue(),
34+
m2 => (m2.ReplacementNode is ParenthesizedExpressionSyntax pes && pes.Expression is ConditionalExpressionSyntax ces && ces.Condition.Kind() is SyntaxKind.FalseLiteralExpression).ShouldBeTrue()
35+
);
36+
}
37+
38+
[Fact]
39+
public void ShouldMutate_DoNotTouchBranches()
40+
{
41+
var target = new ConditionalExpressionMutator();
42+
var source = "251 == 73 ? 1 : 0";
43+
var tree = CSharpSyntaxTree.ParseText(source);
44+
var originalNode = tree.GetRoot().DescendantNodes().OfType<ConditionalExpressionSyntax>().Single();
45+
46+
var result = target.ApplyMutations(originalNode, null).ToList();
47+
48+
foreach (var mutation in result)
49+
{
50+
var pes = mutation.ReplacementNode.ShouldBeOfType<ParenthesizedExpressionSyntax>();
51+
var ces = pes.Expression.ShouldBeOfType<ConditionalExpressionSyntax>();
52+
ces.WhenTrue.IsEquivalentTo(originalNode.WhenTrue).ShouldBeTrue();
53+
ces.WhenFalse.IsEquivalentTo(originalNode.WhenFalse).ShouldBeTrue();
54+
}
55+
}
56+
57+
[Fact]
58+
public void ShouldNotMutateDeclarationPatterns()
59+
{
60+
var target = new ConditionalExpressionMutator();
61+
var source = "var y = x is object result ? result.ToString() : null;";
62+
SyntaxTree tree = CSharpSyntaxTree.ParseText(source);
63+
64+
var expressionSyntax = tree.GetRoot().DescendantNodes().OfType<ConditionalExpressionSyntax>().Single();
65+
var result = target.ApplyMutations(expressionSyntax, null).ToList();
66+
67+
result.ShouldBeEmpty();
68+
}
69+
}
70+
}

src/Stryker.Core/Stryker.Core.UnitTest/Mutators/NegateConditionMutatorTests.cs

-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ static void Main(string[] args)
4848
[Theory]
4949
[InlineData("if (Method()) => return true;")]
5050
[InlineData("while (Method()) => age++;")]
51-
[InlineData("(Method()? 1:2);")]
5251
public void MutatesStatementWithMethodCallWithNoArguments(string method)
5352
{
5453
var target = new NegateConditionMutator();

src/Stryker.Core/Stryker.Core.UnitTest/Options/Inputs/IgnoreMutationsInputTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public void ShouldValidateExcludedMutation()
2727

2828
var ex = Should.Throw<InputException>(() => target.Validate<Mutator>());
2929

30-
ex.Message.ShouldBe($"Invalid excluded mutation (gibberish). The excluded mutations options are [Statement, Arithmetic, Block, Equality, Boolean, Logical, Assignment, Unary, Update, Checked, Linq, String, Bitwise, Initializer, Regex, NullCoalescing, Math, StringMethod]");
30+
ex.Message.ShouldBe($"Invalid excluded mutation (gibberish). The excluded mutations options are [Statement, Arithmetic, Block, Equality, Boolean, Logical, Assignment, Unary, Update, Checked, Linq, String, Bitwise, Initializer, Regex, NullCoalescing, Math, StringMethod, Conditional]");
3131
}
3232

3333
[Fact]

src/Stryker.Core/Stryker.Core/Mutants/CsharpMutantOrchestrator.cs

+1
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ private static List<IMutator> DefaultMutatorList() =>
9393
new BinaryExpressionMutator(),
9494
new BlockMutator(),
9595
new BooleanMutator(),
96+
new ConditionalExpressionMutator(),
9697
new AssignmentExpressionMutator(),
9798
new PrefixUnaryMutator(),
9899
new PostfixUnaryMutator(),

0 commit comments

Comments
 (0)