public void GetDescriptors_LocatesNestedRemoveTagHelperChunkGenerator() { // Arrange var resolver = new TestTagHelperDescriptorResolver(); var tagHelperDirectiveSpanVisitor = new TagHelperDirectiveSpanVisitor(resolver, new ErrorSink()); var document = new MarkupBlock( new DirectiveBlock( Factory.CodeTransition(), Factory.MetaCode(SyntaxConstants.CSharp.RemoveTagHelperKeyword + " ") .Accepts(AcceptedCharacters.None), Factory.Code("\"something\"").AsRemoveTagHelper("something")) ); var expectedRegistration = new TagHelperDirectiveDescriptor { DirectiveText = "something", DirectiveType = TagHelperDirectiveType.RemoveTagHelper }; // Act tagHelperDirectiveSpanVisitor.GetDescriptors(document); // Assert var directiveDescriptor = Assert.Single(resolver.DirectiveDescriptors); Assert.Equal(expectedRegistration, directiveDescriptor, TagHelperDirectiveDescriptorComparer.Default); }
public void GetDescriptors_LocatesTagHelperCodeGenerator_CreatesDirectiveDescriptors() { // Arrange var resolver = new TestTagHelperDescriptorResolver(); var tagHelperDirectiveSpanVisitor = new TagHelperDirectiveSpanVisitor(resolver, new ParserErrorSink()); var document = new MarkupBlock( Factory.Code("\"one\"").AsAddTagHelper("one"), Factory.Code("\"two\"").AsRemoveTagHelper("two"), Factory.Code("\"three\"").AsRemoveTagHelper("three"), Factory.Code("\"four\"").AsTagHelperPrefixDirective("four")); var expectedDescriptors = new TagHelperDirectiveDescriptor[] { new TagHelperDirectiveDescriptor("one", TagHelperDirectiveType.AddTagHelper), new TagHelperDirectiveDescriptor("two", TagHelperDirectiveType.RemoveTagHelper), new TagHelperDirectiveDescriptor("three", TagHelperDirectiveType.RemoveTagHelper), new TagHelperDirectiveDescriptor("four", TagHelperDirectiveType.TagHelperPrefix), }; // Act tagHelperDirectiveSpanVisitor.GetDescriptors(document); // Assert Assert.Equal( expectedDescriptors, resolver.DirectiveDescriptors, TagHelperDirectiveDescriptorComparer.Default); }
public void GetDescriptors_LocatesTagHelperPrefixDirectiveCodeGenerator() { // Arrange var resolver = new TestTagHelperDescriptorResolver(); var tagHelperDirectiveSpanVisitor = new TagHelperDirectiveSpanVisitor(resolver, new ParserErrorSink()); var document = new MarkupBlock( new DirectiveBlock( Factory.CodeTransition(), Factory .MetaCode(SyntaxConstants.CSharp.TagHelperPrefixKeyword + " ") .Accepts(AcceptedCharacters.None), Factory.Code("\"something\"").AsTagHelperPrefixDirective("something"))); var expectedDirectiveDescriptor = new TagHelperDirectiveDescriptor("something", TagHelperDirectiveType.TagHelperPrefix); // Act tagHelperDirectiveSpanVisitor.GetDescriptors(document); // Assert var directiveDescriptor = Assert.Single(resolver.DirectiveDescriptors); Assert.Equal( expectedDirectiveDescriptor, directiveDescriptor, TagHelperDirectiveDescriptorComparer.Default); }
/// <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> /// <param name="errorSink">Used to manage <see cref="RazorError"/>s encountered during the Razor parsing /// phase.</param> /// <returns><see cref="TagHelperDescriptor"/>s that are applicable to the <paramref name="documentRoot"/> /// </returns> protected virtual IEnumerable <TagHelperDescriptor> GetTagHelperDescriptors([NotNull] Block documentRoot, [NotNull] ErrorSink errorSink) { var addOrRemoveTagHelperSpanVisitor = new TagHelperDirectiveSpanVisitor(TagHelperDescriptorResolver, errorSink); return(addOrRemoveTagHelperSpanVisitor.GetDescriptors(documentRoot)); }
public void GetDescriptors_RemoveTagHelperNotInDocument_DoesNotThrow() { // Arrange var tagHelperDirectiveSpanVisitor = new TagHelperDirectiveSpanVisitor( new TestTagHelperDescriptorResolver(), new ErrorSink()); var document = new MarkupBlock(Factory.Markup("Hello World")); // Act var descriptors = tagHelperDirectiveSpanVisitor.GetDescriptors(document); Assert.Empty(descriptors); }
public void GetDescriptors_LocatesQuotedTagHelperDirectives_CreatesDirectiveDescriptors( MarkupBlock document, IEnumerable <TagHelperDirectiveDescriptor> expectedDescriptors) { // Arrange var resolver = new TestTagHelperDescriptorResolver(); var tagHelperDirectiveSpanVisitor = new TagHelperDirectiveSpanVisitor(resolver, new ErrorSink()); // Act tagHelperDirectiveSpanVisitor.GetDescriptors(document); // Assert Assert.Equal( expectedDescriptors, resolver.DirectiveDescriptors, TagHelperDirectiveDescriptorComparer.Default); }
/// <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> /// <param name="errorSink">Used to manage <see cref="RazorError"/>s encountered during the Razor parsing /// phase.</param> /// <returns><see cref="TagHelperDescriptor"/>s that are applicable to the <paramref name="documentRoot"/> /// </returns> protected virtual IEnumerable <TagHelperDescriptor> GetTagHelperDescriptors(Block documentRoot, ErrorSink errorSink) { if (documentRoot == null) { throw new ArgumentNullException(nameof(documentRoot)); } if (errorSink == null) { throw new ArgumentNullException(nameof(errorSink)); } var addOrRemoveTagHelperSpanVisitor = new TagHelperDirectiveSpanVisitor(TagHelperDescriptorResolver, errorSink); return(addOrRemoveTagHelperSpanVisitor.GetDescriptors(documentRoot)); }
public RazorSyntaxTree Execute(RazorCodeDocument document, RazorSyntaxTree syntaxTree) { var resolver = Engine.Features.OfType <TagHelperFeature>().FirstOrDefault()?.Resolver; if (resolver == null) { // No TagHelpers, so nothing to do. return(syntaxTree); } var visitor = new TagHelperDirectiveSpanVisitor(resolver, document.ErrorSink); var descriptors = visitor.GetDescriptors(syntaxTree.Root); var rewriter = new TagHelperParseTreeRewriter(new TagHelperDescriptorProvider(descriptors)); var context = new RewritingContext(syntaxTree.Root, document.ErrorSink); rewriter.Rewrite(context); return(RazorSyntaxTree.Create(context.SyntaxTree, context.ErrorSink.Errors)); }
public void GetDescriptors_InvokesResolveOnceForAllDirectives() { // Arrange var resolver = new Mock <ITagHelperDescriptorResolver>(); resolver.Setup(mock => mock.Resolve(It.IsAny <TagHelperDescriptorResolutionContext>())) .Returns(Enumerable.Empty <TagHelperDescriptor>()); var tagHelperDirectiveSpanVisitor = new TagHelperDirectiveSpanVisitor( resolver.Object, new ErrorSink()); var document = new MarkupBlock( Factory.Code("\"one\"").AsAddTagHelper("one"), Factory.Code("\"two\"").AsRemoveTagHelper("two"), Factory.Code("\"three\"").AsRemoveTagHelper("three"), Factory.Code("\"four\"").AsTagHelperPrefixDirective("four")); // Act tagHelperDirectiveSpanVisitor.GetDescriptors(document); // Assert resolver.Verify(mock => mock.Resolve(It.IsAny <TagHelperDescriptorResolutionContext>()), Times.Once); }