// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Linq; using Microsoft.AspNetCore.Razor.Language; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Host; using Mvc1_X = Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X; using MvcLatest = Microsoft.AspNetCore.Mvc.Razor.Extensions; using Xunit; namespace Microsoft.CodeAnalysis.Razor { public class DefaultTemplateEngineFactoryServiceTest { [Fact] public void Create_CreatesDesignTimeTemplateEngine_ForLatest() { // Arrange var mvcReference = GetAssemblyMetadataReference("Microsoft.AspNetCore.Mvc.Razor", "2.0.0"); var services = GetServices(mvcReference); var factoryService = new DefaultTemplateEngineFactoryService(services); // Act var engine = factoryService.Create("/TestPath/SomePath/", b => { b.Features.Add(new MyCoolNewFeature()); Assert.True(b.DesignTime); }); // Assert Assert.Single(engine.Engine.Features.OfType()); Assert.Single(engine.Engine.Features.OfType()); Assert.Single(engine.Engine.Features.OfType()); } [Fact] public void Create_CreatesDesignTimeTemplateEngine_ForVersion1_1() { // Arrange var mvcReference = GetAssemblyMetadataReference("Microsoft.AspNetCore.Mvc.Razor", "1.1.3"); var services = GetServices(mvcReference); var factoryService = new DefaultTemplateEngineFactoryService(services); // Act var engine = factoryService.Create("/TestPath/SomePath/", b => { b.Features.Add(new MyCoolNewFeature()); Assert.True(b.DesignTime); }); // Assert Assert.Single(engine.Engine.Features.OfType()); Assert.Single(engine.Engine.Features.OfType()); Assert.Single(engine.Engine.Features.OfType()); } [Fact] public void Create_DoesNotSupportViewComponentTagHelpers_ForVersion1_0() { // Arrange var mvcReference = GetAssemblyMetadataReference("Microsoft.AspNetCore.Mvc.Razor", "1.0.0"); var services = GetServices(mvcReference); var factoryService = new DefaultTemplateEngineFactoryService(services); // Act var engine = factoryService.Create("/TestPath/SomePath/", b => { b.Features.Add(new MyCoolNewFeature()); }); // Assert Assert.Single(engine.Engine.Features.OfType()); Assert.Single(engine.Engine.Features.OfType()); Assert.Empty(engine.Engine.Features.OfType()); } [Fact] public void Create_UnknownMvcVersion_UsesLatest() { // Arrange var mvcReference = GetAssemblyMetadataReference("Microsoft.AspNetCore.Mvc.Razor", "3.0.0"); var services = GetServices(mvcReference); var factoryService = new DefaultTemplateEngineFactoryService(services); // Act var engine = factoryService.Create("/TestPath/SomePath/", b => { b.Features.Add(new MyCoolNewFeature()); Assert.True(b.DesignTime); }); // Assert Assert.Single(engine.Engine.Features.OfType()); Assert.Single(engine.Engine.Features.OfType()); Assert.Single(engine.Engine.Features.OfType()); } [Fact] public void Create_UnknownProjectPath_UsesLatest() { // Arrange var mvcReference = GetAssemblyMetadataReference("Microsoft.AspNetCore.Mvc.Razor", "1.1.0"); var services = GetServices(mvcReference); var factoryService = new DefaultTemplateEngineFactoryService(services); // Act var engine = factoryService.Create("/TestPath/DifferentPath/", b => { b.Features.Add(new MyCoolNewFeature()); Assert.True(b.DesignTime); }); // Assert Assert.Single(engine.Engine.Features.OfType()); Assert.Single(engine.Engine.Features.OfType()); Assert.Single(engine.Engine.Features.OfType()); } [Fact] public void Create_MvcReferenceNotFound_UsesLatest() { // Arrange var mvcReference = GetAssemblyMetadataReference("Microsoft.Something.Else", "1.0.0"); var services = GetServices(mvcReference); var factoryService = new DefaultTemplateEngineFactoryService(services); // Act var engine = factoryService.Create("/TestPath/DifferentPath/", b => { b.Features.Add(new MyCoolNewFeature()); Assert.True(b.DesignTime); }); // Assert Assert.Single(engine.Engine.Features.OfType()); Assert.Single(engine.Engine.Features.OfType()); Assert.Single(engine.Engine.Features.OfType()); } private HostLanguageServices GetServices(MetadataReference mvcReference) { var project = ProjectInfo .Create(ProjectId.CreateNewId(), VersionStamp.Default, "TestProject", "TestAssembly", LanguageNames.CSharp) .WithFilePath("/TestPath/SomePath/MyProject.csproj") .WithMetadataReferences(new[] { mvcReference }); var workspace = new AdhocWorkspace(); workspace.AddProject(project); return workspace.Services.GetLanguageServices(LanguageNames.CSharp); } private MetadataReference GetAssemblyMetadataReference(string assemblyName, string version) { var code = $@" using System.Reflection; [assembly: AssemblyVersion(""{version}"")] "; var syntaxTree = CSharpSyntaxTree.ParseText(code); var compilation = CSharpCompilation.Create( assemblyName, syntaxTrees: new[] { syntaxTree }, references: new[] { MetadataReference.CreateFromFile(typeof(object).Assembly.Location) }); return compilation.ToMetadataReference(); } private class MyCoolNewFeature : IRazorEngineFeature { public RazorEngine Engine { get; set; } } } }