public void ComponentDocumentClassifierPass_UsesRelativePathToGenerateTypeNameAndNamespace() { // Arrange var relativePath = "/Pages/Announcements/Banner.razor"; var properties = new RazorSourceDocumentProperties(filePath: $"/MyApp{relativePath}", relativePath: relativePath); var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("some-content", properties)); codeDocument.SetFileKind(FileKinds.Component); var projectEngine = CreateProjectEngine(b => { b.SetRootNamespace("MyApp"); }); var irDocument = CreateIRDocument(projectEngine, codeDocument); var pass = new ComponentDocumentClassifierPass { Engine = projectEngine.Engine }; // Act pass.Execute(codeDocument, irDocument); var visitor = new Visitor(); visitor.Visit(irDocument); // Assert Assert.Equal("Banner", visitor.Class.ClassName); Assert.Equal("MyApp.Pages.Announcements", visitor.Namespace.Content); }
public void ComponentDocumentClassifierPass_SetsClass() { // Arrange var properties = new RazorSourceDocumentProperties(filePath: "/MyApp/Test.razor", relativePath: "Test.razor"); var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("some-content", properties)); codeDocument.SetInputDocumentKind(InputDocumentKind.Component); var projectEngine = CreateProjectEngine(); var irDocument = CreateIRDocument(projectEngine, codeDocument); var pass = new ComponentDocumentClassifierPass { Engine = projectEngine.Engine }; // Act pass.Execute(codeDocument, irDocument); var visitor = new Visitor(); visitor.Visit(irDocument); // Assert Assert.Equal($"global::{CodeGenerationConstants.RazorComponent.FullTypeName}", visitor.Class.BaseType); Assert.Equal(new[] { "public", "sealed" }, visitor.Class.Modifiers); Assert.Equal("Test", visitor.Class.ClassName); }
public void Execute_NoOpsForBlazorComponents() { // Arrange var properties = new RazorSourceDocumentProperties(filePath: "ignored", relativePath: "Test.razor"); var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("Hello world", properties)); codeDocument.SetFileKind(FileKinds.Component); var engine = CreateProjectEngine(b => { PageDirective.Register(b); }).Engine; var irDocument = CreateIRDocument(engine, codeDocument); var pass = new CreateNewOnMetadataUpdateAttributePass { Engine = engine }; var documentClassifier = new DefaultDocumentClassifierPass { Engine = engine }; // Act documentClassifier.Execute(codeDocument, irDocument); pass.Execute(codeDocument, irDocument); var visitor = new Visitor(); visitor.Visit(irDocument); // Assert Assert.Empty(visitor.ExtensionNodes); }
public void RazorPageDocumentClassifierPass_AddsRouteTemplateMetadata() { // Arrange var properties = new RazorSourceDocumentProperties(filePath: "ignored", relativePath: "Test.cshtml"); var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("@page \"some-route\"", properties)); var engine = CreateProjectEngine().Engine; var irDocument = CreateIRDocument(engine, codeDocument); var pass = new RazorPageDocumentClassifierPass { Engine = engine }; // Act pass.Execute(codeDocument, irDocument); var visitor = new Visitor(); visitor.Visit(irDocument); // Assert var attributeNode = Assert.IsType <RazorCompiledItemMetadataAttributeIntermediateNode>(visitor.ExtensionNode); Assert.Equal("RouteTemplate", attributeNode.Key); Assert.Equal("some-route", attributeNode.Value); }
public void ComponentDocumentClassifierPass_SetsNamespace() { // Arrange var properties = new RazorSourceDocumentProperties(filePath: "/MyApp/Test.razor", relativePath: "Test.razor"); var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("some-content", properties)); codeDocument.SetFileKind(FileKinds.Component); var projectEngine = CreateProjectEngine(b => { b.SetRootNamespace("MyApp"); }); var irDocument = CreateIRDocument(projectEngine, codeDocument); var pass = new ComponentDocumentClassifierPass { Engine = projectEngine.Engine }; // Act pass.Execute(codeDocument, irDocument); var visitor = new Visitor(); visitor.Visit(irDocument); // Assert Assert.Equal("MyApp", visitor.Namespace.Content); }
public void ComponentDocumentClassifierPass_SanitizesClassName() { // Arrange var properties = new RazorSourceDocumentProperties(filePath: @"x:\My.+App\path.with+invalid-chars.razor", relativePath: "path.with+invalid-chars.razor"); var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("some-content", properties)); codeDocument.SetFileKind(FileKinds.Component); var projectEngine = CreateProjectEngine(b => { b.SetRootNamespace("My.+App"); }); var irDocument = CreateIRDocument(projectEngine, codeDocument); var pass = new ComponentDocumentClassifierPass { Engine = projectEngine.Engine }; // Act pass.Execute(codeDocument, irDocument); var visitor = new Visitor(); visitor.Visit(irDocument); // Assert Assert.Equal("path_with_invalid_chars", visitor.Class.ClassName); Assert.Equal("My._App", visitor.Namespace.Content); }
public void ComponentDocumentClassifierPass_SetsClass() { // Arrange var properties = new RazorSourceDocumentProperties(filePath: "/MyApp/Test.razor", relativePath: "Test.razor"); var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("some-content", properties)); codeDocument.SetFileKind(FileKinds.Component); var projectEngine = CreateProjectEngine(b => { b.SetRootNamespace("MyApp"); }); var irDocument = CreateIRDocument(projectEngine, codeDocument); var pass = new ComponentDocumentClassifierPass { Engine = projectEngine.Engine }; // Act pass.Execute(codeDocument, irDocument); var visitor = new Visitor(); visitor.Visit(irDocument); // Assert Assert.Equal($"{ComponentsApi.ComponentBase.FullTypeName}", visitor.Class.BaseType); Assert.Equal(new[] { "public", "partial" }, visitor.Class.Modifiers); Assert.Equal("Test", visitor.Class.ClassName); }
public static RazorSourceDocument CreateSourceDocument( string content = "Hello, world!", Encoding encoding = null, string filePath = "test.cshtml", string relativePath = "test.cshtml") { var properties = new RazorSourceDocumentProperties(filePath, relativePath); return(new StringSourceDocument(content, encoding ?? Encoding.UTF8, properties)); }
/// <summary> /// Reads the <see cref="RazorSourceDocument"/> from the specified <paramref name="stream"/>. /// </summary> /// <param name="stream">The <see cref="Stream"/> to read from.</param> /// <param name="fileName">The file name of the template.</param> /// <returns>The <see cref="RazorSourceDocument"/>.</returns> public static RazorSourceDocument ReadFrom(Stream stream, string fileName) { if (stream == null) { throw new ArgumentNullException(nameof(stream)); } var properties = new RazorSourceDocumentProperties(fileName, relativePath: null); return(new StreamSourceDocument(stream, null, properties)); }
public static RazorSourceDocument Create( string content, RazorSourceDocumentProperties properties, Encoding encoding = null, bool normalizeNewLines = false) { if (normalizeNewLines) { content = NormalizeNewLines(content); } return(new StringSourceDocument(content, encoding ?? Encoding.UTF8, properties)); }
/// <summary> /// Creates a <see cref="RazorSourceDocument"/> from the specified <paramref name="content"/>. /// </summary> /// <param name="content">The source document content.</param> /// <param name="properties">Properties to configure the <see cref="RazorSourceDocument"/>.</param> /// <returns>The <see cref="RazorSourceDocument"/>.</returns> /// <remarks>Uses <see cref="System.Text.Encoding.UTF8" /></remarks> public static RazorSourceDocument Create(string content, RazorSourceDocumentProperties properties) { if (content == null) { throw new ArgumentNullException(nameof(content)); } if (properties == null) { throw new ArgumentNullException(nameof(properties)); } return(Create(content, Encoding.UTF8, properties)); }
public void ReadFrom_WithProperties() { // Arrange var content = TestRazorSourceDocument.CreateStreamContent(encoding: Encoding.UTF32); var properties = new RazorSourceDocumentProperties("c:\\myapp\\filePath.cshtml", "filePath.cshtml"); // Act var document = RazorSourceDocument.ReadFrom(content, Encoding.UTF32, properties); // Assert Assert.Equal("c:\\myapp\\filePath.cshtml", document.FilePath); Assert.Equal("filePath.cshtml", document.RelativePath); Assert.Same(Encoding.UTF32, Assert.IsType <StreamSourceDocument>(document).Encoding); }
public void Create_WithProperties() { // Arrange var content = "Hello world"; var properties = new RazorSourceDocumentProperties("c:\\myapp\\filePath.cshtml", "filePath.cshtml"); // Act var document = RazorSourceDocument.Create(content, Encoding.UTF32, properties); // Assert Assert.Equal("c:\\myapp\\filePath.cshtml", document.FilePath); Assert.Equal("filePath.cshtml", document.RelativePath); Assert.Equal(content, ReadContent(document)); Assert.Same(Encoding.UTF32, Assert.IsType <StringSourceDocument>(document).Encoding); }
public StreamSourceDocument(Stream stream, Encoding encoding, RazorSourceDocumentProperties properties) { if (stream == null) { throw new ArgumentNullException(nameof(stream)); } if (properties == null) { throw new ArgumentNullException(nameof(properties)); } // Notice we don't validate the encoding here. StreamSourceDocument can compute it. _checksum = ComputeChecksum(stream); _innerSourceDocument = CreateInnerSourceDocument(stream, encoding, properties); }
/// <summary> /// Creates a <see cref="RazorSourceDocument"/> from the specified <paramref name="content"/>. /// </summary> /// <param name="content">The source document content.</param> /// <param name="fileName">The file name of the <see cref="RazorSourceDocument"/>.</param> /// <param name="encoding">The <see cref="System.Text.Encoding"/> of the file <paramref name="content"/> was read from.</param> /// <returns>The <see cref="RazorSourceDocument"/>.</returns> public static RazorSourceDocument Create(string content, string fileName, Encoding encoding) { if (content == null) { throw new ArgumentNullException(nameof(content)); } if (encoding == null) { throw new ArgumentNullException(nameof(encoding)); } var properties = new RazorSourceDocumentProperties(fileName, relativePath: null); return(new StringSourceDocument(content, encoding, properties)); }
public static RazorSourceDocument Create( string content = "Hello, world!", Encoding encoding = null, bool normalizeNewLines = false, string filePath = "test.cshtml", string relativePath = "test.cshtml") { if (normalizeNewLines) { content = NormalizeNewLines(content); } var properties = new RazorSourceDocumentProperties(filePath, relativePath); return(new StringSourceDocument(content, encoding ?? Encoding.UTF8, properties)); }
public static RazorSourceDocument CreateResource(string resourcePath, Assembly assembly, Encoding encoding = null, bool normalizeNewLines = false) { var file = TestFile.Create(resourcePath, assembly); using (var input = file.OpenRead()) using (var reader = new StreamReader(input)) { var content = reader.ReadToEnd(); if (normalizeNewLines) { content = NormalizeNewLines(content); } var properties = new RazorSourceDocumentProperties(resourcePath, resourcePath); return(new StringSourceDocument(content, encoding ?? Encoding.UTF8, properties)); } }
/// <summary> /// Reads the <see cref="RazorSourceDocument"/> from the specified <paramref name="stream"/>. /// </summary> /// <param name="stream">The <see cref="Stream"/> to read from.</param> /// <param name="encoding">The <see cref="System.Text.Encoding"/> to use to read the <paramref name="stream"/>.</param> /// <param name="properties">Properties to configure the <see cref="RazorSourceDocument"/>.</param> /// <returns>The <see cref="RazorSourceDocument"/>.</returns> public static RazorSourceDocument ReadFrom(Stream stream, Encoding encoding, RazorSourceDocumentProperties properties) { if (stream == null) { throw new ArgumentNullException(nameof(stream)); } if (encoding == null) { throw new ArgumentNullException(nameof(encoding)); } if (properties == null) { throw new ArgumentNullException(nameof(properties)); } return(new StreamSourceDocument(stream, encoding, properties)); }
public void Execute_AddsAttributes() { // Arrange var properties = new RazorSourceDocumentProperties(filePath: "ignored", relativePath: "Test.cshtml"); var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("Hello world", properties)); var engine = CreateProjectEngine(b => { PageDirective.Register(b); }).Engine;; var irDocument = CreateIRDocument(engine, codeDocument); var pass = new CreateNewOnMetadataUpdateAttributePass { Engine = engine }; var documentClassifier = new MvcViewDocumentClassifierPass { Engine = engine }; // Act documentClassifier.Execute(codeDocument, irDocument); pass.Execute(codeDocument, irDocument); var visitor = new Visitor(); visitor.Visit(irDocument); // Assert Assert.Collection( visitor.ExtensionNodes, node => { var attributeNode = Assert.IsType <RazorCompiledItemMetadataAttributeIntermediateNode>(node); Assert.Equal("Identifier", attributeNode.Key); Assert.Equal("/Test.cshtml", attributeNode.Value); }, node => { Assert.IsType <CreateNewOnMetadataUpdateAttributePass.CreateNewOnMetadataUpdateAttributeIntermediateNode>(node); }); }
public void MvcViewDocumentClassifierPass_SanitizesClassName() { // Arrange var properties = new RazorSourceDocumentProperties(filePath: @"x:\Test.cshtml", relativePath: "path.with+invalid-chars"); var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("@page", properties)); var projectEngine = CreateProjectEngine(); var irDocument = CreateIRDocument(projectEngine, codeDocument); var pass = new MvcViewDocumentClassifierPass { Engine = projectEngine.Engine }; // Act pass.Execute(codeDocument, irDocument); var visitor = new Visitor(); visitor.Visit(irDocument); // Assert Assert.Equal("path_with_invalid_chars", visitor.Class.ClassName); }
public void MvcViewDocumentClassifierPass_UsesAbsolutePath_IfRelativePathIsNotSet() { // Arrange var properties = new RazorSourceDocumentProperties(filePath: @"x::\application\Views\Home\Index.cshtml", relativePath: null); var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("some-content", properties)); var projectEngine = CreateProjectEngine(); var irDocument = CreateIRDocument(projectEngine, codeDocument); var pass = new MvcViewDocumentClassifierPass { Engine = projectEngine.Engine }; // Act pass.Execute(codeDocument, irDocument); var visitor = new Visitor(); visitor.Visit(irDocument); // Assert Assert.Equal("x___application_Views_Home_Index", visitor.Class.ClassName); }
public void MvcViewDocumentClassifierPass_UsesRelativePathToGenerateTypeName(string relativePath, string expected) { // Arrange var properties = new RazorSourceDocumentProperties(filePath: "ignored", relativePath: relativePath); var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("some-content", properties)); var projectEngine = CreateProjectEngine(); var irDocument = CreateIRDocument(projectEngine, codeDocument); var pass = new MvcViewDocumentClassifierPass { Engine = projectEngine.Engine }; // Act pass.Execute(codeDocument, irDocument); var visitor = new Visitor(); visitor.Visit(irDocument); // Assert Assert.Equal(expected, visitor.Class.ClassName); }
// Internal for testing internal void AddHierarchicalImports(string sourceFilePath, List <RazorSourceDocument> imports) { // We want items in descending order. FindHierarchicalItems returns items in ascending order. var importProjectItems = ProjectEngine.FileSystem.FindHierarchicalItems(sourceFilePath, ImportsFileName).Reverse(); foreach (var importProjectItem in importProjectItems) { RazorSourceDocument importSourceDocument; if (importProjectItem.Exists) { importSourceDocument = RazorSourceDocument.ReadFrom(importProjectItem); } else { // File doesn't exist on disk so just add a marker source document as an identifier for "there could be something here". var sourceDocumentProperties = new RazorSourceDocumentProperties(importProjectItem.FilePath, importProjectItem.RelativePhysicalPath); importSourceDocument = RazorSourceDocument.Create(string.Empty, sourceDocumentProperties); } imports.Add(importSourceDocument); } }
public void MvcViewDocumentClassifierPass_SetsClass() { // Arrange var properties = new RazorSourceDocumentProperties(filePath: "ignored", relativePath: "Test.cshtml"); var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("some-content", properties)); var projectEngine = CreateProjectEngine(); var irDocument = CreateIRDocument(projectEngine, codeDocument); var pass = new MvcViewDocumentClassifierPass { Engine = projectEngine.Engine }; // Act pass.Execute(codeDocument, irDocument); var visitor = new Visitor(); visitor.Visit(irDocument); // Assert Assert.Equal("global::Microsoft.AspNetCore.Mvc.Razor.RazorPage<TModel>", visitor.Class.BaseType); Assert.Equal(new[] { "public" }, visitor.Class.Modifiers); Assert.Equal("Test", visitor.Class.ClassName); }
public StringSourceDocument(string content, Encoding encoding, RazorSourceDocumentProperties properties) { if (content == null) { throw new ArgumentNullException(nameof(content)); } if (encoding == null) { throw new ArgumentNullException(nameof(encoding)); } if (properties == null) { throw new ArgumentNullException(nameof(properties)); } _content = content; Encoding = encoding; FilePath = properties.FilePath; RelativePath = properties.RelativePath; _lines = new DefaultRazorSourceLineCollection(this); }
public void RazorPageDocumentClassifierPass_NullFilePath_SetsClass() { // Arrange var properties = new RazorSourceDocumentProperties(filePath: null, relativePath: null); var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("@page", properties)); var engine = CreateProjectEngine().Engine; var irDocument = CreateIRDocument(engine, codeDocument); var pass = new RazorPageDocumentClassifierPass { Engine = engine }; // Act pass.Execute(codeDocument, irDocument); var visitor = new Visitor(); visitor.Visit(irDocument); // Assert Assert.Equal("global::Microsoft.AspNetCore.Mvc.RazorPages.Page", visitor.Class.BaseType); Assert.Equal(new[] { "public" }, visitor.Class.Modifiers); Assert.Equal("AspNetCore_74fbaab062bb228ed1ab09c5ff8d6ed2417320e2", visitor.Class.ClassName); }
public void MvcViewDocumentClassifierPass_NullFilePath_SetsClass() { // Arrange var properties = new RazorSourceDocumentProperties(filePath: null, relativePath: null); var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("some-content", properties)); var projectEngine = CreateProjectEngine(); var irDocument = CreateIRDocument(projectEngine, codeDocument); var pass = new MvcViewDocumentClassifierPass { Engine = projectEngine.Engine }; // Act pass.Execute(codeDocument, irDocument); var visitor = new Visitor(); visitor.Visit(irDocument); // Assert Assert.Equal("global::Microsoft.AspNetCore.Mvc.Razor.RazorPage<TModel>", visitor.Class.BaseType); Assert.Equal(new[] { "public" }, visitor.Class.Modifiers); Assert.Equal("AspNetCore_d9f877a857a7e9928eac04d09a59f25967624155", visitor.Class.ClassName); }
private static RazorSourceDocument CreateInnerSourceDocument(Stream stream, Encoding encoding, RazorSourceDocumentProperties properties) { var streamLength = (int)stream.Length; var content = string.Empty; var contentEncoding = encoding ?? Encoding.UTF8; if (streamLength > 0) { var bufferSize = Math.Min(streamLength, LargeObjectHeapLimitInChars); var reader = new StreamReader( stream, contentEncoding, detectEncodingFromByteOrderMarks: true, bufferSize: bufferSize, leaveOpen: true); using (reader) { reader.Peek(); // Just to populate the encoding if (encoding == null) { contentEncoding = reader.CurrentEncoding; } else if (encoding != reader.CurrentEncoding) { throw new InvalidOperationException( Resources.FormatMismatchedContentEncoding( encoding.EncodingName, reader.CurrentEncoding.EncodingName)); } if (streamLength > LargeObjectHeapLimitInChars) { // If the resulting string would end up on the large object heap, then use LargeTextSourceDocument. return(new LargeTextSourceDocument( reader, LargeObjectHeapLimitInChars, contentEncoding, properties)); } content = reader.ReadToEnd(); } } return(new StringSourceDocument(content, contentEncoding, properties)); }
public LargeTextSourceDocument(StreamReader reader, int chunkMaxLength, Encoding encoding, RazorSourceDocumentProperties properties) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } if (encoding == null) { throw new ArgumentNullException(nameof(encoding)); } if (properties == null) { throw new ArgumentNullException(nameof(properties)); } _chunkMaxLength = chunkMaxLength; Encoding = encoding; FilePath = properties.FilePath; RelativePath = properties.RelativePath; ReadChunks(reader, _chunkMaxLength, out _length, out _chunks); _lines = new DefaultRazorSourceLineCollection(this); }