diff --git a/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/DefaultTemplateEngineFactoryServiceTest.cs b/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/DefaultTemplateEngineFactoryServiceTest.cs new file mode 100644 index 0000000000..30af758179 --- /dev/null +++ b/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/DefaultTemplateEngineFactoryServiceTest.cs @@ -0,0 +1,176 @@ +// 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; } + } + } +}