File: DirectiveRemovalOptimizationPassTest.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.Linq;
using Microsoft.AspNetCore.Razor.Language.Intermediate;
using Xunit;
using static Microsoft.AspNetCore.Razor.Language.Intermediate.IntermediateNodeAssert;
 
namespace Microsoft.AspNetCore.Razor.Language;
 
public class DirectiveRemovalOptimizationPassTest : RazorProjectEngineTestBase
{
    protected override RazorLanguageVersion Version => RazorLanguageVersion.Latest;
 
    protected override void ConfigureProjectEngine(RazorProjectEngineBuilder builder)
    {
        var directive = DirectiveDescriptor.CreateDirective("custom", DirectiveKind.SingleLine, d => d.AddStringToken());
        builder.AddDirective(directive);
    }
 
    protected override void ConfigureCodeDocumentProcessor(RazorCodeDocumentProcessor processor)
    {
        processor.ExecutePhasesThrough<IRazorDirectiveClassifierPhase>();
    }
 
    [Fact]
    public void Execute_Custom_RemovesDirectiveNodeFromDocument()
    {
        // Arrange
        var content = "@custom \"Hello\"";
        var source = TestRazorSourceDocument.Create(content);
        var codeDocument = ProjectEngine.CreateCodeDocument(source);
        var processor = CreateCodeDocumentProcessor(codeDocument);
 
        // Act
        processor.ExecutePass<DirectiveRemovalOptimizationPass>();
 
        // 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];
        var method = SingleChild<MethodDeclarationIntermediateNode>(@class);
        Assert.Empty(method.Children);
    }
 
    [Fact]
    public void Execute_MultipleCustomDirectives_RemovesDirectiveNodesFromDocument()
    {
        // Arrange
        var content = """
            @custom "Hello"
            @custom "World"
            """;
        var source = TestRazorSourceDocument.Create(content);
        var codeDocument = ProjectEngine.CreateCodeDocument(source);
        var processor = CreateCodeDocumentProcessor(codeDocument);
 
        // Act
        processor.ExecutePass<DirectiveRemovalOptimizationPass>();
 
        // 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];
        var method = SingleChild<MethodDeclarationIntermediateNode>(@class);
        Assert.Empty(method.Children);
    }
 
    [Fact]
    public void Execute_DirectiveWithError_PreservesDiagnosticsAndRemovesDirectiveNodeFromDocument()
    {
        // Arrange
        var content = "@custom \"Hello\"";
        var expectedDiagnostic = RazorDiagnostic.Create(new RazorDiagnosticDescriptor("RZ9999", "Some diagnostic message.", RazorDiagnosticSeverity.Error));
        var source = TestRazorSourceDocument.Create(content);
        var codeDocument = ProjectEngine.CreateCodeDocument(source);
        var processor = CreateCodeDocumentProcessor(codeDocument);
        var documentNode = processor.GetDocumentNode();
 
        // Add the diagnostic to the directive node.
        var directiveNode = documentNode.FindDescendantNodes<DirectiveIntermediateNode>().Single();
        directiveNode.AddDiagnostic(expectedDiagnostic);
 
        // Act
        processor.ExecutePass<DirectiveRemovalOptimizationPass>();
 
        // Assert
        var diagnostic = Assert.Single(documentNode.Diagnostics);
        Assert.Equal(expectedDiagnostic, diagnostic);
 
        Children(documentNode,
            node => Assert.IsType<NamespaceDeclarationIntermediateNode>(node));
 
        var @namespace = documentNode.Children[0];
        Children(@namespace,
            node => Assert.IsType<ClassDeclarationIntermediateNode>(node));
 
        var @class = @namespace.Children[0];
        var method = SingleChild<MethodDeclarationIntermediateNode>(@class);
        Assert.Empty(method.Children);
    }
}