File: TestCode.cs
Web Access
Project: src\src\Razor\src\Razor\test\Microsoft.AspNetCore.Razor.Test.Common.Tooling\Microsoft.AspNetCore.Razor.Test.Common.Tooling.csproj (Microsoft.AspNetCore.Razor.Test.Common.Tooling)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Collections.Immutable;
using System.Linq;
using Microsoft.CodeAnalysis.Testing;
using Microsoft.CodeAnalysis.Text;
 
namespace Microsoft.AspNetCore.Razor.Test.Common;
 
internal readonly struct TestCode
{
    public string OriginalInput { get; }
    public string Text { get; }
    public ImmutableArray<int> Positions { get; }
 
    private readonly ImmutableDictionary<string, ImmutableArray<TextSpan>> _nameToSpanMap;
 
    public TestCode(string input, bool treatPositionIndicatorsAsCode = false)
    {
        OriginalInput = input;
 
        if (treatPositionIndicatorsAsCode)
        {
            TestFileMarkupParser.GetSpans(input, treatPositionIndicatorsAsCode, out var text, out var nameToSpanMap);
 
            Text = text;
            Positions = [];
            _nameToSpanMap = nameToSpanMap;
        }
        else
        {
            TestFileMarkupParser.GetPositionsAndSpans(input, out var text, out var positions, out var spans);
 
            Text = text;
            Positions = positions;
            _nameToSpanMap = spans;
        }
    }
 
    public int Position
        => Positions.Single();
 
    public bool HasSpans
        => TryGetNamedSpans(string.Empty, out _);
 
    public TextSpan Span
        => Spans.Single();
 
    public ImmutableArray<TextSpan> Spans
        => GetNamedSpans(string.Empty);
 
    public ImmutableDictionary<string, ImmutableArray<TextSpan>> NamedSpans
        => _nameToSpanMap;
 
    public ImmutableArray<TextSpan> GetNamedSpans(string name)
        => _nameToSpanMap[name];
 
    public bool TryGetNamedSpans(string name, out ImmutableArray<TextSpan> spans)
        => _nameToSpanMap.TryGetValue(name, out spans);
 
    public static implicit operator TestCode(string input)
        => new(input);
}