コード例 #1
0
        public void FlattenFlattensStartAndEndTagTagHelpers()
        {
            // Arrange
            var spanFactory  = new SpanFactory();
            var blockFactory = new BlockFactory(spanFactory);
            var tagHelper    = (TagHelperBlock)blockFactory.TagHelperBlock(
                tagName: "div",
                tagMode: TagMode.StartTagAndEndTag,
                start: SourceLocation.Zero,
                startTag: blockFactory.MarkupTagBlock("<div>"),
                children: new SyntaxTreeNode[0],
                endTag: blockFactory.MarkupTagBlock("</div>"));

            spanFactory.Reset();
            var expectedStartTag = spanFactory.Markup("<div>");
            var expectedEndTag   = spanFactory.Markup("</div>");

            // Act
            var flattenedNodes = tagHelper.Flatten();

            // Assert
            Assert.Collection(
                flattenedNodes,
                first =>
            {
                Assert.True(first.EquivalentTo(expectedStartTag));
            },
                second =>
            {
                Assert.True(second.EquivalentTo(expectedEndTag));
            });
        }
コード例 #2
0
ファイル: CSharpErrorTest.cs プロジェクト: yuxi214/Razor
        public void ParseBlockRequiresControlFlowStatementsToHaveBraces()
        {
            var expectedMessage = Resources.FormatParseError_SingleLine_ControlFlowStatements_Not_Allowed("{", "<");

            ParseBlockTest("if(foo) <p>Bar</p> else if(bar) <p>Baz</p> else <p>Boz</p>",
                           new StatementBlock(
                               Factory.Code("if(foo) ").AsStatement(),
                               new MarkupBlock(
                                   BlockFactory.MarkupTagBlock("<p>", AcceptedCharactersInternal.None),
                                   Factory.Markup("Bar"),
                                   BlockFactory.MarkupTagBlock("</p>", AcceptedCharactersInternal.None),
                                   Factory.Markup(" ").Accepts(AcceptedCharactersInternal.None)),
                               Factory.Code("else if(bar) ").AsStatement(),
                               new MarkupBlock(
                                   BlockFactory.MarkupTagBlock("<p>", AcceptedCharactersInternal.None),
                                   Factory.Markup("Baz"),
                                   BlockFactory.MarkupTagBlock("</p>", AcceptedCharactersInternal.None),
                                   Factory.Markup(" ").Accepts(AcceptedCharactersInternal.None)),
                               Factory.Code("else ").AsStatement(),
                               new MarkupBlock(
                                   BlockFactory.MarkupTagBlock("<p>", AcceptedCharactersInternal.None),
                                   Factory.Markup("Boz"),
                                   BlockFactory.MarkupTagBlock("</p>", AcceptedCharactersInternal.None)),
                               Factory.EmptyCSharp().AsStatement()
                               ),
                           RazorDiagnosticFactory.CreateParsing_SingleLineControlFlowStatementsNotAllowed(
                               new SourceSpan(new SourceLocation(8, 0, 8), contentLength: 1), "{", "<"),
                           RazorDiagnosticFactory.CreateParsing_SingleLineControlFlowStatementsNotAllowed(
                               new SourceSpan(new SourceLocation(32, 0, 32), contentLength: 1), "{", "<"),
                           RazorDiagnosticFactory.CreateParsing_SingleLineControlFlowStatementsNotAllowed(
                               new SourceSpan(new SourceLocation(48, 0, 48), contentLength: 1), "{", "<"));
        }
コード例 #3
0
 public void IncompleteVoidElementEndTag(string tagName)
 {
     ParseBlockTest("<" + tagName + "></" + tagName,
                    new MarkupBlock(
                        BlockFactory.MarkupTagBlock("<" + tagName + ">", AcceptedCharactersInternal.None),
                        BlockFactory.MarkupTagBlock("</" + tagName)));
 }
コード例 #4
0
 public void ParseBlockCorrectlyParsesMarkupIncorrectyAssumedToBeWithinAStatement()
 {
     ParseBlockTest("if(foo) {" + Environment.NewLine
                    + "    var foo = \"foo bar baz" + Environment.NewLine
                    + "    <p>Foo is @foo</p>" + Environment.NewLine
                    + "}",
                    new StatementBlock(
                        Factory.Code($"if(foo) {{{Environment.NewLine}    var foo = \"foo bar baz{Environment.NewLine}    ").AsStatement(),
                        new MarkupBlock(
                            BlockFactory.MarkupTagBlock("<p>", AcceptedCharactersInternal.None),
                            Factory.Markup("Foo is "),
                            new ExpressionBlock(
                                Factory.CodeTransition(),
                                Factory.Code("foo")
                                .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
                                .Accepts(AcceptedCharactersInternal.NonWhiteSpace)),
                            BlockFactory.MarkupTagBlock("</p>", AcceptedCharactersInternal.None),
                            Factory.Markup(Environment.NewLine).Accepts(AcceptedCharactersInternal.None)),
                        Factory.Code("}").AsStatement()
                        ),
                    new RazorError(
                        LegacyResources.ParseError_Unterminated_String_Literal,
                        new SourceLocation(23 + Environment.NewLine.Length, 1, 14),
                        length: 1));
 }
コード例 #5
0
        public void ParseBlockRequiresControlFlowStatementsToHaveBraces()
        {
            var expectedMessage = LegacyResources.FormatParseError_SingleLine_ControlFlowStatements_Not_Allowed("{", "<");

            ParseBlockTest("if(foo) <p>Bar</p> else if(bar) <p>Baz</p> else <p>Boz</p>",
                           new StatementBlock(
                               Factory.Code("if(foo) ").AsStatement(),
                               new MarkupBlock(
                                   BlockFactory.MarkupTagBlock("<p>", AcceptedCharactersInternal.None),
                                   Factory.Markup("Bar"),
                                   BlockFactory.MarkupTagBlock("</p>", AcceptedCharactersInternal.None),
                                   Factory.Markup(" ").Accepts(AcceptedCharactersInternal.None)),
                               Factory.Code("else if(bar) ").AsStatement(),
                               new MarkupBlock(
                                   BlockFactory.MarkupTagBlock("<p>", AcceptedCharactersInternal.None),
                                   Factory.Markup("Baz"),
                                   BlockFactory.MarkupTagBlock("</p>", AcceptedCharactersInternal.None),
                                   Factory.Markup(" ").Accepts(AcceptedCharactersInternal.None)),
                               Factory.Code("else ").AsStatement(),
                               new MarkupBlock(
                                   BlockFactory.MarkupTagBlock("<p>", AcceptedCharactersInternal.None),
                                   Factory.Markup("Boz"),
                                   BlockFactory.MarkupTagBlock("</p>", AcceptedCharactersInternal.None)),
                               Factory.EmptyCSharp().AsStatement()
                               ),
                           new RazorError(expectedMessage, 8, 0, 8, 1),
                           new RazorError(expectedMessage, 32, 0, 32, 1),
                           new RazorError(expectedMessage, 48, 0, 48, 1));
        }
コード例 #6
0
 public void ScriptTag()
 {
     ParseDocumentTest("<script>foo < bar && quantity.toString() !== orderQty.val()</script>",
                       new MarkupBlock(
                           BlockFactory.MarkupTagBlock("<script>"),
                           Factory.Markup("foo < bar && quantity.toString() !== orderQty.val()"),
                           BlockFactory.MarkupTagBlock("</script>")));
 }
コード例 #7
0
 public void ScriptTag_WithNestedMalformedTag()
 {
     ParseDocumentTest("<script>var four = 4; /* </ */</script>",
                       new MarkupBlock(
                           BlockFactory.MarkupTagBlock("<script>"),
                           Factory.Markup("var four = 4; /* </ */"),
                           BlockFactory.MarkupTagBlock("</script>")));
 }
コード例 #8
0
 public void ScriptTag_WithNestedTag()
 {
     ParseDocumentTest("<script><p></p></script>",
                       new MarkupBlock(
                           BlockFactory.MarkupTagBlock("<script>"),
                           Factory.Markup("<p></p>"),
                           BlockFactory.MarkupTagBlock("</script>")));
 }
コード例 #9
0
 public void VoidElementFollowedByCloseTag(string tagName)
 {
     ParseBlockTest("<" + tagName + "> </" + tagName + ">foo",
                    new MarkupBlock(
                        BlockFactory.MarkupTagBlock("<" + tagName + ">", AcceptedCharactersInternal.None),
                        Factory.Markup(" "),
                        BlockFactory.MarkupTagBlock("</" + tagName + ">", AcceptedCharactersInternal.None)));
 }
コード例 #10
0
 public void ElementTags()
 {
     ParseBlockTest("<p>Foo</p> Bar",
                    new MarkupBlock(
                        BlockFactory.MarkupTagBlock("<p>", AcceptedCharactersInternal.None),
                        Factory.Markup("Foo"),
                        BlockFactory.MarkupTagBlock("</p>", AcceptedCharactersInternal.None),
                        Factory.Markup(" ").Accepts(AcceptedCharactersInternal.None)));
 }
コード例 #11
0
ファイル: HtmlTagsTest.cs プロジェクト: yuxi214/Razor
 public void EmptyTagNestsLikeNormalTag()
 {
     ParseBlockTest("<p></> Bar",
                    new MarkupBlock(
                        BlockFactory.MarkupTagBlock("<p>", AcceptedCharactersInternal.None),
                        BlockFactory.MarkupTagBlock("</>", AcceptedCharactersInternal.None),
                        Factory.Markup(" ").Accepts(AcceptedCharactersInternal.None)),
                    RazorDiagnosticFactory.CreateParsing_MissingEndTag(
                        new SourceSpan(new SourceLocation(1, 0, 1), contentLength: 1), "p"));
 }
コード例 #12
0
 public void EmptyTag()
 {
     // This can happen in situations where a user is in VS' HTML editor and they're modifying
     // the contents of an HTML tag.
     ParseBlockTest("<></> Bar",
                    new MarkupBlock(
                        BlockFactory.MarkupTagBlock("<>", AcceptedCharactersInternal.None),
                        BlockFactory.MarkupTagBlock("</>", AcceptedCharactersInternal.None),
                        Factory.Markup(" ").Accepts(AcceptedCharactersInternal.None)));
 }
コード例 #13
0
 public void EmptyTagNestsLikeNormalTag()
 {
     ParseBlockTest("<p></> Bar",
                    new MarkupBlock(
                        BlockFactory.MarkupTagBlock("<p>", AcceptedCharactersInternal.None),
                        BlockFactory.MarkupTagBlock("</>", AcceptedCharactersInternal.None),
                        Factory.Markup(" ").Accepts(AcceptedCharactersInternal.None)),
                    new RazorError(
                        LegacyResources.FormatParseError_MissingEndTag("p"),
                        new SourceLocation(1, 0, 1),
                        length: 1));
 }
コード例 #14
0
ファイル: CSharpErrorTest.cs プロジェクト: yuxi214/Razor
 public void ParseBlockOutputsErrorIfAtSignFollowedByLessThanSignAtStatementStart()
 {
     ParseBlockTest("if(foo) { @<p>Bar</p> }",
                    new StatementBlock(
                        Factory.Code("if(foo) {").AsStatement(),
                        new MarkupBlock(
                            Factory.Markup(" "),
                            Factory.MarkupTransition(),
                            BlockFactory.MarkupTagBlock("<p>", AcceptedCharactersInternal.None),
                            Factory.Markup("Bar"),
                            BlockFactory.MarkupTagBlock("</p>", AcceptedCharactersInternal.None),
                            Factory.Markup(" ").Accepts(AcceptedCharactersInternal.None)),
                        Factory.Code("}").AsStatement()
                        ),
                    RazorDiagnosticFactory.CreateParsing_AtInCodeMustBeFollowedByColonParenOrIdentifierStart(
                        new SourceSpan(new SourceLocation(10, 0, 10), contentLength: 1)));
 }
コード例 #15
0
ファイル: CSharpErrorTest.cs プロジェクト: yuxi214/Razor
 public void ParseBlockResumesIfStatementAfterOpenParen()
 {
     ParseBlockTest("if(" + Environment.NewLine
                    + "else { <p>Foo</p> }",
                    new StatementBlock(
                        Factory.Code($"if({Environment.NewLine}else {{").AsStatement(),
                        new MarkupBlock(
                            Factory.Markup(" "),
                            BlockFactory.MarkupTagBlock("<p>", AcceptedCharactersInternal.None),
                            Factory.Markup("Foo"),
                            BlockFactory.MarkupTagBlock("</p>", AcceptedCharactersInternal.None),
                            Factory.Markup(" ").Accepts(AcceptedCharactersInternal.None)),
                        Factory.Code("}").AsStatement().Accepts(AcceptedCharactersInternal.None)
                        ),
                    RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF(
                        new SourceSpan(new SourceLocation(2, 0, 2), contentLength: 1), "(", ")"));
 }
コード例 #16
0
 public void ParseBlockOutputsErrorIfAtSignFollowedByLessThanSignAtStatementStart()
 {
     ParseBlockTest("if(foo) { @<p>Bar</p> }",
                    new StatementBlock(
                        Factory.Code("if(foo) {").AsStatement(),
                        new MarkupBlock(
                            Factory.Markup(" "),
                            Factory.MarkupTransition(),
                            BlockFactory.MarkupTagBlock("<p>", AcceptedCharactersInternal.None),
                            Factory.Markup("Bar"),
                            BlockFactory.MarkupTagBlock("</p>", AcceptedCharactersInternal.None),
                            Factory.Markup(" ").Accepts(AcceptedCharactersInternal.None)),
                        Factory.Code("}").AsStatement()
                        ),
                    new RazorError(
                        LegacyResources.ParseError_AtInCode_Must_Be_Followed_By_Colon_Paren_Or_Identifier_Start,
                        new SourceLocation(10, 0, 10),
                        length: 1));
 }
コード例 #17
0
 public void ParseBlockResumesIfStatementAfterOpenParen()
 {
     ParseBlockTest("if(" + Environment.NewLine
                    + "else { <p>Foo</p> }",
                    new StatementBlock(
                        Factory.Code($"if({Environment.NewLine}else {{").AsStatement(),
                        new MarkupBlock(
                            Factory.Markup(" "),
                            BlockFactory.MarkupTagBlock("<p>", AcceptedCharactersInternal.None),
                            Factory.Markup("Foo"),
                            BlockFactory.MarkupTagBlock("</p>", AcceptedCharactersInternal.None),
                            Factory.Markup(" ").Accepts(AcceptedCharactersInternal.None)),
                        Factory.Code("}").AsStatement().Accepts(AcceptedCharactersInternal.None)
                        ),
                    new RazorError(
                        LegacyResources.FormatParseError_Expected_CloseBracket_Before_EOF("(", ")"),
                        new SourceLocation(2, 0, 2),
                        length: 1));
 }
コード例 #18
0
ファイル: CSharpErrorTest.cs プロジェクト: yuxi214/Razor
 public void ParseBlockCorrectlyRecoversFromMissingCloseParenInExpressionWithinCode()
 {
     ParseBlockTest(@"{string.Format(<html></html>}",
                    new StatementBlock(
                        Factory.MetaCode("{").Accepts(AcceptedCharactersInternal.None),
                        Factory.Code("string.Format(")
                        .AsStatement()
                        .AutoCompleteWith(autoCompleteString: null),
                        new MarkupBlock(
                            BlockFactory.MarkupTagBlock("<html>", AcceptedCharactersInternal.None),
                            BlockFactory.MarkupTagBlock("</html>", AcceptedCharactersInternal.None)),
                        Factory.EmptyCSharp().AsStatement(),
                        Factory.MetaCode("}").Accepts(AcceptedCharactersInternal.None)),
                    expectedErrors: new[]
     {
         RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF(
             new SourceSpan(new SourceLocation(14, 0, 14), contentLength: 1), "(", ")"),
     });
 }
コード例 #19
0
 public void ParseBlockCorrectlyRecoversFromMissingCloseParenInExpressionWithinCode()
 {
     ParseBlockTest(@"{string.Format(<html></html>}",
                    new StatementBlock(
                        Factory.MetaCode("{").Accepts(AcceptedCharactersInternal.None),
                        Factory.Code("string.Format(")
                        .AsStatement()
                        .AutoCompleteWith(autoCompleteString: null),
                        new MarkupBlock(
                            BlockFactory.MarkupTagBlock("<html>", AcceptedCharactersInternal.None),
                            BlockFactory.MarkupTagBlock("</html>", AcceptedCharactersInternal.None)),
                        Factory.EmptyCSharp().AsStatement(),
                        Factory.MetaCode("}").Accepts(AcceptedCharactersInternal.None)),
                    expectedErrors: new[]
     {
         new RazorError(
             LegacyResources.FormatParseError_Expected_CloseBracket_Before_EOF("(", ")"),
             new SourceLocation(14, 0, 14),
             length: 1)
     });
 }
コード例 #20
0
        public void FlattenFlattensSelfClosingTagHelpers()
        {
            // Arrange
            var spanFactory  = new SpanFactory();
            var blockFactory = new BlockFactory(spanFactory);
            var tagHelper    = (TagHelperBlock)blockFactory.TagHelperBlock(
                tagName: "input",
                tagMode: TagMode.SelfClosing,
                start: SourceLocation.Zero,
                startTag: blockFactory.MarkupTagBlock("<input />"),
                children: new SyntaxTreeNode[0],
                endTag: null);

            spanFactory.Reset();
            var expectedNode = spanFactory.Markup("<input />");

            // Act
            var flattenedNodes = tagHelper.Flatten();

            // Assert
            var node = Assert.Single(flattenedNodes);

            Assert.True(node.EquivalentTo(expectedNode));
        }