File: GoToAdjacentMember\AbstractGoToAdjacentMemberTests.cs
Web Access
Project: src\src\EditorFeatures\TestUtilities\Microsoft.CodeAnalysis.EditorFeatures.Test.Utilities.csproj (Microsoft.CodeAnalysis.EditorFeatures.Test.Utilities)
// 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.
 
#nullable disable
 
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.LanguageService;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Test.Utilities;
using Roslyn.Utilities;
using Xunit;
 
namespace Microsoft.CodeAnalysis.Editor.UnitTests.GoToAdjacentMember
{
    [UseExportProvider]
    public abstract class AbstractGoToAdjacentMemberTests
    {
        protected abstract string LanguageName { get; }
        protected abstract ParseOptions DefaultParseOptions { get; }
 
        protected async Task AssertNavigatedAsync(string code, bool next, SourceCodeKind? sourceCodeKind = null)
        {
            var kinds = sourceCodeKind != null
                ? SpecializedCollections.SingletonEnumerable(sourceCodeKind.Value)
                : [SourceCodeKind.Regular, SourceCodeKind.Script];
 
            foreach (var kind in kinds)
            {
                using var workspace = TestWorkspace.Create(
                    LanguageName,
                    compilationOptions: null,
                    parseOptions: DefaultParseOptions.WithKind(kind),
                    content: code);
                var hostDocument = workspace.DocumentWithCursor;
                var document = workspace.CurrentSolution.GetDocument(hostDocument.Id);
                var parsedDocument = await ParsedDocument.CreateAsync(document, CancellationToken.None);
                Assert.Empty(parsedDocument.SyntaxTree.GetDiagnostics());
                var service = document.GetRequiredLanguageService<ISyntaxFactsService>();
 
                var targetPosition = GoToAdjacentMemberCommandHandler.GetTargetPosition(
                    service,
                    parsedDocument.Root,
                    hostDocument.CursorPosition.Value,
                    next);
 
                Assert.NotNull(targetPosition);
                Assert.Equal(hostDocument.SelectedSpans.Single().Start, targetPosition.Value);
            }
        }
 
        protected async Task<int?> GetTargetPositionAsync(string code, bool next)
        {
            using var workspace = TestWorkspace.Create(
                LanguageName,
                compilationOptions: null,
                parseOptions: DefaultParseOptions,
                content: code);
            var hostDocument = workspace.DocumentWithCursor;
            var document = workspace.CurrentSolution.GetDocument(hostDocument.Id);
            var parsedDocument = await ParsedDocument.CreateAsync(document, CancellationToken.None);
            Assert.Empty(parsedDocument.SyntaxTree.GetDiagnostics());
 
            return GoToAdjacentMemberCommandHandler.GetTargetPosition(
                document.GetRequiredLanguageService<ISyntaxFactsService>(),
                parsedDocument.Root,
                hostDocument.CursorPosition.Value,
                next);
        }
    }
}