From 208da8ca12bc5eb065d3d1bb35dda06b0011e3c7 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Thu, 12 Jan 2017 09:25:19 -0800 Subject: [PATCH] Add plumbing for imports and includes Groundwork for support of _ViewImports _ViewStart and others. --- .../DefaultRazorCodeDocument.cs | 13 +++++- .../RazorCodeDocument.cs | 20 +++++++- .../RazorSourceDocument.cs | 2 + .../DefaultRazorCodeDocumentTest.cs | 34 +++++++++++++- .../RazorCodeDocumentTest.cs | 46 +++++++++++++++++++ .../TestRazorCodeDocument.cs | 13 ++++-- 6 files changed, 121 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNetCore.Razor.Evolution/DefaultRazorCodeDocument.cs b/src/Microsoft.AspNetCore.Razor.Evolution/DefaultRazorCodeDocument.cs index e29fc84d40..385f5fe18f 100644 --- a/src/Microsoft.AspNetCore.Razor.Evolution/DefaultRazorCodeDocument.cs +++ b/src/Microsoft.AspNetCore.Razor.Evolution/DefaultRazorCodeDocument.cs @@ -2,12 +2,17 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; +using System.Linq; namespace Microsoft.AspNetCore.Razor.Evolution { internal class DefaultRazorCodeDocument : RazorCodeDocument { - public DefaultRazorCodeDocument(RazorSourceDocument source) + public DefaultRazorCodeDocument( + RazorSourceDocument source, + IEnumerable imports, + IEnumerable includes) { if (source == null) { @@ -15,10 +20,16 @@ namespace Microsoft.AspNetCore.Razor.Evolution } Source = source; + Imports = imports?.ToArray() ?? RazorSourceDocument.EmptyArray; + Includes = includes?.ToArray() ?? RazorSourceDocument.EmptyArray; Items = new DefaultItemCollection(); } + public override IReadOnlyList Imports { get; } + + public override IReadOnlyList Includes { get; } + public override ItemCollection Items { get; } public override RazorSourceDocument Source { get; } diff --git a/src/Microsoft.AspNetCore.Razor.Evolution/RazorCodeDocument.cs b/src/Microsoft.AspNetCore.Razor.Evolution/RazorCodeDocument.cs index 874af1992b..b4e66058b0 100644 --- a/src/Microsoft.AspNetCore.Razor.Evolution/RazorCodeDocument.cs +++ b/src/Microsoft.AspNetCore.Razor.Evolution/RazorCodeDocument.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; namespace Microsoft.AspNetCore.Razor.Evolution { @@ -14,11 +15,28 @@ namespace Microsoft.AspNetCore.Razor.Evolution throw new ArgumentNullException(nameof(source)); } - return new DefaultRazorCodeDocument(source); + return Create(source, imports: null, includes: null); } + public static RazorCodeDocument Create( + RazorSourceDocument source, + IEnumerable imports, + IEnumerable includes) + { + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + return new DefaultRazorCodeDocument(source, imports, includes); + } + + public abstract IReadOnlyList Imports { get; } + public abstract ItemCollection Items { get; } + public abstract IReadOnlyList Includes { get; } + public abstract RazorSourceDocument Source { get; } } } diff --git a/src/Microsoft.AspNetCore.Razor.Evolution/RazorSourceDocument.cs b/src/Microsoft.AspNetCore.Razor.Evolution/RazorSourceDocument.cs index 6ec2a48c6b..df68a131bf 100644 --- a/src/Microsoft.AspNetCore.Razor.Evolution/RazorSourceDocument.cs +++ b/src/Microsoft.AspNetCore.Razor.Evolution/RazorSourceDocument.cs @@ -9,6 +9,8 @@ namespace Microsoft.AspNetCore.Razor.Evolution { public abstract class RazorSourceDocument { + internal static readonly RazorSourceDocument[] EmptyArray = new RazorSourceDocument[0]; + public abstract Encoding Encoding { get; } public abstract string Filename { get; } diff --git a/test/Microsoft.AspNetCore.Razor.Evolution.Test/DefaultRazorCodeDocumentTest.cs b/test/Microsoft.AspNetCore.Razor.Evolution.Test/DefaultRazorCodeDocumentTest.cs index 0616fcd449..95d7de0941 100644 --- a/test/Microsoft.AspNetCore.Razor.Evolution.Test/DefaultRazorCodeDocumentTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Evolution.Test/DefaultRazorCodeDocumentTest.cs @@ -13,12 +13,44 @@ namespace Microsoft.AspNetCore.Razor.Evolution // Arrange var source = TestRazorSourceDocument.Create(); + var imports = new RazorSourceDocument[] + { + TestRazorSourceDocument.Create(), + }; + + var includes = new RazorSourceDocument[] + { + TestRazorSourceDocument.Create(), + }; + // Act - var code = new DefaultRazorCodeDocument(source); + var code = new DefaultRazorCodeDocument(source, imports, includes); // Assert Assert.Same(source, code.Source); Assert.NotNull(code.Items); + + Assert.NotSame(imports, code.Imports); + Assert.Collection(imports, d => Assert.Same(imports[0], d)); + + Assert.NotSame(includes, code.Includes); + Assert.Collection(includes, d => Assert.Same(includes[0], d)); + } + + [Fact] + public void Ctor_AllowsNullForImportsAndIncludes() + { + // Arrange + var source = TestRazorSourceDocument.Create(); + + // Act + var code = new DefaultRazorCodeDocument(source, imports: null, includes: null); + + // Assert + Assert.Same(source, code.Source); + Assert.NotNull(code.Items); + Assert.Empty(code.Imports); + Assert.Empty(code.Includes); } } } diff --git a/test/Microsoft.AspNetCore.Razor.Evolution.Test/RazorCodeDocumentTest.cs b/test/Microsoft.AspNetCore.Razor.Evolution.Test/RazorCodeDocumentTest.cs index 8c1a0bbe59..8624003bb7 100644 --- a/test/Microsoft.AspNetCore.Razor.Evolution.Test/RazorCodeDocumentTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Evolution.Test/RazorCodeDocumentTest.cs @@ -20,5 +20,51 @@ namespace Microsoft.AspNetCore.Razor.Evolution Assert.Same(source, code.Source); Assert.NotNull(code.Items); } + + [Fact] + public void Create_WithImportsAndIncludes() + { + // Arrange + var source = TestRazorSourceDocument.Create(); + + var imports = new RazorSourceDocument[] + { + TestRazorSourceDocument.Create(), + }; + + var includes = new RazorSourceDocument[] + { + TestRazorSourceDocument.Create(), + }; + + // Act + var code = RazorCodeDocument.Create(source, imports, includes); + + // Assert + Assert.Same(source, code.Source); + Assert.NotNull(code.Items); + + Assert.NotSame(imports, code.Imports); + Assert.Collection(imports, d => Assert.Same(imports[0], d)); + + Assert.NotSame(includes, code.Includes); + Assert.Collection(includes, d => Assert.Same(includes[0], d)); + } + + [Fact] + public void Create_WithImportsAndIncludes_AllsNull() + { + // Arrange + var source = TestRazorSourceDocument.Create(); + + // Act + var code = RazorCodeDocument.Create(source, imports: null, includes: null); + + // Assert + Assert.Same(source, code.Source); + Assert.NotNull(code.Items); + Assert.Empty(code.Imports); + Assert.Empty(code.Includes); + } } } diff --git a/test/Microsoft.AspNetCore.Razor.Evolution.Test/TestRazorCodeDocument.cs b/test/Microsoft.AspNetCore.Razor.Evolution.Test/TestRazorCodeDocument.cs index 42c54cd585..c8198f1fee 100644 --- a/test/Microsoft.AspNetCore.Razor.Evolution.Test/TestRazorCodeDocument.cs +++ b/test/Microsoft.AspNetCore.Razor.Evolution.Test/TestRazorCodeDocument.cs @@ -1,6 +1,8 @@ // 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; + namespace Microsoft.AspNetCore.Razor.Evolution { internal class TestRazorCodeDocument : DefaultRazorCodeDocument @@ -8,17 +10,20 @@ namespace Microsoft.AspNetCore.Razor.Evolution public static TestRazorCodeDocument CreateEmpty() { var source = TestRazorSourceDocument.Create(content: string.Empty); - return new TestRazorCodeDocument(source); + return new TestRazorCodeDocument(source, imports: null, includes: null); } public static TestRazorCodeDocument Create(string content) { var source = TestRazorSourceDocument.Create(content); - return new TestRazorCodeDocument(source); + return new TestRazorCodeDocument(source, imports: null, includes: null); } - private TestRazorCodeDocument(RazorSourceDocument source) - : base(source) + private TestRazorCodeDocument( + RazorSourceDocument source, + IEnumerable imports, + IEnumerable includes) + : base(source, imports, includes) { } }