File: Microsoft.NetCore.Analyzers\Performance\UseStringContainsCharOverloadWithSingleCharactersTests.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.Performance.UseStringContainsCharOverloadWithSingleCharactersAnalyzer,
    Microsoft.NetCore.CSharp.Analyzers.Performance.CSharpUseStringContainsCharOverloadWithSingleCharactersFixer>;
using VerifyVB = Test.Utilities.VisualBasicCodeFixVerifier<
    Microsoft.NetCore.Analyzers.Performance.UseStringContainsCharOverloadWithSingleCharactersAnalyzer,
    Microsoft.NetCore.VisualBasic.Analyzers.Performance.BasicUseStringContainsCharOverloadWithSingleCharactersFixer>;
 
namespace Microsoft.NetCore.Analyzers.Performance.UnitTests
{
    public class UseStringContainsCharOverloadWithSingleCharactersTests
    {
        [Fact]
        public async Task CSharp_RegularStringLiteral_FixedAsync()
        {
            var violatingSourceCode = @"using System;
public class TestClass
{
    public bool TestMethod(string input)
    {
        return ""testString"".Contains([|""a""|]);
    }
}";
 
            var fixedSourceCode = @"using System;
public class TestClass
{
    public bool TestMethod(string input)
    {
        return ""testString"".Contains('a');
    }
}";
            await VerifyCSCodeFixWithGivenReferenceAssembliesAsync(violatingSourceCode, ReferenceAssemblies.NetStandard.NetStandard21, fixedSourceCode);
        }
 
        [Fact]
        public async Task CSharp_RegularStringLiteralWithStringComparisonOverload_FixedAsync()
        {
            var violatingSourceCode = @"using System;
public class TestClass
{
    public bool TestMethod(string input)
    {
        return ""testString"".Contains([|""a""|], StringComparison.InvariantCultureIgnoreCase);
    }
}";
 
            var fixedSourceCode = @"using System;
public class TestClass
{
    public bool TestMethod(string input)
    {
        return ""testString"".Contains('a', StringComparison.InvariantCultureIgnoreCase);
    }
}";
            await VerifyCSCodeFixWithGivenReferenceAssembliesAsync(violatingSourceCode, ReferenceAssemblies.NetStandard.NetStandard21, fixedSourceCode);
        }
 
        [Fact]
        public async Task CSharp_RegularStringLiteralWithStringComparisonOverloadAndReorderedNamedArguments_FixedAsync()
        {
            var violatingSourceCode = @"using System;
public class TestClass
{
    public bool TestMethod(string input)
    {
        return ""testString"".Contains(comparisonType: StringComparison.InvariantCultureIgnoreCase, [|value: ""a""|]);
    }
}";
 
            var fixedSourceCode = @"using System;
public class TestClass
{
    public bool TestMethod(string input)
    {
        return ""testString"".Contains(comparisonType: StringComparison.InvariantCultureIgnoreCase, value: 'a');
    }
}";
            await VerifyCSCodeFixWithGivenReferenceAssembliesAsync(violatingSourceCode, ReferenceAssemblies.NetStandard.NetStandard21, fixedSourceCode);
        }
 
        [Fact]
        public async Task CSharp_ConstructedStringLiteral_UnchangedAsync()
        {
            var sourceCode = @"using System;
public class TestClass
{
    public bool TestMethod(string input)
    {
        return ""testString"".Contains(""a""+""samplesuffix"");
    }
}";
            await VerifyCSCodeFixWithGivenReferenceAssembliesAsync(sourceCode, ReferenceAssemblies.NetStandard.NetStandard21, sourceCode);
        }
 
        [Fact]
        public async Task CSharp_ConstructedStringLiteralWithStringComparisonOverload_UnchangedAsync()
        {
            var sourceCode = @"using System;
public class TestClass
{
    public bool TestMethod(string input)
    {
        return ""testString"".Contains(""a""+""samplesuffix"", StringComparison.InvariantCultureIgnoreCase);
    }
}";
            await VerifyCSCodeFixWithGivenReferenceAssembliesAsync(sourceCode, ReferenceAssemblies.NetStandard.NetStandard21, sourceCode);
        }
 
        [Fact]
        public async Task CSharp_SingleCharacterStringVariable_UnchangedAsync()
        {
            var sourceCode = @"using System;
public class TestClass
{
    public bool TestMethod(string input)
    {
        var singleCharacterString = ""a"";
        return ""testString"".Contains(singleCharacterString);
    }
}";
            await VerifyCSCodeFixWithGivenReferenceAssembliesAsync(sourceCode, ReferenceAssemblies.NetStandard.NetStandard21, sourceCode);
        }
 
        [Fact]
        public async Task CSharp_SingleCharacterStringVariableWithStringComparisonOverload_UnchangedAsync()
        {
            var sourceCode = @"using System;
public class TestClass
{
    public bool TestMethod(string input)
    {
        var singleCharacterString = ""a"";
        return ""testString"".Contains(singleCharacterString, StringComparison.InvariantCultureIgnoreCase);
    }
}";
            await VerifyCSCodeFixWithGivenReferenceAssembliesAsync(sourceCode, ReferenceAssemblies.NetStandard.NetStandard21, sourceCode);
        }
 
        [Fact]
        public async Task VB_RegularStringLiteralWithoutAvailableOverload_NoDiagnosticAsync()
        {
            var test = new VerifyVB.Test()
            {
                TestCode = @"Public Class Program
    Public Sub M()
        Dim a = ""testString"".Contains(""a"")
    End Sub
End Class",
                ReferenceAssemblies = ReferenceAssemblies.NetStandard.NetStandard20
            };
 
            await test.RunAsync();
        }
 
        [Fact]
        public async Task VB_RegularStringLiteral_FixedAsync()
        {
            var test = new VerifyVB.Test()
            {
                TestCode = @"Public Class Program
    Public Sub M()
        Dim a = ""testString"".Contains([|""t""|])
    End Sub
End Class",
                ReferenceAssemblies = ReferenceAssemblies.NetStandard.NetStandard21,
                FixedCode = @"Public Class Program
    Public Sub M()
        Dim a = ""testString"".Contains(""t""c)
    End Sub
End Class"
            };
            await test.RunAsync();
        }
 
        [Fact]
        public async Task VB_NamedStringLiteral_FixedAsync()
        {
            var test = new VerifyVB.Test()
            {
                TestCode = @"Public Class Program
    Public Sub M()
        Dim a = ""testString"".Contains([|value:=""t""|])
    End Sub
End Class",
                ReferenceAssemblies = ReferenceAssemblies.NetStandard.NetStandard21,
                FixedCode = @"Public Class Program
    Public Sub M()
        Dim a = ""testString"".Contains(value:=""t""c)
    End Sub
End Class"
            };
            await test.RunAsync();
        }
 
        private static async Task VerifyCSCodeFixWithGivenReferenceAssembliesAsync(string source, ReferenceAssemblies referenceAssemblies, string fixedSource)
        {
            await new VerifyCS.Test()
            {
                TestCode = source,
                ReferenceAssemblies = referenceAssemblies,
                FixedCode = fixedSource
            }.RunAsync();
        }
    }
}