File: Microsoft.NetCore.Analyzers\InteropServices\AvoidStringBuilderPInvokeParametersTests.cs
Web Access
Project: ..\..\..\src\Microsoft.CodeAnalysis.NetAnalyzers\tests\Microsoft.CodeAnalysis.NetAnalyzers.UnitTests\Microsoft.CodeAnalysis.NetAnalyzers.UnitTests.csproj (Microsoft.CodeAnalysis.NetAnalyzers.UnitTests)
// Copyright (c) Microsoft.  All Rights Reserved.  Licensed under the MIT license.  See License.txt in the project root for license information.
 
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Testing;
using Xunit;
using VerifyCS = Test.Utilities.CSharpCodeFixVerifier<
    Microsoft.NetCore.Analyzers.InteropServices.AvoidStringBuilderPInvokeParametersAnalyzer,
    Microsoft.CodeAnalysis.Testing.EmptyCodeFixProvider>;
using VerifyVB = Test.Utilities.VisualBasicCodeFixVerifier<
    Microsoft.NetCore.Analyzers.InteropServices.AvoidStringBuilderPInvokeParametersAnalyzer,
    Microsoft.CodeAnalysis.Testing.EmptyCodeFixProvider>;
 
namespace Microsoft.NetCore.Analyzers.InteropServices.UnitTests
{
    public class AvoidStringBuilderPInvokeParametersTests
    {
        [Fact]
        public async Task NotPInvoke_NoDiagnostics_CSAsync()
        {
            string source = @"
using System.Runtime.InteropServices;
using System.Text;
 
public class C
{
    private static extern void Method(StringBuilder sb);
}
";
            await VerifyCS.VerifyAnalyzerAsync(source);
        }
 
        [Fact]
        public async Task StringBuilderParameter_Diagnostics_CSAsync()
        {
            string source = @"
using System.Runtime.InteropServices;
using System.Text;
 
public class C
{
    [DllImport(""native.dll"")]
    private static extern void Method1(StringBuilder {|#0:sb|});
 
    [DllImport(""native.dll"")]
    private static extern void Method2(StringBuilder {|#1:sb1|}, StringBuilder {|#2:sb2|});
}
";
            await VerifyCS.VerifyAnalyzerAsync(
                source,
                CSharpResult(0, "sb"),
                CSharpResult(1, "sb1"),
                CSharpResult(2, "sb2"));
        }
 
        [Fact]
        public async Task NotPInvoke_NoDiagnostics_VBAsync()
        {
            string source = @"
Imports System.Runtime.InteropServices
Imports System.Text
 
Class C
    Private Shared Sub Method1(sb As StringBuilder)
    End Sub
End Class
";
            await VerifyVB.VerifyAnalyzerAsync(source);
        }
 
        [Fact]
        public async Task StringBuilderParameter_Diagnostics_VBAsync()
        {
            string source = @"
Imports System.Runtime.InteropServices
Imports System.Text
 
Class C
    <DllImport(""native.dll"")>
    Private Shared Sub Method1({|#0:sb|} As StringBuilder)
    End Sub
 
    <DllImport(""native.dll"")>
    Private Shared Sub Method2({|#1:sb1|} As StringBuilder, {|#2:sb2|} As StringBuilder)
    End Sub
End Class
";
            await VerifyVB.VerifyAnalyzerAsync(
                source,
                BasicResult(0, "sb"),
                BasicResult(1, "sb1"),
                BasicResult(2, "sb2"));
        }
 
        private DiagnosticResult CSharpResult(int markupKey, params string[] arguments)
           => VerifyCS.Diagnostic(AvoidStringBuilderPInvokeParametersAnalyzer.Rule)
                .WithLocation(markupKey)
                .WithArguments(arguments);
 
        private DiagnosticResult BasicResult(int markupKey, params string[] arguments)
            => VerifyVB.Diagnostic(AvoidStringBuilderPInvokeParametersAnalyzer.Rule)
                .WithLocation(markupKey)
                .WithArguments(arguments);
    }
}