File: CodeGeneration\DefaultCodeTargetTest.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.
 
using System.Collections.Immutable;
using Xunit;
 
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration;
 
public class DefaultCodeTargetTest
{
    [Fact]
    public void CreateWriter_DesignTime_CreatesDesignTimeNodeWriter()
    {
        // Arrange
        var codeDocument = RazorCodeDocument.Create(
            TestRazorSourceDocument.Create(),
            codeGenerationOptions: RazorCodeGenerationOptions.DesignTimeDefault);
        var target = new DefaultCodeTarget(codeDocument, extensions: []);
 
        // Act
        var writer = target.CreateNodeWriter();
 
        // Assert
        Assert.IsType<DesignTimeNodeWriter>(writer);
    }
 
    [Fact]
    public void CreateWriter_Runtime_CreatesRuntimeNodeWriter()
    {
        // Arrange
        var codeDocument = TestRazorCodeDocument.CreateEmpty();
        var target = new DefaultCodeTarget(codeDocument, extensions: []);
 
        // Act
        var writer = target.CreateNodeWriter();
 
        // Assert
        Assert.IsType<RuntimeNodeWriter>(writer);
    }
 
    [Fact]
    public void HasExtension_ReturnsTrue_WhenExtensionFound()
    {
        // Arrange
        var codeDocument = TestRazorCodeDocument.CreateEmpty();
 
        ImmutableArray<ICodeTargetExtension> extensions = [
            new MyExtension2(),
            new MyExtension1()
        ];
 
        var target = new DefaultCodeTarget(codeDocument, extensions);
 
        // Act
        var result = target.HasExtension<MyExtension1>();
 
        // Assert
        Assert.True(result);
    }
 
    [Fact]
    public void HasExtension_ReturnsFalse_WhenExtensionNotFound()
    {
        // Arrange
        var codeDocument = TestRazorCodeDocument.CreateEmpty();
 
        ImmutableArray<ICodeTargetExtension> extensions = [
            new MyExtension2(),
            new MyExtension2()
        ];
 
        var target = new DefaultCodeTarget(codeDocument, extensions);
 
        // Act
        var result = target.HasExtension<MyExtension1>();
 
        // Assert
        Assert.False(result);
    }
 
    [Fact]
    public void GetExtension_ReturnsExtension_WhenExtensionFound()
    {
        // Arrange
        var codeDocument = TestRazorCodeDocument.CreateEmpty();
 
        ImmutableArray<ICodeTargetExtension> extensions = [
            new MyExtension2(),
            new MyExtension1()
        ];
 
        var target = new DefaultCodeTarget(codeDocument, extensions);
 
        // Act
        var result = target.GetExtension<MyExtension1>();
 
        // Assert
        Assert.Same(extensions[1], result);
    }
 
    [Fact]
    public void GetExtension_ReturnsFirstMatch_WhenExtensionFound()
    {
        // Arrange
        var codeDocument = TestRazorCodeDocument.CreateEmpty();
 
        ImmutableArray<ICodeTargetExtension> extensions = [
            new MyExtension2(),
            new MyExtension1(),
            new MyExtension2(),
            new MyExtension1()
        ];
 
        var target = new DefaultCodeTarget(codeDocument, extensions);
 
        // Act
        var result = target.GetExtension<MyExtension1>();
 
        // Assert
        Assert.Same(extensions[1], result);
    }
 
 
    [Fact]
    public void GetExtension_ReturnsNull_WhenExtensionNotFound()
    {
        // Arrange
        var codeDocument = TestRazorCodeDocument.CreateEmpty();
 
        ImmutableArray<ICodeTargetExtension> extensions = [
            new MyExtension2(),
            new MyExtension2()
        ];
 
        var target = new DefaultCodeTarget(codeDocument, extensions);
 
        // Act
        var result = target.GetExtension<MyExtension1>();
 
        // Assert
        Assert.Null(result);
    }
 
    private class MyExtension1 : ICodeTargetExtension
    {
    }
 
    private class MyExtension2 : ICodeTargetExtension
    {
    }
}