aspnetcore/test/Microsoft.CodeAnalysis.Razo.../ProjectSystem/GeneratedCodeContainerTest.cs

84 lines
2.7 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 Microsoft.AspNetCore.Razor.Language;
using Microsoft.CodeAnalysis.Text;
using Xunit;
namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
{
public class GeneratedCodeContainerTest
{
[Fact]
public void TryGetLinePositionSpan_SpanWithinSourceMapping_ReturnsTrue()
{
// Arrange
var content = @"
@{
var x = SomeClass.SomeProperty;
}
";
var sourceText = SourceText.From(content);
var codeDocument = GetCodeDocument(content);
var generatedCode = codeDocument.GetCSharpDocument().GeneratedCode;
var container = new GeneratedCodeContainer();
container.SetOutput(sourceText, codeDocument);
// TODO: Make writing these tests a little less manual.
// Position of `SomeProperty` in the generated code.
var symbol = "SomeProperty";
var span = new TextSpan(generatedCode.IndexOf(symbol), symbol.Length);
// Position of `SomeProperty` in the source code.
var expectedLineSpan = new LinePositionSpan(new LinePosition(2, 22), new LinePosition(2, 34));
// Act
var result = container.TryGetLinePositionSpan(span, out var lineSpan);
// Assert
Assert.True(result);
Assert.Equal(expectedLineSpan, lineSpan);
}
[Fact]
public void TryGetLinePositionSpan_SpanOutsideSourceMapping_ReturnsFalse()
{
// Arrange
var content = @"
@{
var x = SomeClass.SomeProperty;
}
";
var sourceText = SourceText.From(content);
var codeDocument = GetCodeDocument(content);
var generatedCode = codeDocument.GetCSharpDocument().GeneratedCode;
var container = new GeneratedCodeContainer();
container.SetOutput(sourceText, codeDocument);
// Position of `ExecuteAsync` in the generated code.
var symbol = "ExecuteAsync";
var span = new TextSpan(generatedCode.IndexOf(symbol), symbol.Length);
// Act
var result = container.TryGetLinePositionSpan(span, out var lineSpan);
// Assert
Assert.False(result);
}
private static RazorCodeDocument GetCodeDocument(string content)
{
var sourceProjectItem = new TestRazorProjectItem("test.cshtml")
{
Content = content,
};
var engine = RazorProjectEngine.Create();
var codeDocument = engine.ProcessDesignTime(sourceProjectItem);
return codeDocument;
}
}
}