aspnetcore/test/Microsoft.AspNetCore.Razor..../Legacy/HtmlBlockTest.cs

278 lines
7.5 KiB
C#

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Xunit;
namespace Microsoft.AspNetCore.Razor.Language.Legacy
{
public class HtmlBlockTest : CsHtmlMarkupParserTestBase
{
public HtmlBlockTest()
{
UseBaselineTests = true;
}
[Fact]
public void ParseBlockHandlesUnbalancedTripleDashHTMLComments()
{
ParseDocumentTest(
@"@{
<!-- Hello, I'm a comment that shouldn't break razor --->
}");
}
[Fact]
public void ParseBlockHandlesOpenAngleAtEof()
{
ParseDocumentTest("@{" + Environment.NewLine
+ "<");
}
[Fact]
public void ParseBlockHandlesOpenAngleWithProperTagFollowingIt()
{
ParseDocumentTest("@{" + Environment.NewLine
+ "<" + Environment.NewLine
+ "</html>",
designTime: true);
}
[Fact]
public void TagWithoutCloseAngleDoesNotTerminateBlock()
{
ParseBlockTest("< " + Environment.NewLine
+ " ");
}
[Fact]
public void ParseBlockAllowsStartAndEndTagsToDifferInCase()
{
ParseBlockTest("<li><p>Foo</P></lI>");
}
[Fact]
public void ParseBlockReadsToEndOfLineIfFirstCharacterAfterTransitionIsColon()
{
ParseBlockTest("@:<li>Foo Bar Baz" + Environment.NewLine
+ "bork");
}
[Fact]
public void ParseBlockStopsParsingSingleLineBlockAtEOFIfNoEOLReached()
{
ParseBlockTest("@:foo bar");
}
[Fact]
public void ParseBlockStopsAtMatchingCloseTagToStartTag()
{
ParseBlockTest("<a><b></b></a><c></c>");
}
[Fact]
public void ParseBlockParsesUntilMatchingEndTagIfFirstNonWhitespaceCharacterIsStartTag()
{
ParseBlockTest("<baz><boz><biz></biz></boz></baz>");
}
[Fact]
public void ParseBlockAllowsUnclosedTagsAsLongAsItCanRecoverToAnExpectedEndTag()
{
ParseBlockTest("<foo><bar><baz></foo>");
}
[Fact]
public void ParseBlockWithSelfClosingTagJustEmitsTag()
{
ParseBlockTest("<foo />");
}
[Fact]
public void ParseBlockCanHandleSelfClosingTagsWithinBlock()
{
ParseBlockTest("<foo><bar /></foo>");
}
[Fact]
public void ParseBlockSupportsTagsWithAttributes()
{
ParseBlockTest("<foo bar=\"baz\"><biz><boz zoop=zork/></biz></foo>");
}
[Fact]
public void ParseBlockAllowsCloseAngleBracketInAttributeValueIfDoubleQuoted()
{
ParseBlockTest("<foo><bar baz=\">\" /></foo>");
}
[Fact]
public void ParseBlockAllowsCloseAngleBracketInAttributeValueIfSingleQuoted()
{
ParseBlockTest("<foo><bar baz=\'>\' /></foo>");
}
[Fact]
public void ParseBlockAllowsSlashInAttributeValueIfDoubleQuoted()
{
ParseBlockTest("<foo><bar baz=\"/\"></bar></foo>");
}
[Fact]
public void ParseBlockAllowsSlashInAttributeValueIfSingleQuoted()
{
ParseBlockTest("<foo><bar baz=\'/\'></bar></foo>");
}
[Fact]
public void ParseBlockTerminatesAtEOF()
{
ParseBlockTest("<foo>");
}
[Fact]
public void ParseBlockSupportsCommentAsBlock()
{
ParseBlockTest("<!-- foo -->");
}
[Fact]
public void ParseBlockSupportsCommentWithExtraDashAsBlock()
{
ParseBlockTest("<!-- foo --->");
}
[Fact]
public void ParseBlockSupportsCommentWithinBlock()
{
ParseBlockTest("<foo>bar<!-- zoop -->baz</foo>");
}
[Fact]
public void HtmlCommentSupportsMultipleDashes()
{
ParseDocumentTest(
@"<div><!--- Hello World ---></div>
<div><!---- Hello World ----></div>
<div><!----- Hello World -----></div>
<div><!----- Hello < --- > World </div> -----></div>
");
}
[Fact]
public void ParseBlockProperlyBalancesCommentStartAndEndTags()
{
ParseBlockTest("<!--<foo></bar>-->");
}
[Fact]
public void ParseBlockTerminatesAtEOFWhenParsingComment()
{
ParseBlockTest("<!--<foo>");
}
[Fact]
public void ParseBlockOnlyTerminatesCommentOnFullEndSequence()
{
ParseBlockTest("<!--<foo>--</bar>-->");
}
[Fact]
public void ParseBlockTerminatesCommentAtFirstOccurrenceOfEndSequence()
{
ParseBlockTest("<foo><!--<foo></bar-->--></foo>");
}
[Fact]
public void ParseBlockTreatsMalformedTagsAsContent()
{
ParseBlockTest("<foo></!-- bar --></foo>");
}
[Fact]
public void ParseBlockParsesSGMLDeclarationAsEmptyTag()
{
ParseBlockTest("<foo><!DOCTYPE foo bar baz></foo>");
}
[Fact]
public void ParseBlockTerminatesSGMLDeclarationAtFirstCloseAngle()
{
ParseBlockTest("<foo><!DOCTYPE foo bar> baz></foo>");
}
[Fact]
public void ParseBlockParsesXMLProcessingInstructionAsEmptyTag()
{
ParseBlockTest("<foo><?xml foo bar baz?></foo>");
}
[Fact]
public void ParseBlockTerminatesXMLProcessingInstructionAtQuestionMarkCloseAnglePair()
{
ParseBlockTest("<foo><?xml foo bar baz?> baz</foo>");
}
[Fact]
public void ParseBlockDoesNotTerminateXMLProcessingInstructionAtCloseAngleUnlessPreceededByQuestionMark()
{
ParseBlockTest("<foo><?xml foo bar> baz?></foo>");
}
[Fact]
public void ParseBlockSupportsScriptTagsWithLessThanSignsInThem()
{
ParseBlockTest(@"<script>if(foo<bar) { alert(""baz"");)</script>");
}
[Fact]
public void ParseBlockSupportsScriptTagsWithSpacedLessThanSignsInThem()
{
ParseBlockTest(@"<script>if(foo < bar) { alert(""baz"");)</script>");
}
[Fact]
public void ParseBlockAcceptsEmptyTextTag()
{
ParseBlockTest("<text/>");
}
[Fact]
public void ParseBlockAcceptsTextTagAsOuterTagButDoesNotRender()
{
ParseBlockTest("<text>Foo Bar <foo> Baz</text> zoop");
}
[Fact]
public void ParseBlockRendersLiteralTextTagIfDoubled()
{
ParseBlockTest("<text><text>Foo Bar <foo> Baz</text></text> zoop");
}
[Fact]
public void ParseBlockDoesNotConsiderPsuedoTagWithinMarkupBlock()
{
ParseBlockTest("<foo><text><bar></bar></foo>");
}
[Fact]
public void ParseBlockStopsParsingMidEmptyTagIfEOFReached()
{
ParseBlockTest("<br/");
}
[Fact]
public void ParseBlockCorrectlyHandlesSingleLineOfMarkupWithEmbeddedStatement()
{
ParseBlockTest("<div>Foo @if(true) {} Bar</div>");
}
[Fact]
public void ParseBlockIgnoresTagsInContentsOfScriptTag()
{
ParseBlockTest(@"<script>foo<bar baz='@boz'></script>");
}
}
}