File: OnAutoInsert\RawStringOnAutoInsertTests.cs
Web Access
Project: src\src\LanguageServer\ProtocolUnitTests\Microsoft.CodeAnalysis.LanguageServer.Protocol.UnitTests.csproj (Microsoft.CodeAnalysis.LanguageServer.Protocol.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Threading.Tasks;
using Roslyn.LanguageServer.Protocol;
using Roslyn.Test.Utilities;
using Xunit;
using Xunit.Abstractions;
 
namespace Microsoft.CodeAnalysis.LanguageServer.UnitTests.OnAutoInsert;
 
public sealed class RawStringOnAutoInsertTests(ITestOutputHelper testOutputHelper) : AbstractOnAutoInsertTests(testOutputHelper)
{
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_GenerateInitialEmpty(bool mutatingLspWorkspace)
        => VerifyCSharpMarkupAndExpectedRawString("\"",
            """"
            var v = """{|type:|}
            """",
            """"
            var v = """$0"""
            """", mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_GenerateInitialEmpty_Interpolated(bool mutatingLspWorkspace)
        => VerifyCSharpMarkupAndExpectedRawString("\"",
            """"
            var v = $"""{|type:|}
            """",
            """"
            var v = $"""$0"""
            """", mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_GrowInitialEmpty(bool mutatingLspWorkspace)
        => VerifyCSharpMarkupAndExpectedRawString("\"",
            """""
            var v = """"{|type:|}"""
            """"",
            """""
            var v = """"$0""""
            """"", mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_GrowWithText(bool mutatingLspWorkspace)
        => VerifyCSharpMarkupAndExpectedRawString("\"",
            """""
            var v = """"{|type:|} test """
            """"",
            """""
            var v = """" test """"
            """"", mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_NoGrowForTwoStart(bool mutatingLspWorkspace)
        => VerifyNoResult("\"",
            """"
            var v = """{|type:|}"""
            """", mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_NoGrowForVerbatim(bool mutatingLspWorkspace)
        => VerifyNoResult("\"",
            """
            var v = @""${|type:|}
            """, mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_GenerateAtEndOfFile(bool mutatingLspWorkspace)
        => VerifyCSharpMarkupAndExpectedRawString("\"",
            """"var v = """{|type:|}"""",
            """"
            var v = """$0"""
            """", mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_GenerateWithSemicolonAfter(bool mutatingLspWorkspace)
        => VerifyCSharpMarkupAndExpectedRawString("\"",
            """"var v = """{|type:|};"""",
            """"var v = """$0""";"""", mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_GenerateWithInterpolatedString_TwoDollarSigns(bool mutatingLspWorkspace)
        => VerifyCSharpMarkupAndExpectedRawString("\"",
            """"var v = $$"""{|type:|}"""",
            """"
            var v = $$"""$0"""
            """", mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_GenerateWithInterpolatedString_ThreeDollarSigns(bool mutatingLspWorkspace)
        => VerifyCSharpMarkupAndExpectedRawString("\"",
            """"var v = $$$"""{|type:|}"""",
            """"
            var v = $$$"""$0"""
            """", mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_NoGenerateWithVerbatimString(bool mutatingLspWorkspace)
        => VerifyNoResult("\"",
            """var v = @""{|type:|}""", mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_NoGenerateWithVerbatimInterpolatedString1(bool mutatingLspWorkspace)
        => VerifyNoResult("\"",
            """var v = @$""{|type:|}""", mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_NoGenerateWithVerbatimInterpolatedString2(bool mutatingLspWorkspace)
        => VerifyNoResult("\"",
            """var v = $@""{|type:|}""", mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_DoNotGrowEmptyInsideSimpleString(bool mutatingLspWorkspace)
        => VerifyNoResult("\"",
            """
            var v = ""{|type:|}"
            """, mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_DoNotGrowEmptyInsideFourQuotes(bool mutatingLspWorkspace)
        => VerifyNoResult("\"",
            """"
            var v = """{|type:|}""
            """", mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_GrowEmptyInsideSixQuotesInInterpolatedRaw(bool mutatingLspWorkspace)
        => VerifyCSharpMarkupAndExpectedRawString("\"",
            """""
            var v = $""""{|type:|}"""
            """"",
            """""
            var v = $""""$0""""
            """"", mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_DoNotGrowEmptyInsideSixQuotesWhenNotInMiddle(bool mutatingLspWorkspace)
        => VerifyNoResult("\"",
            """""
            var v = $"""{|type:|}""""
            """"", mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_GrowDelimitersWhenEndExists_SingleLine(bool mutatingLspWorkspace)
        => VerifyCSharpMarkupAndExpectedRawString("\"",
            """""
            var v = """"{|type:|} """
            """"",
            """""
            var v = """" """"
            """"", mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_GrowDelimitersWhenEndExists_MultiLine(bool mutatingLspWorkspace)
        => VerifyCSharpMarkupAndExpectedRawString("\"",
            """""
            var v = """"{|type:|}
 
                """
            """"",
            """""
            var v = """"
 
                """"
            """"", mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_GrowDelimitersWhenEndExists_Interpolated(bool mutatingLspWorkspace)
        => VerifyCSharpMarkupAndExpectedRawString("\"",
            """""
            var v = $""""{|type:|}
 
                """
            """"",
            """""
            var v = $""""
 
                """"
            """"", mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_DoNotGrowDelimitersWhenEndNotThere(bool mutatingLspWorkspace)
        => VerifyNoResult("\"",
            """""
            var v = """"{|type:|}
            """"", mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_DoNotGrowDelimitersWhenEndTooShort(bool mutatingLspWorkspace)
        => VerifyNoResult("\"",
            """""
            var v = """"{|type:|}
 
                ""
            """"", mutatingLspWorkspace);
 
    [Theory, CombinatorialData]
    public Task OnAutoInsert_RawString_TypeQuoteEmptyFile(bool mutatingLspWorkspace)
        => VerifyNoResult("\"",
            """
            "{|type:|}
            """, mutatingLspWorkspace);
 
    private async Task VerifyCSharpMarkupAndExpectedRawString(
        string characterTyped,
        [StringSyntax(PredefinedEmbeddedLanguageNames.CSharpTest)] string markup,
        [StringSyntax(PredefinedEmbeddedLanguageNames.CSharpTest)] string expected,
        bool mutatingLspWorkspace)
    {
        await using var testLspServer = await CreateTestLspServerAsync(markup, mutatingLspWorkspace);
        var locationTyped = testLspServer.GetLocations("type").Single();
 
        var document = await testLspServer.GetDocumentAsync(locationTyped.DocumentUri);
        var documentText = await document.GetTextAsync();
 
        var result = await RunOnAutoInsertAsync(testLspServer, characterTyped, locationTyped, insertSpaces: true, tabSize: 4);
 
        AssertEx.NotNull(result);
        var actualText = ApplyTextEdits([result.TextEdit], documentText);
 
        var expectedCaret = expected.IndexOf("$0");
        if (expectedCaret >= 0)
        {
            Assert.Equal(InsertTextFormat.Snippet, result.TextEditFormat);
        }
        else
        {
            Assert.Equal(InsertTextFormat.Plaintext, result.TextEditFormat);
        }
 
        MarkupTestFile.GetPositionAndSpans(expected, out var massaged, out int? caretPosition, out var spans);
 
        Assert.Equal(massaged, actualText);
    }
}