File: Extensions\DefaultTagHelperOptimizationPassTest.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 Microsoft.AspNetCore.Razor.Language.Intermediate;
using Xunit;
 
namespace Microsoft.AspNetCore.Razor.Language.Extensions;
 
public class DefaultTagHelperOptimizationPassTest : RazorProjectEngineTestBase
{
    protected override RazorLanguageVersion Version => RazorLanguageVersion.Latest;
 
    protected override void ConfigureCodeDocumentProcessor(RazorCodeDocumentProcessor processor)
    {
        processor.ExecutePhasesThrough<IRazorDirectiveClassifierPhase>();
    }
 
    [Fact]
    public void DefaultTagHelperOptimizationPass_Execute_ReplacesChildren()
    {
        // Arrange
        var tagHelper = TagHelperDescriptorBuilder.CreateTagHelper("TestTagHelper", "TestAssembly")
            .TypeName("TestTagHelper")
            .BoundAttributeDescriptor(attribute => attribute
                .Name("Foo")
                .TypeName("System.Int32")
                .PropertyName("FooProp"))
            .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p"))
            .Build();
 
        var codeDocument = ProjectEngine.CreateCodeDocument(@"
@addTagHelper TestTagHelper, TestAssembly
<p foo=""17"" attr=""value"">",
            [tagHelper]);
 
        var processor = CreateCodeDocumentProcessor(codeDocument);
 
        // Act
        processor.ExecutePass<DefaultTagHelperOptimizationPass>();
 
        // Assert
        var documentNode = processor.GetDocumentNode();
 
        var @class = documentNode.FindPrimaryClass();
        Assert.NotNull(@class);
 
        Assert.IsType<DefaultTagHelperRuntimeIntermediateNode>(@class.Children[0]);
 
        var fieldDeclaration = Assert.IsType<FieldDeclarationIntermediateNode>(@class.Children[1]);
        Assert.True(fieldDeclaration.IsTagHelperField);
        Assert.Equal("__TestTagHelper", fieldDeclaration.Name);
        Assert.Equal("global::TestTagHelper", fieldDeclaration.Type);
        Assert.Equal("private", fieldDeclaration.Modifiers[0]);
 
        var tagHelperNode = documentNode.GetTagHelperNode();
        Assert.Equal(5, tagHelperNode.Children.Count);
 
        var body = Assert.IsType<DefaultTagHelperBodyIntermediateNode>(tagHelperNode.Children[0]);
        Assert.Equal("p", body.TagName);
        Assert.Equal(TagMode.StartTagAndEndTag, body.TagMode);
 
        var create = Assert.IsType<DefaultTagHelperCreateIntermediateNode>(tagHelperNode.Children[1]);
        Assert.Equal("__TestTagHelper", create.FieldName);
        Assert.Equal("TestTagHelper", create.TypeName);
        Assert.Equal(tagHelper, create.TagHelper);
 
        var property = Assert.IsType<DefaultTagHelperPropertyIntermediateNode>(tagHelperNode.Children[2]);
        Assert.Equal("foo", property.AttributeName);
        Assert.Equal(AttributeStructure.DoubleQuotes, property.AttributeStructure);
        Assert.Equal(tagHelper.BoundAttributes[0], property.BoundAttribute);
        Assert.Equal("__TestTagHelper", property.FieldName);
        Assert.False(property.IsIndexerNameMatch);
        Assert.Equal("FooProp", property.PropertyName);
        Assert.Equal(tagHelper, property.TagHelper);
 
        var htmlAttribute = Assert.IsType<DefaultTagHelperHtmlAttributeIntermediateNode>(tagHelperNode.Children[3]);
        Assert.Equal("attr", htmlAttribute.AttributeName);
        Assert.Equal(AttributeStructure.DoubleQuotes, htmlAttribute.AttributeStructure);
 
        Assert.IsType<DefaultTagHelperExecuteIntermediateNode>(tagHelperNode.Children[4]);
    }
}