File: Extensions\FunctionsDirectivePassTest.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.Components;
using Microsoft.AspNetCore.Razor.Language.Intermediate;
using Xunit;
using static Microsoft.AspNetCore.Razor.Language.Intermediate.IntermediateNodeAssert;
 
namespace Microsoft.AspNetCore.Razor.Language.Extensions;
 
public class FunctionsDirectivePassTest : RazorProjectEngineTestBase
{
    protected override RazorLanguageVersion Version => RazorLanguageVersion.Latest;
 
    protected override void ConfigureCodeDocumentProcessor(RazorCodeDocumentProcessor processor)
    {
        processor.ExecutePhasesThrough<IRazorDocumentClassifierPhase>();
    }
 
    [Fact]
    public void Execute_SkipsDocumentWithNoClassNode()
    {
        // Arrange
        var source = TestRazorSourceDocument.Create("@functions { var value = true; }");
        var codeDocument = ProjectEngine.CreateCodeDocument(source);
 
        var documentNode = new DocumentIntermediateNode();
        documentNode.Children.Add(new DirectiveIntermediateNode() { Directive = FunctionsDirective.Directive });
 
        // Act
        ProjectEngine.ExecutePass<FunctionsDirectivePass>(codeDocument, documentNode);
 
        // Assert
        Children(
            documentNode,
            node => Assert.IsType<DirectiveIntermediateNode>(node));
    }
 
    [Fact]
    public void Execute_AddsStatementsToClassLevel()
    {
        // Arrange
        var source = TestRazorSourceDocument.Create("@functions { var value = true; }");
        var codeDocument = ProjectEngine.CreateCodeDocument(source);
        var processor = CreateCodeDocumentProcessor(codeDocument);
 
        // Act
        processor.ExecutePass<FunctionsDirectivePass>();
 
        // Assert
        var documentNode = processor.GetDocumentNode();
 
        Children(
            documentNode,
            node => Assert.IsType<NamespaceDeclarationIntermediateNode>(node));
 
        var @namespace = documentNode.Children[0];
        Children(
            @namespace,
            node => Assert.IsType<ClassDeclarationIntermediateNode>(node));
 
        var @class = @namespace.Children[0];
        Children(
            @class,
            node => Assert.IsType<MethodDeclarationIntermediateNode>(node),
            node => CSharpCode(" var value = true; ", node));
 
        var method = @class.Children[0];
        Assert.Empty(method.Children);
    }
 
    [Fact]
    public void Execute_ComponentCodeDirective_AddsStatementsToClassLevel()
    {
        // Arrange
        var projectEngine = CreateProjectEngine(builder =>
        {
            builder.AddDirective(ComponentCodeDirective.Directive);
        });
 
        var source = TestRazorSourceDocument.Create("@code { var value = true; }");
        var codeDocument = projectEngine.CreateCodeDocument(source, RazorFileKind.Component);
        var processor = CreateCodeDocumentProcessor(projectEngine, codeDocument);
 
        // Act
        processor.ExecutePass<FunctionsDirectivePass>();
 
        // Assert
        var documentNode = processor.GetDocumentNode();
 
        Children(
            documentNode,
            node => Assert.IsType<NamespaceDeclarationIntermediateNode>(node));
 
        var @namespace = documentNode.Children[0];
        Children(
            @namespace,
            node => Assert.IsType<ClassDeclarationIntermediateNode>(node));
 
        var @class = @namespace.Children[0];
        Children(
            @class,
            node => Assert.IsType<MethodDeclarationIntermediateNode>(node),
            node => CSharpCode(" var value = true; ", node));
 
        var method = @class.Children[0];
        Assert.Empty(method.Children);
    }
 
    [Fact]
    public void Execute_FunctionsAndComponentCodeDirective_AddsStatementsToClassLevel()
    {
        // Arrange
        var projectEngine = CreateProjectEngine(builder =>
        {
            builder.AddDirective(ComponentCodeDirective.Directive);
        });
 
        var source = TestRazorSourceDocument.Create(@"
@functions { var value1 = true; }
@code { var value2 = true; }
@functions { var value3 = true; }");
        var codeDocument = projectEngine.CreateCodeDocument(source, RazorFileKind.Component);
        var processor = CreateCodeDocumentProcessor(projectEngine, codeDocument);
 
        // Act
        processor.ExecutePass<FunctionsDirectivePass>();
 
        // Assert
        var documentNode = processor.GetDocumentNode();
 
        Children(
            documentNode,
            node => Assert.IsType<NamespaceDeclarationIntermediateNode>(node));
 
        var @namespace = documentNode.Children[0];
        Children(
            @namespace,
            node => Assert.IsType<ClassDeclarationIntermediateNode>(node));
 
        var @class = @namespace.Children[0];
        Children(
            @class,
            node => Assert.IsType<MethodDeclarationIntermediateNode>(node),
            node => CSharpCode(" var value1 = true; ", node),
            node => CSharpCode(" var value2 = true; ", node),
            node => CSharpCode(" var value3 = true; ", node));
 
        var method = @class.Children[0];
        Children(
            method,
            node => Assert.IsType<HtmlContentIntermediateNode>(node));
    }
}