aspnetcore/test/Microsoft.VisualStudio.Edit.../DefaultRazorSyntaxFactsServ...

121 lines
5.1 KiB
C#

// 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.Collections.Generic;
using Microsoft.AspNetCore.Razor.Language;
using Xunit;
namespace Microsoft.VisualStudio.Editor.Razor
{
public class DefaultRazorSyntaxFactsServiceTest
{
[Fact]
public void GetClassifiedSpans_ReturnsExpectedSpans()
{
// Arrange
var expectedSpans = new[]
{
new ClassifiedSpan(new SourceSpan("test.cshtml", 0, 0, 0, 5), new SourceSpan("test.cshtml", 0, 0, 0, 5), SpanKind.Markup, BlockKind.Tag, AcceptedCharacters.Any),
new ClassifiedSpan(new SourceSpan("test.cshtml", 5, 0, 5, 6), new SourceSpan("test.cshtml", 0, 0, 0, 42), SpanKind.Markup, BlockKind.Markup, AcceptedCharacters.Any),
new ClassifiedSpan(new SourceSpan("test.cshtml", 34, 1, 27, 2), new SourceSpan("test.cshtml", 0, 0, 0, 42), SpanKind.Markup, BlockKind.Markup, AcceptedCharacters.Any),
new ClassifiedSpan(new SourceSpan("test.cshtml", 36, 2, 0, 6), new SourceSpan("test.cshtml", 36, 2, 0, 6), SpanKind.Markup, BlockKind.Tag, AcceptedCharacters.Any),
};
var codeDocument = GetCodeDocument(
@"<div>
<taghelper></taghelper>
</div>");
var syntaxTree = codeDocument.GetSyntaxTree();
var service = new DefaultRazorSyntaxFactsService();
// Act
var spans = service.GetClassifiedSpans(syntaxTree);
// Assert
Assert.Equal(expectedSpans, spans);
}
[Fact]
public void GetClassifiedSpans_ReturnsAttributeSpansInDocumentOrder()
{
// Arrange
var expectedSpans = new[]
{
new ClassifiedSpan(new SourceSpan("test.cshtml", 14, 0, 14, 1), new SourceSpan("test.cshtml", 0, 0, 0, 49), SpanKind.Code, BlockKind.Tag, AcceptedCharacters.AnyExceptNewline),
new ClassifiedSpan(new SourceSpan("test.cshtml", 23, 0, 23, 2), new SourceSpan("test.cshtml", 0, 0, 0, 49), SpanKind.Markup, BlockKind.Tag, AcceptedCharacters.Any),
new ClassifiedSpan(new SourceSpan("test.cshtml", 32, 0, 32, 4), new SourceSpan("test.cshtml", 0, 0, 0, 49), SpanKind.Code, BlockKind.Tag, AcceptedCharacters.AnyExceptNewline),
};
var codeDocument = GetCodeDocument(
@"<taghelper id=1 class=""th"" show=true></taghelper>");
var syntaxTree = codeDocument.GetSyntaxTree();
var service = new DefaultRazorSyntaxFactsService();
// Act
var spans = service.GetClassifiedSpans(syntaxTree);
// Assert
Assert.Equal(expectedSpans, spans);
}
[Fact]
public void GetTagHelperSpans_ReturnsExpectedSpans()
{
// Arrange
var codeDocument = GetCodeDocument(
@"<div>
<taghelper></taghelper>
</div>");
var tagHelperContext = codeDocument.GetTagHelperContext();
var expectedSourceSpan = new SourceSpan("test.cshtml", 11, 1, 4, 23);
var syntaxTree = codeDocument.GetSyntaxTree();
var service = new DefaultRazorSyntaxFactsService();
// Act
var spans = service.GetTagHelperSpans(syntaxTree);
// Assert
var actualSpan = Assert.Single(spans);
Assert.Equal(expectedSourceSpan, actualSpan.Span);
Assert.Equal(tagHelperContext.TagHelpers, actualSpan.TagHelpers);
Assert.Equal(tagHelperContext.Prefix, actualSpan.Binding.TagHelperPrefix);
Assert.Equal("div", actualSpan.Binding.ParentTagName);
}
private static RazorCodeDocument GetCodeDocument(string source)
{
var taghelper = TagHelperDescriptorBuilder.Create("TestTagHelper", "TestAssembly")
.BoundAttributeDescriptor(attr => attr.Name("show").TypeName("System.Boolean"))
.BoundAttributeDescriptor(attr => attr.Name("id").TypeName("System.Int32"))
.TagMatchingRuleDescriptor(rule => rule.RequireTagName("taghelper"))
.TypeName("TestTagHelper")
.Build();
var engine = RazorProjectEngine.Create(builder =>
{
builder.AddTagHelpers(taghelper);
builder.SetImportFeature(new TestImportProjectFeature());
});
var sourceProjectItem = new TestRazorProjectItem("test.cshtml")
{
Content = source
};
var codeDocument = engine.ProcessDesignTime(sourceProjectItem);
return codeDocument;
}
private class TestImportProjectFeature : RazorProjectEngineFeatureBase, IImportProjectFeature
{
public IReadOnlyList<RazorProjectItem> GetImports(RazorProjectItem projectItem)
{
var importProjectItem = new TestRazorProjectItem("import.cshtml")
{
Content = "@addTagHelper *, TestAssembly"
};
return new[] { importProjectItem };
}
}
}
}