Skip to content

Commit dd587f4

Browse files
authored
Merge pull request #15 from fluentassertions/feature/expression-body-analyzers
added support for expressionBody
2 parents aca496f + 8cade13 commit dd587f4

File tree

42 files changed

+300
-221
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+300
-221
lines changed

src/FluentAssertions.Analyzers.Tests/GenerateCode.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
1-
using System.Text;
1+
using System;
2+
using System.Text;
23

34
namespace FluentAssertions.Analyzers.Tests
45
{
56
public static class GenerateCode
67
{
78
public static string ActualVariableName => "actual";
89

9-
public static string EnumerableAssertion(string assertion) => new StringBuilder()
10+
public static string EnumerableCodeBlockAssertion(string assertion) => EnumerableAssertion(
11+
" {" + Environment.NewLine +
12+
" " + assertion + Environment.NewLine +
13+
" }");
14+
public static string EnumerableExpressionBodyAssertion(string assertion) => EnumerableAssertion(
15+
" => " + assertion);
16+
17+
private static string EnumerableAssertion(string bodyExpression) => new StringBuilder()
1018
.AppendLine("using System.Collections.Generic;")
1119
.AppendLine("using System.Linq;")
1220
.AppendLine("using System;")
@@ -16,9 +24,7 @@ public static class GenerateCode
1624
.AppendLine(" public class TestClass")
1725
.AppendLine(" {")
1826
.AppendLine($" public void TestMethod(IList<TestComplexClass> {ActualVariableName}, IList<TestComplexClass> expected, IList<TestComplexClass> unexpected, TestComplexClass expectedItem, TestComplexClass unexpectedItem, int k)")
19-
.AppendLine(" {")
20-
.AppendLine($" {assertion}")
21-
.AppendLine(" }")
27+
.AppendLine(bodyExpression)
2228
.AppendLine(" }")
2329
.AppendLine(" public class TestComplexClass")
2430
.AppendLine(" {")

src/FluentAssertions.Analyzers.Tests/TestAttributes.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ namespace FluentAssertions.Analyzers.Tests
88
[AttributeUsage(AttributeTargets.Method)]
99
public class NotImplementedAttribute : TestCategoryBaseAttribute
1010
{
11+
public string Reason { get; set; }
12+
1113
public override IList<string> TestCategories => new[] { "NotImplemented" };
1214
}
1315

src/FluentAssertions.Analyzers.Tests/Tips/CollectionTests.cs

Lines changed: 107 additions & 61 deletions
Large diffs are not rendered by default.

src/FluentAssertions.Analyzers.Tests/Tips/DictionaryTests.generated.cs

Whitespace-only changes.

src/FluentAssertions.Analyzers.Tests/Tips/SanityTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public class SanityTests
1010
public void AssertionCallMultipleMethodWithTheSameNameAndArguments()
1111
{
1212
const string assertion = "actual.Should().Contain(d => d.Message.Contains(\"a\")).And.Contain(d => d.Message.Contains(\"c\"));";
13-
var source = GenerateCode.EnumerableAssertion(assertion);
13+
var source = GenerateCode.EnumerableCodeBlockAssertion(assertion);
1414

1515
DiagnosticVerifier.VerifyCSharpDiagnosticUsingAllAnalyzers(source);
1616
}
@@ -20,7 +20,7 @@ public void AssertionCallMultipleMethodWithTheSameNameAndArguments()
2020
public void PropertyOfIndexerShouldBe_ShouldNotThrowException()
2121
{
2222
const string assertion = "actual[0].Message.Should().Be(\"test\");";
23-
var source = GenerateCode.EnumerableAssertion(assertion);
23+
var source = GenerateCode.EnumerableCodeBlockAssertion(assertion);
2424

2525
DiagnosticVerifier.VerifyCSharpDiagnosticUsingAllAnalyzers(source);
2626
}
@@ -30,7 +30,7 @@ public void PropertyOfIndexerShouldBe_ShouldNotThrowException()
3030
public void PropertyOfElementAtShouldBe_ShouldNotTriggerDiagnostic()
3131
{
3232
const string assertion = "actual.ElementAt(0).Message.Should().Be(\"test\");";
33-
var source = GenerateCode.EnumerableAssertion(assertion);
33+
var source = GenerateCode.EnumerableCodeBlockAssertion(assertion);
3434

3535
DiagnosticVerifier.VerifyCSharpDiagnosticUsingAllAnalyzers(source);
3636
}

src/FluentAssertions.Analyzers/Tips/Collections/CollectionShouldBeEmpty.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,14 @@ public class CollectionShouldBeEmptyCodeFix : FluentAssertionsCodeFixProvider
6363
{
6464
public override ImmutableArray<string> FixableDiagnosticIds => ImmutableArray.Create(CollectionShouldBeEmptyAnalyzer.DiagnosticId);
6565

66-
protected override StatementSyntax GetNewStatement(ExpressionStatementSyntax statement, FluentAssertionsDiagnosticProperties properties)
66+
protected override ExpressionSyntax GetNewExpression(ExpressionSyntax expression, FluentAssertionsDiagnosticProperties properties)
6767
{
6868
switch (properties.VisitorName)
6969
{
7070
case nameof(CollectionShouldBeEmptyAnalyzer.AnyShouldBeFalseSyntaxVisitor):
71-
return GetNewStatement(statement, NodeReplacement.Remove("Any"), NodeReplacement.Rename("BeFalse", "BeEmpty"));
71+
return GetNewExpression(expression, NodeReplacement.Remove("Any"), NodeReplacement.Rename("BeFalse", "BeEmpty"));
7272
case nameof(CollectionShouldBeEmptyAnalyzer.ShouldHaveCount0SyntaxVisitor):
73-
return GetNewStatement(statement, new HaveCountNodeReplacement());
73+
return GetNewExpression(expression, new HaveCountNodeReplacement());
7474
default:
7575
throw new System.InvalidOperationException($"Invalid visitor name - {properties.VisitorName}");
7676
}

src/FluentAssertions.Analyzers/Tips/Collections/CollectionShouldBeInAscendingOrder.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,14 @@ public class CollectionShouldBeInAscendingOrderCodeFix : FluentAssertionsCodeFix
5555
{
5656
public override ImmutableArray<string> FixableDiagnosticIds => ImmutableArray.Create(CollectionShouldBeInAscendingOrderAnalyzer.DiagnosticId);
5757

58-
protected override StatementSyntax GetNewStatement(ExpressionStatementSyntax statement, FluentAssertionsDiagnosticProperties properties)
58+
protected override ExpressionSyntax GetNewExpression(ExpressionSyntax expression, FluentAssertionsDiagnosticProperties properties)
5959
{
6060
var remove = NodeReplacement.RemoveAndExtractArguments("OrderBy");
61-
var newStatement = GetNewStatement(statement, remove);
61+
var newStatement = GetNewExpression(expression, remove);
6262

63-
newStatement = GetNewStatement(newStatement, NodeReplacement.RenameAndRemoveFirstArgument("Equal", "BeInAscendingOrder"));
63+
newStatement = GetNewExpression(newStatement, NodeReplacement.RenameAndRemoveFirstArgument("Equal", "BeInAscendingOrder"));
6464

65-
return GetNewStatement(newStatement, NodeReplacement.PrependArguments("BeInAscendingOrder", remove.Arguments));
65+
return GetNewExpression(newStatement, NodeReplacement.PrependArguments("BeInAscendingOrder", remove.Arguments));
6666
}
6767
}
6868
}

src/FluentAssertions.Analyzers/Tips/Collections/CollectionShouldBeInDescendingOrder.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,14 @@ public class CollectionShouldBeInDescendingOrderCodeFix : FluentAssertionsCodeFi
5555
{
5656
public override ImmutableArray<string> FixableDiagnosticIds => ImmutableArray.Create(CollectionShouldBeInDescendingOrderAnalyzer.DiagnosticId);
5757

58-
protected override StatementSyntax GetNewStatement(ExpressionStatementSyntax statement, FluentAssertionsDiagnosticProperties properties)
58+
protected override ExpressionSyntax GetNewExpression(ExpressionSyntax expression, FluentAssertionsDiagnosticProperties properties)
5959
{
6060
var remove = NodeReplacement.RemoveAndExtractArguments("OrderByDescending");
61-
var newStatement = GetNewStatement(statement, remove);
61+
var newStatement = GetNewExpression(expression, remove);
6262

63-
newStatement = GetNewStatement(newStatement, NodeReplacement.RenameAndRemoveFirstArgument("Equal", "BeInDescendingOrder"));
63+
newStatement = GetNewExpression(newStatement, NodeReplacement.RenameAndRemoveFirstArgument("Equal", "BeInDescendingOrder"));
6464

65-
return GetNewStatement(newStatement, NodeReplacement.PrependArguments("BeInDescendingOrder", remove.Arguments));
65+
return GetNewExpression(newStatement, NodeReplacement.PrependArguments("BeInDescendingOrder", remove.Arguments));
6666
}
6767
}
6868
}

src/FluentAssertions.Analyzers/Tips/Collections/CollectionShouldContainItem.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,12 @@ public class CollectionShouldContainItemCodeFix : FluentAssertionsCodeFixProvide
5353
{
5454
public override ImmutableArray<string> FixableDiagnosticIds => ImmutableArray.Create(CollectionShouldContainItemAnalyzer.DiagnosticId);
5555

56-
protected override StatementSyntax GetNewStatement(ExpressionStatementSyntax statement, FluentAssertionsDiagnosticProperties properties)
56+
protected override ExpressionSyntax GetNewExpression(ExpressionSyntax expression, FluentAssertionsDiagnosticProperties properties)
5757
{
5858
var remove = new NodeReplacement.RemoveAndExtractArgumentsNodeReplacement("Contains");
59-
var newStatement = GetNewStatement(statement, remove);
59+
var newStatement = GetNewExpression(expression, remove);
6060

61-
return GetNewStatement(newStatement, new NodeReplacement.RenameAndPrependArgumentsNodeReplacement("BeTrue", "Contain", remove.Arguments));
61+
return GetNewExpression(newStatement, new NodeReplacement.RenameAndPrependArgumentsNodeReplacement("BeTrue", "Contain", remove.Arguments));
6262
}
6363
}
6464
}

src/FluentAssertions.Analyzers/Tips/Collections/CollectionShouldContainProperty.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,21 +47,21 @@ public class CollectionShouldContainPropertyCodeFix : FluentAssertionsCodeFixPro
4747
{
4848
public override ImmutableArray<string> FixableDiagnosticIds => ImmutableArray.Create(CollectionShouldContainPropertyAnalyzer.DiagnosticId);
4949

50-
protected override StatementSyntax GetNewStatement(ExpressionStatementSyntax statement, FluentAssertionsDiagnosticProperties properties)
50+
protected override ExpressionSyntax GetNewExpression(ExpressionSyntax expression, FluentAssertionsDiagnosticProperties properties)
5151
{
5252
if (properties.VisitorName == nameof(CollectionShouldContainPropertyAnalyzer.AnyShouldBeTrueSyntaxVisitor))
5353
{
5454
var remove = new NodeReplacement.RemoveAndExtractArgumentsNodeReplacement("Any");
55-
var newStatement = GetNewStatement(statement, remove);
55+
var newStatement = GetNewExpression(expression, remove);
5656

57-
return GetNewStatement(newStatement, new NodeReplacement.RenameAndPrependArgumentsNodeReplacement("BeTrue", "Contain", remove.Arguments));
57+
return GetNewExpression(newStatement, new NodeReplacement.RenameAndPrependArgumentsNodeReplacement("BeTrue", "Contain", remove.Arguments));
5858
}
5959
else if (properties.VisitorName == nameof(CollectionShouldContainPropertyAnalyzer.WhereShouldNotBeEmptySyntaxVisitor))
6060
{
6161
var remove = new NodeReplacement.RemoveAndExtractArgumentsNodeReplacement("Where");
62-
var newStatement = GetNewStatement(statement, remove);
62+
var newStatement = GetNewExpression(expression, remove);
6363

64-
return GetNewStatement(newStatement, new NodeReplacement.RenameAndPrependArgumentsNodeReplacement("NotBeEmpty", "Contain", remove.Arguments));
64+
return GetNewExpression(newStatement, new NodeReplacement.RenameAndPrependArgumentsNodeReplacement("NotBeEmpty", "Contain", remove.Arguments));
6565
}
6666
throw new System.InvalidOperationException($"Invalid visitor name - {properties.VisitorName}");
6767
}

0 commit comments

Comments
 (0)