Skip to content

Commit 355131b

Browse files
authored
add support for xunit SetAsserts DoesNotContain (#235)
1 parent 72c5810 commit 355131b

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

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

+32
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,38 @@ public void AssertStringDoesNotContain_TestAnalyzer(string assertion) =>
410410
public void AssertStringDoesNotContain_TestCodeFix(string oldAssertion, string newAssertion)
411411
=> VerifyCSharpFix<AssertDoesNotContainCodeFix, AssertDoesNotContainAnalyzer>("string actual, string expected", oldAssertion, newAssertion);
412412

413+
414+
[DataTestMethod]
415+
[DataRow("Assert.DoesNotContain(expected, actual);", "ISet<string> actual, string expected")]
416+
[DataRow("Assert.DoesNotContain(expected, actual);", "IReadOnlySet<string> actual, string expected")]
417+
[DataRow("Assert.DoesNotContain(expected, actual);", "HashSet<string> actual, string expected")]
418+
[DataRow("Assert.DoesNotContain(expected, actual);", "ImmutableHashSet<string> actual, string expected")]
419+
[Implemented]
420+
public void AssertSetDoesNotContain_TestAnalyzer(string assertion, string arguments) =>
421+
VerifyCSharpDiagnostic<AssertDoesNotContainAnalyzer>(arguments, assertion);
422+
423+
[DataTestMethod]
424+
[DataRow(
425+
/* oldAssertion: */ "Assert.DoesNotContain(expected, actual);",
426+
/* newAssertion: */ "actual.Should().NotContain(expected);",
427+
/* arguments: */ "ISet<string> actual, string expected")]
428+
[DataRow(
429+
/* oldAssertion: */ "Assert.DoesNotContain(expected, actual);",
430+
/* newAssertion: */ "actual.Should().NotContain(expected);",
431+
/* arguments: */ "IReadOnlySet<string> actual, string expected")]
432+
[DataRow(
433+
/* oldAssertion: */ "Assert.DoesNotContain(expected, actual);",
434+
/* newAssertion: */ "actual.Should().NotContain(expected);",
435+
/* arguments: */ "HashSet<string> actual, string expected")]
436+
[DataRow(
437+
/* oldAssertion: */ "Assert.DoesNotContain(expected, actual);",
438+
/* newAssertion: */ "actual.Should().NotContain(expected);",
439+
/* arguments: */ "ImmutableHashSet<string> actual, string expected")]
440+
[Implemented]
441+
public void AssertSetDoesNotContain_TestCodeFix(string oldAssertion, string newAssertion, string arguments)
442+
=> VerifyCSharpFix<AssertDoesNotContainCodeFix, AssertDoesNotContainAnalyzer>(arguments, oldAssertion, newAssertion);
443+
444+
413445
[DataTestMethod]
414446
[DataRow("Assert.Matches(expectedRegexPattern, actual);")]
415447
[Implemented]

src/FluentAssertions.Analyzers/Tips/Xunit/AssertDoesNotContain.cs

+18-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ public class AssertDoesNotContainAnalyzer : XunitAnalyzer
2121

2222
protected override IEnumerable<FluentAssertionsCSharpSyntaxVisitor> Visitors => new FluentAssertionsCSharpSyntaxVisitor[]
2323
{
24-
new AssertDoesNotContainStringSyntaxVisitor()
24+
new AssertDoesNotContainStringSyntaxVisitor(),
25+
new AssertDoesNotContainSetSyntaxVisitor()
2526
};
2627

2728
//public static void DoesNotContain(string expectedSubstring, string? actualString)
@@ -35,6 +36,21 @@ public AssertDoesNotContainStringSyntaxVisitor() : base(
3536
{
3637
}
3738
}
39+
40+
//public static void DoesNotContain<T>(T expected, ISet<T> actual)
41+
//public static void DoesNotContain<T>(T expected, IReadOnlySet<T> actual)
42+
//public static void DoesNotContain<T>(T expected, HashSet<T> actual)
43+
//public static void DoesNotContain<T>(T expected, ImmutableHashSet<T> actual)
44+
public class AssertDoesNotContainSetSyntaxVisitor : FluentAssertionsCSharpSyntaxVisitor
45+
{
46+
public AssertDoesNotContainSetSyntaxVisitor() : base(
47+
MemberValidator.ArgumentsMatch("DoesNotContain",
48+
ArgumentValidator.Exists(),
49+
ArgumentValidator.IsTypeOrConstructedFromTypeOrImplementsType(SpecialType.System_Collections_IEnumerable))
50+
)
51+
{
52+
}
53+
}
3854
}
3955

4056
[ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(AssertDoesNotContainCodeFix)), Shared]
@@ -49,6 +65,7 @@ protected override ExpressionSyntax GetNewExpression(
4965
switch (properties.VisitorName)
5066
{
5167
case nameof(AssertDoesNotContainAnalyzer.AssertDoesNotContainStringSyntaxVisitor):
68+
case nameof(AssertDoesNotContainAnalyzer.AssertDoesNotContainSetSyntaxVisitor):
5269
return RenameMethodAndReorderActualExpectedAndReplaceWithSubjectShould(expression, "DoesNotContain", "NotContain");
5370
default:
5471
throw new System.InvalidOperationException($"Invalid visitor name - {properties.VisitorName}");

0 commit comments

Comments
 (0)