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)); }); }
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), "{", "<")); }
public void IncompleteVoidElementEndTag(string tagName) { ParseBlockTest("<" + tagName + "></" + tagName, new MarkupBlock( BlockFactory.MarkupTagBlock("<" + tagName + ">", AcceptedCharactersInternal.None), BlockFactory.MarkupTagBlock("</" + tagName))); }
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)); }
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)); }
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>"))); }
public void ScriptTag_WithNestedMalformedTag() { ParseDocumentTest("<script>var four = 4; /* </ */</script>", new MarkupBlock( BlockFactory.MarkupTagBlock("<script>"), Factory.Markup("var four = 4; /* </ */"), BlockFactory.MarkupTagBlock("</script>"))); }
public void ScriptTag_WithNestedTag() { ParseDocumentTest("<script><p></p></script>", new MarkupBlock( BlockFactory.MarkupTagBlock("<script>"), Factory.Markup("<p></p>"), BlockFactory.MarkupTagBlock("</script>"))); }
public void VoidElementFollowedByCloseTag(string tagName) { ParseBlockTest("<" + tagName + "> </" + tagName + ">foo", new MarkupBlock( BlockFactory.MarkupTagBlock("<" + tagName + ">", AcceptedCharactersInternal.None), Factory.Markup(" "), BlockFactory.MarkupTagBlock("</" + tagName + ">", AcceptedCharactersInternal.None))); }
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))); }
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")); }
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))); }
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)); }
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))); }
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), "(", ")")); }
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)); }
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)); }
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), "(", ")"), }); }
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) }); }
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)); }