Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UTs: Replace Moq with NSubsitute #9206

Merged
merged 8 commits into from May 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions analyzers/NuGet.Config
Expand Up @@ -26,14 +26,14 @@
<!-- sharwell = author of StyleCop.Analyzers -->
<!-- test dependencies: -->
<!-- meirb = Meir Blachman, author of FluentAssertions.Analyzers -->
<!-- kzu = Daniel Cazzulino, author of Moq -->
<!-- jonorossi = Jonathon Rossi, maintainer of Castle Project -->
<!-- onovotny = Claire Novotny, author of Humanizer.Core -->
<!-- SteveGilham = author of AltCover-->
<!-- jamesnk = author of Newtonsoft.Json -->
<!-- commandlineparser = author of CommandLineParser -->
<!-- grpc-packages = author of Grpc.Tools -->
<owners>protobuf-packages;Microsoft;sharwell;meirb;kzu;dotnetfoundation;castleproject;jonorossi;onovotny;fluentassertions;SteveGilham;jamesnk;commandlineparser;grpc-packages;Fody;</owners>
<!-- Nsubstitute = author of NSubstitute -->
<owners>protobuf-packages;Microsoft;sharwell;meirb;dotnetfoundation;castleproject;jonorossi;onovotny;fluentassertions;SteveGilham;jamesnk;commandlineparser;grpc-packages;Fody;NSubstitute</owners>
</repository>
<author name="SonarSource">
<!-- Subject Name: CN=SonarSource SA, valid from 2023-10-17 -->
Expand Down
18 changes: 9 additions & 9 deletions analyzers/tests/ITs.JsonParser.Test/packages.lock.json
Expand Up @@ -284,19 +284,19 @@
"resolved": "6.0.0",
"contentHash": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A=="
},
"Moq": {
"type": "Transitive",
"resolved": "4.18.4",
"contentHash": "IOo+W51+7Afnb0noltJrKxPBSfsgMzTKCw+Re5AMx8l/vBbAbMDOynLik4+lBYIWDJSO0uV7Zdqt7cNb6RZZ+A==",
"dependencies": {
"Castle.Core": "5.1.1"
}
},
"Newtonsoft.Json": {
"type": "Transitive",
"resolved": "13.0.3",
"contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ=="
},
"NSubstitute": {
"type": "Transitive",
"resolved": "5.1.0",
"contentHash": "ZCqOP3Kpp2ea7QcLyjMU4wzE+0wmrMN35PQMsdPOHYc2IrvjmusG9hICOiqiOTPKN0gJon6wyCn6ZuGHdNs9hQ==",
"dependencies": {
"Castle.Core": "5.1.1"
}
},
"NuGet.Common": {
"type": "Transitive",
"resolved": "6.9.1",
Expand Down Expand Up @@ -585,7 +585,7 @@
"Microsoft.CodeAnalysis.VisualBasic.Workspaces": "[4.9.2, )",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.9.2, )",
"Microsoft.CodeAnalysis.Workspaces.MSBuild": "[4.9.2, )",
"Moq": "[4.18.4, )",
"NSubstitute": "[5.1.0, )",
"NuGet.Protocol": "[6.9.1, )",
"SonarAnalyzer": "[1.0.0, )"
}
Expand Down
Expand Up @@ -272,19 +272,19 @@
"resolved": "6.0.0",
"contentHash": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A=="
},
"Moq": {
"type": "Transitive",
"resolved": "4.18.4",
"contentHash": "IOo+W51+7Afnb0noltJrKxPBSfsgMzTKCw+Re5AMx8l/vBbAbMDOynLik4+lBYIWDJSO0uV7Zdqt7cNb6RZZ+A==",
"dependencies": {
"Castle.Core": "5.1.1"
}
},
"Newtonsoft.Json": {
"type": "Transitive",
"resolved": "13.0.3",
"contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ=="
},
"NSubstitute": {
"type": "Transitive",
"resolved": "5.1.0",
"contentHash": "ZCqOP3Kpp2ea7QcLyjMU4wzE+0wmrMN35PQMsdPOHYc2IrvjmusG9hICOiqiOTPKN0gJon6wyCn6ZuGHdNs9hQ==",
"dependencies": {
"Castle.Core": "5.1.1"
}
},
"NuGet.Common": {
"type": "Transitive",
"resolved": "6.9.1",
Expand Down Expand Up @@ -583,7 +583,7 @@
"Microsoft.CodeAnalysis.VisualBasic.Workspaces": "[4.9.2, )",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.9.2, )",
"Microsoft.CodeAnalysis.Workspaces.MSBuild": "[4.9.2, )",
"Moq": "[4.18.4, )",
"NSubstitute": "[5.1.0, )",
"NuGet.Protocol": "[6.9.1, )",
"SonarAnalyzer": "[1.0.0, )"
}
Expand Down
Expand Up @@ -20,7 +20,7 @@

using System.Text;
using Microsoft.CodeAnalysis.Text;
using Moq;
using NSubstitute;
using CS = SonarAnalyzer.Rules.CSharp;
using VB = SonarAnalyzer.Rules.VisualBasic;

Expand Down Expand Up @@ -103,19 +103,19 @@ public void ShouldAnalyzeTree_GeneratedFile_NoSonarLintXml(string fileName, bool
public void ShouldAnalyzeTree_GeneratedFile_ShouldAnalyzeGeneratedProvider_IsCached()
{
var sonarLintXml = new DummySourceText(AnalysisScaffolding.GenerateSonarLintXmlContent(analyzeGeneratedCode: true));
var additionalText = new Mock<AdditionalText>();
additionalText.Setup(x => x.Path).Returns("SonarLint.xml");
additionalText.Setup(x => x.GetText(default)).Returns(sonarLintXml);
var additionalText = Substitute.For<AdditionalText>();
additionalText.Path.Returns("SonarLint.xml");
additionalText.GetText(default).Returns(sonarLintXml);
var tree = CreateDummyCompilation(AnalyzerLanguage.CSharp, OtherFileName).Tree;
var sut = CreateSut(new AnalyzerOptions(ImmutableArray.Create(additionalText.Object)));
var sut = CreateSut(new AnalyzerOptions(ImmutableArray.Create(additionalText)));

// Call ShouldAnalyzeGenerated multiple times...
sut.ShouldAnalyzeTree(tree, CSharpGeneratedCodeRecognizer.Instance).Should().BeTrue();
sut.ShouldAnalyzeTree(tree, CSharpGeneratedCodeRecognizer.Instance).Should().BeTrue();
sut.ShouldAnalyzeTree(tree, CSharpGeneratedCodeRecognizer.Instance).Should().BeTrue();

// GetText should be called every time ShouldAnalyzeGenerated is called...
additionalText.Verify(x => x.GetText(It.IsAny<CancellationToken>()), Times.Exactly(3));
additionalText.Received(3).GetText(Arg.Any<CancellationToken>());
sonarLintXml.ToStringCallCount.Should().Be(1); // ... but we should only try to read the file once
}

Expand Down
Expand Up @@ -23,7 +23,7 @@

using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Text;
using Moq;
using NSubstitute;
using SonarAnalyzer.AnalysisContext;
using CS = csharp::SonarAnalyzer.Extensions.SonarAnalysisContextExtensions;
using RoslynAnalysisContext = Microsoft.CodeAnalysis.Diagnostics.AnalysisContext;
Expand Down Expand Up @@ -493,12 +493,12 @@ private static int RaiseHere()

private static CompilationStartAnalysisContext MockCompilationStartAnalysisContext(DummyAnalysisContext context)
{
var mock = new Mock<CompilationStartAnalysisContext>(context.Model.Compilation, context.Options, CancellationToken.None);
mock.Setup(x => x.RegisterSyntaxNodeAction(It.IsAny<Action<SyntaxNodeAnalysisContext>>(), It.IsAny<ImmutableArray<SyntaxKind>>()))
.Callback<Action<SyntaxNodeAnalysisContext>, ImmutableArray<SyntaxKind>>((action, _) => action(context.CreateSyntaxNodeAnalysisContext())); // Invoke to call RegisterSyntaxTreeAction
mock.Setup(x => x.RegisterSyntaxTreeAction(It.IsAny<Action<SyntaxTreeAnalysisContext>>()))
.Callback<Action<SyntaxTreeAnalysisContext>>(x => x(new SyntaxTreeAnalysisContext(context.Tree, context.Options, _ => { }, _ => true, default)));
return mock.Object;
var mock = Substitute.For<CompilationStartAnalysisContext>(context.Model.Compilation, context.Options, CancellationToken.None);
mock.When(x => x.RegisterSyntaxNodeAction(Arg.Any<Action<SyntaxNodeAnalysisContext>>(), Arg.Any<ImmutableArray<SyntaxKind>>()))
.Do(x => x.Arg<Action<SyntaxNodeAnalysisContext>>()(context.CreateSyntaxNodeAnalysisContext())); // Invoke to call RegisterSyntaxTreeAction
mock.When(x => x.RegisterSyntaxTreeAction(Arg.Any<Action<SyntaxTreeAnalysisContext>>()))
.Do(x => x.Arg<Action<SyntaxTreeAnalysisContext>>()(new SyntaxTreeAnalysisContext(context.Tree, context.Options, _ => { }, _ => true, default)));
return mock;
}

private sealed class DummyAnalysisContext : RoslynAnalysisContext
Expand Down Expand Up @@ -592,20 +592,19 @@ public void AssertExpectedInvocationCounts(int expectedCompilationEndCount = 0,
public override void RegisterCompilationEndAction(Action<CompilationAnalysisContext> action)
{
compilationEndCount++;
action(new CompilationAnalysisContext(context.Model.Compilation, context.Options, reportDiagnostic: x => RaisedDiagnostic = x, isSupportedDiagnostic: _ => true, CancellationToken.None));
action(new CompilationAnalysisContext(context.Model.Compilation, context.Options, reportDiagnostic: x => RaisedDiagnostic = x, isSupportedDiagnostic: _ => true, default));
}

public override void RegisterSemanticModelAction(Action<SemanticModelAnalysisContext> action)
{
semanticModelCount++;
action(new SemanticModelAnalysisContext(context.Model, context.Options, reportDiagnostic: x => RaisedDiagnostic = x, isSupportedDiagnostic: _ => true, CancellationToken.None));
action(new SemanticModelAnalysisContext(context.Model, context.Options, reportDiagnostic: x => RaisedDiagnostic = x, isSupportedDiagnostic: _ => true, default));
}

public override void RegisterSymbolAction(Action<SymbolAnalysisContext> action, ImmutableArray<SymbolKind> symbolKinds)
{
symbolCount++;
action(new SymbolAnalysisContext(Mock.Of<ISymbol>(), context.Model.Compilation, context.Options,
reportDiagnostic: x => RaisedDiagnostic = x, isSupportedDiagnostic: _ => true, CancellationToken.None));
action(new SymbolAnalysisContext(Substitute.For<ISymbol>(), context.Model.Compilation, context.Options, x => RaisedDiagnostic = x, _ => true, default));
}

public override void RegisterSyntaxNodeAction<TLanguageKindEnum>(Action<SyntaxNodeAnalysisContext> action, ImmutableArray<TLanguageKindEnum> syntaxKinds) =>
Expand All @@ -616,8 +615,8 @@ public override void RegisterSymbolAction(Action<SymbolAnalysisContext> action,

public override void RegisterSymbolStartAction(Action<SymbolStartAnalysisContext> action, SymbolKind symbolKind)
{
var symbolStartAnalysisContext = new Mock<SymbolStartAnalysisContext>(Mock.Of<ISymbol>(), context.Model.Compilation, context.Options, CancellationToken.None);
action(symbolStartAnalysisContext.Object);
var symbolStartAnalysisContext = Substitute.For<SymbolStartAnalysisContext>(Substitute.For<ISymbol>(), context.Model.Compilation, context.Options, default);
action(symbolStartAnalysisContext);
}
}

Expand Down
Expand Up @@ -19,7 +19,7 @@
*/

using System.IO;
using Moq;
using NSubstitute;
using SonarAnalyzer.AnalysisContext;
using SonarAnalyzer.Rules.CSharp;
using SonarAnalyzer.Test.Rules;
Expand Down Expand Up @@ -275,10 +275,15 @@ public void ReportDiagnosticIfNonGenerated_UnchangedFiles_CompilationAnalysisCon
var context = new DummyAnalysisContext(TestContext, unchangedFileName);
var wasReported = false;
var location = context.Tree.GetRoot().GetLocation();
var symbol = Mock.Of<ISymbol>(x => x.Locations == ImmutableArray.Create(location));
var symbol = Substitute.For<ISymbol>();
symbol.Locations.Returns([location]);
var symbolContext = new SymbolAnalysisContext(symbol, context.Model.Compilation, context.Options, _ => wasReported = true, _ => true, default);
var sut = new SonarSymbolReportingContext(new SonarAnalysisContext(context, DummyMainDescriptor), symbolContext);
sut.ReportIssue(CSharpGeneratedCodeRecognizer.Instance, Mock.Of<Diagnostic>(x => x.Id == "Sxxx" && x.Location == location && x.Descriptor == DummyMainDescriptor[0]));
var diagnostic = Substitute.For<Diagnostic>();
diagnostic.Id.Returns("Sxxx");
diagnostic.Location.Returns(location);
diagnostic.Descriptor.Returns(DummyMainDescriptor[0]);
sut.ReportIssue(CSharpGeneratedCodeRecognizer.Instance, diagnostic);

wasReported.Should().Be(expected);
}
Expand Down
Expand Up @@ -19,7 +19,7 @@
*/

using Microsoft.CodeAnalysis.CSharp;
using Moq;
using NSubstitute;
using SonarAnalyzer.AnalysisContext;

namespace SonarAnalyzer.Test.AnalysisContext;
Expand All @@ -32,8 +32,8 @@ public void Properties_ArePropagated()
{
var cancel = new CancellationToken(true);
var codeBlock = SyntaxFactory.Block();
var owningSymbol = Mock.Of<ISymbol>();
var model = Mock.Of<SemanticModel>();
var owningSymbol = Substitute.For<ISymbol>();
var model = Substitute.For<SemanticModel>();
var options = AnalysisScaffolding.CreateOptions();
var context = new CodeBlockAnalysisContext(codeBlock, owningSymbol, model, options, _ => { }, _ => true, cancel);
var sut = new SonarCodeBlockReportingContext(AnalysisScaffolding.CreateSonarAnalysisContext(), context);
Expand Down
Expand Up @@ -19,7 +19,7 @@
*/

using Microsoft.CodeAnalysis.CSharp;
using Moq;
using NSubstitute;
using SonarAnalyzer.AnalysisContext;

namespace SonarAnalyzer.Test.AnalysisContext;
Expand All @@ -32,10 +32,10 @@ public void Properties_ArePropagated()
{
var cancel = new CancellationToken(true);
var codeBlock = SyntaxFactory.Block();
var owningSymbol = Mock.Of<ISymbol>();
var model = Mock.Of<SemanticModel>();
var owningSymbol = Substitute.For<ISymbol>();
var model = Substitute.For<SemanticModel>();
var options = AnalysisScaffolding.CreateOptions();
var context = new Mock<CodeBlockStartAnalysisContext<SyntaxKind>>(codeBlock, owningSymbol, model, options, cancel).Object;
var context = Substitute.For<CodeBlockStartAnalysisContext<SyntaxKind>>(codeBlock, owningSymbol, model, options, cancel);
var sut = new SonarCodeBlockStartAnalysisContext<SyntaxKind>(AnalysisScaffolding.CreateSonarAnalysisContext(), context);

sut.Compilation.Should().BeSameAs(model.Compilation);
Expand Down
Expand Up @@ -18,7 +18,7 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

using Moq;
using NSubstitute;
using SonarAnalyzer.AnalysisContext;

namespace SonarAnalyzer.Test.AnalysisContext;
Expand All @@ -32,7 +32,7 @@ public void Properties_ArePropagated()
var cancel = new CancellationToken(true);
var compilation = TestHelper.CompileCS("// Nothing to see here").Model.Compilation;
var options = AnalysisScaffolding.CreateOptions();
var context = new Mock<CompilationStartAnalysisContext>(compilation, options, cancel).Object;
var context = Substitute.For<CompilationStartAnalysisContext>(compilation, options, cancel);
var sut = new SonarCompilationStartAnalysisContext(AnalysisScaffolding.CreateSonarAnalysisContext(), context);

sut.Compilation.Should().BeSameAs(compilation);
Expand Down
Expand Up @@ -19,7 +19,7 @@
*/

using Microsoft.CodeAnalysis.CSharp;
using Moq;
using NSubstitute;
using SonarAnalyzer.AnalysisContext;
using StyleCop.Analyzers.Lightup;

Expand All @@ -35,7 +35,7 @@ public void Properties_ArePropagated()
var (tree, model) = TestHelper.CompileCS("// Nothing to see here");
var node = tree.GetRoot();
var options = AnalysisScaffolding.CreateOptions();
var containingSymbol = Mock.Of<ISymbol>();
var containingSymbol = Substitute.For<ISymbol>();
var context = new SyntaxNodeAnalysisContext(node, containingSymbol, model, options, _ => { }, _ => true, cancel);
var sut = new SonarSyntaxNodeReportingContext(AnalysisScaffolding.CreateSonarAnalysisContext(), context);

Expand Down