diff --git a/src/NSubstitute.Analyzers.Shared/DiagnosticAnalyzers/AbstractUnusedReceivedAnalyzer.cs b/src/NSubstitute.Analyzers.Shared/DiagnosticAnalyzers/AbstractUnusedReceivedAnalyzer.cs index 20add643..5f91c7c9 100644 --- a/src/NSubstitute.Analyzers.Shared/DiagnosticAnalyzers/AbstractUnusedReceivedAnalyzer.cs +++ b/src/NSubstitute.Analyzers.Shared/DiagnosticAnalyzers/AbstractUnusedReceivedAnalyzer.cs @@ -21,7 +21,7 @@ protected AbstractUnusedReceivedAnalyzer(IDiagnosticDescriptorsProvider diagnost public sealed override ImmutableArray SupportedDiagnostics { get; } private static readonly ImmutableHashSet PossibleParents = - ImmutableHashSet.Create(OperationKind.PropertyReference, OperationKind.Invocation); + ImmutableHashSet.Create(OperationKind.PropertyReference, OperationKind.Invocation, OperationKind.EventReference); protected sealed override void InitializeAnalyzer(AnalysisContext context) { diff --git a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberReceivedAnalyzerTests/NonSubstitutableMemberReceivedDiagnosticVerifier.cs b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberReceivedAnalyzerTests/NonSubstitutableMemberReceivedDiagnosticVerifier.cs index 66fa9d8f..cf9e2622 100644 --- a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberReceivedAnalyzerTests/NonSubstitutableMemberReceivedDiagnosticVerifier.cs +++ b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberReceivedAnalyzerTests/NonSubstitutableMemberReceivedDiagnosticVerifier.cs @@ -105,4 +105,8 @@ public abstract class NonSubstitutableMemberReceivedDiagnosticVerifier : CSharpD [CombinatoryTheory] [InlineData] public abstract Task ReportsNoDiagnostics_WhenUsingUnfortunatelyNamedMethod(string method); + + [CombinatoryTheory] + [InlineData] + public abstract Task ReportsNoDiagnostics_WhenSubscribingToEvent(string method); } \ No newline at end of file diff --git a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs index c8916136..772f1449 100644 --- a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs +++ b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs @@ -668,4 +668,28 @@ public void Test() await VerifyNoDiagnostic(source); } + + public override async Task ReportsNoDiagnostics_WhenSubscribingToEvent(string method) + { + var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; +using System; +namespace MyNamespace +{{ + public class Foo + {{ + public event Action SomeEvent; + }} + + public class FooTests + {{ + public void Test() + {{ + var substitute = NSubstitute.Substitute.For(); + substitute.{method}.SomeEvent += Arg.Any(); + }} + }} +}}"; + await VerifyNoDiagnostic(source); + } } \ No newline at end of file diff --git a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs index cc832228..efab2393 100644 --- a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs +++ b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs @@ -737,4 +737,28 @@ public void Test() await VerifyNoDiagnostic(source); } + + public override async Task ReportsNoDiagnostics_WhenSubscribingToEvent(string method) + { + var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; +using System; +namespace MyNamespace +{{ + public class Foo + {{ + public event Action SomeEvent; + }} + + public class FooTests + {{ + public void Test() + {{ + var substitute = NSubstitute.Substitute.For(); + {method}.SomeEvent += Arg.Any(); + }} + }} +}}"; + await VerifyNoDiagnostic(source); + } } \ No newline at end of file diff --git a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/UnusedReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/UnusedReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs index e2b4029c..536375ad 100644 --- a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/UnusedReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs +++ b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/UnusedReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs @@ -239,6 +239,30 @@ public void Test() substitute.{method}; }} }} +}}"; + await VerifyNoDiagnostic(source); + } + + public override async Task ReportsNoDiagnostics_WhenSubscribingToEvent(string method) + { + var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; +using System; +namespace MyNamespace +{{ + public class Foo + {{ + public event Action SomeEvent; + }} + + public class FooTests + {{ + public void Test() + {{ + var substitute = NSubstitute.Substitute.For(); + substitute.{method}.SomeEvent += Arg.Any(); + }} + }} }}"; await VerifyNoDiagnostic(source); } diff --git a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/UnusedReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/UnusedReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs index 3c13ac56..fc3ee46a 100644 --- a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/UnusedReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs +++ b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/UnusedReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs @@ -300,6 +300,30 @@ public void Test() {method}; }} }} +}}"; + await VerifyNoDiagnostic(source); + } + + public override async Task ReportsNoDiagnostics_WhenSubscribingToEvent(string method) + { + var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; +using System; +namespace MyNamespace +{{ + public class Foo + {{ + public event Action SomeEvent; + }} + + public class FooTests + {{ + public void Test() + {{ + var substitute = NSubstitute.Substitute.For(); + {method}.SomeEvent += Arg.Any(); + }} + }} }}"; await VerifyNoDiagnostic(source); } diff --git a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/UnusedReceivedAnalyzerTests/UnusedReceivedDiagnosticVerifier.cs b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/UnusedReceivedAnalyzerTests/UnusedReceivedDiagnosticVerifier.cs index 827aacbe..a8145fdf 100644 --- a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/UnusedReceivedAnalyzerTests/UnusedReceivedDiagnosticVerifier.cs +++ b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/UnusedReceivedAnalyzerTests/UnusedReceivedDiagnosticVerifier.cs @@ -39,4 +39,8 @@ public abstract class UnusedReceivedDiagnosticVerifier : CSharpDiagnosticVerifie [CombinatoryTheory] [InlineData] public abstract Task ReportsNoDiagnostics_WhenUsedWithUnfortunatelyNamedMethod(string method); + + [CombinatoryTheory] + [InlineData] + public abstract Task ReportsNoDiagnostics_WhenSubscribingToEvent(string method); } \ No newline at end of file diff --git a/tests/NSubstitute.Analyzers.Tests.Shared/DiagnosticAnalyzers/INonSubstitutableMemberReceivedDiagnosticVerifier.cs b/tests/NSubstitute.Analyzers.Tests.Shared/DiagnosticAnalyzers/INonSubstitutableMemberReceivedDiagnosticVerifier.cs index a77d2d10..d65c9a08 100644 --- a/tests/NSubstitute.Analyzers.Tests.Shared/DiagnosticAnalyzers/INonSubstitutableMemberReceivedDiagnosticVerifier.cs +++ b/tests/NSubstitute.Analyzers.Tests.Shared/DiagnosticAnalyzers/INonSubstitutableMemberReceivedDiagnosticVerifier.cs @@ -41,4 +41,6 @@ public interface INonSubstitutableMemberReceivedDiagnosticVerifier Task ReportsDiagnostics_WhenSettingValueForInternalVirtualMember_AndInternalsVisibleToAppliedToWrongAssembly(string method, string call, string message); Task ReportsNoDiagnostics_WhenSettingValueForProtectedInternalVirtualMember(string method, string call); + + Task ReportsNoDiagnostics_WhenSubscribingToEvent(string method); } \ No newline at end of file diff --git a/tests/NSubstitute.Analyzers.Tests.Shared/DiagnosticAnalyzers/IUnusedReceivedDiagnosticVerifier.cs b/tests/NSubstitute.Analyzers.Tests.Shared/DiagnosticAnalyzers/IUnusedReceivedDiagnosticVerifier.cs index 7ef80198..36496828 100644 --- a/tests/NSubstitute.Analyzers.Tests.Shared/DiagnosticAnalyzers/IUnusedReceivedDiagnosticVerifier.cs +++ b/tests/NSubstitute.Analyzers.Tests.Shared/DiagnosticAnalyzers/IUnusedReceivedDiagnosticVerifier.cs @@ -15,4 +15,6 @@ public interface IUnusedReceivedDiagnosticVerifier Task ReportNoDiagnostics_WhenUsedWithInvokingDelegate(string method); Task ReportsNoDiagnostics_WhenUsedWithUnfortunatelyNamedMethod(string method); + + Task ReportsNoDiagnostics_WhenSubscribingToEvent(string method); } \ No newline at end of file diff --git a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberReceivedAnalyzerTests/NonSubstitutableMemberReceivedDiagnosticVerifier.cs b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberReceivedAnalyzerTests/NonSubstitutableMemberReceivedDiagnosticVerifier.cs index edd9d456..cc1eec48 100644 --- a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberReceivedAnalyzerTests/NonSubstitutableMemberReceivedDiagnosticVerifier.cs +++ b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberReceivedAnalyzerTests/NonSubstitutableMemberReceivedDiagnosticVerifier.cs @@ -105,4 +105,8 @@ public abstract class NonSubstitutableMemberReceivedDiagnosticVerifier : VisualB [CombinatoryTheory] [InlineData] public abstract Task ReportsNoDiagnostics_WhenUsingUnfortunatelyNamedMethod(string method); + + [CombinatoryTheory] + [InlineData] + public abstract Task ReportsNoDiagnostics_WhenSubscribingToEvent(string method); } \ No newline at end of file diff --git a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs index 9b38202e..47d34ad9 100644 --- a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs +++ b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs @@ -620,4 +620,27 @@ End Class await VerifyNoDiagnostic(source); } + + public override async Task ReportsNoDiagnostics_WhenSubscribingToEvent(string method) + { + var source = $@" +Imports NSubstitute +Imports NSubstitute.ReceivedExtensions +Imports System + +Namespace MyNamespace + Public Class Foo + Public Event SomeEvent As Action + End Class + + Public Class FooTests + Public Sub Test() + Dim substitute = NSubstitute.Substitute.[For](Of Foo)() + AddHandler substitute.{method}.SomeEvent, Arg.Any (Of Action)() + End Sub + End Class +End Namespace"; + + await VerifyNoDiagnostic(source); + } } \ No newline at end of file diff --git a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs index ecfbc5e6..16fa0c6b 100644 --- a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs +++ b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs @@ -600,6 +600,29 @@ End Namespace await VerifyNoDiagnostic(source); } + public override async Task ReportsNoDiagnostics_WhenSubscribingToEvent(string method) + { + var source = $@" +Imports NSubstitute +Imports NSubstitute.ReceivedExtensions +Imports System + +Namespace MyNamespace + Public Class Foo + Public Event SomeEvent As Action + End Class + + Public Class FooTests + Public Sub Test() + Dim substitute = NSubstitute.Substitute.[For](Of Foo)() + AddHandler {method}.SomeEvent, Arg.Any (Of Action)() + End Sub + End Class +End Namespace"; + + await VerifyNoDiagnostic(source); + } + public override async Task ReportsDiagnostics_WhenSettingValueForInternalVirtualMember_AndInternalsVisibleToNotApplied(string method, string call, string message) { var source = $@"Imports NSubstitute diff --git a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/UnusedReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/UnusedReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs index e1e33512..4b8a7fac 100644 --- a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/UnusedReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs +++ b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/UnusedReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs @@ -208,4 +208,27 @@ End Namespace "; await VerifyNoDiagnostic(source); } + + public override async Task ReportsNoDiagnostics_WhenSubscribingToEvent(string method) + { + var source = @$"Imports NSubstitute +Imports System +Imports NSubstitute.ReceivedExtensions +Imports NUnit.Framework + +Namespace MyNamespace + Public Class Foo + Public Event SomeEvent As Action + End Class + + Public Class FooTests + Public Sub Test() + Dim substitute = NSubstitute.Substitute.[For] (Of Foo)() + AddHandler substitute.{method}.SomeEvent, Arg.Any (Of Action)() + End Sub + End Class +End Namespace"; + + await VerifyNoDiagnostic(source); + } } \ No newline at end of file diff --git a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/UnusedReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/UnusedReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs index 5a38c2dd..7f0043df 100644 --- a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/UnusedReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs +++ b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/UnusedReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs @@ -288,4 +288,27 @@ End Namespace "; await VerifyNoDiagnostic(source); } + + public override async Task ReportsNoDiagnostics_WhenSubscribingToEvent(string method) + { + var source = @$"Imports NSubstitute +Imports System +Imports NSubstitute.ReceivedExtensions +Imports NUnit.Framework + +Namespace MyNamespace + Public Class Foo + Public Event SomeEvent As Action + End Class + + Public Class FooTests + Public Sub Test() + Dim substitute = NSubstitute.Substitute.[For] (Of Foo)() + AddHandler {method}.SomeEvent, Arg.Any (Of Action)() + End Sub + End Class +End Namespace"; + + await VerifyNoDiagnostic(source); + } } \ No newline at end of file diff --git a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/UnusedReceivedAnalyzerTests/UnusedReceivedDiagnosticVerifier.cs b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/UnusedReceivedAnalyzerTests/UnusedReceivedDiagnosticVerifier.cs index 47f71a04..e16c8e92 100644 --- a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/UnusedReceivedAnalyzerTests/UnusedReceivedDiagnosticVerifier.cs +++ b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/UnusedReceivedAnalyzerTests/UnusedReceivedDiagnosticVerifier.cs @@ -39,4 +39,8 @@ public abstract class UnusedReceivedDiagnosticVerifier : VisualBasicDiagnosticVe [CombinatoryTheory] [InlineData] public abstract Task ReportsNoDiagnostics_WhenUsedWithUnfortunatelyNamedMethod(string method); + + [CombinatoryTheory] + [InlineData] + public abstract Task ReportsNoDiagnostics_WhenSubscribingToEvent(string method); } \ No newline at end of file