public void SetIdentifier_SetsIdentifier() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); var expected = "test"; // Act codeDocument.SetIdentifier(expected); // Assert Assert.Same(expected, codeDocument.Items[RazorCodeDocumentExtensions.IdentifierKey]); }
public void TryComputeNamespaceAndClass_RelativePathLongerThanFilePath_ReturnsNull() { // Arrange var sourceDocument = TestRazorSourceDocument.Create(filePath: "C:\\Hello\\Test.cshtml", relativePath: "Some\\invalid\\relative\\path\\Test.cshtml"); var codeDocument = TestRazorCodeDocument.Create(sourceDocument, Array.Empty <RazorSourceDocument>()); // Act codeDocument.TryComputeNamespaceAndClass(out var @namespace, out var @class); // Assert Assert.Null(@namespace); Assert.Null(@class); }
public void SetTagHelperContext_SetsTagHelperContext() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); var expected = TagHelperDocumentContext.Create(null, new TagHelperDescriptor[0]); // Act codeDocument.SetTagHelperContext(expected); // Assert Assert.Same(expected, codeDocument.Items[typeof(TagHelperDocumentContext)]); }
public void SetCodeGenerationOptions_SetsSuccessfully() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); var expected = RazorCodeGenerationOptions.CreateDefault(); // Act codeDocument.SetCodeGenerationOptions(expected); // Assert Assert.Same(expected, codeDocument.Items[typeof(RazorCodeGenerationOptions)]); }
public void SetParserOptions_SetsSyntaxTree() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); var expected = RazorParserOptions.CreateDefault(); // Act codeDocument.SetParserOptions(expected); // Assert Assert.Same(expected, codeDocument.Items[typeof(RazorParserOptions)]); }
public void TryComputeNamespaceAndClass_FilePathNull_ReturnsNull() { // Arrange var sourceDocument = TestRazorSourceDocument.Create(filePath: null, relativePath: "Test.cshtml"); var codeDocument = TestRazorCodeDocument.Create(sourceDocument, Array.Empty <RazorSourceDocument>()); // Act codeDocument.TryComputeNamespaceAndClass(out var @namespace, out var @class); // Assert Assert.Null(@namespace); Assert.Null(@class); }
public void SetRazorSyntaxTree_SetsSyntaxTree() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); var expected = RazorSyntaxTree.Parse(codeDocument.Source); // Act codeDocument.SetSyntaxTree(expected); // Assert Assert.Same(expected, codeDocument.Items[typeof(RazorSyntaxTree)]); }
public void SetIRDocument_SetsIRDocument() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); var expected = new DocumentIntermediateNode(); // Act codeDocument.SetDocumentIntermediateNode((DocumentIntermediateNode)expected); // Assert Assert.Same(expected, codeDocument.Items[typeof(DocumentIntermediateNode)]); }
public void SetCSharpDocument_SetsCSharpDocument() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); var expected = RazorCSharpDocument.Create("", RazorCodeGenerationOptions.CreateDefault(), Array.Empty <RazorDiagnostic>()); // Act codeDocument.SetCSharpDocument(expected); // Assert Assert.Same(expected, codeDocument.Items[typeof(RazorCSharpDocument)]); }
public void Lower_SetsOptions_Defaults() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); // Act var documentNode = Lower(codeDocument); // Assert Assert.NotNull(documentNode.Options); Assert.False(documentNode.Options.DesignTime); Assert.Equal(4, documentNode.Options.IndentSize); Assert.False(documentNode.Options.IndentWithTabs); }
public void GetRazorSyntaxTree_ReturnsSyntaxTree() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); var expected = RazorSyntaxTree.Parse(codeDocument.Source); codeDocument.Items[typeof(RazorSyntaxTree)] = expected; // Act var actual = codeDocument.GetSyntaxTree(); // Assert Assert.Same(expected, actual); }
public void GetCSharpDocument_ReturnsCSharpDocument() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); var expected = RazorCSharpDocument.Create("", RazorCodeGenerationOptions.CreateDefault(), Array.Empty <RazorDiagnostic>()); codeDocument.Items[typeof(RazorCSharpDocument)] = expected; // Act var actual = codeDocument.GetCSharpDocument(); // Assert Assert.Same(expected, actual); }
public void Lower_WithFunctions() { // Arrange var codeDocument = TestRazorCodeDocument.Create(@"@functions { public int Foo { get; set; }}"); // Act var documentNode = Lower(codeDocument); // Assert Children(documentNode, n => Directive( "functions", n, c => Assert.IsType <CSharpCodeIntermediateNode>(c))); }
public void GetParserOptions_ReturnsSyntaxTree() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); var expected = RazorParserOptions.CreateDefault(); codeDocument.Items[typeof(RazorParserOptions)] = expected; // Act var actual = codeDocument.GetParserOptions(); // Assert Assert.Same(expected, actual); }
public void GetImportIdentifiers_ReturnsIdentifiers() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); var expected = new string[] { "test1", "test2" }; codeDocument.Items[RazorCodeDocumentExtensions.ImportIdentifiersKey] = expected; // Act var actual = codeDocument.GetImportIdentifiers(); // Assert Assert.Same(expected, actual); }
public void GetTagHelperContext_ReturnsTagHelperContext() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); var expected = TagHelperDocumentContext.Create(null, new TagHelperDescriptor[0]); codeDocument.Items[typeof(TagHelperDocumentContext)] = expected; // Act var actual = codeDocument.GetTagHelperContext(); // Assert Assert.Same(expected, actual); }
public void GetIdentifier_ReturnsIdentifier() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); var expected = "test"; codeDocument.Items[RazorCodeDocumentExtensions.IdentifierKey] = expected; // Act var actual = codeDocument.GetIdentifier(); // Assert Assert.Same(expected, actual); }
public void Execute_ThrowsForMissingDependency() { // Arrange var phase = new DefaultRazorOptimizationPhase(); var engine = RazorEngine.CreateEmpty(b => b.Phases.Add(phase)); var codeDocument = TestRazorCodeDocument.CreateEmpty(); // Act & Assert ExceptionAssert.Throws <InvalidOperationException>( () => phase.Execute(codeDocument), $"The '{nameof(DefaultRazorOptimizationPhase)}' phase requires a '{nameof(DocumentIntermediateNode)}' " + $"provided by the '{nameof(RazorCodeDocument)}'."); }
public void GetAndSetTagHelpers_ReturnsTagHelpers() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); var expected = new[] { TagHelperDescriptorBuilder.Create("TestTagHelper", "TestAssembly").Build() }; codeDocument.SetTagHelpers(expected); // Act var actual = codeDocument.GetTagHelpers(); // Assert Assert.Same(expected, actual); }
public void GetIRDocument_ReturnsIRDocument() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); var expected = new DocumentIntermediateNode(); codeDocument.Items[typeof(DocumentIntermediateNode)] = expected; // Act var actual = codeDocument.GetDocumentIntermediateNode(); // Assert Assert.Same(expected, actual); }
public void GetCodeGenerationOptions_ReturnsSuccessfully() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); var expected = RazorCodeGenerationOptions.CreateDefault(); codeDocument.Items[typeof(RazorCodeGenerationOptions)] = expected; // Act var actual = codeDocument.GetCodeGenerationOptions(); // Assert Assert.Same(expected, actual); }
public void GetAndSetImportSyntaxTrees_ReturnsSyntaxTrees() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); var expected = new[] { RazorSyntaxTree.Parse(codeDocument.Source), }; codeDocument.SetImportSyntaxTrees(expected); // Act var actual = codeDocument.GetImportSyntaxTrees(); // Assert Assert.Same(expected, actual); }
public void Execute_ExecutesPhasesInOrder() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); // We're going to set up mocks to simulate a sequence of passes. We don't care about // what's in the nodes, we're just going to look at the identity via strict mocks. var originalNode = new DocumentIntermediateNode(); var firstPassNode = new DocumentIntermediateNode(); var secondPassNode = new DocumentIntermediateNode(); codeDocument.SetDocumentIntermediateNode(originalNode); var firstPass = new Mock <IRazorOptimizationPass>(MockBehavior.Strict); firstPass.SetupGet(m => m.Order).Returns(0); firstPass.SetupProperty(m => m.Engine); firstPass.Setup(m => m.Execute(codeDocument, originalNode)).Callback(() => { originalNode.Children.Add(firstPassNode); }); var secondPass = new Mock <IRazorOptimizationPass>(MockBehavior.Strict); secondPass.SetupGet(m => m.Order).Returns(1); secondPass.SetupProperty(m => m.Engine); secondPass.Setup(m => m.Execute(codeDocument, originalNode)).Callback(() => { // Works only when the first pass has run before this. originalNode.Children[0].Children.Add(secondPassNode); }); var phase = new DefaultRazorOptimizationPhase(); var engine = RazorEngine.CreateEmpty(b => { b.Phases.Add(phase); b.Features.Add(firstPass.Object); b.Features.Add(secondPass.Object); }); // Act phase.Execute(codeDocument); // Assert Assert.Same(secondPassNode, codeDocument.GetDocumentIntermediateNode().Children[0].Children[0]); }
public void SetImportIdentifiers_SetsIdentifiers() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); var expected = new string[] { "test1", "test2" }; // Act codeDocument.SetImportIdentifiers(expected); // Assert Assert.Equal(expected, codeDocument.Items[RazorCodeDocumentExtensions.ImportIdentifiersKey]); // Not the same, but equal, it makes a defensive copy. Assert.NotSame(expected, codeDocument.Items[RazorCodeDocumentExtensions.ImportIdentifiersKey]); }
public void TryComputeNamespace_ComputesNamespace() { // Arrange var sourceDocument = TestRazorSourceDocument.Create(filePath: "C:\\Hello\\Components\\Test.cshtml", relativePath: "\\Components\\Test.cshtml"); var codeDocument = TestRazorCodeDocument.Create(sourceDocument, Array.Empty <RazorSourceDocument>()); codeDocument.SetCodeGenerationOptions(RazorCodeGenerationOptions.Create(c => { c.RootNamespace = "Hello"; })); // Act codeDocument.TryComputeNamespace(fallbackToRootNamespace: true, out var @namespace); // Assert Assert.Equal("Hello.Components", @namespace); }
public void Execute_ThrowsForMissingDependency_IRDocument() { // Arrange var phase = new DefaultRazorCSharpLoweringPhase(); var engine = RazorProjectEngine.CreateEmpty(b => b.Phases.Add(phase)); var codeDocument = TestRazorCodeDocument.CreateEmpty(); codeDocument.SetSyntaxTree(RazorSyntaxTree.Parse(codeDocument.Source)); // Act & Assert ExceptionAssert.Throws <InvalidOperationException>( () => phase.Execute(codeDocument), $"The '{nameof(DefaultRazorCSharpLoweringPhase)}' phase requires a '{nameof(DocumentIntermediateNode)}' " + $"provided by the '{nameof(RazorCodeDocument)}'."); }
public void Lower_WithUsing() { // Arrange var codeDocument = TestRazorCodeDocument.Create(@"@using System"); var expectedSourceLocation = new SourceSpan(codeDocument.Source.FilePath, 1, 0, 1, 12); // Act var documentNode = Lower(codeDocument); // Assert Children(documentNode, n => { Using("System", n); Assert.Equal(expectedSourceLocation, n.Source); }); }
public void Execute_AddsSyntaxTree() { // Arrange var phase = new DefaultRazorParsingPhase(); var engine = RazorEngine.CreateEmpty(builder => { builder.Phases.Add(phase); builder.Features.Add(new DefaultRazorParserOptionsFeature(designTime: false, version: RazorLanguageVersion.Latest)); }); var codeDocument = TestRazorCodeDocument.CreateEmpty(); // Act phase.Execute(codeDocument); // Assert Assert.NotNull(codeDocument.GetSyntaxTree()); }
public void TryComputeNamespace_OverrideImportsNamespaceDirective() { // Arrange var sourceDocument = TestRazorSourceDocument.Create( content: "@namespace My.Custom.OverrideNS", filePath: "C:\\Hello\\Components\\Test.cshtml", relativePath: "\\Components\\Test.cshtml"); var codeDocument = TestRazorCodeDocument.Create(sourceDocument, Array.Empty <RazorSourceDocument>()); codeDocument.SetFileKind(FileKinds.Component); codeDocument.SetSyntaxTree(RazorSyntaxTree.Parse(sourceDocument, RazorParserOptions.Create(options => { options.Directives.Add(NamespaceDirective.Directive); }))); var importSourceDocument = TestRazorSourceDocument.Create( content: "@namespace My.Custom.NS", filePath: "C:\\Hello\\_Imports.razor", relativePath: "\\_Imports.razor"); codeDocument.SetImportSyntaxTrees(new[] { RazorSyntaxTree.Parse(importSourceDocument, RazorParserOptions.Create(options => { options.Directives.Add(NamespaceDirective.Directive); })) }); var documentNode = new DocumentIntermediateNode() { Options = RazorCodeGenerationOptions.Create(c => { c.RootNamespace = "Hello.World"; }) }; codeDocument.SetDocumentIntermediateNode(documentNode); // Act codeDocument.TryComputeNamespace(fallbackToRootNamespace: true, out var @namespace); // Assert Assert.Equal("My.Custom.OverrideNS", @namespace); }
public void Lower_TagHelper_InSection() { // Arrange var codeDocument = TestRazorCodeDocument.Create(@"@addTagHelper *, TestAssembly @section test { <span val=""@Hello World""></span> }"); var tagHelpers = new[] { CreateTagHelperDescriptor( tagName: "span", typeName: "SpanTagHelper", assemblyName: "TestAssembly") }; // Act var documentNode = Lower(codeDocument, tagHelpers: tagHelpers); // Assert Children( documentNode, n => Directive( SyntaxConstants.CSharp.AddTagHelperKeyword, n, v => DirectiveToken(DirectiveTokenKind.String, "*, TestAssembly", v)), n => Directive( "section", n, c1 => DirectiveToken(DirectiveTokenKind.Member, "test", c1), c1 => Html(Environment.NewLine, c1), c1 => TagHelper( "span", TagMode.StartTagAndEndTag, tagHelpers, c1, c2 => Assert.IsType <TagHelperBodyIntermediateNode>(c2), c2 => TagHelperHtmlAttribute( "val", AttributeStructure.DoubleQuotes, c2, v => CSharpExpressionAttributeValue(string.Empty, "Hello", v), v => LiteralAttributeValue(" ", "World", v))), c1 => Html(Environment.NewLine, c1))); }