File: ValueTracking\AbstractBaseValueTrackingTests.cs
Web Access
Project: src\src\EditorFeatures\Test\Microsoft.CodeAnalysis.EditorFeatures.UnitTests.csproj (Microsoft.CodeAnalysis.EditorFeatures.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.Collections.Immutable;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.ValueTracking;
using Microsoft.CodeAnalysis.Remote.Testing;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Test.Utilities;
using System.Threading;
using Microsoft.CodeAnalysis.Text;
using Xunit;
using System.Collections.Generic;
 
namespace Microsoft.CodeAnalysis.Editor.UnitTests.ValueTracking;
 
public abstract class AbstractBaseValueTrackingTests
{
    protected TestWorkspace CreateWorkspace(string code, TestHost testHost)
        => CreateWorkspace(code, EditorTestCompositions.EditorFeatures.WithTestHostParts(testHost));
 
    protected abstract TestWorkspace CreateWorkspace(string code, TestComposition composition);
 
    internal static async Task<ImmutableArray<ValueTrackedItem>> GetTrackedItemsAsync(TestWorkspace testWorkspace, CancellationToken cancellationToken = default)
    {
        var cursorDocument = testWorkspace.DocumentWithCursor;
        var document = testWorkspace.CurrentSolution.GetRequiredDocument(cursorDocument.Id);
        var textSpan = new TextSpan(cursorDocument.CursorPosition!.Value, 0);
        var service = testWorkspace.Services.GetRequiredService<IValueTrackingService>();
        return await service.TrackValueSourceAsync(textSpan, document, cancellationToken);
 
    }
 
    internal static async Task<ImmutableArray<ValueTrackedItem>> GetTrackedItemsAsync(TestWorkspace testWorkspace, ValueTrackedItem item, CancellationToken cancellationToken = default)
    {
        var service = testWorkspace.Services.GetRequiredService<IValueTrackingService>();
        return await service.TrackValueSourceAsync(testWorkspace.CurrentSolution, item, cancellationToken);
    }
 
    internal static async Task<ImmutableArray<ValueTrackedItem>> ValidateItemsAsync(TestWorkspace testWorkspace, (int line, string text)[] itemInfo, CancellationToken cancellationToken = default)
    {
        var items = await GetTrackedItemsAsync(testWorkspace, cancellationToken);
        Assert.True(itemInfo.Length == items.Length, $"GetTrackedItemsAsync\n\texpected: [{string.Join(",", itemInfo.Select(p => p.text))}]\n\t  actual: [{string.Join(",", items)}]");
 
        for (var i = 0; i < items.Length; i++)
        {
            ValidateItem(items[i], itemInfo[i].line, itemInfo[i].text);
        }
 
        return items;
    }
 
    internal static async Task<ImmutableArray<ValueTrackedItem>> ValidateChildrenAsync(TestWorkspace testWorkspace, ValueTrackedItem item, (int line, string text)[] childInfo, CancellationToken cancellationToken = default)
    {
        var children = await GetTrackedItemsAsync(testWorkspace, item, cancellationToken);
        Assert.True(childInfo.Length == children.Length, $"GetTrackedItemsAsync on [{item}]\n\texpected: [{string.Join(",", childInfo.Select(p => p.text))}]\n\t  actual: [{string.Join(",", children)}]");
 
        for (var i = 0; i < childInfo.Length; i++)
        {
            ValidateItem(children[i], childInfo[i].line, childInfo[i].text);
        }
 
        return children;
    }
 
    internal static async Task ValidateChildrenEmptyAsync(TestWorkspace testWorkspace, ValueTrackedItem item, CancellationToken cancellationToken = default)
    {
        var children = await GetTrackedItemsAsync(testWorkspace, item, cancellationToken);
        Assert.Empty(children);
    }
 
    internal static async Task ValidateChildrenEmptyAsync(TestWorkspace testWorkspace, IEnumerable<ValueTrackedItem> items, CancellationToken cancellationToken = default)
    {
        foreach (var item in items)
        {
            await ValidateChildrenEmptyAsync(testWorkspace, item, cancellationToken);
        }
    }
 
    internal static void ValidateItem(ValueTrackedItem item, int line, string? text = null)
    {
        item.SourceText.GetLineAndOffset(item.Span.Start, out var lineStart, out var _);
        Assert.Equal(line, lineStart);
 
        if (text is not null)
        {
            Assert.Equal(text, item.ToString());
        }
    }
}