Modifications to support providing tag descriptors from derived hosts
This commit is contained in:
parent
f8020e8e85
commit
99fe8294e9
|
|
@ -9,6 +9,7 @@ using System.Linq;
|
|||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNet.Razor.Parser.SyntaxTree;
|
||||
using Microsoft.AspNet.Razor.Parser.TagHelpers;
|
||||
using Microsoft.AspNet.Razor.Parser.TagHelpers.Internal;
|
||||
using Microsoft.AspNet.Razor.TagHelpers;
|
||||
using Microsoft.AspNet.Razor.Text;
|
||||
|
|
@ -17,34 +18,61 @@ namespace Microsoft.AspNet.Razor.Parser
|
|||
{
|
||||
public class RazorParser
|
||||
{
|
||||
private ITagHelperDescriptorResolver _tagHelperDescriptorResolver;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of <see cref="RazorParser"/>.
|
||||
/// </summary>
|
||||
/// <param name="codeParser">The <see cref="ParserBase"/> used for parsing code content.</param>
|
||||
/// <param name="markupParser">The <see cref="ParserBase"/> used for parsing markpup content.</param>
|
||||
/// <param name="tagHelperDescriptorResolver">The <see cref=ITagHelperDescriptorResolver"/> used to resolve
|
||||
/// <see cref="TagHelperDescriptor"/>s.</param>
|
||||
public RazorParser([NotNull] ParserBase codeParser,
|
||||
[NotNull] ParserBase markupParser,
|
||||
ITagHelperDescriptorResolver tagHelperDescriptorResolver)
|
||||
: this(codeParser,
|
||||
markupParser,
|
||||
tagHelperDescriptorResolver,
|
||||
GetDefaultRewriters(markupParser))
|
||||
{
|
||||
_tagHelperDescriptorResolver = tagHelperDescriptorResolver;
|
||||
MarkupParser = markupParser;
|
||||
CodeParser = codeParser;
|
||||
|
||||
Optimizers = new List<ISyntaxTreeRewriter>()
|
||||
{
|
||||
// TODO: Modify the below WhiteSpaceRewriter & ConditionalAttributeCollapser to handle
|
||||
// TagHelperBlock's: https://github.com/aspnet/Razor/issues/117
|
||||
|
||||
// Move whitespace from start of expression block to markup
|
||||
new WhiteSpaceRewriter(MarkupParser.BuildSpan),
|
||||
// Collapse conditional attributes where the entire value is literal
|
||||
new ConditionalAttributeCollapser(MarkupParser.BuildSpan),
|
||||
};
|
||||
}
|
||||
|
||||
internal ParserBase CodeParser { get; private set; }
|
||||
internal ParserBase MarkupParser { get; private set; }
|
||||
internal IList<ISyntaxTreeRewriter> Optimizers { get; private set; }
|
||||
/// <summary>
|
||||
/// Initializes a new instance of <see cref="RazorParser"/> from the specified <paramref name="parser" />.
|
||||
/// </summary>
|
||||
/// <param name="parser">The <see cref="RazorParser"/> to copy values from.</param>
|
||||
public RazorParser([NotNull] RazorParser parser)
|
||||
: this(parser.CodeParser, parser.MarkupParser, parser.TagHelperDescriptorResolver, parser.Optimizers)
|
||||
{
|
||||
DesignTimeMode = parser.DesignTimeMode;
|
||||
}
|
||||
|
||||
private RazorParser(ParserBase codeParser,
|
||||
ParserBase markupParser,
|
||||
ITagHelperDescriptorResolver tagHelperDescriptorResolver,
|
||||
IEnumerable<ISyntaxTreeRewriter> optimizers)
|
||||
{
|
||||
CodeParser = codeParser;
|
||||
MarkupParser = markupParser;
|
||||
TagHelperDescriptorResolver = tagHelperDescriptorResolver;
|
||||
Optimizers = optimizers.ToList();
|
||||
}
|
||||
|
||||
public bool DesignTimeMode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the <see cref=ITagHelperDescriptorResolver"/> used to resolve
|
||||
/// <see cref="TagHelperDescriptor"/>s.</param>
|
||||
/// </summary>
|
||||
protected ITagHelperDescriptorResolver TagHelperDescriptorResolver { get; private set; }
|
||||
|
||||
// Internal for unit testing
|
||||
internal ParserBase CodeParser { get; private set; }
|
||||
|
||||
// Internal for unit testing
|
||||
internal ParserBase MarkupParser { get; private set; }
|
||||
|
||||
// Internal for unit testing
|
||||
internal List<ISyntaxTreeRewriter> Optimizers { get; private set; }
|
||||
|
||||
public virtual void Parse(TextReader input, ParserVisitor visitor)
|
||||
{
|
||||
Parse(new SeekableTextReader(input), visitor);
|
||||
|
|
@ -142,10 +170,10 @@ namespace Microsoft.AspNet.Razor.Parser
|
|||
rewriter.Rewrite(rewritingContext);
|
||||
}
|
||||
|
||||
if (_tagHelperDescriptorResolver != null)
|
||||
if (TagHelperDescriptorResolver != null)
|
||||
{
|
||||
var tagHelperRegistrationVisitor = new TagHelperRegistrationVisitor(_tagHelperDescriptorResolver);
|
||||
var tagHelperProvider = tagHelperRegistrationVisitor.CreateProvider(rewritingContext.SyntaxTree);
|
||||
var descriptors = GetTagHelperDescriptors(rewritingContext.SyntaxTree);
|
||||
var tagHelperProvider = new TagHelperDescriptorProvider(descriptors);
|
||||
|
||||
var tagHelperParseTreeRewriter = new TagHelperParseTreeRewriter(tagHelperProvider);
|
||||
// Rewrite the document to utilize tag helpers
|
||||
|
|
@ -173,5 +201,31 @@ namespace Microsoft.AspNet.Razor.Parser
|
|||
// Return the new result
|
||||
return new ParserResults(syntaxTree, errors);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a sequence of <see cref="TagHelperDescriptor"/>s for tag helpers that are registered in the
|
||||
/// specified <paramref name="documentRoot"/>.
|
||||
/// </summary>
|
||||
/// <param name="documentRoot">The <see cref="Block"/> to scan for tag helper registrations in.</param>
|
||||
/// <returns></returns>
|
||||
protected virtual IEnumerable<TagHelperDescriptor> GetTagHelperDescriptors([NotNull] Block documentRoot)
|
||||
{
|
||||
var tagHelperRegistrationVisitor = new TagHelperRegistrationVisitor(TagHelperDescriptorResolver);
|
||||
return tagHelperRegistrationVisitor.GetDescriptors(documentRoot);
|
||||
}
|
||||
|
||||
private static IEnumerable<ISyntaxTreeRewriter> GetDefaultRewriters(ParserBase markupParser)
|
||||
{
|
||||
return new ISyntaxTreeRewriter[]
|
||||
{
|
||||
// TODO: Modify the below WhiteSpaceRewriter & ConditionalAttributeCollapser to handle
|
||||
// TagHelperBlock's: https://github.com/aspnet/Razor/issues/117
|
||||
|
||||
// Move whitespace from start of expression block to markup
|
||||
new WhiteSpaceRewriter(markupParser.BuildSpan),
|
||||
// Collapse conditional attributes where the entire value is literal
|
||||
new ConditionalAttributeCollapser(markupParser.BuildSpan),
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,27 +7,31 @@ using Microsoft.AspNet.Razor.Generator;
|
|||
using Microsoft.AspNet.Razor.Parser.SyntaxTree;
|
||||
using Microsoft.AspNet.Razor.TagHelpers;
|
||||
|
||||
namespace Microsoft.AspNet.Razor.Parser.TagHelpers.Internal
|
||||
namespace Microsoft.AspNet.Razor.Parser.TagHelpers
|
||||
{
|
||||
/// <summary>
|
||||
/// A <see cref="ParserVisitor"/> that generates <see cref="TagHelperDescriptor"/>s from
|
||||
/// tag helper code generators in a Razor document.
|
||||
/// </summary>
|
||||
public class TagHelperRegistrationVisitor : ParserVisitor
|
||||
{
|
||||
private readonly ITagHelperDescriptorResolver _descriptorResolver;
|
||||
|
||||
private HashSet<TagHelperDescriptor> _descriptors;
|
||||
private List<TagHelperDescriptor> _descriptors;
|
||||
|
||||
public TagHelperRegistrationVisitor(ITagHelperDescriptorResolver descriptorResolver)
|
||||
{
|
||||
_descriptorResolver = descriptorResolver;
|
||||
}
|
||||
|
||||
public TagHelperDescriptorProvider CreateProvider(Block root)
|
||||
public IEnumerable<TagHelperDescriptor> GetDescriptors([NotNull] Block root)
|
||||
{
|
||||
_descriptors = new HashSet<TagHelperDescriptor>(TagHelperDescriptorComparer.Default);
|
||||
_descriptors = new List<TagHelperDescriptor>();
|
||||
|
||||
// This will recurse through the syntax tree.
|
||||
VisitBlock(root);
|
||||
|
||||
return new TagHelperDescriptorProvider(_descriptors);
|
||||
return _descriptors;
|
||||
}
|
||||
|
||||
public override void VisitSpan(Span span)
|
||||
|
|
@ -50,10 +54,7 @@ namespace Microsoft.AspNet.Razor.Parser.TagHelpers.Internal
|
|||
var descriptors = _descriptorResolver.Resolve(addGenerator.LookupText);
|
||||
|
||||
// Add all the found descriptors to our HashSet.
|
||||
foreach (var descriptor in descriptors)
|
||||
{
|
||||
_descriptors.Add(descriptor);
|
||||
}
|
||||
_descriptors.AddRange(descriptors);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -165,6 +165,19 @@ namespace Microsoft.AspNet.Razor
|
|||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Provides an opportunity for derived types to modify the instance of <see cref="RazorParser"/>
|
||||
/// used by the <see cref="RazorTemplateEngine"/> to parse the Razor tree.
|
||||
/// </summary>
|
||||
/// <param name="incomingRazorParser">The <see cref="RazorParser"/></param>
|
||||
/// <param name="sourceFileName">The file name of the Razor file being parsed.</param>
|
||||
/// <returns>Either the same code parser, after modifications, or a different code parser.</returns>
|
||||
public virtual RazorParser DecorateRazorParser([NotNull] RazorParser incomingRazorParser,
|
||||
string sourceFileName)
|
||||
{
|
||||
return incomingRazorParser;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets an instance of the code parser and is provided an opportunity to decorate or replace it
|
||||
/// </summary>
|
||||
|
|
|
|||
|
|
@ -68,26 +68,28 @@ namespace Microsoft.AspNet.Razor
|
|||
[SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "Input object would be disposed if we dispose the wrapper. We don't own the input so we don't want to dispose it")]
|
||||
public ParserResults ParseTemplate(ITextBuffer input, CancellationToken? cancelToken)
|
||||
{
|
||||
return ParseTemplateCore(input.ToDocument(), cancelToken);
|
||||
return ParseTemplateCore(input.ToDocument(), sourceFileName: null, cancelToken: cancelToken);
|
||||
}
|
||||
|
||||
// See ParseTemplate(ITextBuffer, CancellationToken?),
|
||||
// this overload simply wraps a TextReader in a TextBuffer (see ITextBuffer and BufferingTextReader)
|
||||
public ParserResults ParseTemplate(TextReader input)
|
||||
public ParserResults ParseTemplate(TextReader input, string sourceFileName)
|
||||
{
|
||||
return ParseTemplate(input, null);
|
||||
return ParseTemplateCore(new SeekableTextReader(input), sourceFileName, cancelToken: null);
|
||||
}
|
||||
|
||||
[SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "Input object would be disposed if we dispose the wrapper. We don't own the input so we don't want to dispose it")]
|
||||
public ParserResults ParseTemplate(TextReader input, CancellationToken? cancelToken)
|
||||
{
|
||||
return ParseTemplateCore(new SeekableTextReader(input), cancelToken);
|
||||
return ParseTemplateCore(new SeekableTextReader(input), sourceFileName: null, cancelToken: cancelToken);
|
||||
}
|
||||
|
||||
protected internal virtual ParserResults ParseTemplateCore(ITextDocument input, CancellationToken? cancelToken)
|
||||
protected internal virtual ParserResults ParseTemplateCore(ITextDocument input,
|
||||
string sourceFileName,
|
||||
CancellationToken? cancelToken)
|
||||
{
|
||||
// Construct the parser
|
||||
RazorParser parser = CreateParser();
|
||||
var parser = CreateParser(sourceFileName);
|
||||
Debug.Assert(parser != null);
|
||||
return parser.Parse(input);
|
||||
}
|
||||
|
|
@ -243,7 +245,7 @@ namespace Microsoft.AspNet.Razor
|
|||
rootNamespace = (rootNamespace ?? Host.DefaultNamespace) ?? DefaultNamespace;
|
||||
|
||||
// Run the parser
|
||||
var parser = CreateParser();
|
||||
var parser = CreateParser(sourceFileName);
|
||||
Debug.Assert(parser != null);
|
||||
var results = parser.Parse(input);
|
||||
|
||||
|
|
@ -267,17 +269,19 @@ namespace Microsoft.AspNet.Razor
|
|||
Host.CodeLanguage.CreateCodeGenerator(className, rootNamespace, sourceFileName, Host));
|
||||
}
|
||||
|
||||
protected internal virtual RazorParser CreateParser()
|
||||
protected internal virtual RazorParser CreateParser(string sourceFileName)
|
||||
{
|
||||
var codeParser = Host.CodeLanguage.CreateCodeParser();
|
||||
var markupParser = Host.CreateMarkupParser();
|
||||
|
||||
return new RazorParser(Host.DecorateCodeParser(codeParser),
|
||||
Host.DecorateMarkupParser(markupParser),
|
||||
Host.TagHelperDescriptorResolver)
|
||||
var parser = new RazorParser(Host.DecorateCodeParser(codeParser),
|
||||
Host.DecorateMarkupParser(markupParser),
|
||||
Host.TagHelperDescriptorResolver)
|
||||
{
|
||||
DesignTimeMode = Host.DesignTimeMode
|
||||
};
|
||||
|
||||
return Host.DecorateRazorParser(parser, sourceFileName);
|
||||
}
|
||||
|
||||
protected internal virtual CodeBuilder CreateCodeBuilder(CodeBuilderContext context)
|
||||
|
|
|
|||
|
|
@ -18,11 +18,6 @@ namespace Microsoft.AspNet.Razor.TagHelpers
|
|||
/// </summary>
|
||||
public static readonly TagHelperDescriptorComparer Default = new TagHelperDescriptorComparer();
|
||||
|
||||
// Internal for testing
|
||||
internal TagHelperDescriptorComparer()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines if the two given tag helpers are equal.
|
||||
/// </summary>
|
||||
|
|
|
|||
|
|
@ -57,9 +57,9 @@ namespace Microsoft.AspNet.Razor.Test.Generator
|
|||
_tagHelperDescriptors = tagHelperDescriptors;
|
||||
}
|
||||
|
||||
protected internal override RazorParser CreateParser()
|
||||
protected internal override RazorParser CreateParser(string fileName)
|
||||
{
|
||||
var parser = base.CreateParser();
|
||||
var parser = base.CreateParser(fileName);
|
||||
|
||||
return new RazorParser(parser.CodeParser,
|
||||
parser.MarkupParser,
|
||||
|
|
|
|||
|
|
@ -2,10 +2,15 @@
|
|||
// 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.IO;
|
||||
using System.Linq;
|
||||
using Microsoft.AspNet.Razor.Parser;
|
||||
using Microsoft.AspNet.Razor.Parser.SyntaxTree;
|
||||
using Microsoft.AspNet.Razor.TagHelpers;
|
||||
using Microsoft.AspNet.Razor.Test.Framework;
|
||||
using Moq;
|
||||
using Moq.Protected;
|
||||
using Xunit;
|
||||
|
||||
namespace Microsoft.AspNet.Razor.Test.Parser
|
||||
|
|
@ -18,9 +23,9 @@ namespace Microsoft.AspNet.Razor.Test.Parser
|
|||
var factory = SpanFactory.CreateCsHtml();
|
||||
|
||||
// Arrange
|
||||
RazorParser parser = new RazorParser(new CSharpCodeParser(),
|
||||
new HtmlMarkupParser(),
|
||||
tagHelperDescriptorResolver: null);
|
||||
var parser = new RazorParser(new CSharpCodeParser(),
|
||||
new HtmlMarkupParser(),
|
||||
tagHelperDescriptorResolver: null);
|
||||
|
||||
// Act/Assert
|
||||
ParserTestBase.EvaluateResults(parser.Parse(new StringReader("foo @bar baz")),
|
||||
|
|
@ -40,12 +45,12 @@ namespace Microsoft.AspNet.Razor.Test.Parser
|
|||
var factory = SpanFactory.CreateCsHtml();
|
||||
|
||||
// Arrange
|
||||
RazorParser parser = new RazorParser(new CSharpCodeParser(),
|
||||
new HtmlMarkupParser(),
|
||||
tagHelperDescriptorResolver: null);
|
||||
var parser = new RazorParser(new CSharpCodeParser(),
|
||||
new HtmlMarkupParser(),
|
||||
tagHelperDescriptorResolver: null);
|
||||
|
||||
// Act
|
||||
ParserResults results = parser.Parse(new StringReader("foo @bar baz"));
|
||||
var results = parser.Parse(new StringReader("foo @bar baz"));
|
||||
|
||||
// Assert
|
||||
ParserTestBase.EvaluateResults(results,
|
||||
|
|
@ -59,6 +64,27 @@ namespace Microsoft.AspNet.Razor.Test.Parser
|
|||
factory.Markup(" baz")));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetTagHelperDescriptors_IsInvokedToLocateTagHelperDescriptors()
|
||||
{
|
||||
// Arrange
|
||||
var factory = SpanFactory.CreateCsHtml();
|
||||
var parser = new Mock<RazorParser>(new CSharpCodeParser(),
|
||||
new HtmlMarkupParser(),
|
||||
Mock.Of<ITagHelperDescriptorResolver>());
|
||||
parser.CallBase = true;
|
||||
parser.Protected()
|
||||
.Setup<IEnumerable<TagHelperDescriptor>>("GetTagHelperDescriptors", ItExpr.IsAny<Block>())
|
||||
.Returns(Enumerable.Empty<TagHelperDescriptor>())
|
||||
.Verifiable();
|
||||
|
||||
// Act
|
||||
parser.Object.Parse(new StringReader("<p>Hello world. The time is @DateTime.UtcNow</p>"));
|
||||
|
||||
// Assert
|
||||
parser.Verify();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ParseMethodSetsUpRunWithSpecifiedCodeParserMarkupParserAndListenerAndPassesToMarkupParser()
|
||||
{
|
||||
|
|
@ -68,16 +94,16 @@ namespace Microsoft.AspNet.Razor.Test.Parser
|
|||
private static void RunParseWithListenerTest(Action<RazorParser, TextReader> parserAction)
|
||||
{
|
||||
// Arrange
|
||||
ParserBase markupParser = new MockMarkupParser();
|
||||
ParserBase codeParser = new CSharpCodeParser();
|
||||
RazorParser parser = new RazorParser(codeParser, markupParser, tagHelperDescriptorResolver: null);
|
||||
TextReader expectedReader = new StringReader("foo");
|
||||
var markupParser = new MockMarkupParser();
|
||||
var codeParser = new CSharpCodeParser();
|
||||
var parser = new RazorParser(codeParser, markupParser, tagHelperDescriptorResolver: null);
|
||||
var expectedReader = new StringReader("foo");
|
||||
|
||||
// Act
|
||||
parserAction(parser, expectedReader);
|
||||
|
||||
// Assert
|
||||
ParserContext actualContext = markupParser.Context;
|
||||
var actualContext = markupParser.Context;
|
||||
Assert.NotNull(actualContext);
|
||||
Assert.Same(markupParser, actualContext.MarkupParser);
|
||||
Assert.Same(markupParser, actualContext.ActiveParser);
|
||||
|
|
|
|||
|
|
@ -29,10 +29,10 @@ namespace Microsoft.AspNet.Razor.Test
|
|||
public void ConstructorInitializesHost()
|
||||
{
|
||||
// Arrange
|
||||
RazorEngineHost host = new RazorEngineHost(new CSharpRazorCodeLanguage());
|
||||
var host = new RazorEngineHost(new CSharpRazorCodeLanguage());
|
||||
|
||||
// Act
|
||||
RazorTemplateEngine engine = new RazorTemplateEngine(host);
|
||||
var engine = new RazorTemplateEngine(host);
|
||||
|
||||
// Assert
|
||||
Assert.Same(host, engine.Host);
|
||||
|
|
@ -42,11 +42,11 @@ namespace Microsoft.AspNet.Razor.Test
|
|||
public void CreateParserMethodIsConstructedFromHost()
|
||||
{
|
||||
// Arrange
|
||||
RazorEngineHost host = CreateHost();
|
||||
RazorTemplateEngine engine = new RazorTemplateEngine(host);
|
||||
var host = CreateHost();
|
||||
var engine = new RazorTemplateEngine(host);
|
||||
|
||||
// Act
|
||||
RazorParser parser = engine.CreateParser();
|
||||
var parser = engine.CreateParser("some-file");
|
||||
|
||||
// Assert
|
||||
Assert.IsType<CSharpCodeParser>(parser.CodeParser);
|
||||
|
|
@ -57,12 +57,12 @@ namespace Microsoft.AspNet.Razor.Test
|
|||
public void CreateParserMethodSetsParserContextToDesignTimeModeIfHostSetToDesignTimeMode()
|
||||
{
|
||||
// Arrange
|
||||
RazorEngineHost host = CreateHost();
|
||||
RazorTemplateEngine engine = new RazorTemplateEngine(host);
|
||||
var host = CreateHost();
|
||||
var engine = new RazorTemplateEngine(host);
|
||||
host.DesignTimeMode = true;
|
||||
|
||||
// Act
|
||||
RazorParser parser = engine.CreateParser();
|
||||
var parser = engine.CreateParser("some-file");
|
||||
|
||||
// Assert
|
||||
Assert.True(parser.DesignTimeMode);
|
||||
|
|
@ -72,18 +72,18 @@ namespace Microsoft.AspNet.Razor.Test
|
|||
public void CreateParserMethodPassesParsersThroughDecoratorMethodsOnHost()
|
||||
{
|
||||
// Arrange
|
||||
ParserBase expectedCode = new Mock<ParserBase>().Object;
|
||||
ParserBase expectedMarkup = new Mock<ParserBase>().Object;
|
||||
var expectedCode = new Mock<ParserBase>().Object;
|
||||
var expectedMarkup = new Mock<ParserBase>().Object;
|
||||
|
||||
var mockHost = new Mock<RazorEngineHost>(new CSharpRazorCodeLanguage()) { CallBase = true };
|
||||
mockHost.Setup(h => h.DecorateCodeParser(It.IsAny<CSharpCodeParser>()))
|
||||
.Returns(expectedCode);
|
||||
mockHost.Setup(h => h.DecorateMarkupParser(It.IsAny<HtmlMarkupParser>()))
|
||||
.Returns(expectedMarkup);
|
||||
RazorTemplateEngine engine = new RazorTemplateEngine(mockHost.Object);
|
||||
var engine = new RazorTemplateEngine(mockHost.Object);
|
||||
|
||||
// Act
|
||||
RazorParser actual = engine.CreateParser();
|
||||
var actual = engine.CreateParser("some-file");
|
||||
|
||||
// Assert
|
||||
Assert.Equal(expectedCode, actual.CodeParser);
|
||||
|
|
@ -96,14 +96,14 @@ namespace Microsoft.AspNet.Razor.Test
|
|||
// Arrange
|
||||
var mockHost = new Mock<RazorEngineHost>(new CSharpRazorCodeLanguage()) { CallBase = true };
|
||||
|
||||
RazorCodeGenerator expected = new Mock<RazorCodeGenerator>("Foo", "Bar", "Baz", mockHost.Object).Object;
|
||||
var expected = new Mock<RazorCodeGenerator>("Foo", "Bar", "Baz", mockHost.Object).Object;
|
||||
|
||||
mockHost.Setup(h => h.DecorateCodeGenerator(It.IsAny<CSharpRazorCodeGenerator>()))
|
||||
.Returns(expected);
|
||||
RazorTemplateEngine engine = new RazorTemplateEngine(mockHost.Object);
|
||||
var engine = new RazorTemplateEngine(mockHost.Object);
|
||||
|
||||
// Act
|
||||
RazorCodeGenerator actual = engine.CreateCodeGenerator("Foo", "Bar", "Baz");
|
||||
var actual = engine.CreateCodeGenerator("Foo", "Bar", "Baz");
|
||||
|
||||
// Assert
|
||||
Assert.Equal(expected, actual);
|
||||
|
|
@ -138,15 +138,16 @@ namespace Microsoft.AspNet.Razor.Test
|
|||
public void ParseTemplateCopiesTextReaderContentToSeekableTextReaderAndPassesToParseTemplateCore()
|
||||
{
|
||||
// Arrange
|
||||
Mock<RazorTemplateEngine> mockEngine = new Mock<RazorTemplateEngine>(CreateHost());
|
||||
TextReader reader = new StringReader("foo");
|
||||
CancellationTokenSource source = new CancellationTokenSource();
|
||||
var mockEngine = new Mock<RazorTemplateEngine>(CreateHost());
|
||||
var reader = new StringReader("foo");
|
||||
var source = new CancellationTokenSource();
|
||||
|
||||
// Act
|
||||
mockEngine.Object.ParseTemplate(reader, cancelToken: source.Token);
|
||||
|
||||
// Assert
|
||||
mockEngine.Verify(e => e.ParseTemplateCore(It.Is<SeekableTextReader>(l => l.ReadToEnd() == "foo"),
|
||||
null,
|
||||
source.Token));
|
||||
}
|
||||
|
||||
|
|
@ -154,12 +155,12 @@ namespace Microsoft.AspNet.Razor.Test
|
|||
public void GenerateCodeCopiesTextReaderContentToSeekableTextReaderAndPassesToGenerateCodeCore()
|
||||
{
|
||||
// Arrange
|
||||
Mock<RazorTemplateEngine> mockEngine = new Mock<RazorTemplateEngine>(CreateHost());
|
||||
TextReader reader = new StringReader("foo");
|
||||
CancellationTokenSource source = new CancellationTokenSource();
|
||||
string className = "Foo";
|
||||
string ns = "Bar";
|
||||
string src = "Baz";
|
||||
var mockEngine = new Mock<RazorTemplateEngine>(CreateHost());
|
||||
var reader = new StringReader("foo");
|
||||
var source = new CancellationTokenSource();
|
||||
var className = "Foo";
|
||||
var ns = "Bar";
|
||||
var src = "Baz";
|
||||
|
||||
// Act
|
||||
mockEngine.Object.GenerateCode(reader, className: className, rootNamespace: ns, sourceFileName: src, cancelToken: source.Token);
|
||||
|
|
@ -173,10 +174,10 @@ namespace Microsoft.AspNet.Razor.Test
|
|||
public void ParseTemplateOutputsResultsOfParsingProvidedTemplateSource()
|
||||
{
|
||||
// Arrange
|
||||
RazorTemplateEngine engine = new RazorTemplateEngine(CreateHost());
|
||||
var engine = new RazorTemplateEngine(CreateHost());
|
||||
|
||||
// Act
|
||||
ParserResults results = engine.ParseTemplate(new StringTextBuffer("foo @bar("));
|
||||
var results = engine.ParseTemplate(new StringTextBuffer("foo @bar("));
|
||||
|
||||
// Assert
|
||||
Assert.False(results.Success);
|
||||
|
|
@ -188,10 +189,10 @@ namespace Microsoft.AspNet.Razor.Test
|
|||
public void GenerateOutputsResultsOfParsingAndGeneration()
|
||||
{
|
||||
// Arrange
|
||||
RazorTemplateEngine engine = new RazorTemplateEngine(CreateHost());
|
||||
var engine = new RazorTemplateEngine(CreateHost());
|
||||
|
||||
// Act
|
||||
GeneratorResults results = engine.GenerateCode(new StringTextBuffer("foo @bar("));
|
||||
var results = engine.GenerateCode(new StringTextBuffer("foo @bar("));
|
||||
|
||||
// Assert
|
||||
Assert.False(results.Success);
|
||||
|
|
@ -204,10 +205,10 @@ namespace Microsoft.AspNet.Razor.Test
|
|||
public void GenerateOutputsDesignTimeMappingsIfDesignTimeSetOnHost()
|
||||
{
|
||||
// Arrange
|
||||
RazorTemplateEngine engine = new RazorTemplateEngine(CreateHost(designTime: true));
|
||||
var engine = new RazorTemplateEngine(CreateHost(designTime: true));
|
||||
|
||||
// Act
|
||||
GeneratorResults results = engine.GenerateCode(new StringTextBuffer("foo @bar()"), className: null, rootNamespace: null, sourceFileName: "foo.cshtml");
|
||||
var results = engine.GenerateCode(new StringTextBuffer("foo @bar()"), className: null, rootNamespace: null, sourceFileName: "foo.cshtml");
|
||||
|
||||
// Assert
|
||||
Assert.True(results.Success);
|
||||
|
|
@ -267,6 +268,38 @@ namespace Microsoft.AspNet.Razor.Test
|
|||
Assert.Null(engine.Checksum);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GenerateCode_UsesDecoratedRazorParser()
|
||||
{
|
||||
// Arrange
|
||||
Mock<RazorParser> parser = null;
|
||||
var host = new Mock<RazorEngineHost>(new CSharpRazorCodeLanguage())
|
||||
{
|
||||
CallBase = true
|
||||
};
|
||||
host.Setup(p => p.DecorateRazorParser(It.IsAny<RazorParser>(), "foo.cshtml"))
|
||||
.Returns((RazorParser p, string file) =>
|
||||
{
|
||||
parser = new Mock<RazorParser>(p)
|
||||
{
|
||||
CallBase = true
|
||||
};
|
||||
return parser.Object;
|
||||
})
|
||||
.Verifiable();
|
||||
|
||||
var engine = new RazorTemplateEngine(host.Object);
|
||||
|
||||
// Act
|
||||
var results = engine.GenerateCode(Stream.Null, "some-class", "some-ns", "foo.cshtml");
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(parser);
|
||||
|
||||
parser.Verify(v => v.Parse(It.IsAny<ITextDocument>()), Times.Once());
|
||||
host.Verify();
|
||||
}
|
||||
|
||||
private static RazorEngineHost CreateHost(bool designTime = false)
|
||||
{
|
||||
return new RazorEngineHost(new CSharpRazorCodeLanguage())
|
||||
|
|
@ -284,11 +317,11 @@ namespace Microsoft.AspNet.Razor.Test
|
|||
|
||||
public string Checksum { get; set; }
|
||||
|
||||
protected internal override GeneratorResults GenerateCodeCore(ITextDocument input,
|
||||
string className,
|
||||
string rootNamespace,
|
||||
string sourceFileName,
|
||||
string checksum,
|
||||
protected internal override GeneratorResults GenerateCodeCore(ITextDocument input,
|
||||
string className,
|
||||
string rootNamespace,
|
||||
string sourceFileName,
|
||||
string checksum,
|
||||
CancellationToken? cancelToken)
|
||||
{
|
||||
Checksum = checksum;
|
||||
|
|
|
|||
Loading…
Reference in New Issue