Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        /// <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));
        }
Exemple #5
0
        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);
        }
Exemple #7
0
        /// <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));
        }
Exemple #8
0
        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));
        }
Exemple #9
0
        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);
        }