From 2b34488f56e38bbdd5dbea6db242bea482ce6a9d Mon Sep 17 00:00:00 2001 From: tpodolak Date: Sat, 1 Feb 2020 21:53:22 +0100 Subject: [PATCH] [GH-131|500] - taking into account ReceivedExtensions.Received with quantity in analyzers --- .../AbstractUnusedReceivedAnalyzer.cs | 3 +- .../Extensions/SubstituteSymbolExtensions.cs | 3 +- .../MetadataNames.cs | 7 + .../Resources.resx | 2 +- .../ReceivedAsExtensionMethodTests.cs | 150 ++++++++++++--- .../ReceivedAsOrdinaryMethodTests.cs | 168 ++++++++++++----- .../ReceivedAsExtensionMethodTests.cs | 118 +++++++++--- .../ReceivedAsOrdinaryMethodTests.cs | 126 +++++++++---- .../ReceivedAsExtensionMethodTests.cs | 118 +++++++++--- .../ReceivedAsOrdinaryMethodTests.cs | 177 ++++++++++++------ .../ReceivedAsExtensionMethodTests.cs | 88 +++++++-- .../ReceivedAsOrdinaryMethodTests.cs | 126 +++++++++---- 12 files changed, 811 insertions(+), 275 deletions(-) diff --git a/src/NSubstitute.Analyzers.Shared/DiagnosticAnalyzers/AbstractUnusedReceivedAnalyzer.cs b/src/NSubstitute.Analyzers.Shared/DiagnosticAnalyzers/AbstractUnusedReceivedAnalyzer.cs index bcdb2d73..b36f7ad6 100644 --- a/src/NSubstitute.Analyzers.Shared/DiagnosticAnalyzers/AbstractUnusedReceivedAnalyzer.cs +++ b/src/NSubstitute.Analyzers.Shared/DiagnosticAnalyzers/AbstractUnusedReceivedAnalyzer.cs @@ -62,7 +62,8 @@ private void AnalyzeInvocation(SyntaxNodeAnalysisContext syntaxNodeContext) var diagnostic = Diagnostic.Create( diagnosticDescriptor, invocationExpression.GetLocation(), - methodSymbol.Name); + methodSymbol.Name, + methodSymbol.ContainingType.Name); syntaxNodeContext.ReportDiagnostic(diagnostic); } diff --git a/src/NSubstitute.Analyzers.Shared/Extensions/SubstituteSymbolExtensions.cs b/src/NSubstitute.Analyzers.Shared/Extensions/SubstituteSymbolExtensions.cs index 7e3da104..c5b75056 100644 --- a/src/NSubstitute.Analyzers.Shared/Extensions/SubstituteSymbolExtensions.cs +++ b/src/NSubstitute.Analyzers.Shared/Extensions/SubstituteSymbolExtensions.cs @@ -44,7 +44,8 @@ public static bool IsThrowLikeMethod(this ISymbol symbol) public static bool IsReceivedLikeMethod(this ISymbol symbol) { - return IsMember(symbol, MetadataNames.ReceivedMethodNames); + return IsMember(symbol, MetadataNames.ReceivedMethodNames) || + IsMember(symbol, MetadataNames.ReceivedWithQuantityMethodNames); } public static bool IsWhenLikeMethod(this ISymbol symbol) diff --git a/src/NSubstitute.Analyzers.Shared/MetadataNames.cs b/src/NSubstitute.Analyzers.Shared/MetadataNames.cs index 23c62a86..77617102 100644 --- a/src/NSubstitute.Analyzers.Shared/MetadataNames.cs +++ b/src/NSubstitute.Analyzers.Shared/MetadataNames.cs @@ -8,6 +8,7 @@ internal class MetadataNames public const string NSubstituteArgFullTypeName = "NSubstitute.Arg"; public const string NSubstituteArgCompatFullTypeName = "NSubstitute.Arg.Compat"; public const string NSubstituteSubstituteExtensionsFullTypeName = "NSubstitute.SubstituteExtensions"; + public const string NSubstituteReceivedExtensionsFullTypeName = "NSubstitute.ReceivedExtensions.ReceivedExtensions"; public const string NSubstituteReturnsExtensionsFullTypeName = "NSubstitute.ReturnsExtensions.ReturnsExtensions"; public const string NSubstituteExceptionExtensionsFullTypeName = "NSubstitute.ExceptionExtensions.ExceptionExtensions"; public const string NSubstituteCallInfoFullTypeName = "NSubstitute.Core.CallInfo"; @@ -66,6 +67,12 @@ internal class MetadataNames [NSubstituteDidNotReceiveWithAnyArgsMethod] = NSubstituteSubstituteExtensionsFullTypeName }; + public static readonly IReadOnlyDictionary ReceivedWithQuantityMethodNames = new Dictionary + { + [NSubstituteReceivedMethod] = NSubstituteReceivedExtensionsFullTypeName, + [NSubstituteReceivedWithAnyArgsMethod] = NSubstituteReceivedExtensionsFullTypeName, + }; + public static readonly IReadOnlyDictionary WhenMethodNames = new Dictionary { [NSubstituteWhenMethod] = NSubstituteSubstituteExtensionsFullTypeName, diff --git a/src/NSubstitute.Analyzers.Shared/Resources.resx b/src/NSubstitute.Analyzers.Shared/Resources.resx index 09eab71c..95dea413 100644 --- a/src/NSubstitute.Analyzers.Shared/Resources.resx +++ b/src/NSubstitute.Analyzers.Shared/Resources.resx @@ -155,7 +155,7 @@ An optional longer localizable description of the diagnostic. - Unused received check. To fix, make sure there is a call after "{0}". Correct: "SubstituteExtensions.{0}(sub).SomeCall();". Incorrect: "SubstituteExtensions.{0}(sub);" + Unused received check. To fix, make sure there is a call after "{0}". Correct: "{1}.{0}(sub).SomeCall();". Incorrect: "{1}.{0}(sub);" The format-able message the diagnostic displays. diff --git a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs index 8c18c491..766c6176 100644 --- a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs +++ b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs @@ -3,12 +3,25 @@ namespace NSubstitute.Analyzers.Tests.CSharp.DiagnosticAnalyzerTests.NonSubstitutableMemberReceivedAnalyzerTests { - [CombinatoryData("Received", "Received", "ReceivedWithAnyArgs", "ReceivedWithAnyArgs", "DidNotReceive", "DidNotReceive", "DidNotReceiveWithAnyArgs", "DidNotReceiveWithAnyArgs")] + [CombinatoryData( + "Received(Quantity.None())", + "Received(Quantity.None())", + "Received()", + "Received()", + "ReceivedWithAnyArgs(Quantity.None())", + "ReceivedWithAnyArgs(Quantity.None())", + "ReceivedWithAnyArgs()", + "ReceivedWithAnyArgs()", + "DidNotReceive()", + "DidNotReceive()", + "DidNotReceiveWithAnyArgs()", + "DidNotReceiveWithAnyArgs()")] public class ReceivedAsExtensionMethodTests : NonSubstitutableMemberReceivedDiagnosticVerifier { public override async Task ReportsDiagnostics_WhenCheckingReceivedCallsForNonVirtualMethod(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -25,7 +38,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - [|substitute.{method}().Bar()|]; + [|substitute.{method}.Bar()|]; }} }} }}"; @@ -36,6 +49,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForVirtualMethod(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -52,7 +66,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - substitute.{method}().Bar(); + substitute.{method}.Bar(); }} }} }}"; @@ -62,6 +76,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForNonSealedMethod(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -83,17 +98,30 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - substitute.{method}().Bar(); + substitute.{method}.Bar(); }} }} }}"; await VerifyNoDiagnostic(source); } - [CombinatoryData("Received", "Received>", "ReceivedWithAnyArgs", "ReceivedWithAnyArgs>", "DidNotReceive", "DidNotReceive>", "DidNotReceiveWithAnyArgs", "DidNotReceiveWithAnyArgs>")] + [CombinatoryData( + "Received(Quantity.None())", + "Received>(Quantity.None())", + "Received", + "Received>", + "ReceivedWithAnyArgs(Quantity.None())", + "ReceivedWithAnyArgs>(Quantity.None())", + "ReceivedWithAnyArgs", + "ReceivedWithAnyArgs>", + "DidNotReceive", + "DidNotReceive>", + "DidNotReceiveWithAnyArgs", + "DidNotReceiveWithAnyArgs>")] public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForDelegate(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; using System; namespace MyNamespace @@ -107,7 +135,7 @@ public class FooTests public void Test() {{ var substitute = Substitute.For>(); - substitute.{method}()(); + substitute.{method}(); }} }} }}"; @@ -117,6 +145,7 @@ public void Test() public override async Task ReportsDiagnostics_WhenCheckingReceivedCallsForSealedMethod(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -138,7 +167,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - [|substitute.{method}().Bar()|]; + [|substitute.{method}.Bar()|]; }} }} }}"; @@ -149,6 +178,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForAbstractMethod(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -162,7 +192,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - substitute.{method}().Bar(); + substitute.{method}.Bar(); }} }} }}"; @@ -173,6 +203,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForInterfaceMethod(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -186,7 +217,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - substitute.{method}().Bar(); + substitute.{method}.Bar(); }} }} }}"; @@ -196,6 +227,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForInterfaceProperty(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -209,17 +241,30 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = substitute.{method}().Bar; + var x = substitute.{method}.Bar; }} }} }}"; await VerifyNoDiagnostic(source); } - [CombinatoryData("Received", "Received>", "ReceivedWithAnyArgs", "ReceivedWithAnyArgs>", "DidNotReceive", "DidNotReceive>", "DidNotReceiveWithAnyArgs", "DidNotReceiveWithAnyArgs>")] + [CombinatoryData( + "Received(Quantity.None())", + "Received>(Quantity.None())", + "Received()", + "Received>()", + "ReceivedWithAnyArgs(Quantity.None())", + "ReceivedWithAnyArgs>(Quantity.None())", + "ReceivedWithAnyArgs()", + "ReceivedWithAnyArgs>()", + "DidNotReceive()", + "DidNotReceive>()", + "DidNotReceiveWithAnyArgs()", + "DidNotReceiveWithAnyArgs>()")] public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForGenericInterfaceMethod(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -233,7 +278,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For>(); - substitute.{method}().Bar(); + substitute.{method}.Bar(); }} }} }}"; @@ -243,6 +288,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForAbstractProperty(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -256,7 +302,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = substitute.{method}().Bar; + var x = substitute.{method}.Bar; }} }} }}"; @@ -267,6 +313,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForInterfaceIndexer(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -280,7 +327,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = substitute.{method}()[1]; + var x = substitute.{method}[1]; }} }} }}"; @@ -290,6 +337,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForVirtualProperty(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -303,7 +351,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = substitute.{method}().Bar; + var x = substitute.{method}.Bar; }} }} }}"; @@ -314,6 +362,7 @@ public void Test() public override async Task ReportsDiagnostics_WhenCheckingReceivedCallsForNonVirtualProperty(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -327,7 +376,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = [|substitute.{method}().Bar|]; + var x = [|substitute.{method}.Bar|]; }} }} }}"; @@ -338,6 +387,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForVirtualIndexer(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -351,7 +401,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = substitute.{method}()[1]; + var x = substitute.{method}[1]; }} }} }}"; @@ -361,6 +411,7 @@ public void Test() public override async Task ReportsDiagnostics_WhenCheckingReceivedCallsForNonVirtualIndexer(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -374,7 +425,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = [|substitute.{method}()[1]|]; + var x = [|substitute.{method}[1]|]; }} }} }}"; @@ -382,12 +433,30 @@ public void Test() await VerifyDiagnostic(source, NonVirtualReceivedSetupSpecificationDescriptor, "Member this[] can not be intercepted. Only interface members and virtual, overriding, and abstract members can be intercepted."); } + [CombinatoryData( + "Received(Quantity.None())", + "Received(Quantity.None())", + "Received(1, 1)", + "Received(1, 1)", + "ReceivedWithAnyArgs(Quantity.None())", + "ReceivedWithAnyArgs(Quantity.None())", + "ReceivedWithAnyArgs(1, 1)", + "ReceivedWithAnyArgs(1, 1)", + "DidNotReceive(1, 1)", + "DidNotReceive(1, 1)", + "DidNotReceiveWithAnyArgs(1, 1)", + "DidNotReceiveWithAnyArgs(1, 1)")] public override async Task ReportsNoDiagnostics_WhenUsingUnfortunatelyNamedMethod(string method) { var source = $@" namespace NSubstitute {{ + public class Quantity + {{ + public static Quantity None() => null; + }} + public class Foo {{ public int Bar() @@ -398,22 +467,45 @@ public int Bar() public static class SubstituteExtensions {{ - public static T Received(this T returnValue, decimal x) + public static T Received(this T substitute, int x, int y) + {{ + return default(T); + }} + + public static T ReceivedWithAnyArgs(this T substitute, int x, int y) + {{ + return default(T); + }} + + public static T DidNotReceive(this T substitute, int x, int y) + {{ + return default(T); + }} + + public static T DidNotReceiveWithAnyArgs(this T substitute, int x, int y) + {{ + return default(T); + }} + }} + + public static class ReceivedExtensions + {{ + public static T Received(this T substitute, Quantity x) {{ return default(T); }} - public static T ReceivedWithAnyArgs(this T returnValue, decimal x) + public static T ReceivedWithAnyArgs(this T substitute, Quantity x) {{ return default(T); }} - public static T DidNotReceive(this T returnValue, decimal x) + public static T DidNotReceive(this T substitute, Quantity x) {{ return default(T); }} - public static T DidNotReceiveWithAnyArgs(this T returnValue, decimal x) + public static T DidNotReceiveWithAnyArgs(this T substitute, Quantity x) {{ return default(T); }} @@ -424,7 +516,7 @@ public class FooTests public void Test() {{ Foo substitute = null; - substitute.{method}(1m).Bar(); + substitute.{method}.Bar(); }} }} }}"; @@ -434,6 +526,7 @@ public void Test() public override async Task ReportsDiagnostics_WhenSettingValueForInternalVirtualMember_AndInternalsVisibleToNotApplied(string method, string call, string message) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -457,7 +550,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = [|substitute.{method}(){call}|]; + var x = [|substitute.{method}{call}|]; }} }} }}"; @@ -468,6 +561,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenSettingValueForInternalVirtualMember_AndInternalsVisibleToApplied(string method, string call) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo(""OtherFirstAssembly"")] [assembly: InternalsVisibleTo(""DynamicProxyGenAssembly2"")] @@ -495,7 +589,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = substitute.{method}(){call}; + var x = substitute.{method}{call}; }} }} }}"; @@ -506,6 +600,7 @@ public void Test() public override async Task ReportsDiagnostics_WhenSettingValueForInternalVirtualMember_AndInternalsVisibleToAppliedToWrongAssembly(string method, string call, string message) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo(""OtherAssembly"")] @@ -531,7 +626,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = [|substitute.{method}(){call}|]; + var x = [|substitute.{method}{call}|]; }} }} }}"; @@ -542,6 +637,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenSettingValueForProtectedInternalVirtualMember(string method, string call) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -565,7 +661,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = substitute.{method}(){call}; + var x = substitute.{method}{call}; }} }} }}"; diff --git a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs index 23d731af..0d6fe489 100644 --- a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs +++ b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs @@ -4,19 +4,24 @@ namespace NSubstitute.Analyzers.Tests.CSharp.DiagnosticAnalyzerTests.NonSubstitutableMemberReceivedAnalyzerTests { [CombinatoryData( - "SubstituteExtensions.Received", - "SubstituteExtensions.Received", - "SubstituteExtensions.ReceivedWithAnyArgs", - "SubstituteExtensions.ReceivedWithAnyArgs", - "SubstituteExtensions.DidNotReceive", - "SubstituteExtensions.DidNotReceive", - "SubstituteExtensions.DidNotReceiveWithAnyArgs", - "SubstituteExtensions.DidNotReceiveWithAnyArgs")] + "ReceivedExtensions.Received(substitute, Quantity.None())", + "ReceivedExtensions.Received(substitute, Quantity.None())", + "SubstituteExtensions.Received(substitute)", + "SubstituteExtensions.Received(substitute)", + "SubstituteExtensions.ReceivedWithAnyArgs(substitute, Quantity.None())", + "ReceivedExtensions.ReceivedWithAnyArgs(substitute, Quantity.None())", + "ReceivedExtensions.ReceivedWithAnyArgs(substitute)", + "SubstituteExtensions.ReceivedWithAnyArgs(substitute)", + "SubstituteExtensions.DidNotReceive(substitute)", + "SubstituteExtensions.DidNotReceive(substitute)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(substitute)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(substitute)")] public class ReceivedAsOrdinaryMethodTests : NonSubstitutableMemberReceivedDiagnosticVerifier { public override async Task ReportsDiagnostics_WhenCheckingReceivedCallsForNonVirtualMethod(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -33,7 +38,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - [|{method}(substitute).Bar()|]; + [|{method}.Bar()|]; }} }} }}"; @@ -44,6 +49,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForVirtualMethod(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -60,7 +66,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - {method}(substitute).Bar(); + {method}.Bar(); }} }} }}"; @@ -70,6 +76,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForNonSealedMethod(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -91,7 +98,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - {method}(substitute).Bar(); + {method}.Bar(); }} }} }}"; @@ -99,17 +106,22 @@ public void Test() } [CombinatoryData( - "SubstituteExtensions.Received", - "SubstituteExtensions.Received>", - "SubstituteExtensions.ReceivedWithAnyArgs", - "SubstituteExtensions.ReceivedWithAnyArgs>", - "SubstituteExtensions.DidNotReceive", - "SubstituteExtensions.DidNotReceive>", - "SubstituteExtensions.DidNotReceiveWithAnyArgs", - "SubstituteExtensions.DidNotReceiveWithAnyArgs>")] + "ReceivedExtensions.Received(substitute, Quantity.None())", + "ReceivedExtensions.Received>(substitute, Quantity.None())", + "SubstituteExtensions.Received(substitute)", + "SubstituteExtensions.Received>(substitute)", + "ReceivedExtensions.ReceivedWithAnyArgs(substitute, Quantity.None())", + "ReceivedExtensions.ReceivedWithAnyArgs>(substitute, Quantity.None())", + "SubstituteExtensions.ReceivedWithAnyArgs(substitute)", + "SubstituteExtensions.ReceivedWithAnyArgs>(substitute)", + "SubstituteExtensions.DidNotReceive(substitute)", + "SubstituteExtensions.DidNotReceive>(substitute)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(substitute)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs>(substitute)")] public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForDelegate(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; using System; public class Foo @@ -123,7 +135,7 @@ public class FooTests public void Test() {{ var substitute = Substitute.For>(); - {method}(substitute)(); + {method}(); }} }} }}"; @@ -133,6 +145,7 @@ public void Test() public override async Task ReportsDiagnostics_WhenCheckingReceivedCallsForSealedMethod(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -154,7 +167,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - [|{method}(substitute).Bar()|]; + [|{method}.Bar()|]; }} }} }}"; @@ -165,6 +178,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForAbstractMethod(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -178,7 +192,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - {method}(substitute).Bar(); + {method}.Bar(); }} }} }}"; @@ -189,6 +203,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForInterfaceMethod(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -202,7 +217,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - {method}(substitute).Bar(); + {method}.Bar(); }} }} }}"; @@ -212,6 +227,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForInterfaceProperty(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -225,7 +241,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = {method}(substitute).Bar; + var x = {method}.Bar; }} }} }}"; @@ -233,17 +249,22 @@ public void Test() } [CombinatoryData( - "SubstituteExtensions.Received", - "SubstituteExtensions.Received>", - "SubstituteExtensions.ReceivedWithAnyArgs", - "SubstituteExtensions.ReceivedWithAnyArgs>", - "SubstituteExtensions.DidNotReceive", - "SubstituteExtensions.DidNotReceive>", - "SubstituteExtensions.DidNotReceiveWithAnyArgs", - "SubstituteExtensions.DidNotReceiveWithAnyArgs>")] + "ReceivedExtensions.Received(substitute, Quantity.None())", + "ReceivedExtensions.Received>(substitute, Quantity.None())", + "SubstituteExtensions.Received(substitute)", + "SubstituteExtensions.Received>(substitute)", + "ReceivedExtensions.ReceivedWithAnyArgs(substitute, Quantity.None())", + "ReceivedExtensions.ReceivedWithAnyArgs>(substitute, Quantity.None())", + "SubstituteExtensions.ReceivedWithAnyArgs(substitute)", + "SubstituteExtensions.ReceivedWithAnyArgs>(substitute)", + "SubstituteExtensions.DidNotReceive(substitute)", + "SubstituteExtensions.DidNotReceive>(substitute)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(substitute)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs>(substitute)")] public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForGenericInterfaceMethod(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -257,7 +278,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For>(); - {method}(substitute).Bar(); + {method}.Bar(); }} }} }}"; @@ -267,6 +288,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForAbstractProperty(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -280,7 +302,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = {method}(substitute).Bar; + var x = {method}.Bar; }} }} }}"; @@ -291,6 +313,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForInterfaceIndexer(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -304,7 +327,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = {method}(substitute)[1]; + var x = {method}[1]; }} }} }}"; @@ -314,6 +337,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForVirtualProperty(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -327,7 +351,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = {method}(substitute).Bar; + var x = {method}.Bar; }} }} }}"; @@ -338,6 +362,7 @@ public void Test() public override async Task ReportsDiagnostics_WhenCheckingReceivedCallsForNonVirtualProperty(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -351,7 +376,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = [|{method}(substitute).Bar|]; + var x = [|{method}.Bar|]; }} }} }}"; @@ -362,6 +387,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForVirtualIndexer(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -375,7 +401,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = {method}(substitute)[1]; + var x = {method}[1]; }} }} }}"; @@ -385,6 +411,7 @@ public void Test() public override async Task ReportsDiagnostics_WhenCheckingReceivedCallsForNonVirtualIndexer(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -398,7 +425,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = [|{method}(substitute)[1]|]; + var x = [|{method}[1]|]; }} }} }}"; @@ -406,12 +433,30 @@ public void Test() await VerifyDiagnostic(source, NonVirtualReceivedSetupSpecificationDescriptor, "Member this[] can not be intercepted. Only interface members and virtual, overriding, and abstract members can be intercepted."); } + [CombinatoryData( + "ReceivedExtensions.Received(substitute, Quantity.None())", + "ReceivedExtensions.Received(substitute, Quantity.None())", + "SubstituteExtensions.Received(substitute, 1, 1)", + "SubstituteExtensions.Received(substitute, 1, 1)", + "ReceivedExtensions.ReceivedWithAnyArgs(substitute, Quantity.None())", + "ReceivedExtensions.ReceivedWithAnyArgs(substitute, Quantity.None())", + "SubstituteExtensions.ReceivedWithAnyArgs(substitute, 1, 1)", + "SubstituteExtensions.ReceivedWithAnyArgs(substitute, 1, 1)", + "SubstituteExtensions.DidNotReceive(substitute, 1, 1)", + "SubstituteExtensions.DidNotReceive(substitute, 1, 1)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(substitute, 1, 1)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(substitute, 1, 1)")] public override async Task ReportsNoDiagnostics_WhenUsingUnfortunatelyNamedMethod(string method) { var source = $@" namespace NSubstitute {{ + public class Quantity + {{ + public static Quantity None() => null; + }} + public class Foo {{ public int Bar() @@ -422,22 +467,45 @@ public int Bar() public static class SubstituteExtensions {{ - public static T Received(this T returnValue, decimal x) + public static T Received(this T substitute, int x, int y) + {{ + return default(T); + }} + + public static T ReceivedWithAnyArgs(this T substitute, int x, int y) + {{ + return default(T); + }} + + public static T DidNotReceive(this T substitute, int x, int y) + {{ + return default(T); + }} + + public static T DidNotReceiveWithAnyArgs(this T substitute, int x, int y) + {{ + return default(T); + }} + }} + + public static class ReceivedExtensions + {{ + public static T Received(this T substitute, Quantity x) {{ return default(T); }} - public static T ReceivedWithAnyArgs(this T returnValue, decimal x) + public static T ReceivedWithAnyArgs(this T substitute, Quantity x) {{ return default(T); }} - public static T DidNotReceive(this T returnValue, decimal x) + public static T DidNotReceive(this T substitute, Quantity x) {{ return default(T); }} - public static T DidNotReceiveWithAnyArgs(this T returnValue, decimal x) + public static T DidNotReceiveWithAnyArgs(this T substitute, Quantity x) {{ return default(T); }} @@ -448,7 +516,7 @@ public class FooTests public void Test() {{ Foo substitute = null; - var x = {method}(substitute, 1m).Bar(); + var x = {method}.Bar(); }} }} }}"; @@ -458,6 +526,7 @@ public void Test() public override async Task ReportsDiagnostics_WhenSettingValueForInternalVirtualMember_AndInternalsVisibleToNotApplied(string method, string call, string message) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -481,7 +550,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = [|{method}(substitute){call}|]; + var x = [|{method}{call}|]; }} }} }}"; @@ -492,6 +561,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenSettingValueForInternalVirtualMember_AndInternalsVisibleToApplied(string method, string call) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo(""OtherFirstAssembly"")] [assembly: InternalsVisibleTo(""DynamicProxyGenAssembly2"")] @@ -519,7 +589,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = {method}(substitute){call}; + var x = {method}{call}; }} }} }}"; @@ -530,6 +600,7 @@ public void Test() public override async Task ReportsDiagnostics_WhenSettingValueForInternalVirtualMember_AndInternalsVisibleToAppliedToWrongAssembly(string method, string call, string message) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo(""OtherAssembly"")] @@ -555,7 +626,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = [|{method}(substitute){call}|]; + var x = [|{method}{call}|]; }} }} }}"; @@ -566,6 +637,7 @@ public void Test() public override async Task ReportsNoDiagnostics_WhenSettingValueForProtectedInternalVirtualMember(string method, string call) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -589,7 +661,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var x = {method}(substitute){call}; + var x = {method}{call}; }} }} }}"; diff --git a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/UnusedReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/UnusedReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs index 510aaf9a..16bb0c80 100644 --- a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/UnusedReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs +++ b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/UnusedReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs @@ -1,22 +1,31 @@ using System.Threading.Tasks; -using Microsoft.CodeAnalysis; -using NSubstitute.Analyzers.CSharp; -using NSubstitute.Analyzers.Shared; -using NSubstitute.Analyzers.Tests.Shared; -using NSubstitute.Analyzers.Tests.Shared.DiagnosticAnalyzers; using NSubstitute.Analyzers.Tests.Shared.Extensibility; -using NSubstitute.Analyzers.Tests.Shared.Extensions; namespace NSubstitute.Analyzers.Tests.CSharp.DiagnosticAnalyzerTests.UnusedReceivedAnalyzerTests { - [CombinatoryData("Received", "Received", "ReceivedWithAnyArgs", "ReceivedWithAnyArgs", "DidNotReceive", "DidNotReceive", "DidNotReceiveWithAnyArgs", "DidNotReceiveWithAnyArgs")] + [CombinatoryData( + "Received(Quantity.None())", + "Received(Quantity.None())", + "Received()", + "Received()", + "ReceivedWithAnyArgs(Quantity.None())", + "ReceivedWithAnyArgs(Quantity.None())", + "ReceivedWithAnyArgs()", + "ReceivedWithAnyArgs()", + "DidNotReceive()", + "DidNotReceive()", + "DidNotReceiveWithAnyArgs()", + "DidNotReceiveWithAnyArgs()")] public class ReceivedAsExtensionMethodTests : UnusedReceivedDiagnosticVerifier { public override async Task ReportDiagnostics_WhenUsedWithoutMemberCall(string method) { - var plainMethodName = method.Replace("", string.Empty); - var source = $@"using NSubstitute; + var plainMethodName = method.Replace("", string.Empty) + .Replace("Quantity.None()", string.Empty) + .Replace("()", string.Empty); + var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ public interface Foo @@ -28,7 +37,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - [|substitute.{method}()|]; + [|substitute.{method}|]; }} }} }}"; @@ -39,7 +48,7 @@ public void Test() public override async Task ReportNoDiagnostics_WhenUsedWithMethodMemberAccess(string method) { var source = $@"using NSubstitute; - +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ public class FooBar @@ -56,7 +65,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - substitute.{method}().Bar(); + substitute.{method}.Bar(); }} }} }}"; @@ -67,6 +76,7 @@ public void Test() public override async Task ReportNoDiagnostics_WhenUsedWithPropertyMemberAccess(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -81,7 +91,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var bar = substitute.{method}().Bar; + var bar = substitute.{method}.Bar; }} }} }}"; @@ -92,7 +102,7 @@ public void Test() public override async Task ReportNoDiagnostics_WhenUsedWithIndexerMemberAccess(string method) { var source = $@"using NSubstitute; - +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -106,7 +116,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var bar = substitute.{method}()[0]; + var bar = substitute.{method}[0]; }} }} }}"; @@ -114,11 +124,24 @@ public void Test() await VerifyNoDiagnostic(source); } - [CombinatoryData("Received", "Received>", "ReceivedWithAnyArgs", "ReceivedWithAnyArgs>", "DidNotReceive", "DidNotReceive>", "DidNotReceiveWithAnyArgs", "DidNotReceiveWithAnyArgs>")] + [CombinatoryData( + "Received(Quantity.None())", + "Received>(Quantity.None())", + "Received()", + "Received>()", + "ReceivedWithAnyArgs(Quantity.None())", + "ReceivedWithAnyArgs>(Quantity.None())", + "ReceivedWithAnyArgs()", + "ReceivedWithAnyArgs>()", + "DidNotReceive()", + "DidNotReceive>()", + "DidNotReceiveWithAnyArgs()", + "DidNotReceiveWithAnyArgs>()")] public override async Task ReportNoDiagnostics_WhenUsedWithInvokingDelegate(string method) { var source = $@"using System; using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -127,43 +150,84 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For>(); - substitute.{method}()(); + substitute.{method}(); }} }} }}"; await VerifyNoDiagnostic(source); } + [CombinatoryData( + "Received(Quantity.None())", + "Received(Quantity.None())", + "Received(1, 1)", + "Received(1, 1)", + "ReceivedWithAnyArgs(Quantity.None())", + "ReceivedWithAnyArgs(Quantity.None())", + "ReceivedWithAnyArgs(1, 1)", + "ReceivedWithAnyArgs(1, 1)", + "DidNotReceive(1, 1)", + "DidNotReceive(1, 1)", + "DidNotReceiveWithAnyArgs(1, 1)", + "DidNotReceiveWithAnyArgs(1, 1)")] public override async Task ReportsNoDiagnostics_WhenUsedWithUnfortunatelyNamedMethod(string method) { var source = $@"using System; namespace NSubstitute {{ + public class Quantity + {{ + public static Quantity None() => null; + }} + public class Foo {{ }} public static class SubstituteExtensions {{ - public static T Received(this T substitute, decimal x) where T : class + public static T Received(this T substitute, int x, int y) {{ - return null; + return default(T); }} - public static T ReceivedWithAnyArgs(this T substitute, decimal x) where T : class + public static T ReceivedWithAnyArgs(this T substitute, int x, int y) {{ - return null; + return default(T); }} - public static T DidNotReceive(this T substitute, decimal x) where T : class + public static T DidNotReceive(this T substitute, int x, int y) {{ - return null; + return default(T); }} - public static T DidNotReceiveWithAnyArgs(this T substitute, decimal x) where T : class + public static T DidNotReceiveWithAnyArgs(this T substitute, int x, int y) {{ - return null; + return default(T); + }} + }} + + public static class ReceivedExtensions + {{ + public static T Received(this T substitute, Quantity x) + {{ + return default(T); + }} + + public static T ReceivedWithAnyArgs(this T substitute, Quantity x) + {{ + return default(T); + }} + + public static T DidNotReceive(this T substitute, Quantity x) + {{ + return default(T); + }} + + public static T DidNotReceiveWithAnyArgs(this T substitute, Quantity x) + {{ + return default(T); }} }} @@ -171,8 +235,8 @@ public class FooTests {{ public void Test() {{ - var substitute = NSubstitute.Substitute.For(); - substitute.{method}(1m); + Foo substitute = null; + substitute.{method}; }} }} }}"; diff --git a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/UnusedReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/UnusedReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs index 7bf5ee5b..dfc82a22 100644 --- a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/UnusedReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs +++ b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/UnusedReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs @@ -4,23 +4,31 @@ namespace NSubstitute.Analyzers.Tests.CSharp.DiagnosticAnalyzerTests.UnusedReceivedAnalyzerTests { [CombinatoryData( - "SubstituteExtensions.Received", - "SubstituteExtensions.Received", - "SubstituteExtensions.ReceivedWithAnyArgs", - "SubstituteExtensions.ReceivedWithAnyArgs", - "SubstituteExtensions.DidNotReceive", - "SubstituteExtensions.DidNotReceive", - "SubstituteExtensions.DidNotReceiveWithAnyArgs", - "SubstituteExtensions.DidNotReceiveWithAnyArgs")] + "ReceivedExtensions.Received(substitute, Quantity.None())", + "ReceivedExtensions.Received(substitute, Quantity.None())", + "SubstituteExtensions.Received(substitute)", + "SubstituteExtensions.Received(substitute)", + "ReceivedExtensions.ReceivedWithAnyArgs(substitute, Quantity.None())", + "ReceivedExtensions.ReceivedWithAnyArgs(substitute, Quantity.None())", + "SubstituteExtensions.ReceivedWithAnyArgs(substitute)", + "SubstituteExtensions.ReceivedWithAnyArgs(substitute)", + "SubstituteExtensions.DidNotReceive(substitute)", + "SubstituteExtensions.DidNotReceive(substitute)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(substitute)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(substitute)")] public class ReceivedAsOrdinaryMethodTests : UnusedReceivedDiagnosticVerifier { public override async Task ReportDiagnostics_WhenUsedWithoutMemberCall(string method) { - var plainMethodName = method.Replace("", string.Empty); - var planMethodNameWithoutNamespace = plainMethodName.Replace("SubstituteExtensions.", string.Empty); + var plainMethodName = method.Replace("", string.Empty) + .Replace("(substitute, Quantity.None())", string.Empty) + .Replace("(substitute)", string.Empty); - var source = $@"using NSubstitute; + var planMethodNameWithoutNamespace = plainMethodName.Replace("SubstituteExtensions.", string.Empty) + .Replace("ReceivedExtensions.", string.Empty); + var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ public interface Foo @@ -32,7 +40,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - [|{method}(substitute)|]; + [|{method}|]; }} }} }}"; @@ -43,6 +51,7 @@ public void Test() public override async Task ReportNoDiagnostics_WhenUsedWithMethodMemberAccess(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -60,7 +69,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - {method}(substitute).Bar(); + {method}.Bar(); }} }} }}"; @@ -71,6 +80,7 @@ public void Test() public override async Task ReportNoDiagnostics_WhenUsedWithPropertyMemberAccess(string method) { var source = $@"using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -85,7 +95,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var bar = {method}(substitute).Bar; + var bar = {method}.Bar; }} }} }}"; @@ -96,7 +106,7 @@ public void Test() public override async Task ReportNoDiagnostics_WhenUsedWithIndexerMemberAccess(string method) { var source = $@"using NSubstitute; - +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -110,7 +120,7 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For(); - var bar = {method}(substitute)[0]; + var bar = {method}[0]; }} }} }}"; @@ -119,18 +129,23 @@ public void Test() } [CombinatoryData( - "SubstituteExtensions.Received", - "SubstituteExtensions.Received>", - "SubstituteExtensions.ReceivedWithAnyArgs", - "SubstituteExtensions.ReceivedWithAnyArgs>", - "SubstituteExtensions.DidNotReceive", - "SubstituteExtensions.DidNotReceive>", - "SubstituteExtensions.DidNotReceiveWithAnyArgs", - "SubstituteExtensions.DidNotReceiveWithAnyArgs>")] + "ReceivedExtensions.Received(substitute, Quantity.None())", + "ReceivedExtensions.Received>(substitute, Quantity.None())", + "SubstituteExtensions.Received(substitute)", + "SubstituteExtensions.Received>(substitute)", + "SubstituteExtensions.ReceivedWithAnyArgs(substitute)", + "ReceivedExtensions.ReceivedWithAnyArgs(substitute, Quantity.None())", + "ReceivedExtensions.ReceivedWithAnyArgs>(substitute, Quantity.None())", + "SubstituteExtensions.ReceivedWithAnyArgs>(substitute)", + "SubstituteExtensions.DidNotReceive(substitute)", + "SubstituteExtensions.DidNotReceive>(substitute)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(substitute)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs>(substitute)")] public override async Task ReportNoDiagnostics_WhenUsedWithInvokingDelegate(string method) { var source = $@"using System; using NSubstitute; +using NSubstitute.ReceivedExtensions; namespace MyNamespace {{ @@ -139,43 +154,84 @@ public class FooTests public void Test() {{ var substitute = NSubstitute.Substitute.For>(); - {method}(substitute)(); + {method}(); }} }} }}"; await VerifyNoDiagnostic(source); } + [CombinatoryData( + "ReceivedExtensions.Received(substitute, Quantity.None())", + "ReceivedExtensions.Received(substitute, Quantity.None())", + "SubstituteExtensions.Received(substitute, 1, 1)", + "SubstituteExtensions.Received(substitute, 1, 1)", + "ReceivedExtensions.ReceivedWithAnyArgs(substitute, Quantity.None())", + "ReceivedExtensions.ReceivedWithAnyArgs(substitute, Quantity.None())", + "SubstituteExtensions.ReceivedWithAnyArgs(substitute, 1, 1)", + "SubstituteExtensions.ReceivedWithAnyArgs(substitute, 1, 1)", + "SubstituteExtensions.DidNotReceive(substitute, 1, 1)", + "SubstituteExtensions.DidNotReceive(substitute, 1, 1)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(substitute, 1, 1)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(substitute, 1, 1)")] public override async Task ReportsNoDiagnostics_WhenUsedWithUnfortunatelyNamedMethod(string method) { var source = $@"using System; namespace NSubstitute {{ + public class Quantity + {{ + public static Quantity None() => null; + }} + public class Foo {{ }} public static class SubstituteExtensions {{ - public static T Received(this T substitute, decimal x) where T : class + public static T Received(this T substitute, int x, int y) {{ - return null; + return default(T); }} - public static T ReceivedWithAnyArgs(this T substitute, decimal x) where T : class + public static T ReceivedWithAnyArgs(this T substitute, int x, int y) {{ - return null; + return default(T); }} - public static T DidNotReceive(this T substitute, decimal x) where T : class + public static T DidNotReceive(this T substitute, int x, int y) {{ - return null; + return default(T); }} - public static T DidNotReceiveWithAnyArgs(this T substitute, decimal x) where T : class + public static T DidNotReceiveWithAnyArgs(this T substitute, int x, int y) {{ - return null; + return default(T); + }} + }} + + public static class ReceivedExtensions + {{ + public static T Received(this T substitute, Quantity x) + {{ + return default(T); + }} + + public static T ReceivedWithAnyArgs(this T substitute, Quantity x) + {{ + return default(T); + }} + + public static T DidNotReceive(this T substitute, Quantity x) + {{ + return default(T); + }} + + public static T DidNotReceiveWithAnyArgs(this T substitute, Quantity x) + {{ + return default(T); }} }} @@ -183,8 +239,8 @@ public class FooTests {{ public void Test() {{ - var substitute = NSubstitute.Substitute.For(); - {method}(substitute, 1m); + Foo substitute = null; + {method}; }} }} }}"; diff --git a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs index a8de5b1e..0f459291 100644 --- a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs +++ b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs @@ -3,12 +3,19 @@ namespace NSubstitute.Analyzers.Tests.VisualBasic.DiagnosticAnalyzersTests.NonSubstitutableMemberReceivedAnalyzerTests { - [CombinatoryData("Received", "ReceivedWithAnyArgs", "DidNotReceive", "DidNotReceiveWithAnyArgs")] + [CombinatoryData( + "Received(Quantity.None())", + "Received()", + "ReceivedWithAnyArgs(Quantity.None())", + "ReceivedWithAnyArgs()", + "DidNotReceive()", + "DidNotReceiveWithAnyArgs()")] public class ReceivedAsExtensionMethodTests : NonSubstitutableMemberReceivedDiagnosticVerifier { public override async Task ReportsDiagnostics_WhenCheckingReceivedCallsForNonVirtualMethod(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -23,7 +30,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - [|substitute.{method}().Bar()|] + [|substitute.{method}.Bar()|] End Sub End Class End Namespace @@ -34,6 +41,7 @@ End Namespace public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForVirtualMethod(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -48,7 +56,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - substitute.{method}().Bar() + substitute.{method}.Bar() End Sub End Class End Namespace @@ -59,6 +67,7 @@ End Namespace public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForNonSealedMethod(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -81,7 +90,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo2)() - substitute.{method}().Bar() + substitute.{method}.Bar() End Sub End Class End Namespace @@ -92,6 +101,7 @@ End Namespace public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForDelegate(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Imports System Namespace MyNamespace @@ -100,7 +110,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Func(Of Integer))() - substitute.{method}()() + substitute.{method}() End Sub End Class End Namespace @@ -111,6 +121,7 @@ End Namespace public override async Task ReportsDiagnostics_WhenCheckingReceivedCallsForSealedMethod(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -133,7 +144,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo2)() - [|substitute.{method}().Bar()|] + [|substitute.{method}.Bar()|] End Sub End Class End Namespace @@ -144,6 +155,7 @@ End Namespace public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForAbstractMethod(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -156,7 +168,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - substitute.{method}().Bar() + substitute.{method}.Bar() End Sub End Class End Namespace @@ -168,6 +180,7 @@ End Namespace public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForInterfaceMethod(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -181,7 +194,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of IFoo)() - substitute.{method}().Bar() + substitute.{method}.Bar() End Sub End Class End Namespace @@ -192,6 +205,7 @@ End Namespace public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForInterfaceProperty(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -205,7 +219,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of IFoo)() - Dim x As Integer = substitute.{method}().Bar + Dim x As Integer = substitute.{method}.Bar End Sub End Class End Namespace @@ -216,6 +230,7 @@ End Namespace public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForGenericInterfaceMethod(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -228,7 +243,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of IFoo(Of Integer))() - substitute.{method}().Bar(Of Integer) + substitute.{method}.Bar(Of Integer) End Sub End Class End Namespace"; @@ -238,6 +253,7 @@ End Class public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForAbstractProperty(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -250,7 +266,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.For(Of Foo) - Dim x As Integer = substitute.{method}().Bar + Dim x As Integer = substitute.{method}.Bar End Sub End Class End Namespace"; @@ -261,6 +277,7 @@ End Class public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForInterfaceIndexer(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -273,7 +290,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.For(Of IFoo) - Dim x As Integer = substitute.{method}()(1) + Dim x As Integer = substitute.{method}(1) End Sub End Class End Namespace"; @@ -283,6 +300,7 @@ End Class public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForVirtualProperty(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -298,7 +316,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.For(Of Foo) - Dim x As Integer = substitute.{method}().Bar + Dim x As Integer = substitute.{method}.Bar End Sub End Class End Namespace"; @@ -309,6 +327,7 @@ End Class public override async Task ReportsDiagnostics_WhenCheckingReceivedCallsForNonVirtualProperty(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -324,7 +343,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.For(Of Foo) - Dim x As Integer = [|substitute.{method}().Bar|] + Dim x As Integer = [|substitute.{method}.Bar|] End Sub End Class End Namespace"; @@ -336,6 +355,7 @@ public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForVirt { var source = $@"Imports System Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -356,7 +376,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.For(Of Foo) - Dim x As Integer = substitute.{method}()(1) + Dim x As Integer = substitute.{method}(1) End Sub End Class End Namespace"; @@ -367,6 +387,7 @@ public override async Task ReportsDiagnostics_WhenCheckingReceivedCallsForNonVir { var source = $@"Imports System Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -383,7 +404,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.For(Of Foo) - Dim x As Integer = [|substitute.{method}()(1)|] + Dim x As Integer = [|substitute.{method}(1)|] End Sub End Class End Namespace"; @@ -391,11 +412,24 @@ End Class await VerifyDiagnostic(source, NonVirtualReceivedSetupSpecificationDescriptor, "Member Item can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted."); } + [CombinatoryData( + "Received(Quantity.None())", + "Received(1, 1)", + "ReceivedWithAnyArgs(Quantity.None())", + "ReceivedWithAnyArgs(1, 1)", + "DidNotReceive(1, 1)", + "DidNotReceiveWithAnyArgs(1, 1)")] public override async Task ReportsNoDiagnostics_WhenUsingUnfortunatelyNamedMethod(string method) { var source = $@"Imports System.Runtime.CompilerServices Namespace NSubstitute + Public Class Quantity + Public Shared Function None() As Quantity + Return Nothing + End Function + End Class + Public Class Foo Public Function Bar() As Integer Return 1 @@ -403,23 +437,45 @@ End Function End Class Module SubstituteExtensions - - Function Received(Of T)(ByVal returnValue As T, ByVal x as Single) As T + + Function Received(Of T)(ByVal substitute As T, ByVal x As Integer, ByVal y As Integer) As T + Return Nothing + End Function + + + Function ReceivedWithAnyArgs(Of T)(ByVal substitute As T, ByVal x As Integer, ByVal y As Integer) As T + Return Nothing + End Function + + + Function DidNotReceive(Of T)(ByVal substitute As T, ByVal x As Integer, ByVal y As Integer) As T + Return Nothing + End Function + + + Function DidNotReceiveWithAnyArgs(Of T)(ByVal substitute As T, ByVal x As Integer, ByVal y As Integer) As T + Return Nothing + End Function + End Module + + Module ReceivedExtensions + + Function Received(Of T)(ByVal substitute As T, ByVal x As Quantity) As T Return Nothing End Function - - Function ReceivedWithAnyArgs(Of T)(ByVal returnValue As T, ByVal x as Single) As T + + Function ReceivedWithAnyArgs(Of T)(ByVal substitute As T, ByVal x As Quantity) As T Return Nothing End Function - - Function DidNotReceive(Of T)(ByVal returnValue As T, ByVal x as Single) As T + + Function DidNotReceive(Of T)(ByVal substitute As T, ByVal x As Quantity) As T Return Nothing End Function - - Function DidNotReceiveWithAnyArgs(Of T)(ByVal returnValue As T, ByVal x as Single) As T + + Function DidNotReceiveWithAnyArgs(Of T)(ByVal substitute As T, ByVal x As Quantity) As T Return Nothing End Function End Module @@ -427,7 +483,7 @@ End Module Public Class FooTests Public Sub Test() Dim substitute As Foo = Nothing - substitute.{method}(1D).Bar() + substitute.{method}.Bar() End Sub End Class End Namespace @@ -438,6 +494,7 @@ End Namespace public override async Task ReportsDiagnostics_WhenSettingValueForInternalVirtualMember_AndInternalsVisibleToNotApplied(string method, string call, string message) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace Public Class Foo @@ -457,7 +514,7 @@ End Class Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - Dim x = [|substitute.{method}(){call}|] + Dim x = [|substitute.{method}{call}|] End Sub End Class End Namespace"; @@ -468,6 +525,7 @@ End Class public override async Task ReportsNoDiagnostics_WhenSettingValueForInternalVirtualMember_AndInternalsVisibleToApplied(string method, string call) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions @@ -491,7 +549,7 @@ End Class Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - Dim x = substitute.{method}(){call} + Dim x = substitute.{method}{call} End Sub End Class End Namespace"; @@ -502,6 +560,7 @@ End Class public override async Task ReportsDiagnostics_WhenSettingValueForInternalVirtualMember_AndInternalsVisibleToAppliedToWrongAssembly(string method, string call, string message) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions @@ -523,7 +582,7 @@ End Class Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - Dim x = [|substitute.{method}(){call}|] + Dim x = [|substitute.{method}{call}|] End Sub End Class End Namespace"; @@ -534,6 +593,7 @@ End Class public override async Task ReportsNoDiagnostics_WhenSettingValueForProtectedInternalVirtualMember(string method, string call) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace Public Class Foo @@ -553,7 +613,7 @@ End Class Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - Dim x = substitute.{method}(){call} + Dim x = substitute.{method}{call} End Sub End Class End Namespace"; diff --git a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs index a15e1c63..bc4b40d4 100644 --- a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs +++ b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs @@ -4,19 +4,24 @@ namespace NSubstitute.Analyzers.Tests.VisualBasic.DiagnosticAnalyzersTests.NonSubstitutableMemberReceivedAnalyzerTests { [CombinatoryData( - "SubstituteExtensions.Received", - "SubstituteExtensions.Received(Of Foo)", - "SubstituteExtensions.ReceivedWithAnyArgs", - "SubstituteExtensions.ReceivedWithAnyArgs(Of Foo)", - "SubstituteExtensions.DidNotReceive", - "SubstituteExtensions.DidNotReceive(Of Foo)", - "SubstituteExtensions.DidNotReceiveWithAnyArgs", - "SubstituteExtensions.DidNotReceiveWithAnyArgs(Of Foo)")] + "ReceivedExtensions.Received(substitute, Quantity.None())", + "ReceivedExtensions.Received(Of Foo)(substitute, Quantity.None())", + "SubstituteExtensions.Received(substitute)", + "SubstituteExtensions.Received(Of Foo)(substitute)", + "ReceivedExtensions.ReceivedWithAnyArgs(substitute, Quantity.None())", + "ReceivedExtensions.ReceivedWithAnyArgs(Of Foo)(substitute, Quantity.None())", + "SubstituteExtensions.ReceivedWithAnyArgs(substitute)", + "SubstituteExtensions.ReceivedWithAnyArgs(Of Foo)(substitute)", + "SubstituteExtensions.DidNotReceive(substitute)", + "SubstituteExtensions.DidNotReceive(Of Foo)(substitute)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(substitute)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(Of Foo)(substitute)")] public class ReceivedAsOrdinaryMethodTests : NonSubstitutableMemberReceivedDiagnosticVerifier { public override async Task ReportsDiagnostics_WhenCheckingReceivedCallsForNonVirtualMethod(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -31,7 +36,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - [|{method}(substitute).Bar()|] + [|{method}.Bar()|] End Sub End Class End Namespace @@ -42,6 +47,7 @@ End Namespace public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForVirtualMethod(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -56,7 +62,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - {method}(substitute).Bar() + {method}.Bar() End Sub End Class End Namespace @@ -67,6 +73,7 @@ End Namespace public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForNonSealedMethod(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -89,7 +96,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo2)() - {method}(substitute).Bar() + {method}.Bar() End Sub End Class End Namespace @@ -98,17 +105,22 @@ End Namespace } [CombinatoryData( - "SubstituteExtensions.Received", - "SubstituteExtensions.Received(Of Func(Of Foo))", - "SubstituteExtensions.ReceivedWithAnyArgs", - "SubstituteExtensions.ReceivedWithAnyArgs(Of Func(Of Foo))", - "SubstituteExtensions.DidNotReceive", - "SubstituteExtensions.DidNotReceive(Of Func(Of Foo))", - "SubstituteExtensions.DidNotReceiveWithAnyArgs", - "SubstituteExtensions.DidNotReceiveWithAnyArgs(Of Func(Of Foo))")] + "ReceivedExtensions.Received(substitute, Quantity.None())", + "ReceivedExtensions.Received(Of Func(Of Foo))(substitute, Quantity.None())", + "SubstituteExtensions.Received(substitute)", + "SubstituteExtensions.Received(Of Func(Of Foo))(substitute)", + "ReceivedExtensions.ReceivedWithAnyArgs(substitute, Quantity.None())", + "ReceivedExtensions.ReceivedWithAnyArgs(Of Func(Of Foo))(substitute, Quantity.None())", + "SubstituteExtensions.ReceivedWithAnyArgs(substitute)", + "SubstituteExtensions.ReceivedWithAnyArgs(Of Func(Of Foo))(substitute)", + "SubstituteExtensions.DidNotReceive(substitute)", + "SubstituteExtensions.DidNotReceive(Of Func(Of Foo))(substitute)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(substitute)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(Of Func(Of Foo))(substitute)")] public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForDelegate(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Imports System Public Class Foo @@ -120,7 +132,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Func(Of Foo))() - {method}(substitute)() + {method}() End Sub End Class End Namespace @@ -131,6 +143,7 @@ End Namespace public override async Task ReportsDiagnostics_WhenCheckingReceivedCallsForSealedMethod(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -153,7 +166,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - [|{method}(substitute).Bar()|] + [|{method}.Bar()|] End Sub End Class End Namespace @@ -164,6 +177,7 @@ End Namespace public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForAbstractMethod(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -176,7 +190,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - {method}(substitute).Bar() + {method}.Bar() End Sub End Class End Namespace @@ -188,6 +202,7 @@ End Namespace public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForInterfaceMethod(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -201,7 +216,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - {method}(substitute).Bar() + {method}.Bar() End Sub End Class End Namespace @@ -212,6 +227,7 @@ End Namespace public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForInterfaceProperty(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -225,7 +241,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - Dim x As Integer = {method}(substitute).Bar + Dim x As Integer = {method}.Bar End Sub End Class End Namespace @@ -234,17 +250,22 @@ End Namespace } [CombinatoryData( - "SubstituteExtensions.Received", - "SubstituteExtensions.Received(Of Foo(Of Integer))", - "SubstituteExtensions.ReceivedWithAnyArgs", - "SubstituteExtensions.ReceivedWithAnyArgs(Of Foo(Of Integer))", - "SubstituteExtensions.DidNotReceive", - "SubstituteExtensions.DidNotReceive(Of Foo(Of Integer))", - "SubstituteExtensions.DidNotReceiveWithAnyArgs", - "SubstituteExtensions.DidNotReceiveWithAnyArgs(Of Foo(Of Integer))")] + "ReceivedExtensions.Received(substitute, Quantity.None())", + "ReceivedExtensions.Received(Of Foo(Of Integer))(substitute, Quantity.None())", + "SubstituteExtensions.Received(substitute)", + "SubstituteExtensions.Received(Of Foo(Of Integer))(substitute)", + "ReceivedExtensions.ReceivedWithAnyArgs(substitute, Quantity.None())", + "ReceivedExtensions.ReceivedWithAnyArgs(Of Foo(Of Integer))(substitute, Quantity.None())", + "SubstituteExtensions.ReceivedWithAnyArgs(substitute)", + "SubstituteExtensions.ReceivedWithAnyArgs(Of Foo(Of Integer))(substitute)", + "SubstituteExtensions.DidNotReceive(substitute)", + "SubstituteExtensions.DidNotReceive(Of Foo(Of Integer))(substitute)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(substitute)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(Of Foo(Of Integer))(substitute)")] public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForGenericInterfaceMethod(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -257,7 +278,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo(Of Integer))() - {method}(substitute).Bar(Of Integer) + {method}.Bar(Of Integer) End Sub End Class End Namespace"; @@ -267,6 +288,7 @@ End Class public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForAbstractProperty(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -279,7 +301,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.For(Of Foo) - Dim x As Integer = {method}(substitute).Bar + Dim x As Integer = {method}.Bar End Sub End Class End Namespace"; @@ -290,7 +312,7 @@ End Class public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForInterfaceIndexer(string method) { var source = $@"Imports NSubstitute - +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace Public Interface Foo @@ -302,7 +324,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.For(Of Foo) - Dim x As Integer = {method}(substitute)(1) + Dim x As Integer = {method}(1) End Sub End Class End Namespace"; @@ -312,6 +334,7 @@ End Class public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForVirtualProperty(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -327,7 +350,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.For(Of Foo) - Dim x As Integer = {method}(substitute).Bar + Dim x As Integer = {method}.Bar End Sub End Class End Namespace"; @@ -338,6 +361,7 @@ End Class public override async Task ReportsDiagnostics_WhenCheckingReceivedCallsForNonVirtualProperty(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -353,7 +377,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.For(Of Foo) - Dim x As Integer = [|{method}(substitute).Bar|] + Dim x As Integer = [|{method}.Bar|] End Sub End Class End Namespace"; @@ -365,6 +389,7 @@ public override async Task ReportsNoDiagnostics_WhenCheckingReceivedCallsForVirt { var source = $@"Imports System Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -385,7 +410,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.For(Of Foo) - Dim x As Integer = {method}(substitute)(1) + Dim x As Integer = {method}(1) End Sub End Class End Namespace"; @@ -396,6 +421,7 @@ public override async Task ReportsDiagnostics_WhenCheckingReceivedCallsForNonVir { var source = $@"Imports System Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace @@ -412,7 +438,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.For(Of Foo) - Dim x As Integer = [|{method}(substitute)(1)|] + Dim x As Integer = [|{method}(1)|] End Sub End Class End Namespace"; @@ -420,11 +446,30 @@ End Class await VerifyDiagnostic(source, NonVirtualReceivedSetupSpecificationDescriptor, "Member Item can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted."); } + [CombinatoryData( + "ReceivedExtensions.Received(substitute, Quantity.None())", + "ReceivedExtensions.Received(Of Foo)(substitute, Quantity.None())", + "SubstituteExtensions.Received(substitute, 1, 1)", + "SubstituteExtensions.Received(Of Foo)(substitute, 1, 1)", + "ReceivedExtensions.ReceivedWithAnyArgs(substitute, Quantity.None())", + "ReceivedExtensions.ReceivedWithAnyArgs(Of Foo)(substitute, Quantity.None())", + "SubstituteExtensions.ReceivedWithAnyArgs(substitute, 1, 1)", + "SubstituteExtensions.ReceivedWithAnyArgs(Of Foo)(substitute, 1, 1)", + "SubstituteExtensions.DidNotReceive(substitute, 1, 1)", + "SubstituteExtensions.DidNotReceive(Of Foo)(substitute, 1, 1)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(substitute, 1, 1)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(Of Foo)(substitute, 1, 1)")] public override async Task ReportsNoDiagnostics_WhenUsingUnfortunatelyNamedMethod(string method) { var source = $@"Imports System.Runtime.CompilerServices Namespace NSubstitute + Public Class Quantity + Public Shared Function None() As Quantity + Return Nothing + End Function + End Class + Public Class Foo Public Function Bar() As Integer Return 1 @@ -432,23 +477,45 @@ End Function End Class Module SubstituteExtensions - - Function Received(Of T)(ByVal returnValue As T, ByVal x as Single) As T + + Function Received(Of T)(ByVal substitute As T, ByVal x As Integer, ByVal y As Integer) As T + Return Nothing + End Function + + + Function ReceivedWithAnyArgs(Of T)(ByVal substitute As T, ByVal x As Integer, ByVal y As Integer) As T + Return Nothing + End Function + + + Function DidNotReceive(Of T)(ByVal substitute As T, ByVal x As Integer, ByVal y As Integer) As T + Return Nothing + End Function + + + Function DidNotReceiveWithAnyArgs(Of T)(ByVal substitute As T, ByVal x As Integer, ByVal y As Integer) As T + Return Nothing + End Function + End Module + + Module ReceivedExtensions + + Function Received(Of T)(ByVal substitute As T, ByVal x As Quantity) As T Return Nothing End Function - - Function ReceivedWithAnyArgs(Of T)(ByVal returnValue As T, ByVal x as Single) As T + + Function ReceivedWithAnyArgs(Of T)(ByVal substitute As T, ByVal x As Quantity) As T Return Nothing End Function - - Function DidNotReceive(Of T)(ByVal returnValue As T, ByVal x as Single) As T + + Function DidNotReceive(Of T)(ByVal substitute As T, ByVal x As Quantity) As T Return Nothing End Function - - Function DidNotReceiveWithAnyArgs(Of T)(ByVal returnValue As T, ByVal x as Single) As T + + Function DidNotReceiveWithAnyArgs(Of T)(ByVal substitute As T, ByVal x As Quantity) As T Return Nothing End Function End Module @@ -456,7 +523,7 @@ End Module Public Class FooTests Public Sub Test() Dim substitute As Foo = Nothing - {method}(substitute, 1D).Bar() + {method}.Bar() End Sub End Class End Namespace @@ -467,6 +534,7 @@ End Namespace public override async Task ReportsDiagnostics_WhenSettingValueForInternalVirtualMember_AndInternalsVisibleToNotApplied(string method, string call, string message) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace Public Class Foo @@ -486,7 +554,7 @@ End Class Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - Dim x = [|{method}(substitute){call}|] + Dim x = [|{method}{call}|] End Sub End Class End Namespace"; @@ -497,6 +565,7 @@ End Class public override async Task ReportsNoDiagnostics_WhenSettingValueForInternalVirtualMember_AndInternalsVisibleToApplied(string method, string call) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions @@ -520,7 +589,7 @@ End Class Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - Dim x = {method}(substitute){call} + Dim x = {method}{call} End Sub End Class End Namespace"; @@ -531,6 +600,7 @@ End Class public override async Task ReportsDiagnostics_WhenSettingValueForInternalVirtualMember_AndInternalsVisibleToAppliedToWrongAssembly(string method, string call, string message) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions @@ -552,7 +622,7 @@ End Class Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - Dim x = [|{method}(substitute){call}|] + Dim x = [|{method}{call}|] End Sub End Class End Namespace"; @@ -563,6 +633,7 @@ End Class public override async Task ReportsNoDiagnostics_WhenSettingValueForProtectedInternalVirtualMember(string method, string call) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace Public Class Foo @@ -582,7 +653,7 @@ End Class Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - Dim x = {method}(substitute){call} + Dim x = {method}{call} End Sub End Class End Namespace"; diff --git a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/UnusedReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/UnusedReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs index 74eae89d..8d823ed5 100644 --- a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/UnusedReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs +++ b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/UnusedReceivedAnalyzerTests/ReceivedAsExtensionMethodTests.cs @@ -3,13 +3,23 @@ namespace NSubstitute.Analyzers.Tests.VisualBasic.DiagnosticAnalyzersTests.UnusedReceivedAnalyzerTests { - [CombinatoryData("Received", "ReceivedWithAnyArgs", "DidNotReceive", "DidNotReceiveWithAnyArgs")] + [CombinatoryData( + "Received(Quantity.None())", + "Received()", + "ReceivedWithAnyArgs(Quantity.None())", + "ReceivedWithAnyArgs()", + "DidNotReceive()", + "DidNotReceiveWithAnyArgs()")] public class ReceivedAsExtensionMethodTests : UnusedReceivedDiagnosticVerifier { public override async Task ReportDiagnostics_WhenUsedWithoutMemberCall(string method) { - var plainMethodName = method.Replace("(Of Foo)", string.Empty); + var plainMethodName = method.Replace("(Of Foo)", string.Empty) + .Replace("Quantity.None()", string.Empty) + .Replace("()", string.Empty); + var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace Interface Foo @@ -18,7 +28,7 @@ End Interface Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - [|substitute.{method}()|] + [|substitute.{method}|] End Sub End Class End Namespace @@ -29,6 +39,7 @@ End Namespace public override async Task ReportNoDiagnostics_WhenUsedWithMethodMemberAccess(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace Public Class FooBar @@ -41,7 +52,7 @@ End Interface Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - substitute.{method}().Bar() + substitute.{method}.Bar() End Sub End Class End Namespace @@ -53,6 +64,7 @@ End Namespace public override async Task ReportNoDiagnostics_WhenUsedWithPropertyMemberAccess(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace Interface Foo @@ -62,7 +74,7 @@ End Interface Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - Dim bar = substitute.{method}().Bar + Dim bar = substitute.{method}.Bar End Sub End Class End Namespace @@ -74,6 +86,7 @@ End Namespace public override async Task ReportNoDiagnostics_WhenUsedWithIndexerMemberAccess(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace Interface Foo @@ -83,7 +96,7 @@ End Interface Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - Dim bar = substitute.{method}()(0) + Dim bar = substitute.{method}(0) End Sub End Class End Namespace @@ -92,10 +105,17 @@ End Namespace await VerifyNoDiagnostic(source); } - [CombinatoryData("Received", "ReceivedWithAnyArgs", "DidNotReceive", "DidNotReceiveWithAnyArgs")] + [CombinatoryData( + "Received(Quantity.None())", + "Received()", + "ReceivedWithAnyArgs(Quantity.None())", + "ReceivedWithAnyArgs()", + "DidNotReceive()", + "DidNotReceiveWithAnyArgs()")] public override async Task ReportNoDiagnostics_WhenUsedWithInvokingDelegate(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Imports System Namespace MyNamespace @@ -104,7 +124,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Func(Of Integer))() - substitute.{method}()() + substitute.{method}() End Sub End Class End Namespace @@ -112,42 +132,76 @@ End Namespace await VerifyNoDiagnostic(source); } + [CombinatoryData( + "Received(Quantity.None())", + "Received(1, 1)", + "ReceivedWithAnyArgs(Quantity.None())", + "ReceivedWithAnyArgs(1, 1)", + "DidNotReceive(1, 1)", + "DidNotReceiveWithAnyArgs(1, 1)")] public override async Task ReportsNoDiagnostics_WhenUsedWithUnfortunatelyNamedMethod(string method) { var source = $@"Imports System Imports System.Runtime.CompilerServices Namespace NSubstitute + Public Class Quantity + Public Shared Function None() As Quantity + Return Nothing + End Function + End Class + + Public Class Foo + End Class + Module SubstituteExtensions - Function Received(Of T As Class)(ByVal substitute As T, ByVal params As Decimal) As T + Function Received(Of T)(ByVal substitute As T, ByVal x As Integer, ByVal y As Integer) As T Return Nothing End Function - Function ReceivedWithAnyArgs(Of T As Class)(ByVal substitute As T, ByVal params As Decimal) As T + Function ReceivedWithAnyArgs(Of T)(ByVal substitute As T, ByVal x As Integer, ByVal y As Integer) As T Return Nothing End Function - Function DidNotReceive(Of T As Class)(ByVal substitute As T, ByVal params As Decimal) As T + Function DidNotReceive(Of T)(ByVal substitute As T, ByVal x As Integer, ByVal y As Integer) As T Return Nothing End Function - Function DidNotReceiveWithAnyArgs(Of T As Class)(ByVal substitute As T, ByVal params As Decimal) As T + Function DidNotReceiveWithAnyArgs(Of T)(ByVal substitute As T, ByVal x As Integer, ByVal y As Integer) As T Return Nothing End Function - End Module - Public Class Foo - End Class + Module ReceivedExtensions + + Function Received(Of T)(ByVal substitute As T, ByVal x As Quantity) As T + Return Nothing + End Function + + + Function ReceivedWithAnyArgs(Of T)(ByVal substitute As T, ByVal x As Quantity) As T + Return Nothing + End Function + + + Function DidNotReceive(Of T)(ByVal substitute As T, ByVal x As Quantity) As T + Return Nothing + End Function + + + Function DidNotReceiveWithAnyArgs(Of T)(ByVal substitute As T, ByVal x As Quantity) As T + Return Nothing + End Function + End Module Public Class FooTests Public Sub Test() - Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - substitute.{method}(1D) + Dim substitute As Foo = Nothing + substitute.{method} End Sub End Class End Namespace diff --git a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/UnusedReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/UnusedReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs index 1ffc9878..10e5ebaa 100644 --- a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/UnusedReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs +++ b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/UnusedReceivedAnalyzerTests/ReceivedAsOrdinaryMethodTests.cs @@ -1,28 +1,34 @@ using System.Threading.Tasks; -using Microsoft.CodeAnalysis; -using NSubstitute.Analyzers.Shared; -using NSubstitute.Analyzers.Tests.Shared; -using NSubstitute.Analyzers.Tests.Shared.DiagnosticAnalyzers; using NSubstitute.Analyzers.Tests.Shared.Extensibility; namespace NSubstitute.Analyzers.Tests.VisualBasic.DiagnosticAnalyzersTests.UnusedReceivedAnalyzerTests { [CombinatoryData( - "SubstituteExtensions.Received", - "SubstituteExtensions.Received(Of Foo)", - "SubstituteExtensions.ReceivedWithAnyArgs", - "SubstituteExtensions.ReceivedWithAnyArgs(Of Foo)", - "SubstituteExtensions.DidNotReceive", - "SubstituteExtensions.DidNotReceive(Of Foo)", - "SubstituteExtensions.DidNotReceiveWithAnyArgs", - "SubstituteExtensions.DidNotReceiveWithAnyArgs(Of Foo)")] + "ReceivedExtensions.Received(substitute, Quantity.None())", + "ReceivedExtensions.Received(Of Foo)(substitute, Quantity.None())", + "SubstituteExtensions.Received(substitute)", + "SubstituteExtensions.Received(Of Foo)(substitute)", + "ReceivedExtensions.ReceivedWithAnyArgs(substitute, Quantity.None())", + "ReceivedExtensions.ReceivedWithAnyArgs(Of Foo)(substitute, Quantity.None())", + "SubstituteExtensions.ReceivedWithAnyArgs(substitute)", + "SubstituteExtensions.ReceivedWithAnyArgs(Of Foo)(substitute)", + "SubstituteExtensions.DidNotReceive(substitute)", + "SubstituteExtensions.DidNotReceive(Of Foo)(substitute)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(substitute)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(Of Foo)(substitute)")] public class ReceivedAsOrdinaryMethodTests : UnusedReceivedDiagnosticVerifier { public override async Task ReportDiagnostics_WhenUsedWithoutMemberCall(string method) { - var plainMethodName = method.Replace("(Of Foo)", string.Empty); - var planMethodNameWithoutNamespace = plainMethodName.Replace("SubstituteExtensions.", string.Empty); + var plainMethodName = method.Replace("(Of Foo)", string.Empty) + .Replace("(substitute, Quantity.None())", string.Empty) + .Replace("(substitute)", string.Empty); + + var planMethodNameWithoutNamespace = plainMethodName.Replace("SubstituteExtensions.", string.Empty) + .Replace("ReceivedExtensions.", string.Empty); + var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace Interface Foo @@ -31,7 +37,7 @@ End Interface Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - [|{method}(substitute)|] + [|{method}|] End Sub End Class End Namespace @@ -43,6 +49,7 @@ End Namespace public override async Task ReportNoDiagnostics_WhenUsedWithMethodMemberAccess(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace Public Class FooBar @@ -55,7 +62,7 @@ End Interface Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - {method}(substitute).Bar() + {method}.Bar() End Sub End Class End Namespace @@ -67,6 +74,7 @@ End Namespace public override async Task ReportNoDiagnostics_WhenUsedWithPropertyMemberAccess(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace Interface Foo @@ -76,7 +84,7 @@ End Interface Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - Dim bar = {method}(substitute).Bar + Dim bar = {method}.Bar End Sub End Class End Namespace @@ -88,6 +96,7 @@ End Namespace public override async Task ReportNoDiagnostics_WhenUsedWithIndexerMemberAccess(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Namespace MyNamespace Interface Foo @@ -97,7 +106,7 @@ End Interface Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - Dim bar = {method}(substitute)(0) + Dim bar = {method}(0) End Sub End Class End Namespace @@ -107,17 +116,22 @@ End Namespace } [CombinatoryData( - "SubstituteExtensions.Received", - "SubstituteExtensions.Received(Of Func(Of Integer))", - "SubstituteExtensions.ReceivedWithAnyArgs", - "SubstituteExtensions.ReceivedWithAnyArgs(Of Func(Of Integer))", - "SubstituteExtensions.DidNotReceive", - "SubstituteExtensions.DidNotReceive(Of Func(Of Integer))", - "SubstituteExtensions.DidNotReceiveWithAnyArgs", - "SubstituteExtensions.DidNotReceiveWithAnyArgs(Of Func(Of Integer))")] + "ReceivedExtensions.Received(substitute, Quantity.None())", + "ReceivedExtensions.Received(Of Func(Of Integer))(substitute, Quantity.None())", + "SubstituteExtensions.Received(substitute)", + "SubstituteExtensions.Received(Of Func(Of Integer))(substitute)", + "ReceivedExtensions.ReceivedWithAnyArgs(substitute, Quantity.None())", + "ReceivedExtensions.ReceivedWithAnyArgs(Of Func(Of Integer))(substitute, Quantity.None())", + "SubstituteExtensions.ReceivedWithAnyArgs(substitute)", + "SubstituteExtensions.ReceivedWithAnyArgs(Of Func(Of Integer))(substitute)", + "SubstituteExtensions.DidNotReceive(substitute)", + "SubstituteExtensions.DidNotReceive(Of Func(Of Integer))(substitute)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(substitute)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(Of Func(Of Integer))(substitute)")] public override async Task ReportNoDiagnostics_WhenUsedWithInvokingDelegate(string method) { var source = $@"Imports NSubstitute +Imports NSubstitute.ReceivedExtensions Imports System Namespace MyNamespace @@ -126,7 +140,7 @@ Public Class FooTests Public Sub Test() Dim substitute = NSubstitute.Substitute.[For](Of Func(Of Integer))() - {method}(substitute)() + {method}() End Sub End Class End Namespace @@ -134,42 +148,82 @@ End Namespace await VerifyNoDiagnostic(source); } + [CombinatoryData( + "ReceivedExtensions.Received(substitute, Quantity.None())", + "ReceivedExtensions.Received(Of Foo)(substitute, Quantity.None())", + "SubstituteExtensions.Received(substitute, 1, 1)", + "SubstituteExtensions.Received(Of Foo)(substitute, 1, 1)", + "ReceivedExtensions.ReceivedWithAnyArgs(substitute, Quantity.None())", + "ReceivedExtensions.ReceivedWithAnyArgs(Of Foo)(substitute, Quantity.None())", + "SubstituteExtensions.ReceivedWithAnyArgs(substitute, 1, 1)", + "SubstituteExtensions.ReceivedWithAnyArgs(Of Foo)(substitute, 1, 1)", + "SubstituteExtensions.DidNotReceive(substitute, 1, 1)", + "SubstituteExtensions.DidNotReceive(Of Foo)(substitute, 1, 1)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(substitute, 1, 1)", + "SubstituteExtensions.DidNotReceiveWithAnyArgs(Of Foo)(substitute, 1, 1)")] public override async Task ReportsNoDiagnostics_WhenUsedWithUnfortunatelyNamedMethod(string method) { var source = $@"Imports System Imports System.Runtime.CompilerServices Namespace NSubstitute + Public Class Quantity + Public Shared Function None() As Quantity + Return Nothing + End Function + End Class + + Public Class Foo + End Class + Module SubstituteExtensions - Function Received(Of T As Class)(ByVal substitute As T, ByVal params As Decimal) As T + Function Received(Of T)(ByVal substitute As T, ByVal x As Integer, ByVal y As Integer) As T Return Nothing End Function - Function ReceivedWithAnyArgs(Of T As Class)(ByVal substitute As T, ByVal params As Decimal) As T + Function ReceivedWithAnyArgs(Of T)(ByVal substitute As T, ByVal x As Integer, ByVal y As Integer) As T Return Nothing End Function - Function DidNotReceive(Of T As Class)(ByVal substitute As T, ByVal params As Decimal) As T + Function DidNotReceive(Of T)(ByVal substitute As T, ByVal x As Integer, ByVal y As Integer) As T Return Nothing End Function - Function DidNotReceiveWithAnyArgs(Of T As Class)(ByVal substitute As T, ByVal params As Decimal) As T + Function DidNotReceiveWithAnyArgs(Of T)(ByVal substitute As T, ByVal x As Integer, ByVal y As Integer) As T Return Nothing End Function - End Module - Public Class Foo - End Class + Module ReceivedExtensions + + Function Received(Of T)(ByVal substitute As T, ByVal x As Quantity) As T + Return Nothing + End Function + + + Function ReceivedWithAnyArgs(Of T)(ByVal substitute As T, ByVal x As Quantity) As T + Return Nothing + End Function + + + Function DidNotReceive(Of T)(ByVal substitute As T, ByVal x As Quantity) As T + Return Nothing + End Function + + + Function DidNotReceiveWithAnyArgs(Of T)(ByVal substitute As T, ByVal x As Quantity) As T + Return Nothing + End Function + End Module Public Class FooTests Public Sub Test() - Dim substitute = NSubstitute.Substitute.[For](Of Foo)() - {method}(substitute, 1D) + Dim substitute As Foo = Nothing + {method} End Sub End Class End Namespace