File: Microsoft.NetCore.Analyzers\Runtime\PreferConstCharOverConstUnitStringTests.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 Xunit;
using VerifyCS = Test.Utilities.CSharpCodeFixVerifier<
    Microsoft.NetCore.Analyzers.Runtime.PreferConstCharOverConstUnitStringAnalyzer,
    Microsoft.NetCore.Analyzers.Runtime.PreferConstCharOverConstUnitStringFixer>;
using VerifyVB = Test.Utilities.VisualBasicCodeFixVerifier<
    Microsoft.NetCore.Analyzers.Runtime.PreferConstCharOverConstUnitStringAnalyzer,
    Microsoft.NetCore.Analyzers.Runtime.PreferConstCharOverConstUnitStringFixer>;
 
namespace Microsoft.NetCore.Analyzers.Runtime.UnitTests
{
    public class PreferConstCharOverConstUnitStringForStringBuilderAppendTests
    {
        [Fact]
        public async Task TestRegularCaseAsync()
        {
            string csInput = @" 
using System; 
using System.Text;
 
namespace TestNamespace 
{ 
    class TestClass 
    { 
        private void TestMethod() 
        { 
            StringBuilder sb = new StringBuilder();
            const string ch = ""a"";
            sb.Append([|ch|]);
        } 
    } 
}";
            string csFix = @" 
using System; 
using System.Text;
 
namespace TestNamespace 
{ 
    class TestClass 
    { 
        private void TestMethod() 
        { 
            StringBuilder sb = new StringBuilder();
            const char ch = 'a';
            sb.Append(ch);
        } 
    } 
}";
 
            await VerifyCS.VerifyCodeFixAsync(csInput, csFix);
 
            string vbInput = @" 
Imports System
 
Module Program
    Sub Main(args As String())
        Const aa As String = ""a""
        Dim builder As New System.Text.StringBuilder
        builder.Append([|aa|])
 
    End Sub
End Module
";
 
            string vbFix = @" 
Imports System
 
Module Program
    Sub Main(args As String())
        Const aa As Char = ""a""c
        Dim builder As New System.Text.StringBuilder
        builder.Append(aa)
 
    End Sub
End Module
";
 
            await VerifyVB.VerifyCodeFixAsync(vbInput, vbFix);
        }
 
        [Fact]
        public async Task TestMultipleDeclarationsAsync()
        {
            const string multipleDeclarations_cs = @" 
using System; 
using System.Text;
 
namespace TestNamespace 
{ 
    class TestClass 
    { 
        private void TestMethod() 
        { 
            StringBuilder sb = new StringBuilder();
            const string ch = ""a"", bb = ""b"";
            sb.Append([|ch|]);
        } 
    } 
}";
            await VerifyCS.VerifyCodeFixAsync(multipleDeclarations_cs, multipleDeclarations_cs);
            const string multipleDeclarations_vb = @" 
Imports System
 
Module Program
    Class TestClass
        Public Sub Main(args As String())
            Const aa As String = ""a"", bb As String = ""b""
            Dim builder As New System.Text.StringBuilder
            builder.Append([|aa|])
        End Sub
    End Class
End Module
";
            await VerifyVB.VerifyCodeFixAsync(multipleDeclarations_vb, multipleDeclarations_vb);
        }
 
        [Fact]
        public async Task TestClassFieldAsync()
        {
            const string classFieldInAppend_cs = @"
using System;
using System.Text;
 
namespace RosylnScratch
{
    public class Program
    {
        public const string SS = ""a"";
 
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append([|SS|]);
        }
    }
}";
            await VerifyCS.VerifyCodeFixAsync(classFieldInAppend_cs, classFieldInAppend_cs);
            const string classFieldInAppend_vb = @"
Imports System
 
Module Program
    Class TestClass
        Public Const str As String = ""a""
        Public Sub Main(args As String())
            Dim builder As New System.Text.StringBuilder
            builder.Append([|str|])
        End Sub
    End Class
End Module
";
            await VerifyVB.VerifyCodeFixAsync(classFieldInAppend_vb, classFieldInAppend_vb);
        }
 
        [Fact]
        public async Task TestNullInitializerAsync()
        {
            const string nullInitializer_cs = @" 
using System; 
using System.Text;
 
namespace TestNamespace 
{ 
    class TestClass 
    { 
        private void TestMethod() 
        { 
            StringBuilder sb = new StringBuilder();
            const string ch = null;
            sb.Append(ch);
        } 
    } 
}";
            await VerifyCS.VerifyAnalyzerAsync(nullInitializer_cs);
            const string nullInitializer_vb = @"
Imports System
 
Module Program
    Class TestClass
        Public Sub Main(args As String())
            Const ch As String = Nothing
            Dim builder As New System.Text.StringBuilder
            builder.Append(ch)
        End Sub
    End Class
End Module
";
            await VerifyVB.VerifyAnalyzerAsync(nullInitializer_vb);
        }
 
        [Fact]
        public async Task TestNonUnitStringAsync()
        {
            const string nonUnitString_cs = @" 
using System; 
using System.Text;
 
namespace TestNamespace 
{ 
    class TestClass 
    { 
        private void TestMethod() 
        { 
            StringBuilder sb = new StringBuilder();
            const string ch = ""ab"";
            sb.Append(ch);
        } 
    } 
}";
            await VerifyCS.VerifyAnalyzerAsync(nonUnitString_cs);
            const string nonUnitString_vb = @"
Imports System
 
Module Program
    Class TestClass
        Public Sub Main(args As String())
            Const ch As String = ""ab""
            Dim builder As New System.Text.StringBuilder
            builder.Append(ch)
        End Sub
    End Class
End Module
";
            await VerifyVB.VerifyAnalyzerAsync(nonUnitString_vb);
        }
 
        [Fact]
        public async Task TestNoCallToStringAppendAsync()
        {
            const string noCallToStringAppend_cs = @" 
using System; 
using System.Text;
 
namespace TestNamespace 
{ 
    class TestClass 
    { 
        private void TestMethod() 
        { 
            StringBuilder sb = new StringBuilder();
            const string ch = ""a"";
        } 
    } 
}";
            await VerifyCS.VerifyAnalyzerAsync(noCallToStringAppend_cs);
 
            const string noCallToStringAppend_vb = @"
Imports System
 
Module Program
    Class TestClass
        Public Sub Main(args As String())
            Const ch As String = ""a""
            Dim builder As New System.Text.StringBuilder
        End Sub
    End Class
End Module
";
            await VerifyVB.VerifyAnalyzerAsync(noCallToStringAppend_vb);
        }
 
        [Fact]
        public async Task TestNonConstUnitStringAsync()
        {
            const string nonConstUnitString_cs = @" 
using System; 
using System.Text;
 
namespace TestNamespace 
{ 
    class TestClass 
    { 
        private void TestMethod() 
        { 
            StringBuilder sb = new StringBuilder();
            string ch = ""ab"";
            sb.Append(ch);
        } 
    } 
}";
            await VerifyCS.VerifyAnalyzerAsync(nonConstUnitString_cs);
 
            const string nonConstUnitString_vb = @"
Imports System
 
Module Program
    Class TestClass
        Public Sub Main(args As String())
            Dim ch As String = ""a""
            Dim builder As New System.Text.StringBuilder
            builder.Append(ch)
        End Sub
    End Class
End Module
";
            await VerifyVB.VerifyAnalyzerAsync(nonConstUnitString_vb);
        }
 
        [Fact]
        public async Task TestAppendLiteralWithFixAsync()
        {
            const string appendLiteralInput_cs = @" 
using System; 
using System.Text;
 
namespace TestNamespace 
{ 
    class TestClass 
    { 
        private void TestMethod() 
        { 
            StringBuilder sb = new StringBuilder();
            sb.Append([|"",""|]);
        } 
    } 
}";
            const string appendLiteralFix_cs = @" 
using System; 
using System.Text;
 
namespace TestNamespace 
{ 
    class TestClass 
    { 
        private void TestMethod() 
        { 
            StringBuilder sb = new StringBuilder();
            sb.Append(',');
        } 
    } 
}";
            await VerifyCS.VerifyCodeFixAsync(appendLiteralInput_cs, appendLiteralFix_cs);
 
            const string appendLiteralInput_vb = @"
Imports System
 
Module Program
    Class TestClass
        Public Sub Main(args As String())
            Dim builder As New System.Text.StringBuilder
            builder.Append([|"",""|])
        End Sub
    End Class
End Module
";
 
            const string appendLiteralFix_vb = @"
Imports System
 
Module Program
    Class TestClass
        Public Sub Main(args As String())
            Dim builder As New System.Text.StringBuilder
            builder.Append("",""c)
        End Sub
    End Class
End Module
";
            await VerifyVB.VerifyCodeFixAsync(appendLiteralInput_vb, appendLiteralFix_vb);
        }
 
        [Fact]
        public async Task TestMethodCallInAppendAsync()
        {
            const string methodCallInAppend_cs = @" 
using System; 
using System.Text;
 
namespace TestNamespace 
{ 
    class TestClass 
    { 
        private string AString() => ""A"";
 
        private void TestMethod() 
        { 
            StringBuilder sb = new StringBuilder();
            sb.Append(AString());
        } 
    } 
}";
            await VerifyCS.VerifyAnalyzerAsync(methodCallInAppend_cs);
 
            const string methodCallInAppend_vb = @"
Imports System
 
Module Program
    Class TestClass
        Public Function AString() As String
            Return ""A""
        End Function
 
        Public Sub Main(args As String())
            Dim builder As New System.Text.StringBuilder
            builder.Append(AString())
        End Sub
    End Class
End Module
";
            await VerifyVB.VerifyAnalyzerAsync(methodCallInAppend_vb);
        }
 
        [Fact]
        public async Task TestMethodParameterInAppendAsync()
        {
            const string methodParameterInAppend = @"
using System; 
using System.Text;
 
namespace TestNamespace 
{ 
    class TestClass 
    { 
        private void TestMethod(int value) 
        { 
            StringBuilder sb = new StringBuilder();
            sb.Append(value.ToString());
        } 
    } 
}";
            await VerifyCS.VerifyAnalyzerAsync(methodParameterInAppend);
 
            const string methodParameterInAppend_vb = @"
Imports System
 
Module Program
    Class TestClass
        Public Sub Main(arg As Int32)
            Dim builder As New System.Text.StringBuilder
            builder.Append(arg)
        End Sub
    End Class
End Module
";
            await VerifyVB.VerifyAnalyzerAsync(methodParameterInAppend_vb);
        }
 
        [Theory]
        [InlineData("ab")]
        [InlineData("(string)null")]
        public async Task TestAppendLiteralAsync(string input)
        {
            string quotes = input == "(string)null" ? "" : "\"";
            string methodParameterInAppend = @"
using System; 
using System.Text;
 
namespace TestNamespace 
{ 
    class TestClass 
    { 
        private void TestMethod(int value) 
        { 
            StringBuilder sb = new StringBuilder();
            sb.Append(" + quotes + input + quotes + @");
        } 
    } 
}";
            await VerifyCS.VerifyAnalyzerAsync(methodParameterInAppend);
 
            if (input == "(string)null")
            {
                input = "CType(Nothing, String)";
            }
 
            string methodParameterInAppend_vb = @"
Imports System
 
Module Program
    Class TestClass
        Public Sub Main(arg As Int32)
            Dim builder As New System.Text.StringBuilder
            builder.Append(" + quotes + input + quotes + @")
        End Sub
    End Class
End Module
";
            await VerifyVB.VerifyAnalyzerAsync(methodParameterInAppend_vb);
        }
 
        [Fact]
        public async Task TestInterpolatedStringAsync()
        {
            const string interpolatedString_cs = @"
using System; 
using System.Text;
 
namespace TestNamespace 
{ 
    class TestClass 
    { 
        private void TestMethod(int value) 
        { 
            StringBuilder sb = new StringBuilder();
            const string ch = ""a"";
            sb.Append([|$""{ch}""|]);
        } 
    } 
}";
 
            await VerifyCS.VerifyCodeFixAsync(interpolatedString_cs, interpolatedString_cs);
            const string interpolatedString_vb = @"
Imports System
 
Module Program
    Class TestClass
        Public Sub Main(args As String())
            Const ch As String = ""a""
            Dim builder As New System.Text.StringBuilder
            builder.Append($""{ch}"")
        End Sub
    End Class
End Module
";
            await VerifyVB.VerifyAnalyzerAsync(interpolatedString_vb);
        }
    }
}