File: InlayHint\AbstractInlayHintTests.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.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Text;
using Roslyn.Test.Utilities;
using Xunit;
using Xunit.Abstractions;
using LSP = Roslyn.LanguageServer.Protocol;
 
namespace Microsoft.CodeAnalysis.LanguageServer.UnitTests.InlayHint;
 
public abstract class AbstractInlayHintTests : AbstractLanguageServerProtocolTests
{
    protected AbstractInlayHintTests(ITestOutputHelper? testOutputHelper) : base(testOutputHelper)
    {
    }
 
    private protected static async Task VerifyInlayHintAsync(TestLspServer testLspServer, bool hasTextEdits = true)
    {
        var expectedInlayHints = await GetAnnotatedLocationsAsync(testLspServer.TestWorkspace, testLspServer.GetCurrentSolution());
        var document = testLspServer.GetCurrentSolution().Projects.Single().Documents.Single();
        var textDocumentIdentifier = CreateTextDocumentIdentifier(document.GetURI());
        var text = await document.GetTextAsync(CancellationToken.None);
        var span = TextSpan.FromBounds(0, text.Length);
 
        var inlayHintParams = new LSP.InlayHintParams
        {
            TextDocument = textDocumentIdentifier,
            Range = ProtocolConversions.TextSpanToRange(span, text)
        };
 
        var actualInlayHints = await testLspServer.ExecuteRequestAsync<LSP.InlayHintParams, LSP.InlayHint[]?>(LSP.Methods.TextDocumentInlayHintName, inlayHintParams, CancellationToken.None);
        AssertEx.NotNull(actualInlayHints);
 
        foreach (var kvp in expectedInlayHints)
        {
            var name = kvp.Key;
            var locations = kvp.Value;
 
            foreach (var location in locations)
            {
                var matchingInlayHints = actualInlayHints.Where(actualInlayHints => actualInlayHints.Position == location.Range.Start);
                Assert.Single(matchingInlayHints);
 
                var matchingInlayHint = matchingInlayHints.Single();
                AssertEx.Equal(name, matchingInlayHint.Label.First.TrimEnd(':'));
 
                AssertEx.NotNull(matchingInlayHint.Kind);
                Assert.True(matchingInlayHint.PaddingRight);
                Assert.False(matchingInlayHint.PaddingLeft);
                if (hasTextEdits)
                {
                    AssertEx.NotNull(matchingInlayHint.TextEdits);
                }
 
                var resolvedInlayHint = await testLspServer.ExecuteRequestAsync<LSP.InlayHint, LSP.InlayHint>(LSP.Methods.InlayHintResolveName, matchingInlayHint, CancellationToken.None);
                AssertEx.NotNull(resolvedInlayHint?.ToolTip);
            }
        }
    }
}