File: RazorProjectEngineBuilderExtensionsTest.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.Generic;
using System.Collections.Immutable;
using Microsoft.AspNetCore.Razor.Language.CodeGeneration;
using Microsoft.CodeAnalysis.CSharp;
using Moq;
using Xunit;
 
namespace Microsoft.AspNetCore.Razor.Language;
 
public class RazorProjectEngineBuilderExtensionsTest
{
    [Fact]
    public void SetImportFeature_SetsTheImportFeature()
    {
        // Arrange
        var builder = new RazorProjectEngineBuilder(RazorConfiguration.Default, new Mock<RazorProjectFileSystem>(MockBehavior.Strict).Object);
        var testFeature1 = new TestImportProjectFeature();
        var testFeature2 = new TestImportProjectFeature();
        builder.Features.Add(testFeature1);
        builder.Features.Add(testFeature2);
        var newFeature = new TestImportProjectFeature();
 
        // Act
        builder.SetImportFeature(newFeature);
 
        // Assert
        var feature = Assert.Single(builder.Features);
        Assert.Same(newFeature, feature);
    }
 
    [Fact]
    public void AddTargetExtension_CreatesAndAddsToTargetExtensionFeatureIfItDoesNotExist()
    {
        // Arrange
        var builder = new RazorProjectEngineBuilder(RazorConfiguration.Default, new Mock<RazorProjectFileSystem>(MockBehavior.Strict).Object);
        var expectedExtension = new Mock<ICodeTargetExtension>(MockBehavior.Strict).Object;
 
        // Act
        builder.AddTargetExtension(expectedExtension);
 
        // Assert
        var feature = Assert.Single(builder.Features);
        var codeTargetExtensionFeature = Assert.IsAssignableFrom<IRazorTargetExtensionFeature>(feature);
        var extension = Assert.Single(codeTargetExtensionFeature.TargetExtensions);
        Assert.Same(expectedExtension, extension);
    }
 
    [Fact]
    public void AddTargetExtension_UsesExistingFeatureIfExistsAndAddsTo()
    {
        // Arrange
        var builder = new RazorProjectEngineBuilder(RazorConfiguration.Default, new Mock<RazorProjectFileSystem>(MockBehavior.Strict).Object);
        var codeTargetExtensionFeature = new DefaultRazorTargetExtensionFeature();
        builder.Features.Add(codeTargetExtensionFeature);
        var expectedExtension = new Mock<ICodeTargetExtension>(MockBehavior.Strict).Object;
 
        // Act
        builder.AddTargetExtension(expectedExtension);
 
        // Assert
        var feature = Assert.Single(builder.Features);
        Assert.Same(codeTargetExtensionFeature, feature);
        var extensions = Assert.Single(codeTargetExtensionFeature.TargetExtensions);
        Assert.Same(expectedExtension, extensions);
    }
 
    [Fact]
    public void AddDirective_CreatesAndAddsToDirectiveFeatureIfItDoesNotExist()
    {
        // Arrange
        var builder = new RazorProjectEngineBuilder(RazorConfiguration.Default, new Mock<RazorProjectFileSystem>(MockBehavior.Strict).Object);
        var expectedDirective = new Mock<DirectiveDescriptor>(MockBehavior.Strict).Object;
 
        // Act
        builder.AddDirective(expectedDirective);
 
        // Assert
        var feature = Assert.Single(builder.Features);
        var directiveFeature = Assert.IsType<ConfigureDirectivesFeature>(feature);
        var directive = Assert.Single(directiveFeature.GetDirectives());
        Assert.Same(expectedDirective, directive);
    }
 
    [Fact]
    public void AddDirective_UsesExistingFeatureIfExistsAndAddsTo()
    {
        // Arrange
        var builder = new RazorProjectEngineBuilder(RazorConfiguration.Default, new Mock<RazorProjectFileSystem>(MockBehavior.Strict).Object);
        var directiveFeature = new ConfigureDirectivesFeature();
        builder.Features.Add(directiveFeature);
        var expectedDirective = new Mock<DirectiveDescriptor>(MockBehavior.Strict).Object;
 
        // Act
        builder.AddDirective(expectedDirective);
 
        // Assert
        var feature = Assert.Single(builder.Features);
        Assert.Same(directiveFeature, feature);
        var directive = Assert.Single(directiveFeature.GetDirectives());
        Assert.Same(expectedDirective, directive);
    }
 
    [Fact]
    public void SetCSharpLanguageVersion_ResolvesLatestCSharpLangVersions()
    {
        // Arrange
        var csharpLanguageVersion = LanguageVersion.Latest;
 
        // Act
        var projectEngine = RazorProjectEngine.Create(builder =>
        {
            builder.SetCSharpLanguageVersion(csharpLanguageVersion);
 
            builder.ConfigureParserOptions(builder =>
            {
                builder.UseRoslynTokenizer = true;
                builder.CSharpParseOptions = CSharpParseOptions.Default.WithLanguageVersion(csharpLanguageVersion);
            });
        });
 
        var features = projectEngine.Engine.GetFeatures<IConfigureRazorCodeGenerationOptionsFeature>().OrderByAsArray(static x => x.Order);
        var builder = new RazorCodeGenerationOptions.Builder();
 
        foreach (var feature in features)
        {
            feature.Configure(builder);
        }
 
        var options = builder.ToOptions();
 
        // Assert
        Assert.False(options.SuppressNullabilityEnforcement);
        Assert.True(options.UseEnhancedLinePragma);
        Assert.True(options.OmitMinimizedComponentAttributeValues);
    }
}