File: Legacy\CodeBlockEditHandlerTest.cs
Web Access
Project: src\src\Razor\src\Compiler\Microsoft.AspNetCore.Razor.Language\test\Microsoft.AspNetCore.Razor.Language.UnitTests.csproj (Microsoft.AspNetCore.Razor.Language.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#nullable disable
 
using System.Linq;
using Microsoft.AspNetCore.Razor.Language.Legacy;
using Microsoft.AspNetCore.Razor.Language.Syntax;
using Microsoft.AspNetCore.Razor.PooledObjects;
using Xunit;
 
namespace Microsoft.AspNetCore.Razor.Language.Test.Legacy;
 
public class CodeBlockEditHandlerTest
{
    [Fact]
    public void IsAcceptableReplacement_AcceptableReplacement_ReturnsTrue()
    {
        // Arrange
        var span = GetSpan(SourceLocation.Zero, "Hello {world}.");
        var change = new SourceChange(new SourceSpan(0, 5), "H3ll0");
 
        // Act
        var result = CodeBlockEditHandler.IsAcceptableReplacement(span, change);
 
        // Assert
        Assert.True(result);
    }
 
    [Fact]
    public void IsAcceptableReplacement_AcceptableReplacement_WithMarkup_ReturnsTrue()
    {
        // Arrange
        var span = GetSpan(SourceLocation.Zero, "Hello <div>@world</div>.");
        var change = new SourceChange(new SourceSpan(0, 5), "H3ll0");
 
        // Act
        var result = CodeBlockEditHandler.IsAcceptableReplacement(span, change);
 
        // Assert
        Assert.True(result);
    }
 
    [Fact]
    public void IsAcceptableReplacement_ChangeModifiesInvalidContent_ReturnsFalse()
    {
        // Arrange
        var span = GetSpan(SourceLocation.Zero, "Hello {world}.");
        var change = new SourceChange(new SourceSpan(6, 1), "!");
 
        // Act
        var result = CodeBlockEditHandler.IsAcceptableReplacement(span, change);
 
        // Assert
        Assert.False(result);
    }
 
    [Fact]
    public void IsAcceptableReplacement_ChangeAddsOpenAngle_ReturnsFalse()
    {
        // Arrange
        var span = GetSpan(SourceLocation.Zero, "Hello <div></div>.");
        var change = new SourceChange(new SourceSpan(6, 1), "<");
 
        // Act
        var result = CodeBlockEditHandler.IsAcceptableReplacement(span, change);
 
        // Assert
        Assert.False(result);
    }
 
    [Fact]
    public void IsAcceptableReplacement_ChangeToComment_ReturnsFalse()
    {
        // Arrange
        var span = GetSpan(SourceLocation.Zero, "Hello @");
        var change = new SourceChange(new SourceSpan(6, 1), "@*");
 
        // Act
        var result = CodeBlockEditHandler.IsAcceptableReplacement(span, change);
 
        // Assert
        Assert.False(result);
    }
 
    [Fact]
    public void IsAcceptableReplacement_ChangeContainsInvalidContent_ReturnsFalse()
    {
        // Arrange
        var span = GetSpan(SourceLocation.Zero, "Hello {world}.");
        var change = new SourceChange(new SourceSpan(0, 0), "{");
 
        // Act
        var result = CodeBlockEditHandler.IsAcceptableReplacement(span, change);
 
        // Assert
        Assert.False(result);
    }
 
    [Fact]
    public void IsAcceptableReplacement_NotReplace_ReturnsFalse()
    {
        // Arrange
        var span = GetSpan(SourceLocation.Zero, "Hello {world}.");
        var change = new SourceChange(new SourceSpan(0, 5), string.Empty);
 
        // Act
        var result = CodeBlockEditHandler.IsAcceptableReplacement(span, change);
 
        // Assert
        Assert.False(result);
    }
 
    [Fact]
    public void IsAcceptableDeletion_ValidChange_ReturnsTrue()
    {
        // Arrange
        var span = GetSpan(SourceLocation.Zero, "Hello {world}.");
        var change = new SourceChange(new SourceSpan(0, 5), string.Empty);
 
        // Act
        var result = CodeBlockEditHandler.IsAcceptableDeletion(span, change);
 
        // Assert
        Assert.True(result);
    }
 
    [Fact]
    public void IsAcceptableDeletion_InvalidChange_ReturnsFalse()
    {
        // Arrange
        var span = GetSpan(SourceLocation.Zero, "Hello {world}.");
        var change = new SourceChange(new SourceSpan(5, 3), string.Empty);
 
        // Act
        var result = CodeBlockEditHandler.IsAcceptableDeletion(span, change);
 
        // Assert
        Assert.False(result);
    }
 
    [Fact]
    public void IsAcceptableDeletion_NotDelete_ReturnsFalse()
    {
        // Arrange
        var span = GetSpan(SourceLocation.Zero, "world");
        var change = new SourceChange(new SourceSpan(0, 0), "hello");
 
        // Act
        var result = CodeBlockEditHandler.IsAcceptableDeletion(span, change);
 
        // Assert
        Assert.False(result);
    }
 
    [Fact]
    public void ModifiesInvalidContent_ValidContent_ReturnsFalse()
    {
        // Arrange
        var span = GetSpan(SourceLocation.Zero, "Hello {world}.");
        var change = new SourceChange(new SourceSpan(0, 5), string.Empty);
 
        // Act
        var result = CodeBlockEditHandler.ModifiesInvalidContent(span, change);
 
        // Assert
        Assert.False(result);
    }
 
    [Fact]
    public void ModifiesInvalidContent_InvalidContent_ReturnsTrue()
    {
        // Arrange
        var span = GetSpan(SourceLocation.Zero, "Hello {world}.");
        var change = new SourceChange(new SourceSpan(5, 7), string.Empty);
 
        // Act
        var result = CodeBlockEditHandler.ModifiesInvalidContent(span, change);
 
        // Assert
        Assert.True(result);
    }
 
    [Fact]
    public void IsAcceptableInsertion_ValidChange_ReturnsTrue()
    {
        // Arrange
        var change = new SourceChange(new SourceSpan(0, 0), "hello");
 
        // Act
        var result = CodeBlockEditHandler.IsAcceptableInsertion(change);
 
        // Assert
        Assert.True(result);
    }
 
    [Fact]
    public void IsAcceptableInsertion_InvalidChange_ReturnsFalse()
    {
        // Arrange
        var change = new SourceChange(new SourceSpan(0, 0), "{");
 
        // Act
        var result = CodeBlockEditHandler.IsAcceptableInsertion(change);
 
        // Assert
        Assert.False(result);
    }
 
    [Fact]
    public void IsAcceptableInsertion_InvalidChange_Transition_ReturnsFalse()
    {
        // Arrange
        var change = new SourceChange(new SourceSpan(0, 0), "@");
 
        // Act
        var result = CodeBlockEditHandler.IsAcceptableInsertion(change);
 
        // Assert
        Assert.False(result);
    }
 
    [Fact]
    public void IsAcceptableInsertion_InvalidChange_TemplateTransition_ReturnsFalse()
    {
        // Arrange
        var change = new SourceChange(new SourceSpan(0, 0), "<");
 
        // Act
        var result = CodeBlockEditHandler.IsAcceptableInsertion(change);
 
        // Assert
        Assert.False(result);
    }
 
    [Fact]
    public void IsAcceptableInsertion_NotInsert_ReturnsFalse()
    {
        // Arrange
        var change = new SourceChange(new SourceSpan(0, 2), string.Empty);
 
        // Act
        var result = CodeBlockEditHandler.IsAcceptableInsertion(change);
 
        // Assert
        Assert.False(result);
    }
 
    [Theory]
    [InlineData("{")]
    [InlineData("}")]
    [InlineData("if (true) { }")]
    [InlineData("@<div></div>")]
    [InlineData("<div></div>")]
    [InlineData("*")]
    public void ContainsInvalidContent_InvalidContent_ReturnsTrue(string content)
    {
        // Arrange
        var change = new SourceChange(new SourceSpan(0, 0), content);
 
        // Act
        var result = CodeBlockEditHandler.ContainsInvalidContent(change);
 
        // Assert
        Assert.True(result);
    }
 
    [Theory]
    [InlineData("var x = true;")]
    [InlineData("if (true) Console.WriteLine('!')")]
    public void ContainsInvalidContent_ValidContent_ReturnsFalse(string content)
    {
        // Arrange
        var change = new SourceChange(new SourceSpan(0, 0), content);
 
        // Act
        var result = CodeBlockEditHandler.ContainsInvalidContent(change);
 
        // Assert
        Assert.False(result);
    }
 
    private static SyntaxNode GetSpan(SourceLocation start, string content)
    {
        using PooledArrayBuilder<SyntaxToken> builder = [];
 
        var tokens = NativeCSharpLanguageCharacteristics.Instance.TokenizeString(content).ToArray();
        foreach (var token in tokens)
        {
            builder.Add(new SyntaxToken(token));
        }
 
        return SyntaxFactory.CSharpStatementLiteral(builder.ToList(), SpanChunkGenerator.Null, editHandler: null);
    }
}