File: Extensions\ITextSnapshotExtensionsTests.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.
 
#nullable disable
 
using Microsoft.CodeAnalysis.Editor.Shared.Extensions;
using Microsoft.CodeAnalysis.Test.Utilities;
using Microsoft.CodeAnalysis.Text.Shared.Extensions;
using Microsoft.VisualStudio.Text;
using Roslyn.Test.EditorUtilities;
using Xunit;
 
namespace Microsoft.CodeAnalysis.Editor.UnitTests.Extensions;
 
[UseExportProvider]
public class ITextSnapshotExtensionsTests
{
    [Fact]
    public void GetLeadingWhitespaceOfLineAtPosition_EmptyLineReturnsEmptyString()
    {
        var leadingWhitespace = GetLeadingWhitespaceOfLineAtPosition(string.Empty, 0);
        Assert.Equal(string.Empty, leadingWhitespace);
    }
 
    [Fact]
    public void GetLeadingWhitespaceOfLineAtPosition_WhitespaceLineReturnsWhitespace1()
    {
        var leadingWhitespace = GetLeadingWhitespaceOfLineAtPosition("    ", 0);
        Assert.Equal("    ", leadingWhitespace);
    }
 
    [Fact]
    public void GetLeadingWhitespaceOfLineAtPosition_WhitespaceLineReturnsWhitespace2()
    {
        var leadingWhitespace = GetLeadingWhitespaceOfLineAtPosition(" \t ", 0);
        Assert.Equal(" \t ", leadingWhitespace);
    }
 
    [Fact]
    public void GetLeadingWhitespaceOfLineAtPosition_WhitespaceLineReturnsWhitespace3()
    {
        var leadingWhitespace = GetLeadingWhitespaceOfLineAtPosition("\t\t", 0);
        Assert.Equal("\t\t", leadingWhitespace);
    }
 
    [Fact]
    public void GetLeadingWhitespaceOfLineAtPosition_TextLine()
    {
        var leadingWhitespace = GetLeadingWhitespaceOfLineAtPosition("Goo", 0);
        Assert.Equal(string.Empty, leadingWhitespace);
    }
 
    [Fact]
    public void GetLeadingWhitespaceOfLineAtPosition_TextLineStartingWithWhitespace1()
    {
        var leadingWhitespace = GetLeadingWhitespaceOfLineAtPosition("    Goo", 0);
        Assert.Equal("    ", leadingWhitespace);
    }
 
    [Fact]
    public void GetLeadingWhitespaceOfLineAtPosition_TextLineStartingWithWhitespace2()
    {
        var leadingWhitespace = GetLeadingWhitespaceOfLineAtPosition(" \t Goo", 0);
        Assert.Equal(" \t ", leadingWhitespace);
    }
 
    [Fact]
    public void GetLeadingWhitespaceOfLineAtPosition_TextLineStartingWithWhitespace3()
    {
        var leadingWhitespace = GetLeadingWhitespaceOfLineAtPosition("\t\tGoo", 0);
        Assert.Equal("\t\t", leadingWhitespace);
    }
 
    [Fact]
    public void GetLeadingWhitespaceOfLineAtPosition_EmptySecondLineReturnsEmptyString()
    {
        var leadingWhitespace = GetLeadingWhitespaceOfLineAtPosition("Goo\r\n", 5);
        Assert.Equal(string.Empty, leadingWhitespace);
    }
 
    [Fact]
    public void GetLeadingWhitespaceOfLineAtPosition_WhitespaceSecondLineReturnsWhitespace1()
    {
        var leadingWhitespace = GetLeadingWhitespaceOfLineAtPosition("Goo\r\n    ", 5);
        Assert.Equal("    ", leadingWhitespace);
    }
 
    [Fact]
    public void GetLeadingWhitespaceOfLineAtPosition_WhitespaceSecondLineReturnsWhitespace2()
    {
        var leadingWhitespace = GetLeadingWhitespaceOfLineAtPosition("Goo\r\n \t ", 5);
        Assert.Equal(" \t ", leadingWhitespace);
    }
 
    [Fact]
    public void GetLeadingWhitespaceOfLineAtPosition_WhitespaceSecondLineReturnsWhitespace3()
    {
        var leadingWhitespace = GetLeadingWhitespaceOfLineAtPosition("Goo\r\n\t\t", 5);
        Assert.Equal("\t\t", leadingWhitespace);
    }
 
    [Fact]
    public void GetLeadingWhitespaceOfLineAtPosition_TextSecondLine()
    {
        var leadingWhitespace = GetLeadingWhitespaceOfLineAtPosition("Goo\r\nGoo", 5);
        Assert.Equal(string.Empty, leadingWhitespace);
    }
 
    [Fact]
    public void GetLeadingWhitespaceOfLineAtPosition_TextSecondLineStartingWithWhitespace1()
    {
        var leadingWhitespace = GetLeadingWhitespaceOfLineAtPosition("Goo\r\n    Goo", 5);
        Assert.Equal("    ", leadingWhitespace);
    }
 
    [Fact]
    public void GetLeadingWhitespaceOfLineAtPosition_TextSecondLineStartingWithWhitespace2()
    {
        var leadingWhitespace = GetLeadingWhitespaceOfLineAtPosition("Goo\r\n \t Goo", 5);
        Assert.Equal(" \t ", leadingWhitespace);
    }
 
    [Fact]
    public void GetLeadingWhitespaceOfLineAtPosition_TextSecondLineStartingWithWhitespace3()
    {
        var leadingWhitespace = GetLeadingWhitespaceOfLineAtPosition("Goo\r\n\t\tGoo", 5);
        Assert.Equal("\t\t", leadingWhitespace);
    }
 
    [Fact]
    public void GetSpanTest()
    {
        // each line of sample code contains 4 characters followed by a newline
        var snapshot = GetSampleCodeSnapshot();
        var span = snapshot.GetSpan(0, 2, 1, 1);
 
        // column 0, index 2 = (0 * 5) + 2 = 2
        Assert.Equal(2, span.Start);
 
        // column 1, index 1 = (1 * 5) + 1 = 6
        Assert.Equal(6, span.End);
    }
 
    [Fact]
    public void TryGetPositionTest()
    {
        // each line of sample code contains 4 characters followed by a newline
        var snapshot = GetSampleCodeSnapshot();
 
        // valid line, valid column
        Assert.True(snapshot.TryGetPosition(3, 2, out var point));
        Assert.Equal(17, point.Position);
 
        // valid line, invalid column
        Assert.False(snapshot.TryGetPosition(1, 8, out _));
        Assert.False(snapshot.TryGetPosition(3, -2, out _));
 
        // invalid line, valid column
        Assert.False(snapshot.TryGetPosition(18, 1, out _));
        Assert.False(snapshot.TryGetPosition(-1, 1, out _));
    }
 
    [Fact]
    public void TryGetPointValueTest()
    {
        var snapshot = GetSampleCodeSnapshot();
        Assert.Equal(new SnapshotPoint(snapshot, 15), snapshot.TryGetPoint(3, 0).Value);
    }
 
    [Fact]
    public void TryGetPointNullTest()
    {
        var snapshot = GetSampleCodeSnapshot();
        Assert.Null(snapshot.TryGetPoint(3000, 0));
    }
 
    [Fact]
    public void GetLineAndCharacterTest()
    {
        var snapshot = GetSampleCodeSnapshot();
        snapshot.GetLineAndCharacter(16, out var line, out var character);
        Assert.Equal(3, line);
        Assert.Equal(1, character);
    }
 
    private static string GetLeadingWhitespaceOfLineAtPosition(string code, int position)
    {
        var exportProvider = EditorTestCompositions.EditorFeatures.ExportProviderFactory.CreateExportProvider();
        var snapshot = EditorFactory.CreateBuffer(exportProvider, code).CurrentSnapshot;
        return snapshot.GetLeadingWhitespaceOfLineAtPosition(position);
    }
 
    private static ITextSnapshot GetSampleCodeSnapshot()
    {
        var exportProvider = EditorTestCompositions.EditorFeatures.ExportProviderFactory.CreateExportProvider();
 
        // to make verification simpler, each line of code is 4 characters and will be joined to other lines
        // with a single newline character making the formula to calculate the offset from a given line and
        // column thus:
        //   position = row * 5 + column
        var lines = new string[]
        {
            "goo1",
            "bar1",
            "goo2",
            "bar2",
            "goo3",
            "bar3",
        };
        var code = string.Join("\n", lines);
        var snapshot = EditorFactory.CreateBuffer(exportProvider, code).CurrentSnapshot;
        return snapshot;
    }
}