Fix tests to work with new TagBlock parsing format.

- These are the fixes to the tests that could not be fixed by altering the core parsing code base.
- Most involve adding TagBlock's, breaking out existing markup blocks and altering some AcceptedCharacter formats.
- Was able to loosen the restrictions on AcceptedCharacter's to allow the body of html tags to accept any character.

#75
This commit is contained in:
N. Taylor Mullen 2014-08-13 16:40:30 -07:00
parent 6114d5d269
commit acefdf5f2e
26 changed files with 1372 additions and 613 deletions

View File

@ -0,0 +1,30 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.AspNet.Razor.Parser.SyntaxTree;
namespace Microsoft.AspNet.Razor.Test.Framework
{
public class BlockFactory
{
private SpanFactory _factory;
public BlockFactory(SpanFactory factory)
{
_factory = factory;
}
public Block MarkupTagBlock(string content)
{
return MarkupTagBlock(content, AcceptedCharacters.Any);
}
public Block MarkupTagBlock(string content, AcceptedCharacters acceptedCharacters)
{
return new MarkupTagBlock(
_factory.Markup(content).Accepts(acceptedCharacters)
);
}
}
}

View File

@ -134,12 +134,27 @@ namespace Microsoft.AspNet.Razor.Test.Framework
} }
} }
public class MarkupTagBlock : Block
{
private const BlockType ThisBlockType = BlockType.Tag;
public MarkupTagBlock(params SyntaxTreeNode[] children)
: base(ThisBlockType, children, BlockCodeGenerator.Null)
{
}
}
public class MarkupBlock : Block public class MarkupBlock : Block
{ {
private const BlockType ThisBlockType = BlockType.Markup; private const BlockType ThisBlockType = BlockType.Markup;
public MarkupBlock(BlockType blockType, IBlockCodeGenerator codeGenerator, IEnumerable<SyntaxTreeNode> children)
: base(blockType, children, codeGenerator)
{
}
public MarkupBlock(IBlockCodeGenerator codeGenerator, IEnumerable<SyntaxTreeNode> children) public MarkupBlock(IBlockCodeGenerator codeGenerator, IEnumerable<SyntaxTreeNode> children)
: base(ThisBlockType, children, codeGenerator) : this(ThisBlockType, codeGenerator, children)
{ {
} }

View File

@ -13,6 +13,11 @@ namespace Microsoft.AspNet.Razor.Test.Framework
get { return CSharpCodeParser.DefaultKeywords; } get { return CSharpCodeParser.DefaultKeywords; }
} }
protected override BlockFactory CreateBlockFactory()
{
return new BlockFactory(Factory ?? CreateSpanFactory());
}
protected override SpanFactory CreateSpanFactory() protected override SpanFactory CreateSpanFactory()
{ {
return SpanFactory.CreateCsHtml(); return SpanFactory.CreateCsHtml();

View File

@ -13,6 +13,11 @@ namespace Microsoft.AspNet.Razor.Test.Framework
get { return CSharpCodeParser.DefaultKeywords; } get { return CSharpCodeParser.DefaultKeywords; }
} }
protected override BlockFactory CreateBlockFactory()
{
return new BlockFactory(Factory ?? CreateSpanFactory());
}
protected override SpanFactory CreateSpanFactory() protected override SpanFactory CreateSpanFactory()
{ {
return SpanFactory.CreateCsHtml(); return SpanFactory.CreateCsHtml();

View File

@ -21,10 +21,12 @@ namespace Microsoft.AspNet.Razor.Test.Framework
protected static Block IgnoreOutput = new IgnoreOutputBlock(); protected static Block IgnoreOutput = new IgnoreOutputBlock();
public SpanFactory Factory { get; private set; } public SpanFactory Factory { get; private set; }
public BlockFactory BlockFactory { get; private set; }
protected ParserTestBase() protected ParserTestBase()
{ {
Factory = CreateSpanFactory(); Factory = CreateSpanFactory();
BlockFactory = CreateBlockFactory();
} }
public abstract ParserBase CreateMarkupParser(); public abstract ParserBase CreateMarkupParser();
@ -38,6 +40,7 @@ namespace Microsoft.AspNet.Razor.Test.Framework
} }
protected abstract SpanFactory CreateSpanFactory(); protected abstract SpanFactory CreateSpanFactory();
protected abstract BlockFactory CreateBlockFactory();
protected virtual void ParseBlockTest(string document) protected virtual void ParseBlockTest(string document)
{ {

View File

@ -432,7 +432,10 @@ namespace Microsoft.AspNet.Razor.Test.Generator
tabTest: withTabs ? TabTest.Tabs : TabTest.NoTabs, tabTest: withTabs ? TabTest.Tabs : TabTest.NoTabs,
spans: new TestSpan[] spans: new TestSpan[]
{ {
new TestSpan(SpanKind.Markup, 0, 16), new TestSpan(SpanKind.Markup, 0, 6),
new TestSpan(SpanKind.Markup, 6, 8),
new TestSpan(SpanKind.Markup, 8, 14),
new TestSpan(SpanKind.Markup, 14, 16),
new TestSpan(SpanKind.Transition, 16, 17), new TestSpan(SpanKind.Transition, 16, 17),
new TestSpan(SpanKind.Code, 17, 31), new TestSpan(SpanKind.Code, 17, 31),
new TestSpan(SpanKind.Markup, 31, 38), new TestSpan(SpanKind.Markup, 31, 38),

View File

@ -1,6 +1,7 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
@ -17,14 +18,14 @@ namespace Microsoft.AspNet.Razor.Test.Generator
public void CalculatePaddingForEmptySpanReturnsZero() public void CalculatePaddingForEmptySpanReturnsZero()
{ {
// Arrange // Arrange
RazorEngineHost host = CreateHost(designTime: true); var host = CreateHost(designTime: true);
Span span = new Span(new SpanBuilder()); var span = new Span(new SpanBuilder());
var paddingBuilder = new CSharpPaddingBuilder(host); var paddingBuilder = new CSharpPaddingBuilder(host);
// Act // Act
int padding = paddingBuilder.CalculatePadding(span, 0); var padding = paddingBuilder.CalculatePadding(span, 0);
// Assert // Assert
Assert.Equal(0, padding); Assert.Equal(0, padding);
@ -35,9 +36,9 @@ namespace Microsoft.AspNet.Razor.Test.Generator
public void CalculatePaddingForEmptySpanWith4Spaces(bool designTime, bool isIndentingWithTabs, int tabSize) public void CalculatePaddingForEmptySpanWith4Spaces(bool designTime, bool isIndentingWithTabs, int tabSize)
{ {
// Arrange // Arrange
RazorEngineHost host = CreateHost(designTime, isIndentingWithTabs, tabSize); var host = CreateHost(designTime, isIndentingWithTabs, tabSize);
Span span = GenerateSpan(@" @{", SpanKind.Code, 3, ""); var span = GenerateSpan(@" @{", SpanKind.Code, 3, "");
var paddingBuilder = new CSharpPaddingBuilder(host); var paddingBuilder = new CSharpPaddingBuilder(host);
@ -53,14 +54,14 @@ namespace Microsoft.AspNet.Razor.Test.Generator
public void CalculatePaddingForIfSpanWith5Spaces(bool designTime, bool isIndentingWithTabs, int tabSize) public void CalculatePaddingForIfSpanWith5Spaces(bool designTime, bool isIndentingWithTabs, int tabSize)
{ {
// Arrange // Arrange
RazorEngineHost host = CreateHost(designTime, isIndentingWithTabs, tabSize); var host = CreateHost(designTime, isIndentingWithTabs, tabSize);
Span span = GenerateSpan(@" @if (true)", SpanKind.Code, 2, "if (true)"); var span = GenerateSpan(@" @if (true)", SpanKind.Code, 2, "if (true)");
var paddingBuilder = new CSharpPaddingBuilder(host); var paddingBuilder = new CSharpPaddingBuilder(host);
// Act // Act
int padding = paddingBuilder.CalculatePadding(span, 1); var padding = paddingBuilder.CalculatePadding(span, 1);
// Assert // Assert
Assert.Equal(4, padding); Assert.Equal(4, padding);
@ -85,22 +86,20 @@ namespace Microsoft.AspNet.Razor.Test.Generator
public void VerifyPaddingForIfSpanWith4Spaces(bool designTime, bool isIndentingWithTabs, int tabSize, int numTabs, int numSpaces) public void VerifyPaddingForIfSpanWith4Spaces(bool designTime, bool isIndentingWithTabs, int tabSize, int numTabs, int numSpaces)
{ {
// Arrange // Arrange
RazorEngineHost host = CreateHost(designTime, isIndentingWithTabs, tabSize); var host = CreateHost(designTime, isIndentingWithTabs, tabSize);
// no new lines involved // no new lines involved
Span spanFlat = GenerateSpan(" @if (true)", SpanKind.Code, 2, "if (true)"); var spanFlat = GenerateSpan(" @if (true)", SpanKind.Code, 2, "if (true)");
Span spanNewlines = GenerateSpan("\t<div>\r\n @if (true)", SpanKind.Code, 3, "if (true)"); var spanNewlines = GenerateSpan("\t<div>" + Environment.NewLine + " @if (true)", SpanKind.Code, 5, "if (true)");
var paddingBuilder = new CSharpPaddingBuilder(host); var paddingBuilder = new CSharpPaddingBuilder(host);
// Act // Act
string paddingFlat = paddingBuilder.BuildStatementPadding(spanFlat); var paddingFlat = paddingBuilder.BuildStatementPadding(spanFlat);
var paddingNewlines = paddingBuilder.BuildStatementPadding(spanNewlines);
string paddingNewlines = paddingBuilder.BuildStatementPadding(spanNewlines);
// Assert // Assert
string code = " if (true)"; var code = " if (true)";
VerifyPadded(numTabs, numSpaces, code, paddingFlat); VerifyPadded(numTabs, numSpaces, code, paddingFlat);
VerifyPadded(numTabs, numSpaces, code, paddingNewlines); VerifyPadded(numTabs, numSpaces, code, paddingNewlines);
} }
@ -123,20 +122,20 @@ namespace Microsoft.AspNet.Razor.Test.Generator
public void VerifyPaddingForIfSpanWithTwoTabs(bool designTime, bool isIndentingWithTabs, int tabSize, int numTabs, int numSpaces) public void VerifyPaddingForIfSpanWithTwoTabs(bool designTime, bool isIndentingWithTabs, int tabSize, int numTabs, int numSpaces)
{ {
// Arrange // Arrange
RazorEngineHost host = CreateHost(designTime, isIndentingWithTabs, tabSize); var host = CreateHost(designTime, isIndentingWithTabs, tabSize);
// no new lines involved // no new lines involved
Span spanFlat = GenerateSpan("\t\t@if (true)", SpanKind.Code, 2, "if (true)"); var spanFlat = GenerateSpan("\t\t@if (true)", SpanKind.Code, 2, "if (true)");
Span spanNewlines = GenerateSpan("\t<div>\r\n\t\t@if (true)", SpanKind.Code, 3, "if (true)"); var spanNewlines = GenerateSpan("\t<div>" + Environment.NewLine + "\t\t@if (true)", SpanKind.Code, 5, "if (true)");
var paddingBuilder = new CSharpPaddingBuilder(host); var paddingBuilder = new CSharpPaddingBuilder(host);
// Act // Act
string paddingFlat = paddingBuilder.BuildStatementPadding(spanFlat); var paddingFlat = paddingBuilder.BuildStatementPadding(spanFlat);
string paddingNewlines = paddingBuilder.BuildStatementPadding(spanNewlines); var paddingNewlines = paddingBuilder.BuildStatementPadding(spanNewlines);
// Assert // Assert
string code = " if (true)"; var code = " if (true)";
VerifyPadded(numTabs, numSpaces, code, paddingFlat); VerifyPadded(numTabs, numSpaces, code, paddingFlat);
VerifyPadded(numTabs, numSpaces, code, paddingNewlines); VerifyPadded(numTabs, numSpaces, code, paddingNewlines);
} }
@ -158,27 +157,26 @@ namespace Microsoft.AspNet.Razor.Test.Generator
public void CalculatePaddingForOpenedIf(bool designTime, bool isIndentingWithTabs, int tabSize, int numTabs, int numSpaces) public void CalculatePaddingForOpenedIf(bool designTime, bool isIndentingWithTabs, int tabSize, int numTabs, int numSpaces)
{ {
// Arrange // Arrange
RazorEngineHost host = CreateHost(designTime, isIndentingWithTabs, tabSize); var host = CreateHost(designTime, isIndentingWithTabs, tabSize);
string text = "\r\n<html>\r\n<body>\r\n\t\t@if (true) { \r\n</body>\r\n</html>"; var text = string.Format("{0}<html>{0}<body>{0}\t\t@if (true) {{ {0}</body>{0}</html>", Environment.NewLine);
Span span = GenerateSpan(text, SpanKind.Code, 3, "if (true) { \r\n"); var code = "if (true) { " + Environment.NewLine;
var span = GenerateSpan(text, SpanKind.Code, 7, code);
var paddingBuilder = new CSharpPaddingBuilder(host); var paddingBuilder = new CSharpPaddingBuilder(host);
// Act // Act
string padding = paddingBuilder.BuildStatementPadding(span); var padding = paddingBuilder.BuildStatementPadding(span);
// Assert // Assert
string code = " if (true) { \r\n";
VerifyPadded(numTabs, numSpaces, code, padding); VerifyPadded(numTabs, numSpaces, code, padding);
} }
private static void VerifyPadded(int numTabs, int numSpaces, string code, string padding) private static void VerifyPadded(int numTabs, int numSpaces, string code, string padding)
{ {
string padded = padding + code; var padded = padding + code;
string expectedPadding = new string('\t', numTabs) + new string(' ', numSpaces); var expectedPadding = new string('\t', numTabs) + new string(' ', numSpaces);
Assert.Equal(expectedPadding, padding); Assert.Equal(expectedPadding, padding);
Assert.Equal(numTabs + numSpaces + code.Length, padded.Length); Assert.Equal(numTabs + numSpaces + code.Length, padded.Length);
@ -214,7 +212,7 @@ namespace Microsoft.AspNet.Razor.Test.Generator
private static Span GenerateSpan(string text, SpanKind spanKind, int spanIndex, string spanText) private static Span GenerateSpan(string text, SpanKind spanKind, int spanIndex, string spanText)
{ {
Span[] spans = GenerateSpans(text, spanKind, spanIndex, spanText); var spans = GenerateSpans(text, spanKind, spanIndex, spanText);
return spans[spanIndex]; return spans[spanIndex];
} }

View File

@ -121,10 +121,10 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
.AsStatement() .AsStatement()
.With(new AutoCompleteEditHandler(CSharpLanguageCharacteristics.Instance.TokenizeString) { AutoCompleteString = "}" }), .With(new AutoCompleteEditHandler(CSharpLanguageCharacteristics.Instance.TokenizeString) { AutoCompleteString = "}" }),
new MarkupBlock( new MarkupBlock(
Factory.Markup(@"<p></p>") new MarkupTagBlock(
.With(new MarkupCodeGenerator()) Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
.Accepts(AcceptedCharacters.None) new MarkupTagBlock(
), Factory.Markup("</p>").Accepts(AcceptedCharacters.None))),
Factory.Span(SpanKind.Code, new CSharpSymbol(Factory.LocationTracker.CurrentLocation, String.Empty, CSharpSymbolType.Unknown)) Factory.Span(SpanKind.Code, new CSharpSymbol(Factory.LocationTracker.CurrentLocation, String.Empty, CSharpSymbolType.Unknown))
.With(new StatementCodeGenerator()) .With(new StatementCodeGenerator())
) )
@ -144,7 +144,12 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
.AutoCompleteWith("}", atEndOfSpan: true) .AutoCompleteWith("}", atEndOfSpan: true)
.Accepts(AcceptedCharacters.Any), .Accepts(AcceptedCharacters.Any),
new MarkupBlock( new MarkupBlock(
Factory.Markup("\r\n<p>Foo</p>"))), Factory.Markup("\r\n"),
new MarkupTagBlock(
Factory.Markup("<p>")),
Factory.Markup("Foo"),
new MarkupTagBlock(
Factory.Markup("</p>")))),
new RazorError(RazorResources.FormatParseError_Expected_X("}"), new RazorError(RazorResources.FormatParseError_Expected_X("}"),
29, 1, 10)); 29, 1, 10));
} }
@ -161,10 +166,10 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
.AsStatement() .AsStatement()
.With(new AutoCompleteEditHandler(CSharpLanguageCharacteristics.Instance.TokenizeString) { AutoCompleteString = "}" }), .With(new AutoCompleteEditHandler(CSharpLanguageCharacteristics.Instance.TokenizeString) { AutoCompleteString = "}" }),
new MarkupBlock( new MarkupBlock(
Factory.Markup(@"<p></p>") new MarkupTagBlock(
.With(new MarkupCodeGenerator()) Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
.Accepts(AcceptedCharacters.None) new MarkupTagBlock(
), Factory.Markup("</p>").Accepts(AcceptedCharacters.None))),
Factory.Span(SpanKind.Code, new CSharpSymbol(Factory.LocationTracker.CurrentLocation, String.Empty, CSharpSymbolType.Unknown)) Factory.Span(SpanKind.Code, new CSharpSymbol(Factory.LocationTracker.CurrentLocation, String.Empty, CSharpSymbolType.Unknown))
.With(new StatementCodeGenerator()) .With(new StatementCodeGenerator())
), ),

View File

@ -312,7 +312,11 @@ while(true);", BlockType.Statement, SpanKind.Code, acceptedCharacters: AcceptedC
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("do { var foo = bar;").AsStatement(), Factory.Code("do { var foo = bar;").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Foo</p> ").Accepts(AcceptedCharacters.None) Factory.Markup(" "),
BlockFactory.MarkupTagBlock("<p>", AcceptedCharacters.None),
Factory.Markup("Foo"),
BlockFactory.MarkupTagBlock("</p>", AcceptedCharacters.None),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)
), ),
Factory.Code("foo++; } while (foo<bar>);").AsStatement().Accepts(AcceptedCharacters.None) Factory.Code("foo++; } while (foo<bar>);").AsStatement().Accepts(AcceptedCharacters.None)
)); ));
@ -478,7 +482,16 @@ catch(bar) { baz(); }", BlockType.Statement, SpanKind.Code);
[Fact] [Fact]
public void ParseBlockSupportsMarkupWithinTryClause() public void ParseBlockSupportsMarkupWithinTryClause()
{ {
RunSimpleWrappedMarkupTest("try {", " <p>Foo</p> ", "}"); RunSimpleWrappedMarkupTest(
prefix: "try {",
markup: " <p>Foo</p> ",
suffix: "}",
expectedMarkup: new MarkupBlock(
Factory.Markup(" "),
BlockFactory.MarkupTagBlock("<p>", AcceptedCharacters.None),
Factory.Markup("Foo"),
BlockFactory.MarkupTagBlock("</p>", AcceptedCharacters.None),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)));
} }
[Fact] [Fact]
@ -490,7 +503,16 @@ catch(bar) { baz(); }", BlockType.Statement, SpanKind.Code);
[Fact] [Fact]
public void ParseBlockSupportsMarkupWithinCatchClause() public void ParseBlockSupportsMarkupWithinCatchClause()
{ {
RunSimpleWrappedMarkupTest("try { var foo = new { } } catch(Foo Bar Baz) {", " <p>Foo</p> ", "}"); RunSimpleWrappedMarkupTest(
prefix: "try { var foo = new { } } catch(Foo Bar Baz) {",
markup: " <p>Foo</p> ",
suffix: "}",
expectedMarkup: new MarkupBlock(
Factory.Markup(" "),
BlockFactory.MarkupTagBlock("<p>", AcceptedCharacters.None),
Factory.Markup("Foo"),
BlockFactory.MarkupTagBlock("</p>", AcceptedCharacters.None),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)));
} }
[Fact] [Fact]
@ -508,7 +530,16 @@ catch(bar) { baz(); }", BlockType.Statement, SpanKind.Code);
[Fact] [Fact]
public void ParseBlockSupportsMarkupWithinAdditionalCatchClauses() public void ParseBlockSupportsMarkupWithinAdditionalCatchClauses()
{ {
RunSimpleWrappedMarkupTest("try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) {", " <p>Foo</p> ", "}"); RunSimpleWrappedMarkupTest(
prefix: "try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) {",
markup: " <p>Foo</p> ",
suffix: "}",
expectedMarkup: new MarkupBlock(
Factory.Markup(" "),
BlockFactory.MarkupTagBlock("<p>", AcceptedCharacters.None),
Factory.Markup("Foo"),
BlockFactory.MarkupTagBlock("</p>", AcceptedCharacters.None),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)));
} }
[Fact] [Fact]
@ -520,7 +551,17 @@ catch(bar) { baz(); }", BlockType.Statement, SpanKind.Code);
[Fact] [Fact]
public void ParseBlockSupportsMarkupWithinFinallyClause() public void ParseBlockSupportsMarkupWithinFinallyClause()
{ {
RunSimpleWrappedMarkupTest("try { var foo = new { } } finally {", " <p>Foo</p> ", "}", acceptedCharacters: AcceptedCharacters.None); RunSimpleWrappedMarkupTest(
prefix: "try { var foo = new { } } finally {",
markup: " <p>Foo</p> ",
suffix: "}",
expectedMarkup: new MarkupBlock(
Factory.Markup(" "),
BlockFactory.MarkupTagBlock("<p>", AcceptedCharacters.None),
Factory.Markup("Foo"),
BlockFactory.MarkupTagBlock("</p>", AcceptedCharacters.None),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)),
acceptedCharacters: AcceptedCharacters.None);
} }
[Fact] [Fact]
@ -638,38 +679,54 @@ catch(bar) { baz(); }", BlockType.Statement, SpanKind.Code);
new StatementBlock( new StatementBlock(
Factory.Code("foreach(var c in db.Categories) {\r\n").AsStatement(), Factory.Code("foreach(var c in db.Categories) {\r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <div>\r\n <h1>"), Factory.Markup(" "),
BlockFactory.MarkupTagBlock("<div>", AcceptedCharacters.None),
Factory.Markup("\r\n "),
BlockFactory.MarkupTagBlock("<h1>", AcceptedCharacters.None),
Factory.EmptyHtml(),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("c.Name") Factory.Code("c.Name")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)), .Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("</h1>\r\n <ul>\r\n"), BlockFactory.MarkupTagBlock("</h1>", AcceptedCharacters.None),
Factory.Markup("\r\n "),
BlockFactory.MarkupTagBlock("<ul>", AcceptedCharacters.None),
Factory.Markup("\r\n"),
new StatementBlock( new StatementBlock(
Factory.Code(@" ").AsStatement(), Factory.Code(@" ").AsStatement(),
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("foreach(var p in c.Products) {\r\n").AsStatement(), Factory.Code("foreach(var p in c.Products) {\r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <li><a"), Factory.Markup(" "),
new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href=\"", 193, 5, 30), new LocationTagged<string>("\"", 256, 5, 93)), BlockFactory.MarkupTagBlock("<li>", AcceptedCharacters.None),
Factory.Markup(" href=\"").With(SpanCodeGenerator.Null), new MarkupTagBlock(
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(String.Empty, 200, 5, 37), 200, 5, 37), Factory.Markup("<a"),
new ExpressionBlock( new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href=\"", 193, 5, 30), new LocationTagged<string>("\"", 256, 5, 93)),
Factory.CodeTransition(), Factory.Markup(" href=\"").With(SpanCodeGenerator.Null),
Factory.Code("Html.ActionUrl(\"Products\", \"Detail\", new { id = p.Id })") new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(string.Empty, 200, 5, 37), 200, 5, 37),
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) new ExpressionBlock(
.Accepts(AcceptedCharacters.NonWhiteSpace))), Factory.CodeTransition(),
Factory.Markup("\"").With(SpanCodeGenerator.Null)), Factory.Code("Html.ActionUrl(\"Products\", \"Detail\", new { id = p.Id })")
Factory.Markup(">"), .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace))),
Factory.Markup("\"").With(SpanCodeGenerator.Null)),
Factory.Markup(">").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml(),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("p.Name") Factory.Code("p.Name")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)), .Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("</a></li>\r\n").Accepts(AcceptedCharacters.None)), BlockFactory.MarkupTagBlock("</a>", AcceptedCharacters.None),
BlockFactory.MarkupTagBlock("</li>", AcceptedCharacters.None),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)),
Factory.Code(" }\r\n").AsStatement().Accepts(AcceptedCharacters.None)), Factory.Code(" }\r\n").AsStatement().Accepts(AcceptedCharacters.None)),
Factory.Markup(" </ul>\r\n </div>\r\n") Factory.Markup(" "),
.Accepts(AcceptedCharacters.None)), BlockFactory.MarkupTagBlock("</ul>", AcceptedCharacters.None),
Factory.Markup("\r\n "),
BlockFactory.MarkupTagBlock("</div>", AcceptedCharacters.None),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)),
Factory.Code(" }").AsStatement().Accepts(AcceptedCharacters.None))); Factory.Code(" }").AsStatement().Accepts(AcceptedCharacters.None)));
} }
@ -696,14 +753,12 @@ catch(bar) { baz(); }", BlockType.Statement, SpanKind.Code);
Factory.Code(postComment).AsStatement().Accepts(acceptedCharacters))); Factory.Code(postComment).AsStatement().Accepts(acceptedCharacters)));
} }
private void RunSimpleWrappedMarkupTest(string prefix, string markup, string suffix, AcceptedCharacters acceptedCharacters = AcceptedCharacters.Any) private void RunSimpleWrappedMarkupTest(string prefix, string markup, string suffix, MarkupBlock expectedMarkup, AcceptedCharacters acceptedCharacters = AcceptedCharacters.Any)
{ {
ParseBlockTest(prefix + markup + suffix, ParseBlockTest(prefix + markup + suffix,
new StatementBlock( new StatementBlock(
Factory.Code(prefix).AsStatement(), Factory.Code(prefix).AsStatement(),
new MarkupBlock( expectedMarkup,
Factory.Markup(markup).Accepts(AcceptedCharacters.None)
),
Factory.Code(suffix).AsStatement().Accepts(acceptedCharacters) Factory.Code(suffix).AsStatement().Accepts(acceptedCharacters)
)); ));
} }

View File

@ -136,7 +136,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
.AutoCompleteWith(null, atEndOfSpan: true) .AutoCompleteWith(null, atEndOfSpan: true)
.Accepts(AcceptedCharacters.Any), .Accepts(AcceptedCharacters.Any),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>F", "{", "o", "}", "o", "</p> ")), Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>")),
Factory.Markup("F", "{", "o", "}", "o"),
new MarkupTagBlock(
Factory.Markup("</p>")),
Factory.Markup(" ")),
Factory.MetaCode("}") Factory.MetaCode("}")
.Accepts(AcceptedCharacters.None))); .Accepts(AcceptedCharacters.None)));
} }

View File

@ -389,16 +389,21 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new StatementBlock( new StatementBlock(
Factory.Code("if(foo) ").AsStatement(), Factory.Code("if(foo) ").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup("<p>Bar</p> ").Accepts(AcceptedCharacters.None) BlockFactory.MarkupTagBlock("<p>", AcceptedCharacters.None),
), Factory.Markup("Bar"),
BlockFactory.MarkupTagBlock("</p>", AcceptedCharacters.None),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)),
Factory.Code("else if(bar) ").AsStatement(), Factory.Code("else if(bar) ").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup("<p>Baz</p> ").Accepts(AcceptedCharacters.None) BlockFactory.MarkupTagBlock("<p>", AcceptedCharacters.None),
), Factory.Markup("Baz"),
BlockFactory.MarkupTagBlock("</p>", AcceptedCharacters.None),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)),
Factory.Code("else ").AsStatement(), Factory.Code("else ").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup("<p>Boz</p>").Accepts(AcceptedCharacters.None) BlockFactory.MarkupTagBlock("<p>", AcceptedCharacters.None),
), Factory.Markup("Boz"),
BlockFactory.MarkupTagBlock("</p>", AcceptedCharacters.None)),
Factory.EmptyCSharp().AsStatement() Factory.EmptyCSharp().AsStatement()
), ),
new RazorError(expectedMessage, 8, 0, 8), new RazorError(expectedMessage, 8, 0, 8),
@ -427,8 +432,10 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new MarkupBlock( new MarkupBlock(
Factory.Markup(" "), Factory.Markup(" "),
Factory.MarkupTransition(), Factory.MarkupTransition(),
Factory.Markup("<p>Bar</p> ").Accepts(AcceptedCharacters.None) BlockFactory.MarkupTagBlock("<p>", AcceptedCharacters.None),
), Factory.Markup("Bar"),
BlockFactory.MarkupTagBlock("</p>", AcceptedCharacters.None),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)),
Factory.Code("}").AsStatement() Factory.Code("}").AsStatement()
), ),
new RazorError( new RazorError(
@ -496,8 +503,11 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new StatementBlock( new StatementBlock(
Factory.Code("if(\r\nelse {").AsStatement(), Factory.Code("if(\r\nelse {").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Foo</p> ").Accepts(AcceptedCharacters.None) Factory.Markup(" "),
), BlockFactory.MarkupTagBlock("<p>", AcceptedCharacters.None),
Factory.Markup("Foo"),
BlockFactory.MarkupTagBlock("</p>", AcceptedCharacters.None),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)),
Factory.Code("}").AsStatement().Accepts(AcceptedCharacters.None) Factory.Code("}").AsStatement().Accepts(AcceptedCharacters.None)
), ),
new RazorError( new RazorError(
@ -547,13 +557,15 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new StatementBlock( new StatementBlock(
Factory.Code("if(foo) {\r\n var foo = \"foo bar baz\r\n ").AsStatement(), Factory.Code("if(foo) {\r\n var foo = \"foo bar baz\r\n ").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup("<p>Foo is "), BlockFactory.MarkupTagBlock("<p>", AcceptedCharacters.None),
Factory.Markup("Foo is "),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("foo") Factory.Code("foo")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)), .Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("</p>\r\n").Accepts(AcceptedCharacters.None)), BlockFactory.MarkupTagBlock("</p>", AcceptedCharacters.None),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)),
Factory.Code("}").AsStatement() Factory.Code("}").AsStatement()
), ),
new RazorError( new RazorError(
@ -581,7 +593,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.Code("String.Format(") Factory.Code("String.Format(")
.AsStatement(), .AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup("<html></html>").Accepts(AcceptedCharacters.None)), BlockFactory.MarkupTagBlock("<html>", AcceptedCharacters.None),
BlockFactory.MarkupTagBlock("</html>", AcceptedCharacters.None)),
Factory.EmptyCSharp().AsStatement(), Factory.EmptyCSharp().AsStatement(),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None)), Factory.MetaCode("}").Accepts(AcceptedCharacters.None)),
expectedErrors: new[] { expectedErrors: new[] {

View File

@ -205,7 +205,12 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
.AsStatement() .AsStatement()
.AutoCompleteWith("}"), .AutoCompleteWith("}"),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Foo</p>").Accepts(AcceptedCharacters.None)), Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Foo"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None))),
Factory.EmptyCSharp().AsStatement()))), Factory.EmptyCSharp().AsStatement()))),
new RazorError( new RazorError(
RazorResources.FormatParseError_Expected_EndOfBlock_Before_EOF("helper", "}", "{"), RazorResources.FormatParseError_Expected_EndOfBlock_Before_EOF("helper", "}", "{"),
@ -227,13 +232,18 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new StatementBlock( new StatementBlock(
Factory.Code(" \r\n").AsStatement(), Factory.Code(" \r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>"), Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml(),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("foo") Factory.Code("foo")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)), .Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("</p>\r\n").Accepts(AcceptedCharacters.None)), new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)),
Factory.EmptyCSharp().AsStatement()), Factory.EmptyCSharp().AsStatement()),
Factory.Code("}").Hidden().Accepts(AcceptedCharacters.None)), Factory.Code("}").Hidden().Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml())); Factory.EmptyHtml()));
@ -258,13 +268,18 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new StatementBlock( new StatementBlock(
Factory.Code(" \r\n").AsStatement(), Factory.Code(" \r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(@" <p>"), Factory.Markup(@" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml(),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("foo") Factory.Code("foo")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)), .Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("</p>\r\n").Accepts(AcceptedCharacters.None)), new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)),
Factory.EmptyCSharp().AsStatement()), Factory.EmptyCSharp().AsStatement()),
Factory.Code("}").Hidden().Accepts(AcceptedCharacters.None)), Factory.Code("}").Hidden().Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml())); Factory.EmptyHtml()));

View File

@ -92,9 +92,14 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.Code("while(true) {") Factory.Code("while(true) {")
.AsStatement(), .AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Hello</p> ") Factory.Markup(" "),
.With(new MarkupCodeGenerator()) new MarkupTagBlock(
.Accepts(AcceptedCharacters.None)), Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Hello"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)
),
Factory.Code("}") Factory.Code("}")
.AsStatement() .AsStatement()
.Accepts(AcceptedCharacters.None))); .Accepts(AcceptedCharacters.None)));

View File

@ -125,8 +125,9 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.Code("\r\n").AsStatement(), Factory.Code("\r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" "), Factory.Markup(" "),
Factory.MarkupTransition("<text").Accepts(AcceptedCharacters.Any), new MarkupTagBlock(
Factory.Markup("\r\n "), Factory.MarkupTransition("<text").Accepts(AcceptedCharacters.Any)),
Factory.Markup("\r\n ").Accepts(AcceptedCharacters.None),
new CommentBlock( new CommentBlock(
Factory.MarkupTransition(HtmlSymbolType.RazorCommentTransition) Factory.MarkupTransition(HtmlSymbolType.RazorCommentTransition)
.Accepts(AcceptedCharacters.None), .Accepts(AcceptedCharacters.None),

View File

@ -79,7 +79,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new SectionBlock(new SectionCodeGenerator(string.Empty), new SectionBlock(new SectionCodeGenerator(string.Empty),
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode("section ")), Factory.MetaCode("section ")),
Factory.Markup("9 { <p>Foo</p> }")), Factory.Markup("9 { "),
new MarkupTagBlock(
Factory.Markup("<p>")),
Factory.Markup("Foo"),
new MarkupTagBlock(
Factory.Markup("</p>")),
Factory.Markup(" }")),
new RazorError( new RazorError(
RazorResources.FormatParseError_Unexpected_Character_At_Section_Name_Start(RazorResources.FormatErrorComponent_Character("9")), RazorResources.FormatParseError_Unexpected_Character_At_Section_Name_Start(RazorResources.FormatErrorComponent_Character("9")),
9, 0, 9)); 9, 0, 9));
@ -94,7 +100,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new SectionBlock(new SectionCodeGenerator("foo"), new SectionBlock(new SectionCodeGenerator("foo"),
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode("section foo")), Factory.MetaCode("section foo")),
Factory.Markup("-bar { <p>Foo</p> }")), Factory.Markup("-bar { "),
new MarkupTagBlock(
Factory.Markup("<p>")),
Factory.Markup("Foo"),
new MarkupTagBlock(
Factory.Markup("</p>")),
Factory.Markup(" }")),
new RazorError(RazorResources.ParseError_MissingOpenBraceAfterSection, 12, 0, 12)); new RazorError(RazorResources.ParseError_MissingOpenBraceAfterSection, 12, 0, 12));
} }
@ -115,7 +127,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.MetaCode("section bar {") Factory.MetaCode("section bar {")
.AutoCompleteWith(null, atEndOfSpan: true), .AutoCompleteWith(null, atEndOfSpan: true),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Foo</p> ")), Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>")),
Factory.Markup("Foo"),
new MarkupTagBlock(
Factory.Markup("</p>")),
Factory.Markup(" ")),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None)), Factory.MetaCode("}").Accepts(AcceptedCharacters.None)),
Factory.Markup(" ")), Factory.Markup(" ")),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None)), Factory.MetaCode("}").Accepts(AcceptedCharacters.None)),
@ -152,8 +170,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.MetaCode("section foo {") Factory.MetaCode("section foo {")
.AutoCompleteWith("}", atEndOfSpan: true), .AutoCompleteWith("}", atEndOfSpan: true),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>")),
// Need to provide the markup span as fragments, since the parser will split the {} into separate symbols. // Need to provide the markup span as fragments, since the parser will split the {} into separate symbols.
Factory.Markup(" <p>Foo", "{", "}", "</p>")))), Factory.Markup("Foo", "{", "}"),
new MarkupTagBlock(
Factory.Markup("</p>"))))),
new RazorError( new RazorError(
RazorResources.FormatParseError_Expected_X("}"), RazorResources.FormatParseError_Expected_X("}"),
27, 0, 27)); 27, 0, 27));
@ -190,7 +213,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.MetaCode("section foo \r\n\r\n\r\n\r\n\r\n\r\n{") Factory.MetaCode("section foo \r\n\r\n\r\n\r\n\r\n\r\n{")
.AutoCompleteWith(null, atEndOfSpan: true), .AutoCompleteWith(null, atEndOfSpan: true),
new MarkupBlock( new MarkupBlock(
Factory.Markup("\r\n<p>Foo</p>\r\n")), Factory.Markup("\r\n"),
new MarkupTagBlock(
Factory.Markup("<p>")),
Factory.Markup("Foo"),
new MarkupTagBlock(
Factory.Markup("</p>")),
Factory.Markup("\r\n")),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None)), Factory.MetaCode("}").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml())); Factory.EmptyHtml()));
} }
@ -206,7 +235,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.MetaCode("section foo {") Factory.MetaCode("section foo {")
.AutoCompleteWith(null, atEndOfSpan: true), .AutoCompleteWith(null, atEndOfSpan: true),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Foo</p> ")), Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>")),
Factory.Markup("Foo"),
new MarkupTagBlock(
Factory.Markup("</p>")),
Factory.Markup(" ")),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None)), Factory.MetaCode("}").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml())); Factory.EmptyHtml()));
} }
@ -222,7 +257,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.MetaCode("section foo{") Factory.MetaCode("section foo{")
.AutoCompleteWith(null, atEndOfSpan: true), .AutoCompleteWith(null, atEndOfSpan: true),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Foo</p> ")), Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>")),
Factory.Markup("Foo"),
new MarkupTagBlock(
Factory.Markup("</p>")),
Factory.Markup(" ")),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None)), Factory.MetaCode("}").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml())); Factory.EmptyHtml()));
} }
@ -238,7 +279,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.MetaCode("section foo {") Factory.MetaCode("section foo {")
.AutoCompleteWith(null, atEndOfSpan: true), .AutoCompleteWith(null, atEndOfSpan: true),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <script>(function foo() { return 1; })();</script> ")), Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<script>")),
Factory.Markup("(function foo() { return 1; })();"),
new MarkupTagBlock(
Factory.Markup("</script>")),
Factory.Markup(" ")),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None)), Factory.MetaCode("}").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml())); Factory.EmptyHtml()));
} }
@ -372,7 +419,10 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.MetaCode("section s {") Factory.MetaCode("section s {")
.AutoCompleteWith(null, atEndOfSpan: true), .AutoCompleteWith(null, atEndOfSpan: true),
new MarkupBlock( new MarkupBlock(
Factory.Markup(Environment.NewLine + "<a" + Environment.NewLine + "<!-- > \" '-->")), Factory.Markup(Environment.NewLine),
new MarkupTagBlock(
Factory.Markup("<a" + Environment.NewLine)),
Factory.Markup("<!-- > \" '-->")),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None)), Factory.MetaCode("}").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml())); Factory.EmptyHtml()));
} }

View File

@ -189,8 +189,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new StatementBlock( new StatementBlock(
Factory.Code("if(!false) {\r\n // Foo\r\n").AsStatement(), Factory.Code("if(!false) {\r\n // Foo\r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup("\t<p>A real tag!</p>\r\n") Factory.Markup("\t"),
.Accepts(AcceptedCharacters.None)), new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("A real tag!"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)),
Factory.Code("}").AsStatement() Factory.Code("}").AsStatement()
)); ));
} }

View File

@ -21,14 +21,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
return new TemplateBlock( return new TemplateBlock(
new MarkupBlock( new MarkupBlock(
Factory.MarkupTransition(), Factory.MarkupTransition(),
Factory.Markup("<p>Foo #"), new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Foo #"),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("item") Factory.Code("item")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace) .Accepts(AcceptedCharacters.NonWhiteSpace)
), ),
Factory.Markup("</p>").Accepts(AcceptedCharacters.None) new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None))
) )
); );
} }
@ -40,7 +43,9 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
return new TemplateBlock( return new TemplateBlock(
new MarkupBlock( new MarkupBlock(
Factory.MarkupTransition(), Factory.MarkupTransition(),
Factory.Markup("<p>Foo #"), new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Foo #"),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("Html.Repeat(10, ") Factory.Code("Html.Repeat(10, ")
@ -48,21 +53,25 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new TemplateBlock( new TemplateBlock(
new MarkupBlock( new MarkupBlock(
Factory.MarkupTransition(), Factory.MarkupTransition(),
Factory.Markup("<p>"), new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml(),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("item") Factory.Code("item")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace) .Accepts(AcceptedCharacters.NonWhiteSpace)
), ),
Factory.Markup("</p>").Accepts(AcceptedCharacters.None) new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None))
) )
), ),
Factory.Code(")") Factory.Code(")")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace) .Accepts(AcceptedCharacters.NonWhiteSpace)
), ),
Factory.Markup("</p>").Accepts(AcceptedCharacters.None) new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None))
) )
); );
} }

View File

@ -34,7 +34,11 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new TemplateBlock( new TemplateBlock(
new MarkupBlock( new MarkupBlock(
Factory.MarkupTransition(), Factory.MarkupTransition(),
Factory.Markup("<p>Foo</p>").Accepts(AcceptedCharacters.None) new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Foo"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None))
) )
), ),
Factory.Code(" )") Factory.Code(" )")
@ -75,7 +79,11 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.MetaCode("{").Accepts(AcceptedCharacters.None), Factory.MetaCode("{").Accepts(AcceptedCharacters.None),
Factory.Code("\r\n ").AsStatement(), Factory.Code("\r\n ").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup("<p>Foo</p>").Accepts(AcceptedCharacters.None) new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Foo"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None))
), ),
Factory.Code(" \r\n").AsStatement(), Factory.Code(" \r\n").AsStatement(),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None) Factory.MetaCode("}").Accepts(AcceptedCharacters.None)
@ -93,7 +101,11 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.Code("\r\n ").AsStatement(), Factory.Code("\r\n ").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.MarkupTransition(), Factory.MarkupTransition(),
Factory.Markup("<p>Foo</p>").Accepts(AcceptedCharacters.None) new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Foo"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None))
), ),
Factory.Code(" \r\n").AsStatement(), Factory.Code(" \r\n").AsStatement(),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None) Factory.MetaCode("}").Accepts(AcceptedCharacters.None)
@ -172,13 +184,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
.With(new SingleLineMarkupEditHandler(CSharpLanguageCharacteristics.Instance.TokenizeString, AcceptedCharacters.None)) .With(new SingleLineMarkupEditHandler(CSharpLanguageCharacteristics.Instance.TokenizeString, AcceptedCharacters.None))
), ),
new MarkupBlock( new MarkupBlock(
Factory.Markup("<br/>\r\n") new MarkupTagBlock(
.Accepts(AcceptedCharacters.None) Factory.Markup("<br/>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)
), ),
new MarkupBlock( new MarkupBlock(
Factory.Markup("<a>Foo</a>\r\n") new MarkupTagBlock(
.Accepts(AcceptedCharacters.None) Factory.Markup("<a>").Accepts(AcceptedCharacters.None)),
), Factory.Markup("Foo"),
new MarkupTagBlock(
Factory.Markup("</a>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)),
new MarkupBlock( new MarkupBlock(
Factory.MarkupTransition(), Factory.MarkupTransition(),
Factory.MetaMarkup(":", HtmlSymbolType.Colon), Factory.MetaMarkup(":", HtmlSymbolType.Colon),
@ -204,13 +220,19 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new StatementBlock( new StatementBlock(
Factory.Code("if(foo) {\r\n var foo = \"After this statement there are 10 spaces\"; \r\n").AsStatement(), Factory.Code("if(foo) {\r\n var foo = \"After this statement there are 10 spaces\"; \r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>\r\n Foo\r\n"), Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n Foo\r\n"),
new ExpressionBlock( new ExpressionBlock(
Factory.Code(" ").AsStatement(), Factory.Code(" ").AsStatement(),
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("bar").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharacters.NonWhiteSpace) Factory.Code("bar").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharacters.NonWhiteSpace)
), ),
Factory.Markup("\r\n </p>\r\n").Accepts(AcceptedCharacters.None) Factory.Markup("\r\n "),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)
), ),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" "), Factory.Markup(" "),
@ -228,15 +250,33 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new StatementBlock( new StatementBlock(
Factory.Code("if(foo) {").AsStatement(), Factory.Code("if(foo) {").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Bar</p> ").Accepts(AcceptedCharacters.None) Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Bar"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)
), ),
Factory.Code("} else if(bar) {").AsStatement(), Factory.Code("} else if(bar) {").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Baz</p> ").Accepts(AcceptedCharacters.None) Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Baz"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)
), ),
Factory.Code("} else {").AsStatement(), Factory.Code("} else {").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Boz</p> ").Accepts(AcceptedCharacters.None) Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Boz"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)
), ),
Factory.Code("}").AsStatement().Accepts(AcceptedCharacters.None) Factory.Code("}").AsStatement().Accepts(AcceptedCharacters.None)
)); ));
@ -250,15 +290,33 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.MetaCode("{").Accepts(AcceptedCharacters.None), Factory.MetaCode("{").Accepts(AcceptedCharacters.None),
Factory.Code(" if(foo) {").AsStatement(), Factory.Code(" if(foo) {").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Bar</p> ").Accepts(AcceptedCharacters.None) Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Bar"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)
), ),
Factory.Code("} else if(bar) {").AsStatement(), Factory.Code("} else if(bar) {").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Baz</p> ").Accepts(AcceptedCharacters.None) Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Baz"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)
), ),
Factory.Code("} else {").AsStatement(), Factory.Code("} else {").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Boz</p> ").Accepts(AcceptedCharacters.None) Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Boz"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)
), ),
Factory.Code("} ").AsStatement(), Factory.Code("} ").AsStatement(),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None) Factory.MetaCode("}").Accepts(AcceptedCharacters.None)
@ -287,22 +345,52 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new StatementBlock( new StatementBlock(
Factory.Code("switch(foo) {\r\n case 0:\r\n").AsStatement(), Factory.Code("switch(foo) {\r\n case 0:\r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Foo</p>\r\n").Accepts(AcceptedCharacters.None) Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Foo"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)
), ),
Factory.Code(" break;\r\n case 1:\r\n").AsStatement(), Factory.Code(" break;\r\n case 1:\r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Bar</p>\r\n").Accepts(AcceptedCharacters.None) Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Bar"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)
), ),
Factory.Code(" return;\r\n case 2:\r\n {\r\n").AsStatement(), Factory.Code(" return;\r\n case 2:\r\n {\r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Baz</p>\r\n").Accepts(AcceptedCharacters.None) Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Baz"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)
), ),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Boz</p>\r\n").Accepts(AcceptedCharacters.None) Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Boz"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)
), ),
Factory.Code(" }\r\n default:\r\n").AsStatement(), Factory.Code(" }\r\n default:\r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Biz</p>\r\n").Accepts(AcceptedCharacters.None) Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Biz"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)
), ),
Factory.Code("}").AsStatement().Accepts(AcceptedCharacters.None))); Factory.Code("}").AsStatement().Accepts(AcceptedCharacters.None)));
} }
@ -330,22 +418,52 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.MetaCode("{").Accepts(AcceptedCharacters.None), Factory.MetaCode("{").Accepts(AcceptedCharacters.None),
Factory.Code(" switch(foo) {\r\n case 0:\r\n").AsStatement(), Factory.Code(" switch(foo) {\r\n case 0:\r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Foo</p>\r\n").Accepts(AcceptedCharacters.None) Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Foo"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)
), ),
Factory.Code(" break;\r\n case 1:\r\n").AsStatement(), Factory.Code(" break;\r\n case 1:\r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Bar</p>\r\n").Accepts(AcceptedCharacters.None) Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Bar"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)
), ),
Factory.Code(" return;\r\n case 2:\r\n {\r\n").AsStatement(), Factory.Code(" return;\r\n case 2:\r\n {\r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Baz</p>\r\n").Accepts(AcceptedCharacters.None) Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Baz"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)
), ),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Boz</p>\r\n").Accepts(AcceptedCharacters.None) Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Boz"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)
), ),
Factory.Code(" }\r\n default:\r\n").AsStatement(), Factory.Code(" }\r\n default:\r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Biz</p>\r\n").Accepts(AcceptedCharacters.None) Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Biz"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)
), ),
Factory.Code("} ").AsStatement(), Factory.Code("} ").AsStatement(),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None))); Factory.MetaCode("}").Accepts(AcceptedCharacters.None)));
@ -358,7 +476,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new StatementBlock( new StatementBlock(
Factory.Code("for(int i = 0; i < 10; i++) {").AsStatement(), Factory.Code("for(int i = 0; i < 10; i++) {").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Foo</p> ").Accepts(AcceptedCharacters.None) Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Foo"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)
), ),
Factory.Code("}").AsStatement().Accepts(AcceptedCharacters.None) Factory.Code("}").AsStatement().Accepts(AcceptedCharacters.None)
)); ));
@ -372,7 +496,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.MetaCode("{").Accepts(AcceptedCharacters.None), Factory.MetaCode("{").Accepts(AcceptedCharacters.None),
Factory.Code(" for(int i = 0; i < 10; i++) {").AsStatement(), Factory.Code(" for(int i = 0; i < 10; i++) {").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>Foo</p> ").Accepts(AcceptedCharacters.None) Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Foo"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)
), ),
Factory.Code("} ").AsStatement(), Factory.Code("} ").AsStatement(),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None))); Factory.MetaCode("}").Accepts(AcceptedCharacters.None)));
@ -422,9 +552,11 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.Code("if (i > 0) {").AsStatement(), Factory.Code("if (i > 0) {").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" "), Factory.Markup(" "),
Factory.MarkupTransition("<text>").Accepts(AcceptedCharacters.None), new MarkupTagBlock(
Factory.Markup(";"), Factory.MarkupTransition("<text>").Accepts(AcceptedCharacters.None)),
Factory.MarkupTransition("</text>").Accepts(AcceptedCharacters.None), Factory.Markup(";").Accepts(AcceptedCharacters.None),
new MarkupTagBlock(
Factory.MarkupTransition("</text>").Accepts(AcceptedCharacters.None)),
Factory.Markup(" ").Accepts(AcceptedCharacters.None) Factory.Markup(" ").Accepts(AcceptedCharacters.None)
), ),
Factory.Code("}").AsStatement())); Factory.Code("}").AsStatement()));
@ -439,9 +571,11 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.Code(" if (i > 0) {").AsStatement(), Factory.Code(" if (i > 0) {").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" "), Factory.Markup(" "),
Factory.MarkupTransition("<text>").Accepts(AcceptedCharacters.None), new MarkupTagBlock(
Factory.Markup(";"), Factory.MarkupTransition("<text>").Accepts(AcceptedCharacters.None)),
Factory.MarkupTransition("</text>").Accepts(AcceptedCharacters.None), Factory.Markup(";").Accepts(AcceptedCharacters.None),
new MarkupTagBlock(
Factory.MarkupTransition("</text>").Accepts(AcceptedCharacters.None)),
Factory.Markup(" ").Accepts(AcceptedCharacters.None) Factory.Markup(" ").Accepts(AcceptedCharacters.None)
), ),
Factory.Code("} ").AsStatement(), Factory.Code("} ").AsStatement(),
@ -474,18 +608,26 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.Code(" }\r\n foreach (var p in Enumerable.Range(1, 10)) {\r\n").AsStatement(), Factory.Code(" }\r\n foreach (var p in Enumerable.Range(1, 10)) {\r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" "), Factory.Markup(" "),
Factory.MarkupTransition("<text>").Accepts(AcceptedCharacters.None), new MarkupTagBlock(
Factory.Markup("The number is "), Factory.MarkupTransition("<text>").Accepts(AcceptedCharacters.None)),
Factory.Markup("The number is ").Accepts(AcceptedCharacters.None),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("p").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharacters.NonWhiteSpace) Factory.Code("p").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharacters.NonWhiteSpace)
), ),
Factory.MarkupTransition("</text>").Accepts(AcceptedCharacters.None), new MarkupTagBlock(
Factory.MarkupTransition("</text>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None) Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)
), ),
Factory.Code(" }\r\n if(!false) {\r\n").AsStatement(), Factory.Code(" }\r\n if(!false) {\r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <p>A real tag!</p>\r\n").Accepts(AcceptedCharacters.None) Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("A real tag!"),
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)
), ),
Factory.Code(" }\r\n").AsStatement(), Factory.Code(" }\r\n").AsStatement(),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None))); Factory.MetaCode("}").Accepts(AcceptedCharacters.None)));

View File

@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using System.Linq;
using Microsoft.AspNet.Razor.Editor; using Microsoft.AspNet.Razor.Editor;
using Microsoft.AspNet.Razor.Generator; using Microsoft.AspNet.Razor.Generator;
using Microsoft.AspNet.Razor.Parser; using Microsoft.AspNet.Razor.Parser;
@ -19,12 +20,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<a href='Foo' />", ParseBlockTest("<a href='Foo' />",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<a"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 12, 0, 12)), Factory.Markup("<a"),
Factory.Markup(" href='").With(SpanCodeGenerator.Null), new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 12, 0, 12)),
Factory.Markup("Foo").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(string.Empty, 9, 0, 9), value: new LocationTagged<string>("Foo", 9, 0, 9))), Factory.Markup(" href='").With(SpanCodeGenerator.Null),
Factory.Markup("'").With(SpanCodeGenerator.Null)), Factory.Markup("Foo").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(string.Empty, 9, 0, 9), value: new LocationTagged<string>("Foo", 9, 0, 9))),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))); Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -32,14 +34,15 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<a href='Foo Bar Baz' />", ParseBlockTest("<a href='Foo Bar Baz' />",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<a"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 20, 0, 20)), Factory.Markup("<a"),
Factory.Markup(" href='").With(SpanCodeGenerator.Null), new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 20, 0, 20)),
Factory.Markup("Foo").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(string.Empty, 9, 0, 9), value: new LocationTagged<string>("Foo", 9, 0, 9))), Factory.Markup(" href='").With(SpanCodeGenerator.Null),
Factory.Markup(" Bar").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(" ", 12, 0, 12), value: new LocationTagged<string>("Bar", 13, 0, 13))), Factory.Markup("Foo").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(string.Empty, 9, 0, 9), value: new LocationTagged<string>("Foo", 9, 0, 9))),
Factory.Markup(" Baz").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(" ", 16, 0, 16), value: new LocationTagged<string>("Baz", 17, 0, 17))), Factory.Markup(" Bar").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(" ", 12, 0, 12), value: new LocationTagged<string>("Bar", 13, 0, 13))),
Factory.Markup("'").With(SpanCodeGenerator.Null)), Factory.Markup(" Baz").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(" ", 16, 0, 16), value: new LocationTagged<string>("Baz", 17, 0, 17))),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))); Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -47,14 +50,15 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<a href=\"Foo Bar Baz\" />", ParseBlockTest("<a href=\"Foo Bar Baz\" />",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<a"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href=\"", 2, 0, 2), suffix: new LocationTagged<string>("\"", 20, 0, 20)), Factory.Markup("<a"),
Factory.Markup(" href=\"").With(SpanCodeGenerator.Null), new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href=\"", 2, 0, 2), suffix: new LocationTagged<string>("\"", 20, 0, 20)),
Factory.Markup("Foo").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(string.Empty, 9, 0, 9), value: new LocationTagged<string>("Foo", 9, 0, 9))), Factory.Markup(" href=\"").With(SpanCodeGenerator.Null),
Factory.Markup(" Bar").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(" ", 12, 0, 12), value: new LocationTagged<string>("Bar", 13, 0, 13))), Factory.Markup("Foo").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(string.Empty, 9, 0, 9), value: new LocationTagged<string>("Foo", 9, 0, 9))),
Factory.Markup(" Baz").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(" ", 16, 0, 16), value: new LocationTagged<string>("Baz", 17, 0, 17))), Factory.Markup(" Bar").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(" ", 12, 0, 12), value: new LocationTagged<string>("Bar", 13, 0, 13))),
Factory.Markup("\"").With(SpanCodeGenerator.Null)), Factory.Markup(" Baz").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(" ", 16, 0, 16), value: new LocationTagged<string>("Baz", 17, 0, 17))),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))); Factory.Markup("\"").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -62,11 +66,12 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<a href=Foo Bar Baz />", ParseBlockTest("<a href=Foo Bar Baz />",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<a"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href=", 2, 0, 2), suffix: new LocationTagged<string>(string.Empty, 11, 0, 11)), Factory.Markup("<a"),
Factory.Markup(" href=").With(SpanCodeGenerator.Null), new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href=", 2, 0, 2), suffix: new LocationTagged<string>(string.Empty, 11, 0, 11)),
Factory.Markup("Foo").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(string.Empty, 8, 0, 8), value: new LocationTagged<string>("Foo", 8, 0, 8)))), Factory.Markup(" href=").With(SpanCodeGenerator.Null),
Factory.Markup(" Bar Baz />").Accepts(AcceptedCharacters.None))); Factory.Markup("Foo").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(string.Empty, 8, 0, 8), value: new LocationTagged<string>("Foo", 8, 0, 8)))),
Factory.Markup(" Bar Baz />").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -74,17 +79,18 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<a href='@foo' />", ParseBlockTest("<a href='@foo' />",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<a"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 13, 0, 13)), Factory.Markup("<a"),
Factory.Markup(" href='").With(SpanCodeGenerator.Null), new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 13, 0, 13)),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(string.Empty, 9, 0, 9), 9, 0, 9), Factory.Markup(" href='").With(SpanCodeGenerator.Null),
new ExpressionBlock( new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(string.Empty, 9, 0, 9), 9, 0, 9),
Factory.CodeTransition(), new ExpressionBlock(
Factory.Code("foo") Factory.CodeTransition(),
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) Factory.Code("foo")
.Accepts(AcceptedCharacters.NonWhiteSpace))), .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
Factory.Markup("'").With(SpanCodeGenerator.Null)), .Accepts(AcceptedCharacters.NonWhiteSpace))),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))); Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -92,25 +98,26 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<a href='@foo bar @baz' />", ParseBlockTest("<a href='@foo bar @baz' />",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<a"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 22, 0, 22)), Factory.Markup("<a"),
Factory.Markup(" href='").With(SpanCodeGenerator.Null), new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 22, 0, 22)),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(string.Empty, 9, 0, 9), 9, 0, 9), Factory.Markup(" href='").With(SpanCodeGenerator.Null),
new ExpressionBlock( new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(string.Empty, 9, 0, 9), 9, 0, 9),
Factory.CodeTransition(), new ExpressionBlock(
Factory.Code("foo") Factory.CodeTransition(),
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) Factory.Code("foo")
.Accepts(AcceptedCharacters.NonWhiteSpace))), .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
Factory.Markup(" bar").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(" ", 13, 0, 13), new LocationTagged<string>("bar", 14, 0, 14))), .Accepts(AcceptedCharacters.NonWhiteSpace))),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(" ", 17, 0, 17), 18, 0, 18), Factory.Markup(" bar").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(" ", 13, 0, 13), new LocationTagged<string>("bar", 14, 0, 14))),
Factory.Markup(" ").With(SpanCodeGenerator.Null), new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(" ", 17, 0, 17), 18, 0, 18),
new ExpressionBlock( Factory.Markup(" ").With(SpanCodeGenerator.Null),
Factory.CodeTransition(), new ExpressionBlock(
Factory.Code("baz") Factory.CodeTransition(),
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) Factory.Code("baz")
.Accepts(AcceptedCharacters.NonWhiteSpace))), .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
Factory.Markup("'").With(SpanCodeGenerator.Null)), .Accepts(AcceptedCharacters.NonWhiteSpace))),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))); Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -118,22 +125,23 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<a href='@foo ~/Foo/Bar' />", ParseBlockTest("<a href='@foo ~/Foo/Bar' />",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<a"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 23, 0, 23)), Factory.Markup("<a"),
Factory.Markup(" href='").With(SpanCodeGenerator.Null), new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 23, 0, 23)),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(string.Empty, 9, 0, 9), 9, 0, 9), Factory.Markup(" href='").With(SpanCodeGenerator.Null),
new ExpressionBlock( new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(string.Empty, 9, 0, 9), 9, 0, 9),
Factory.CodeTransition(), new ExpressionBlock(
Factory.Code("foo") Factory.CodeTransition(),
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) Factory.Code("foo")
.Accepts(AcceptedCharacters.NonWhiteSpace))), .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
Factory.Markup(" ~/Foo/Bar") .Accepts(AcceptedCharacters.NonWhiteSpace))),
.WithEditorHints(EditorHints.VirtualPath) Factory.Markup(" ~/Foo/Bar")
.With(new LiteralAttributeCodeGenerator( .WithEditorHints(EditorHints.VirtualPath)
new LocationTagged<string>(" ", 13, 0, 13), .With(new LiteralAttributeCodeGenerator(
new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 14, 0, 14))), new LocationTagged<string>(" ", 13, 0, 13),
Factory.Markup("'").With(SpanCodeGenerator.Null)), new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 14, 0, 14))),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))); Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -141,16 +149,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<input value=@foo />", ParseBlockTest("<input value=@foo />",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<input"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator(name: "value", prefix: new LocationTagged<string>(" value=", 6, 0, 6), suffix: new LocationTagged<string>(string.Empty, 17, 0, 17)), Factory.Markup("<input"),
Factory.Markup(" value=").With(SpanCodeGenerator.Null), new MarkupBlock(new AttributeBlockCodeGenerator(name: "value", prefix: new LocationTagged<string>(" value=", 6, 0, 6), suffix: new LocationTagged<string>(string.Empty, 17, 0, 17)),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(string.Empty, 13, 0, 13), 13, 0, 13), Factory.Markup(" value=").With(SpanCodeGenerator.Null),
new ExpressionBlock( new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(string.Empty, 13, 0, 13), 13, 0, 13),
Factory.CodeTransition(), new ExpressionBlock(
Factory.Code("foo") Factory.CodeTransition(),
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) Factory.Code("foo")
.Accepts(AcceptedCharacters.NonWhiteSpace)))), .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
Factory.Markup(" />").Accepts(AcceptedCharacters.None))); .Accepts(AcceptedCharacters.NonWhiteSpace)))),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -158,16 +167,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseDocumentTest("<input value=@foo />", ParseDocumentTest("<input value=@foo />",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<input"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator(name: "value", prefix: new LocationTagged<string>(" value=", 6, 0, 6), suffix: new LocationTagged<string>(string.Empty, 17, 0, 17)), Factory.Markup("<input"),
Factory.Markup(" value=").With(SpanCodeGenerator.Null), new MarkupBlock(new AttributeBlockCodeGenerator(name: "value", prefix: new LocationTagged<string>(" value=", 6, 0, 6), suffix: new LocationTagged<string>(string.Empty, 17, 0, 17)),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(string.Empty, 13, 0, 13), 13, 0, 13), Factory.Markup(" value=").With(SpanCodeGenerator.Null),
new ExpressionBlock( new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(string.Empty, 13, 0, 13), 13, 0, 13),
Factory.CodeTransition(), new ExpressionBlock(
Factory.Code("foo") Factory.CodeTransition(),
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) Factory.Code("foo")
.Accepts(AcceptedCharacters.NonWhiteSpace)))), .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
Factory.Markup(" />"))); .Accepts(AcceptedCharacters.NonWhiteSpace)))),
Factory.Markup(" />"))));
} }
[Fact] [Fact]
@ -182,16 +192,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
Assert.Equal(0, results.ParserErrors.Count); Assert.Equal(0, results.ParserErrors.Count);
EvaluateParseTree(rewritten, EvaluateParseTree(rewritten,
new MarkupBlock( new MarkupBlock(
Factory.Markup("<a"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 18, 0, 18)), Factory.Markup("<a"),
Factory.Markup(" href='").With(SpanCodeGenerator.Null), new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 18, 0, 18)),
Factory.Markup("~/Foo/Bar") Factory.Markup(" href='").With(SpanCodeGenerator.Null),
.WithEditorHints(EditorHints.VirtualPath) Factory.Markup("~/Foo/Bar")
.With(new LiteralAttributeCodeGenerator( .WithEditorHints(EditorHints.VirtualPath)
new LocationTagged<string>(string.Empty, 9, 0, 9), .With(new LiteralAttributeCodeGenerator(
new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 9, 0, 9))), new LocationTagged<string>(string.Empty, 9, 0, 9),
Factory.Markup("'").With(SpanCodeGenerator.Null)), new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 9, 0, 9))),
Factory.Markup(" />"))); Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />"))));
} }
[Fact] [Fact]
@ -264,7 +275,7 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
// Assert // Assert
Assert.Equal(0, results.ParserErrors.Count); Assert.Equal(0, results.ParserErrors.Count);
EvaluateParseTree(rewritten, new MarkupBlock(Factory.Markup(code))); Assert.Equal(rewritten.Children.Count(), results.Document.Children.Count());
} }
[Fact] [Fact]
@ -272,16 +283,19 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<span data-foo='@foo'></span>", ParseBlockTest("<span data-foo='@foo'></span>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<span"), new MarkupTagBlock(
new MarkupBlock( Factory.Markup("<span"),
Factory.Markup(" data-foo='"), new MarkupBlock(
new ExpressionBlock( Factory.Markup(" data-foo='"),
Factory.CodeTransition(), new ExpressionBlock(
Factory.Code("foo") Factory.CodeTransition(),
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) Factory.Code("foo")
.Accepts(AcceptedCharacters.NonWhiteSpace)), .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
Factory.Markup("'")), .Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("></span>").Accepts(AcceptedCharacters.None))); Factory.Markup("'")),
Factory.Markup(">").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</span>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -289,16 +303,19 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseDocumentTest("<span data-foo='@foo'></span>", ParseDocumentTest("<span data-foo='@foo'></span>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<span"), new MarkupTagBlock(
new MarkupBlock( Factory.Markup("<span"),
Factory.Markup(" data-foo='"), new MarkupBlock(
new ExpressionBlock( Factory.Markup(" data-foo='"),
Factory.CodeTransition(), new ExpressionBlock(
Factory.Code("foo") Factory.CodeTransition(),
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) Factory.Code("foo")
.Accepts(AcceptedCharacters.NonWhiteSpace)), .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
Factory.Markup("'")), .Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("></span>"))); Factory.Markup("'")),
Factory.Markup(">")),
new MarkupTagBlock(
Factory.Markup("</span>"))));
} }
} }
} }

View File

@ -38,7 +38,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
Factory.MetaCode("{").Accepts(AcceptedCharacters.None), Factory.MetaCode("{").Accepts(AcceptedCharacters.None),
Factory.Code("\r\n").AsStatement(), Factory.Code("\r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup("<")))), new MarkupTagBlock(
Factory.Markup("<"))))),
new RazorError( new RazorError(
RazorResources.FormatParseError_Expected_EndOfBlock_Before_EOF(RazorResources.BlockName_Code, "}", "{"), RazorResources.FormatParseError_Expected_EndOfBlock_Before_EOF(RazorResources.BlockName_Code, "}", "{"),
1, 0, 1)); 1, 0, 1));
@ -57,10 +58,12 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
Factory.MetaCode("{").Accepts(AcceptedCharacters.None), Factory.MetaCode("{").Accepts(AcceptedCharacters.None),
Factory.Code("\r\n").AsStatement(), Factory.Code("\r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup("<\r\n") new MarkupTagBlock(
Factory.Markup("<\r\n"))
), ),
new MarkupBlock( new MarkupBlock(
Factory.Markup(@"</html>").Accepts(AcceptedCharacters.None) new MarkupTagBlock(
Factory.Markup("</html>").Accepts(AcceptedCharacters.None))
), ),
Factory.EmptyCSharp().AsStatement() Factory.EmptyCSharp().AsStatement()
) )
@ -79,7 +82,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
ParseBlockTest("< " + Environment.NewLine ParseBlockTest("< " + Environment.NewLine
+ " ", + " ",
new MarkupBlock( new MarkupBlock(
Factory.Markup("< \r\n ")), new MarkupTagBlock(
Factory.Markup("< \r\n "))),
designTimeParser: true, designTimeParser: true,
expectedErrors: new RazorError(RazorResources.FormatParseError_UnfinishedTag(string.Empty), 0, 0, 0)); expectedErrors: new RazorError(RazorResources.FormatParseError_UnfinishedTag(string.Empty), 0, 0, 0));
} }
@ -87,7 +91,18 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
[Fact] [Fact]
public void ParseBlockAllowsStartAndEndTagsToDifferInCase() public void ParseBlockAllowsStartAndEndTagsToDifferInCase()
{ {
SingleSpanBlockTest("<li><p>Foo</P></lI>", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); ParseBlockTest("<li><p>Foo</P></lI>",
new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<li>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Foo"),
new MarkupTagBlock(
Factory.Markup("</P>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</lI>").Accepts(AcceptedCharacters.None))
));
} }
[Fact] [Fact]
@ -118,31 +133,77 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
[Fact] [Fact]
public void ParseBlockStopsAtMatchingCloseTagToStartTag() public void ParseBlockStopsAtMatchingCloseTagToStartTag()
{ {
SingleSpanBlockTest("<a><b></b></a><c></c>", "<a><b></b></a>", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); ParseBlockTest("<a><b></b></a><c></c>",
new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<a>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("<b>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</b>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</a>").Accepts(AcceptedCharacters.None))
));
} }
[Fact] [Fact]
public void ParseBlockParsesUntilMatchingEndTagIfFirstNonWhitespaceCharacterIsStartTag() public void ParseBlockParsesUntilMatchingEndTagIfFirstNonWhitespaceCharacterIsStartTag()
{ {
SingleSpanBlockTest("<baz><boz><biz></biz></boz></baz>", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); ParseBlockTest("<baz><boz><biz></biz></boz></baz>",
new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<baz>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("<boz>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("<biz>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</biz>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</boz>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</baz>").Accepts(AcceptedCharacters.None))
));
} }
[Fact] [Fact]
public void ParseBlockAllowsUnclosedTagsAsLongAsItCanRecoverToAnExpectedEndTag() public void ParseBlockAllowsUnclosedTagsAsLongAsItCanRecoverToAnExpectedEndTag()
{ {
SingleSpanBlockTest("<foo><bar><baz></foo>", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); ParseBlockTest("<foo><bar><baz></foo>",
new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("<bar>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("<baz>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))
));
} }
[Fact] [Fact]
public void ParseBlockWithSelfClosingTagJustEmitsTag() public void ParseBlockWithSelfClosingTagJustEmitsTag()
{ {
SingleSpanBlockTest("<foo />", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); ParseBlockTest("<foo />",
new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<foo />").Accepts(AcceptedCharacters.None))
));
} }
[Fact] [Fact]
public void ParseBlockCanHandleSelfClosingTagsWithinBlock() public void ParseBlockCanHandleSelfClosingTagsWithinBlock()
{ {
SingleSpanBlockTest("<foo><bar /></foo>", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); ParseBlockTest("<foo><bar /></foo>",
new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("<bar />").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))
));
} }
[Fact] [Fact]
@ -150,16 +211,25 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<foo bar=\"baz\"><biz><boz zoop=zork/></biz></foo>", ParseBlockTest("<foo bar=\"baz\"><biz><boz zoop=zork/></biz></foo>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<foo"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator("bar", new LocationTagged<string>(" bar=\"", 4, 0, 4), new LocationTagged<string>("\"", 13, 0, 13)), Factory.Markup("<foo"),
Factory.Markup(" bar=\"").With(SpanCodeGenerator.Null), new MarkupBlock(new AttributeBlockCodeGenerator("bar", new LocationTagged<string>(" bar=\"", 4, 0, 4), new LocationTagged<string>("\"", 13, 0, 13)),
Factory.Markup("baz").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 10, 0, 10), new LocationTagged<string>("baz", 10, 0, 10))), Factory.Markup(" bar=\"").With(SpanCodeGenerator.Null),
Factory.Markup("\"").With(SpanCodeGenerator.Null)), Factory.Markup("baz").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 10, 0, 10), new LocationTagged<string>("baz", 10, 0, 10))),
Factory.Markup("><biz><boz"), Factory.Markup("\"").With(SpanCodeGenerator.Null)),
new MarkupBlock(new AttributeBlockCodeGenerator("zoop", new LocationTagged<string>(" zoop=", 24, 0, 24), new LocationTagged<string>(String.Empty, 34, 0, 34)), Factory.Markup(">").Accepts(AcceptedCharacters.None)),
Factory.Markup(" zoop=").With(SpanCodeGenerator.Null), new MarkupTagBlock(
Factory.Markup("zork").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 30, 0, 30), new LocationTagged<string>("zork", 30, 0, 30)))), Factory.Markup("<biz>").Accepts(AcceptedCharacters.None)),
Factory.Markup("/></biz></foo>").Accepts(AcceptedCharacters.None))); new MarkupTagBlock(
Factory.Markup("<boz"),
new MarkupBlock(new AttributeBlockCodeGenerator("zoop", new LocationTagged<string>(" zoop=", 24, 0, 24), new LocationTagged<string>(String.Empty, 34, 0, 34)),
Factory.Markup(" zoop=").With(SpanCodeGenerator.Null),
Factory.Markup("zork").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 30, 0, 30), new LocationTagged<string>("zork", 30, 0, 30)))),
Factory.Markup("/>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</biz>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -167,12 +237,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<foo><bar baz=\">\" /></foo>", ParseBlockTest("<foo><bar baz=\">\" /></foo>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<foo><bar"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator("baz", new LocationTagged<string>(" baz=\"", 9, 0, 9), new LocationTagged<string>("\"", 16, 0, 16)), Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
Factory.Markup(" baz=\"").With(SpanCodeGenerator.Null), new MarkupTagBlock(
Factory.Markup(">").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 15, 0, 15), new LocationTagged<string>(">", 15, 0, 15))), Factory.Markup("<bar"),
Factory.Markup("\"").With(SpanCodeGenerator.Null)), new MarkupBlock(new AttributeBlockCodeGenerator("baz", new LocationTagged<string>(" baz=\"", 9, 0, 9), new LocationTagged<string>("\"", 16, 0, 16)),
Factory.Markup(" /></foo>").Accepts(AcceptedCharacters.None))); Factory.Markup(" baz=\"").With(SpanCodeGenerator.Null),
Factory.Markup(">").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 15, 0, 15), new LocationTagged<string>(">", 15, 0, 15))),
Factory.Markup("\"").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -180,12 +255,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<foo><bar baz=\'>\' /></foo>", ParseBlockTest("<foo><bar baz=\'>\' /></foo>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<foo><bar"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator("baz", new LocationTagged<string>(" baz='", 9, 0, 9), new LocationTagged<string>("'", 16, 0, 16)), Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
Factory.Markup(" baz='").With(SpanCodeGenerator.Null), new MarkupTagBlock(
Factory.Markup(">").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 15, 0, 15), new LocationTagged<string>(">", 15, 0, 15))), Factory.Markup("<bar"),
Factory.Markup("'").With(SpanCodeGenerator.Null)), new MarkupBlock(new AttributeBlockCodeGenerator("baz", new LocationTagged<string>(" baz='", 9, 0, 9), new LocationTagged<string>("'", 16, 0, 16)),
Factory.Markup(" /></foo>").Accepts(AcceptedCharacters.None))); Factory.Markup(" baz='").With(SpanCodeGenerator.Null),
Factory.Markup(">").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 15, 0, 15), new LocationTagged<string>(">", 15, 0, 15))),
Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -193,12 +273,19 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<foo><bar baz=\"/\"></bar></foo>", ParseBlockTest("<foo><bar baz=\"/\"></bar></foo>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<foo><bar"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator("baz", new LocationTagged<string>(" baz=\"", 9, 0, 9), new LocationTagged<string>("\"", 16, 0, 16)), Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
Factory.Markup(" baz=\"").With(SpanCodeGenerator.Null), new MarkupTagBlock(
Factory.Markup("/").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 15, 0, 15), new LocationTagged<string>("/", 15, 0, 15))), Factory.Markup("<bar"),
Factory.Markup("\"").With(SpanCodeGenerator.Null)), new MarkupBlock(new AttributeBlockCodeGenerator("baz", new LocationTagged<string>(" baz=\"", 9, 0, 9), new LocationTagged<string>("\"", 16, 0, 16)),
Factory.Markup("></bar></foo>").Accepts(AcceptedCharacters.None))); Factory.Markup(" baz=\"").With(SpanCodeGenerator.Null),
Factory.Markup("/").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 15, 0, 15), new LocationTagged<string>("/", 15, 0, 15))),
Factory.Markup("\"").With(SpanCodeGenerator.Null)),
Factory.Markup(">").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</bar>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -206,19 +293,29 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<foo><bar baz=\'/\'></bar></foo>", ParseBlockTest("<foo><bar baz=\'/\'></bar></foo>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<foo><bar"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator("baz", new LocationTagged<string>(" baz='", 9, 0, 9), new LocationTagged<string>("'", 16, 0, 16)), Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
Factory.Markup(" baz='").With(SpanCodeGenerator.Null), new MarkupTagBlock(
Factory.Markup("/").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 15, 0, 15), new LocationTagged<string>("/", 15, 0, 15))), Factory.Markup("<bar"),
Factory.Markup("'").With(SpanCodeGenerator.Null)), new MarkupBlock(new AttributeBlockCodeGenerator("baz", new LocationTagged<string>(" baz='", 9, 0, 9), new LocationTagged<string>("'", 16, 0, 16)),
Factory.Markup("></bar></foo>").Accepts(AcceptedCharacters.None))); Factory.Markup(" baz='").With(SpanCodeGenerator.Null),
Factory.Markup("/").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 15, 0, 15), new LocationTagged<string>("/", 15, 0, 15))),
Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(">").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</bar>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
public void ParseBlockTerminatesAtEOF() public void ParseBlockTerminatesAtEOF()
{ {
SingleSpanBlockTest("<foo>", "<foo>", BlockType.Markup, SpanKind.Markup, ParseBlockTest("<foo>",
new RazorError(RazorResources.FormatParseError_MissingEndTag("foo"), new SourceLocation(0, 0, 0))); new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None))),
new RazorError(RazorResources.FormatParseError_MissingEndTag("foo"), new SourceLocation(0, 0, 0)));
} }
[Fact] [Fact]
@ -230,7 +327,15 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
[Fact] [Fact]
public void ParseBlockSupportsCommentWithinBlock() public void ParseBlockSupportsCommentWithinBlock()
{ {
SingleSpanBlockTest("<foo>bar<!-- zoop -->baz</foo>", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); ParseBlockTest("<foo>bar<!-- zoop -->baz</foo>",
new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
Factory.Markup("bar"),
Factory.Markup("<!-- zoop -->").Accepts(AcceptedCharacters.None),
Factory.Markup("baz"),
new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -254,18 +359,25 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
[Fact] [Fact]
public void ParseBlockTerminatesCommentAtFirstOccurrenceOfEndSequence() public void ParseBlockTerminatesCommentAtFirstOccurrenceOfEndSequence()
{ {
SingleSpanBlockTest("<foo><!--<foo></bar-->--></foo>", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); ParseBlockTest("<foo><!--<foo></bar-->--></foo>",
new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
Factory.Markup("<!--<foo></bar-->").Accepts(AcceptedCharacters.None),
Factory.Markup("-->"),
new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
public void ParseBlockTreatsMalformedTagsAsContent() public void ParseBlockTreatsMalformedTagsAsContent()
{ {
SingleSpanBlockTest( ParseBlockTest("<foo></!-- bar --></foo>",
"<foo></!-- bar --></foo>", new MarkupBlock(
"<foo></!-- bar -->", new MarkupTagBlock(
BlockType.Markup, Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
SpanKind.Markup, new MarkupTagBlock(
AcceptedCharacters.None, Factory.Markup("</!-- bar -->").Accepts(AcceptedCharacters.None))),
new RazorError(RazorResources.FormatParseError_MissingEndTag("foo"), 0, 0, 0)); new RazorError(RazorResources.FormatParseError_MissingEndTag("foo"), 0, 0, 0));
} }
@ -273,43 +385,87 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
[Fact] [Fact]
public void ParseBlockParsesSGMLDeclarationAsEmptyTag() public void ParseBlockParsesSGMLDeclarationAsEmptyTag()
{ {
SingleSpanBlockTest("<foo><!DOCTYPE foo bar baz></foo>", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); ParseBlockTest("<foo><!DOCTYPE foo bar baz></foo>",
new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
Factory.Markup("<!DOCTYPE foo bar baz>").Accepts(AcceptedCharacters.None),
new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
public void ParseBlockTerminatesSGMLDeclarationAtFirstCloseAngle() public void ParseBlockTerminatesSGMLDeclarationAtFirstCloseAngle()
{ {
SingleSpanBlockTest("<foo><!DOCTYPE foo bar> baz></foo>", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); ParseBlockTest("<foo><!DOCTYPE foo bar> baz></foo>",
new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
Factory.Markup("<!DOCTYPE foo bar>").Accepts(AcceptedCharacters.None),
Factory.Markup(" baz>"),
new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
public void ParseBlockParsesXMLProcessingInstructionAsEmptyTag() public void ParseBlockParsesXMLProcessingInstructionAsEmptyTag()
{ {
SingleSpanBlockTest("<foo><?xml foo bar baz?></foo>", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); ParseBlockTest("<foo><?xml foo bar baz?></foo>",
new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
Factory.Markup("<?xml foo bar baz?>").Accepts(AcceptedCharacters.None),
new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
public void ParseBlockTerminatesXMLProcessingInstructionAtQuestionMarkCloseAnglePair() public void ParseBlockTerminatesXMLProcessingInstructionAtQuestionMarkCloseAnglePair()
{ {
SingleSpanBlockTest("<foo><?xml foo bar?> baz</foo>", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); ParseBlockTest("<foo><?xml foo bar baz?> baz</foo>",
new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
Factory.Markup("<?xml foo bar baz?>").Accepts(AcceptedCharacters.None),
Factory.Markup(" baz"),
new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
public void ParseBlockDoesNotTerminateXMLProcessingInstructionAtCloseAngleUnlessPreceededByQuestionMark() public void ParseBlockDoesNotTerminateXMLProcessingInstructionAtCloseAngleUnlessPreceededByQuestionMark()
{ {
SingleSpanBlockTest("<foo><?xml foo bar> baz?></foo>", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); ParseBlockTest("<foo><?xml foo bar> baz?></foo>",
new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
Factory.Markup("<?xml foo bar> baz?>").Accepts(AcceptedCharacters.None),
new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
public void ParseBlockSupportsScriptTagsWithLessThanSignsInThem() public void ParseBlockSupportsScriptTagsWithLessThanSignsInThem()
{ {
SingleSpanBlockTest(@"<script>if(foo<bar) { alert(""baz"");)</script>", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); ParseBlockTest(@"<script>if(foo<bar) { alert(""baz"");)</script>",
new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<script>").Accepts(AcceptedCharacters.None)),
Factory.Markup(@"if(foo<bar) { alert(""baz"");)"),
new MarkupTagBlock(
Factory.Markup("</script>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
public void ParseBlockSupportsScriptTagsWithSpacedLessThanSignsInThem() public void ParseBlockSupportsScriptTagsWithSpacedLessThanSignsInThem()
{ {
SingleSpanBlockTest(@"<script>if(foo < bar) { alert(""baz"");)</script>", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); ParseBlockTest(@"<script>if(foo < bar) { alert(""baz"");)</script>",
new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<script>").Accepts(AcceptedCharacters.None)),
Factory.Markup(@"if(foo < bar) { alert(""baz"");)"),
new MarkupTagBlock(
Factory.Markup("</script>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -317,7 +473,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<text/>", ParseBlockTest("<text/>",
new MarkupBlock( new MarkupBlock(
Factory.MarkupTransition("<text/>") new MarkupTagBlock(
Factory.MarkupTransition("<text/>"))
)); ));
} }
@ -326,9 +483,14 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<text>Foo Bar <foo> Baz</text> zoop", ParseBlockTest("<text>Foo Bar <foo> Baz</text> zoop",
new MarkupBlock( new MarkupBlock(
Factory.MarkupTransition("<text>"), new MarkupTagBlock(
Factory.Markup("Foo Bar <foo> Baz"), Factory.MarkupTransition("<text>")),
Factory.MarkupTransition("</text>"), Factory.Markup("Foo Bar ").Accepts(AcceptedCharacters.None),
new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
Factory.Markup(" Baz"),
new MarkupTagBlock(
Factory.MarkupTransition("</text>")),
Factory.Markup(" ").Accepts(AcceptedCharacters.None) Factory.Markup(" ").Accepts(AcceptedCharacters.None)
)); ));
} }
@ -338,9 +500,18 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<text><text>Foo Bar <foo> Baz</text></text> zoop", ParseBlockTest("<text><text>Foo Bar <foo> Baz</text></text> zoop",
new MarkupBlock( new MarkupBlock(
Factory.MarkupTransition("<text>"), new MarkupTagBlock(
Factory.Markup("<text>Foo Bar <foo> Baz</text>"), Factory.MarkupTransition("<text>")),
Factory.MarkupTransition("</text>"), new MarkupTagBlock(
Factory.Markup("<text>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Foo Bar "),
new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
Factory.Markup(" Baz"),
new MarkupTagBlock(
Factory.Markup("</text>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.MarkupTransition("</text>")),
Factory.Markup(" ").Accepts(AcceptedCharacters.None) Factory.Markup(" ").Accepts(AcceptedCharacters.None)
)); ));
} }
@ -350,7 +521,16 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<foo><text><bar></bar></foo>", ParseBlockTest("<foo><text><bar></bar></foo>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<foo><text><bar></bar></foo>").Accepts(AcceptedCharacters.None) new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("<text>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("<bar>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</bar>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))
)); ));
} }
@ -359,8 +539,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<br/", ParseBlockTest("<br/",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<br/") new MarkupTagBlock(
), Factory.Markup("<br/"))),
new RazorError(RazorResources.FormatParseError_UnfinishedTag("br"), SourceLocation.Zero)); new RazorError(RazorResources.FormatParseError_UnfinishedTag("br"), SourceLocation.Zero));
} }
@ -369,11 +549,15 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<div>Foo @if(true) {} Bar</div>", ParseBlockTest("<div>Foo @if(true) {} Bar</div>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<div>Foo "), new MarkupTagBlock(
Factory.Markup("<div>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Foo "),
new StatementBlock( new StatementBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("if(true) {}").AsStatement()), Factory.Code("if(true) {}").AsStatement()),
Factory.Markup(" Bar</div>").Accepts(AcceptedCharacters.None))); Factory.Markup(" Bar"),
new MarkupTagBlock(
Factory.Markup("</div>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -381,14 +565,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest(@"<script>foo<bar baz='@boz'></script>", ParseBlockTest(@"<script>foo<bar baz='@boz'></script>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<script>foo<bar baz='"), new MarkupTagBlock(
Factory.Markup("<script>").Accepts(AcceptedCharacters.None)),
Factory.Markup("foo<bar baz='"),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("boz") Factory.Code("boz")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: false) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: false)
.Accepts(AcceptedCharacters.NonWhiteSpace)), .Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("'></script>") Factory.Markup("'>"),
.Accepts(AcceptedCharacters.None))); new MarkupTagBlock(
Factory.Markup("</script>").Accepts(AcceptedCharacters.None))));
} }
} }
} }

View File

@ -64,16 +64,30 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
new RazorError(RazorResources.ParseError_Unexpected_EndOfFile_At_Start_Of_CodeBlock, 1, 0, 1)); new RazorError(RazorResources.ParseError_Unexpected_EndOfFile_At_Start_Of_CodeBlock, 1, 0, 1));
} }
[Fact]
public void ParseDocumentCorrectlyHandlesOddlySpacedHTMLElements()
{
ParseDocumentTest("<div ><p class = 'bar'> Foo </p></div >",
new MarkupBlock(
BlockFactory.MarkupTagBlock("<div >"),
BlockFactory.MarkupTagBlock("<p class = 'bar'>"),
Factory.Markup(" Foo "),
BlockFactory.MarkupTagBlock("</p>"),
BlockFactory.MarkupTagBlock("</div >")));
}
[Fact] [Fact]
public void ParseDocumentCorrectlyHandlesSingleLineOfMarkupWithEmbeddedStatement() public void ParseDocumentCorrectlyHandlesSingleLineOfMarkupWithEmbeddedStatement()
{ {
ParseDocumentTest("<div>Foo @if(true) {} Bar</div>", ParseDocumentTest("<div>Foo @if(true) {} Bar</div>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<div>Foo "), BlockFactory.MarkupTagBlock("<div>"),
Factory.Markup("Foo "),
new StatementBlock( new StatementBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("if(true) {}").AsStatement()), Factory.Code("if(true) {}").AsStatement()),
Factory.Markup(" Bar</div>"))); Factory.Markup(" Bar"),
BlockFactory.MarkupTagBlock("</div>")));
} }
[Fact] [Fact]
@ -89,7 +103,10 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
Factory.MetaCode("section Foo {") Factory.MetaCode("section Foo {")
.AutoCompleteWith(null, atEndOfSpan: true), .AutoCompleteWith(null, atEndOfSpan: true),
new MarkupBlock( new MarkupBlock(
Factory.Markup("\r\n <html></html>\r\n")), Factory.Markup("\r\n "),
BlockFactory.MarkupTagBlock("<html>"),
BlockFactory.MarkupTagBlock("</html>"),
Factory.Markup("\r\n")),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None)), Factory.MetaCode("}").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml())); Factory.EmptyHtml()));
} }
@ -97,7 +114,7 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
[Fact] [Fact]
public void ParseDocumentParsesWholeContentAsOneSpanIfNoSwapCharacterEncountered() public void ParseDocumentParsesWholeContentAsOneSpanIfNoSwapCharacterEncountered()
{ {
SingleSpanDocumentTest("foo <bar>baz</bar>", BlockType.Markup, SpanKind.Markup); SingleSpanDocumentTest("foo baz", BlockType.Markup, SpanKind.Markup);
} }
[Fact] [Fact]
@ -146,7 +163,7 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
[Fact] [Fact]
public void ParseDocumentDoesNotSwitchToCodeOnEmailAddressInText() public void ParseDocumentDoesNotSwitchToCodeOnEmailAddressInText()
{ {
SingleSpanDocumentTest("<foo>anurse@microsoft.com</foo>", BlockType.Markup, SpanKind.Markup); SingleSpanDocumentTest("anurse@microsoft.com", BlockType.Markup, SpanKind.Markup);
} }
[Fact] [Fact]
@ -154,37 +171,56 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseDocumentTest("<a href=\"mailto:anurse@microsoft.com\">Email me</a>", ParseDocumentTest("<a href=\"mailto:anurse@microsoft.com\">Email me</a>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<a"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href=\"", 2, 0, 2), new LocationTagged<string>("\"", 36, 0, 36)), Factory.Markup("<a"),
Factory.Markup(" href=\"").With(SpanCodeGenerator.Null), new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href=\"", 2, 0, 2), new LocationTagged<string>("\"", 36, 0, 36)),
Factory.Markup("mailto:anurse@microsoft.com") Factory.Markup(" href=\"").With(SpanCodeGenerator.Null),
.With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 9, 0, 9), new LocationTagged<string>("mailto:anurse@microsoft.com", 9, 0, 9))), Factory.Markup("mailto:anurse@microsoft.com")
Factory.Markup("\"").With(SpanCodeGenerator.Null)), .With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 9, 0, 9), new LocationTagged<string>("mailto:anurse@microsoft.com", 9, 0, 9))),
Factory.Markup(">Email me</a>"))); Factory.Markup("\"").With(SpanCodeGenerator.Null)),
Factory.Markup(">")),
Factory.Markup("Email me"),
BlockFactory.MarkupTagBlock("</a>")));
} }
[Fact] [Fact]
public void ParseDocumentDoesNotReturnErrorOnMismatchedTags() public void ParseDocumentDoesNotReturnErrorOnMismatchedTags()
{ {
SingleSpanDocumentTest("Foo <div><p></p></p> Baz", BlockType.Markup, SpanKind.Markup); ParseDocumentTest("Foo <div><p></p></p> Baz",
new MarkupBlock(
Factory.Markup("Foo "),
BlockFactory.MarkupTagBlock("<div>"),
BlockFactory.MarkupTagBlock("<p>"),
BlockFactory.MarkupTagBlock("</p>"),
BlockFactory.MarkupTagBlock("</p>"),
Factory.Markup(" Baz")));
} }
[Fact] [Fact]
public void ParseDocumentReturnsOneMarkupSegmentIfNoCodeBlocksEncountered() public void ParseDocumentReturnsOneMarkupSegmentIfNoCodeBlocksEncountered()
{ {
SingleSpanDocumentTest("Foo <p>Baz<!--Foo-->Bar<!-F> Qux", BlockType.Markup, SpanKind.Markup); SingleSpanDocumentTest("Foo Baz<!--Foo-->Bar<!-F> Qux", BlockType.Markup, SpanKind.Markup);
} }
[Fact] [Fact]
public void ParseDocumentRendersTextPseudoTagAsMarkup() public void ParseDocumentRendersTextPseudoTagAsMarkup()
{ {
SingleSpanDocumentTest("Foo <text>Foo</text>", BlockType.Markup, SpanKind.Markup); ParseDocumentTest("Foo <text>Foo</text>",
new MarkupBlock(
Factory.Markup("Foo "),
BlockFactory.MarkupTagBlock("<text>"),
Factory.Markup("Foo"),
BlockFactory.MarkupTagBlock("</text>")));
} }
[Fact] [Fact]
public void ParseDocumentAcceptsEndTagWithNoMatchingStartTag() public void ParseDocumentAcceptsEndTagWithNoMatchingStartTag()
{ {
SingleSpanDocumentTest("Foo </div> Bar", BlockType.Markup, SpanKind.Markup); ParseDocumentTest("Foo </div> Bar",
new MarkupBlock(
Factory.Markup("Foo "),
BlockFactory.MarkupTagBlock("</div>"),
Factory.Markup(" Bar")));
} }
[Fact] [Fact]
@ -192,7 +228,9 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseDocumentTest("<foo>${bar}</foo>", ParseDocumentTest("<foo>${bar}</foo>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<foo>${bar}</foo>"))); BlockFactory.MarkupTagBlock("<foo>"),
Factory.Markup("${bar}"),
BlockFactory.MarkupTagBlock("</foo>")));
} }
[Fact] [Fact]
@ -200,13 +238,15 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseDocumentTest(@"<script>foo<bar baz='@boz'></script>", ParseDocumentTest(@"<script>foo<bar baz='@boz'></script>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<script>foo<bar baz='"), BlockFactory.MarkupTagBlock("<script>"),
Factory.Markup("foo<bar baz='"),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("boz") Factory.Code("boz")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: false) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: false)
.Accepts(AcceptedCharacters.NonWhiteSpace)), .Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("'></script>"))); Factory.Markup("'>"),
BlockFactory.MarkupTagBlock("</script>")));
} }
[Fact] [Fact]
@ -219,13 +259,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode("section Foo {"), Factory.MetaCode("section Foo {"),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <script>foo<bar baz='"), Factory.Markup(" "),
BlockFactory.MarkupTagBlock("<script>"),
Factory.Markup("foo<bar baz='"),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("boz") Factory.Code("boz")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: false) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: false)
.Accepts(AcceptedCharacters.NonWhiteSpace)), .Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("'></script> ")), Factory.Markup("'>"),
BlockFactory.MarkupTagBlock("</script>"),
Factory.Markup(" ")),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None)), Factory.MetaCode("}").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml())); Factory.EmptyHtml()));
} }
@ -234,7 +278,7 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
public void ParseBlockCanParse1000NestedElements() public void ParseBlockCanParse1000NestedElements()
{ {
string content = Nested1000.ReadAllText(); string content = Nested1000.ReadAllText();
SingleSpanDocumentTest(content, BlockType.Markup, SpanKind.Markup); ParseDocument(content);
} }
} }
} }

View File

@ -15,7 +15,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
[Fact] [Fact]
public void ParseBlockAllowsInvalidTagNamesAsLongAsParserCanIdentifyEndTag() public void ParseBlockAllowsInvalidTagNamesAsLongAsParserCanIdentifyEndTag()
{ {
SingleSpanBlockTest("<1-foo+bar>foo</1-foo+bar>", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); ParseBlockTest("<1-foo+bar>foo</1-foo+bar>",
new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<1-foo+bar>").Accepts(AcceptedCharacters.None)),
Factory.Markup("foo"),
new MarkupTagBlock(
Factory.Markup("</1-foo+bar>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -23,9 +29,10 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<text foo bar></text>", ParseBlockTest("<text foo bar></text>",
new MarkupBlock( new MarkupBlock(
Factory.MarkupTransition("<text").Accepts(AcceptedCharacters.Any), new MarkupTagBlock(
Factory.Markup(" foo bar>"), Factory.MarkupTransition("<text foo bar>").Accepts(AcceptedCharacters.Any)),
Factory.MarkupTransition("</text>")), new MarkupTagBlock(
Factory.MarkupTransition("</text>"))),
new RazorError(RazorResources.ParseError_TextTagCannotContainAttributes, SourceLocation.Zero)); new RazorError(RazorResources.ParseError_TextTagCannotContainAttributes, SourceLocation.Zero));
} }
@ -34,9 +41,10 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<text></text foo bar>", ParseBlockTest("<text></text foo bar>",
new MarkupBlock( new MarkupBlock(
Factory.MarkupTransition("<text>"), new MarkupTagBlock(
Factory.MarkupTransition("</text").Accepts(AcceptedCharacters.Any), Factory.MarkupTransition("<text>")),
Factory.Markup(" ")), new MarkupTagBlock(
Factory.MarkupTransition("</text foo bar>").Accepts(AcceptedCharacters.Any))),
new RazorError(RazorResources.ParseError_TextTagCannotContainAttributes, 6, 0, 6)); new RazorError(RazorResources.ParseError_TextTagCannotContainAttributes, 6, 0, 6));
} }
@ -53,7 +61,9 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("</foo> bar baz", ParseBlockTest("</foo> bar baz",
new MarkupBlock( new MarkupBlock(
Factory.Markup("</foo> ").Accepts(AcceptedCharacters.None)), new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None)),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)),
new RazorError(RazorResources.FormatParseError_UnexpectedEndTag("foo"), SourceLocation.Zero)); new RazorError(RazorResources.FormatParseError_UnexpectedEndTag("foo"), SourceLocation.Zero));
} }
@ -62,7 +72,12 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<p><foo></bar>", ParseBlockTest("<p><foo></bar>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<p><foo></bar>").Accepts(AcceptedCharacters.None)), new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</bar>").Accepts(AcceptedCharacters.None))),
new RazorError(RazorResources.FormatParseError_MissingEndTag("p"), new SourceLocation(0, 0, 0))); new RazorError(RazorResources.FormatParseError_MissingEndTag("p"), new SourceLocation(0, 0, 0)));
} }
@ -71,7 +86,9 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<foo>blah blah blah blah blah", ParseBlockTest("<foo>blah blah blah blah blah",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<foo>blah blah blah blah blah")), new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
Factory.Markup("blah blah blah blah blah")),
new RazorError(RazorResources.FormatParseError_MissingEndTag("foo"), new SourceLocation(0, 0, 0))); new RazorError(RazorResources.FormatParseError_MissingEndTag("foo"), new SourceLocation(0, 0, 0)));
} }
@ -80,10 +97,11 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<foo bar=baz", ParseBlockTest("<foo bar=baz",
new MarkupBlock( new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<foo"), Factory.Markup("<foo"),
new MarkupBlock(new AttributeBlockCodeGenerator("bar", new LocationTagged<string>(" bar=", 4, 0, 4), new LocationTagged<string>(String.Empty, 12, 0, 12)), new MarkupBlock(new AttributeBlockCodeGenerator("bar", new LocationTagged<string>(" bar=", 4, 0, 4), new LocationTagged<string>(String.Empty, 12, 0, 12)),
Factory.Markup(" bar=").With(SpanCodeGenerator.Null), Factory.Markup(" bar=").With(SpanCodeGenerator.Null),
Factory.Markup("baz").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(string.Empty, 9, 0, 9), new LocationTagged<string>("baz", 9, 0, 9))))), Factory.Markup("baz").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(string.Empty, 9, 0, 9), new LocationTagged<string>("baz", 9, 0, 9)))))),
new RazorError(RazorResources.FormatParseError_UnfinishedTag("foo"), new SourceLocation(0, 0, 0))); new RazorError(RazorResources.FormatParseError_UnfinishedTag("foo"), new SourceLocation(0, 0, 0)));
} }
} }

View File

@ -15,9 +15,12 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
var factory = SpanFactory.CreateCsHtml(); var factory = SpanFactory.CreateCsHtml();
testMethod("<foo>@@bar</foo>", testMethod("<foo>@@bar</foo>",
new MarkupBlock( new MarkupBlock(
factory.Markup("<foo>"), new MarkupTagBlock(
factory.Markup("<foo>").Accepts(lastSpanAcceptedCharacters)),
factory.Markup("@").Hidden(), factory.Markup("@").Hidden(),
factory.Markup("@bar</foo>").Accepts(lastSpanAcceptedCharacters))); factory.Markup("@bar"),
new MarkupTagBlock(
factory.Markup("</foo>").Accepts(lastSpanAcceptedCharacters))));
} }
public static void RunMultiAtEscapeTest(Action<string, Block> testMethod, AcceptedCharacters lastSpanAcceptedCharacters = AcceptedCharacters.None) public static void RunMultiAtEscapeTest(Action<string, Block> testMethod, AcceptedCharacters lastSpanAcceptedCharacters = AcceptedCharacters.None)
@ -25,7 +28,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
var factory = SpanFactory.CreateCsHtml(); var factory = SpanFactory.CreateCsHtml();
testMethod("<foo>@@@@@bar</foo>", testMethod("<foo>@@@@@bar</foo>",
new MarkupBlock( new MarkupBlock(
factory.Markup("<foo>"), new MarkupTagBlock(
factory.Markup("<foo>").Accepts(lastSpanAcceptedCharacters)),
factory.Markup("@").Hidden(), factory.Markup("@").Hidden(),
factory.Markup("@"), factory.Markup("@"),
factory.Markup("@").Hidden(), factory.Markup("@").Hidden(),
@ -35,7 +39,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
factory.Code("bar") factory.Code("bar")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)), .Accepts(AcceptedCharacters.NonWhiteSpace)),
factory.Markup("</foo>").Accepts(lastSpanAcceptedCharacters))); new MarkupTagBlock(
factory.Markup("</foo>").Accepts(lastSpanAcceptedCharacters))));
} }
} }
} }

View File

@ -38,16 +38,22 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<p></> Bar", ParseBlockTest("<p></> Bar",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<p></> ").Accepts(AcceptedCharacters.None)), BlockFactory.MarkupTagBlock("<p>", AcceptedCharacters.None),
BlockFactory.MarkupTagBlock("</>", AcceptedCharacters.None),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)),
new RazorError(RazorResources.FormatParseError_MissingEndTag("p"), 0, 0, 0)); new RazorError(RazorResources.FormatParseError_MissingEndTag("p"), 0, 0, 0));
} }
[Fact] [Fact]
public void EmptyTag() 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", ParseBlockTest("<></> Bar",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<></> ").Accepts(AcceptedCharacters.None))); BlockFactory.MarkupTagBlock("<>", AcceptedCharacters.None),
BlockFactory.MarkupTagBlock("</>", AcceptedCharacters.None),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)));
} }
[Fact] [Fact]
@ -55,7 +61,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<!--Foo--> Bar", ParseBlockTest("<!--Foo--> Bar",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<!--Foo--> ").Accepts(AcceptedCharacters.None))); Factory.Markup("<!--Foo-->").Accepts(AcceptedCharacters.None),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)));
} }
[Fact] [Fact]
@ -63,7 +70,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<!DOCTYPE html> foo", ParseBlockTest("<!DOCTYPE html> foo",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<!DOCTYPE html> ").Accepts(AcceptedCharacters.None))); Factory.Markup("<!DOCTYPE html>").Accepts(AcceptedCharacters.None),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)));
} }
[Fact] [Fact]
@ -71,7 +79,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<?xml version=\"1.0\" ?> foo", ParseBlockTest("<?xml version=\"1.0\" ?> foo",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<?xml version=\"1.0\" ?> ").Accepts(AcceptedCharacters.None))); Factory.Markup("<?xml version=\"1.0\" ?>").Accepts(AcceptedCharacters.None),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)));
} }
[Fact] [Fact]
@ -79,7 +88,10 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<p>Foo</p> Bar", ParseBlockTest("<p>Foo</p> Bar",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<p>Foo</p> ").Accepts(AcceptedCharacters.None))); BlockFactory.MarkupTagBlock("<p>", AcceptedCharacters.None),
Factory.Markup("Foo"),
BlockFactory.MarkupTagBlock("</p>", AcceptedCharacters.None),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)));
} }
[Fact] [Fact]
@ -87,9 +99,11 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<text>Foo</text>}", ParseBlockTest("<text>Foo</text>}",
new MarkupBlock( new MarkupBlock(
Factory.MarkupTransition("<text>"), new MarkupTagBlock(
Factory.Markup("Foo"), Factory.MarkupTransition("<text>")),
Factory.MarkupTransition("</text>"))); Factory.Markup("Foo").Accepts(AcceptedCharacters.None),
new MarkupTagBlock(
Factory.MarkupTransition("</text>"))));
} }
[Fact] [Fact]
@ -97,7 +111,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<![CDATA[Foo]]> Bar", ParseBlockTest("<![CDATA[Foo]]> Bar",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<![CDATA[Foo]]> ").Accepts(AcceptedCharacters.None))); Factory.Markup("<![CDATA[Foo]]>").Accepts(AcceptedCharacters.None),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)));
} }
[Fact] [Fact]
@ -105,7 +120,9 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseDocumentTest("<script>foo < bar && quantity.toString() !== orderQty.val()</script>", ParseDocumentTest("<script>foo < bar && quantity.toString() !== orderQty.val()</script>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<script>foo < bar && quantity.toString() !== orderQty.val()</script>"))); BlockFactory.MarkupTagBlock("<script>"),
Factory.Markup("foo < bar && quantity.toString() !== orderQty.val()"),
BlockFactory.MarkupTagBlock("</script>")));
} }
[Theory] [Theory]
@ -114,8 +131,7 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<" + tagName + ">foo", ParseBlockTest("<" + tagName + ">foo",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<" + tagName + ">") BlockFactory.MarkupTagBlock("<" + tagName + ">", AcceptedCharacters.None)));
.Accepts(AcceptedCharacters.None)));
} }
[Theory] [Theory]
@ -124,8 +140,7 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<" + tagName + "><other>foo", ParseBlockTest("<" + tagName + "><other>foo",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<" + tagName + ">") BlockFactory.MarkupTagBlock("<" + tagName + ">", AcceptedCharacters.None)));
.Accepts(AcceptedCharacters.None)));
} }
[Theory] [Theory]
@ -134,8 +149,9 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<" + tagName + "> </" + tagName + ">foo", ParseBlockTest("<" + tagName + "> </" + tagName + ">foo",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<" + tagName + "> </" + tagName + ">") BlockFactory.MarkupTagBlock("<" + tagName + ">", AcceptedCharacters.None),
.Accepts(AcceptedCharacters.None))); Factory.Markup(" "),
BlockFactory.MarkupTagBlock("</" + tagName + ">", AcceptedCharacters.None)));
} }
[Theory] [Theory]
@ -144,8 +160,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<" + tagName + "></" + tagName, ParseBlockTest("<" + tagName + "></" + tagName,
new MarkupBlock( new MarkupBlock(
Factory.Markup("<" + tagName + "></" + tagName) BlockFactory.MarkupTagBlock("<" + tagName + ">", AcceptedCharacters.None),
.Accepts(AcceptedCharacters.Any))); BlockFactory.MarkupTagBlock("</" + tagName)));
} }
} }
} }

View File

@ -20,11 +20,14 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<p>foo#@i</p>", ParseBlockTest("<p>foo#@i</p>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<p>foo#"), new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("foo#"),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("i").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharacters.NonWhiteSpace)), Factory.Code("i").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("</p>").Accepts(AcceptedCharacters.None))); new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -32,13 +35,14 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<foo @bar />", ParseBlockTest("<foo @bar />",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<foo "), new MarkupTagBlock(
new ExpressionBlock( Factory.Markup("<foo "),
Factory.CodeTransition(), new ExpressionBlock(
Factory.Code("bar") Factory.CodeTransition(),
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) Factory.Code("bar")
.Accepts(AcceptedCharacters.NonWhiteSpace)), .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
Factory.Markup(" />").Accepts(AcceptedCharacters.None))); .Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -46,17 +50,18 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<foo bar=\"@baz\" />", ParseBlockTest("<foo bar=\"@baz\" />",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<foo"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator("bar", new LocationTagged<string>(" bar=\"", 4, 0, 4), new LocationTagged<string>("\"", 14, 0, 14)), Factory.Markup("<foo"),
Factory.Markup(" bar=\"").With(SpanCodeGenerator.Null), new MarkupBlock(new AttributeBlockCodeGenerator("bar", new LocationTagged<string>(" bar=\"", 4, 0, 4), new LocationTagged<string>("\"", 14, 0, 14)),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(String.Empty, 10, 0, 10), 10, 0, 10), Factory.Markup(" bar=\"").With(SpanCodeGenerator.Null),
new ExpressionBlock( new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(String.Empty, 10, 0, 10), 10, 0, 10),
Factory.CodeTransition(), new ExpressionBlock(
Factory.Code("baz") Factory.CodeTransition(),
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) Factory.Code("baz")
.Accepts(AcceptedCharacters.NonWhiteSpace))), .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
Factory.Markup("\"").With(SpanCodeGenerator.Null)), .Accepts(AcceptedCharacters.NonWhiteSpace))),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))); Factory.Markup("\"").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -64,24 +69,32 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<foo>@bar<baz>@boz</baz></foo>", ParseBlockTest("<foo>@bar<baz>@boz</baz></foo>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<foo>"), new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml(),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("bar") Factory.Code("bar")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)), .Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("<baz>"), new MarkupTagBlock(
Factory.Markup("<baz>").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml(),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("boz") Factory.Code("boz")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)), .Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("</baz></foo>").Accepts(AcceptedCharacters.None))); new MarkupTagBlock(
Factory.Markup("</baz>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
public void ParseBlockParsesCodeWithinSingleLineMarkup() public void ParseBlockParsesCodeWithinSingleLineMarkup()
{ {
// TODO: Fix at a later date, HTML should be a tag block: https://github.com/aspnet/Razor/issues/101
ParseBlockTest("@:<li>Foo @Bar Baz" + Environment.NewLine ParseBlockTest("@:<li>Foo @Bar Baz" + Environment.NewLine
+ "bork", + "bork",
new MarkupBlock( new MarkupBlock(
@ -102,13 +115,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<foo><!-- @foo --></foo>", ParseBlockTest("<foo><!-- @foo --></foo>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<foo><!-- "), new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
Factory.Markup("<!-- "),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("foo") Factory.Code("foo")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)), .Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup(" --></foo>").Accepts(AcceptedCharacters.None))); Factory.Markup(" -->").Accepts(AcceptedCharacters.None),
new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -116,13 +133,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<foo><!DOCTYPE foo @bar baz></foo>", ParseBlockTest("<foo><!DOCTYPE foo @bar baz></foo>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<foo><!DOCTYPE foo "), new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
Factory.Markup("<!DOCTYPE foo "),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("bar") Factory.Code("bar")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)), .Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup(" baz></foo>").Accepts(AcceptedCharacters.None))); Factory.Markup(" baz>").Accepts(AcceptedCharacters.None),
new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -130,13 +151,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<foo><![CDATA[ foo @bar baz]]></foo>", ParseBlockTest("<foo><![CDATA[ foo @bar baz]]></foo>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<foo><![CDATA[ foo "), new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
Factory.Markup("<![CDATA[ foo "),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("bar") Factory.Code("bar")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)), .Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup(" baz]]></foo>").Accepts(AcceptedCharacters.None))); Factory.Markup(" baz]]>").Accepts(AcceptedCharacters.None),
new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -144,19 +169,29 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<foo><?xml foo @bar baz?></foo>", ParseBlockTest("<foo><?xml foo @bar baz?></foo>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<foo><?xml foo "), new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
Factory.Markup("<?xml foo "),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("bar") Factory.Code("bar")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)), .Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup(" baz?></foo>").Accepts(AcceptedCharacters.None))); Factory.Markup(" baz?>").Accepts(AcceptedCharacters.None),
new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
public void ParseBlockDoesNotSwitchToCodeOnEmailAddressInText() public void ParseBlockDoesNotSwitchToCodeOnEmailAddressInText()
{ {
SingleSpanBlockTest("<foo>anurse@microsoft.com</foo>", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); ParseBlockTest("<foo>anurse@microsoft.com</foo>",
new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
Factory.Markup("anurse@microsoft.com"),
new MarkupTagBlock(
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -164,13 +199,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<a href=\"mailto:anurse@microsoft.com\">Email me</a>", ParseBlockTest("<a href=\"mailto:anurse@microsoft.com\">Email me</a>",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<a"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href=\"", 2, 0, 2), new LocationTagged<string>("\"", 36, 0, 36)), Factory.Markup("<a"),
Factory.Markup(" href=\"").With(SpanCodeGenerator.Null), new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href=\"", 2, 0, 2), new LocationTagged<string>("\"", 36, 0, 36)),
Factory.Markup("mailto:anurse@microsoft.com") Factory.Markup(" href=\"").With(SpanCodeGenerator.Null),
.With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 9, 0, 9), new LocationTagged<string>("mailto:anurse@microsoft.com", 9, 0, 9))), Factory.Markup("mailto:anurse@microsoft.com")
Factory.Markup("\"").With(SpanCodeGenerator.Null)), .With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 9, 0, 9), new LocationTagged<string>("mailto:anurse@microsoft.com", 9, 0, 9))),
Factory.Markup(">Email me</a>").Accepts(AcceptedCharacters.None))); Factory.Markup("\"").With(SpanCodeGenerator.Null)),
Factory.Markup(">").Accepts(AcceptedCharacters.None)),
Factory.Markup("Email me"),
new MarkupTagBlock(
Factory.Markup("</a>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -182,21 +221,31 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
+ " }" + Environment.NewLine + " }" + Environment.NewLine
+ " </ul>", + " </ul>",
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <ul>\r\n"), Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<ul>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n"),
new StatementBlock( new StatementBlock(
Factory.Code(" ").AsStatement(), Factory.Code(" ").AsStatement(),
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("foreach(var p in Products) {\r\n").AsStatement(), Factory.Code("foreach(var p in Products) {\r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <li>Product: "), Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<li>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Product: "),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("p.Name") Factory.Code("p.Name")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)), .Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("</li>\r\n").Accepts(AcceptedCharacters.None)), new MarkupTagBlock(
Factory.Markup("</li>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)),
Factory.Code(" }\r\n").AsStatement().Accepts(AcceptedCharacters.None)), Factory.Code(" }\r\n").AsStatement().Accepts(AcceptedCharacters.None)),
Factory.Markup(" </ul>").Accepts(AcceptedCharacters.None))); Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("</ul>").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -208,21 +257,31 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
+ " }" + Environment.NewLine + " }" + Environment.NewLine
+ " </ul>", + " </ul>",
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <ul>\r\n"), Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<ul>")),
Factory.Markup("\r\n"),
new StatementBlock( new StatementBlock(
Factory.Code(" ").AsStatement(), Factory.Code(" ").AsStatement(),
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("foreach(var p in Products) {\r\n").AsStatement(), Factory.Code("foreach(var p in Products) {\r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <li>Product: "), Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<li>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Product: "),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("p.Name") Factory.Code("p.Name")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)), .Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("</li>\r\n").Accepts(AcceptedCharacters.None)), new MarkupTagBlock(
Factory.Markup("</li>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)),
Factory.Code(" }\r\n").AsStatement().Accepts(AcceptedCharacters.None)), Factory.Code(" }\r\n").AsStatement().Accepts(AcceptedCharacters.None)),
Factory.Markup(" </ul>"))); Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("</ul>"))));
} }
[Fact] [Fact]
@ -241,21 +300,32 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode("section foo {").AutoCompleteWith(null, atEndOfSpan: true), Factory.MetaCode("section foo {").AutoCompleteWith(null, atEndOfSpan: true),
new MarkupBlock( new MarkupBlock(
Factory.Markup("\r\n <ul>\r\n"), Factory.Markup("\r\n "),
new MarkupTagBlock(
Factory.Markup("<ul>")),
Factory.Markup("\r\n"),
new StatementBlock( new StatementBlock(
Factory.Code(" ").AsStatement(), Factory.Code(" ").AsStatement(),
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("foreach(var p in Products) {\r\n").AsStatement(), Factory.Code("foreach(var p in Products) {\r\n").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <li>Product: "), Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<li>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Product: "),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("p.Name") Factory.Code("p.Name")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)), .Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("</li>\r\n").Accepts(AcceptedCharacters.None)), new MarkupTagBlock(
Factory.Markup("</li>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)),
Factory.Code(" }\r\n").AsStatement().Accepts(AcceptedCharacters.None)), Factory.Code(" }\r\n").AsStatement().Accepts(AcceptedCharacters.None)),
Factory.Markup(" </ul>\r\n")), Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("</ul>")),
Factory.Markup("\r\n")),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None)), Factory.MetaCode("}").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml())); Factory.EmptyHtml()));
} }
@ -269,18 +339,26 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
+ " }" + Environment.NewLine + " }" + Environment.NewLine
+ " </ul>", + " </ul>",
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <ul>\r\n "), Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<ul>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n "),
new StatementBlock( new StatementBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("foreach(var p in Products) {\r\n ").AsStatement(), Factory.Code("foreach(var p in Products) {\r\n ").AsStatement(),
new MarkupBlock( new MarkupBlock(
Factory.Markup("<li>Product: "), new MarkupTagBlock(
Factory.Markup("<li>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Product: "),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.Code("p.Name").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharacters.NonWhiteSpace)), Factory.Code("p.Name").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("</li>").Accepts(AcceptedCharacters.None)), new MarkupTagBlock(
Factory.Markup("</li>").Accepts(AcceptedCharacters.None))),
Factory.Code("\r\n }").AsStatement().Accepts(AcceptedCharacters.None)), Factory.Code("\r\n }").AsStatement().Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n </ul>").Accepts(AcceptedCharacters.None)), Factory.Markup("\r\n "),
new MarkupTagBlock(
Factory.Markup("</ul>").Accepts(AcceptedCharacters.None))),
designTimeParser: true); designTimeParser: true);
} }
@ -319,9 +397,14 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode("section Foo {").AutoCompleteWith(null, atEndOfSpan: true), Factory.MetaCode("section Foo {").AutoCompleteWith(null, atEndOfSpan: true),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <foo>"), Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<foo>")),
Factory.Markup("@").Hidden(), Factory.Markup("@").Hidden(),
Factory.Markup("@bar</foo> ")), Factory.Markup("@bar"),
new MarkupTagBlock(
Factory.Markup("</foo>")),
Factory.Markup(" ")),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None)), Factory.MetaCode("}").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml())); Factory.EmptyHtml()));
} }
@ -336,7 +419,9 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode("section Foo {").AutoCompleteWith(null, atEndOfSpan: true), Factory.MetaCode("section Foo {").AutoCompleteWith(null, atEndOfSpan: true),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <foo>"), Factory.Markup(" "),
new MarkupTagBlock(
Factory.Markup("<foo>")),
Factory.Markup("@").Hidden(), Factory.Markup("@").Hidden(),
Factory.Markup("@"), Factory.Markup("@"),
Factory.Markup("@").Hidden(), Factory.Markup("@").Hidden(),
@ -346,7 +431,9 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
Factory.Code("bar") Factory.Code("bar")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)), .Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("</foo> ")), new MarkupTagBlock(
Factory.Markup("</foo>")),
Factory.Markup(" ")),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None)), Factory.MetaCode("}").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml())); Factory.EmptyHtml()));
} }

View File

@ -19,16 +19,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<a href='~/Foo/Bar/Baz' />", ParseBlockTest("<a href='~/Foo/Bar/Baz' />",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<a"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href='", 2, 0, 2), new LocationTagged<string>("'", 22, 0, 22)), Factory.Markup("<a"),
Factory.Markup(" href='").With(SpanCodeGenerator.Null), new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href='", 2, 0, 2), new LocationTagged<string>("'", 22, 0, 22)),
Factory.Markup("~/Foo/Bar/Baz") Factory.Markup(" href='").With(SpanCodeGenerator.Null),
.WithEditorHints(EditorHints.VirtualPath) Factory.Markup("~/Foo/Bar/Baz")
.With(new LiteralAttributeCodeGenerator( .WithEditorHints(EditorHints.VirtualPath)
new LocationTagged<string>(String.Empty, 9, 0, 9), .With(new LiteralAttributeCodeGenerator(
new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 9, 0, 9))), new LocationTagged<string>(String.Empty, 9, 0, 9),
Factory.Markup("'").With(SpanCodeGenerator.Null)), new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 9, 0, 9))),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))); Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -36,16 +37,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseDocumentTest("<a href='~/Foo/Bar/Baz' />", ParseDocumentTest("<a href='~/Foo/Bar/Baz' />",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<a"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href='", 2, 0, 2), new LocationTagged<string>("'", 22, 0, 22)), Factory.Markup("<a"),
Factory.Markup(" href='").With(SpanCodeGenerator.Null), new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href='", 2, 0, 2), new LocationTagged<string>("'", 22, 0, 22)),
Factory.Markup("~/Foo/Bar/Baz") Factory.Markup(" href='").With(SpanCodeGenerator.Null),
.WithEditorHints(EditorHints.VirtualPath) Factory.Markup("~/Foo/Bar/Baz")
.With(new LiteralAttributeCodeGenerator( .WithEditorHints(EditorHints.VirtualPath)
new LocationTagged<string>(String.Empty, 9, 0, 9), .With(new LiteralAttributeCodeGenerator(
new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 9, 0, 9))), new LocationTagged<string>(String.Empty, 9, 0, 9),
Factory.Markup("'").With(SpanCodeGenerator.Null)), new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 9, 0, 9))),
Factory.Markup(" />"))); Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />"))));
} }
[Fact] [Fact]
@ -60,16 +62,20 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
.AutoCompleteWith(null, atEndOfSpan: true) .AutoCompleteWith(null, atEndOfSpan: true)
.Accepts(AcceptedCharacters.Any), .Accepts(AcceptedCharacters.Any),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <a"), Factory.Markup(" "),
new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href='", 17, 0, 17), new LocationTagged<string>("'", 37, 0, 37)), new MarkupTagBlock(
Factory.Markup(" href='").With(SpanCodeGenerator.Null), Factory.Markup("<a"),
Factory.Markup("~/Foo/Bar/Baz") new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href='", 17, 0, 17), new LocationTagged<string>("'", 37, 0, 37)),
.WithEditorHints(EditorHints.VirtualPath) Factory.Markup(" href='").With(SpanCodeGenerator.Null),
.With(new LiteralAttributeCodeGenerator( Factory.Markup("~/Foo/Bar/Baz")
new LocationTagged<string>(String.Empty, 24, 0, 24), .WithEditorHints(EditorHints.VirtualPath)
new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 24, 0, 24))), .With(new LiteralAttributeCodeGenerator(
Factory.Markup("'").With(SpanCodeGenerator.Null)), new LocationTagged<string>(String.Empty, 24, 0, 24),
Factory.Markup(" /> ")), new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 24, 0, 24))),
Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />")),
Factory.Markup(" ")
),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None)), Factory.MetaCode("}").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml())); Factory.EmptyHtml()));
} }
@ -79,14 +85,41 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<a href='~/Foo/@id/Baz' />", ParseBlockTest("<a href='~/Foo/@id/Baz' />",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<a"), new MarkupTagBlock(
Factory.Markup("<a"),
new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href='", 2, 0, 2), new LocationTagged<string>("'", 22, 0, 22)),
Factory.Markup(" href='").With(SpanCodeGenerator.Null),
Factory.Markup("~/Foo/")
.WithEditorHints(EditorHints.VirtualPath)
.With(new LiteralAttributeCodeGenerator(
new LocationTagged<string>(String.Empty, 9, 0, 9),
new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 9, 0, 9))),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(String.Empty, 15, 0, 15), 15, 0, 15),
new ExpressionBlock(
Factory.CodeTransition().Accepts(AcceptedCharacters.None),
Factory.Code("id")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace))),
Factory.Markup("/Baz")
.With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 18, 0, 18), new LocationTagged<string>("/Baz", 18, 0, 18))),
Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))));
}
[Fact]
public void UrlWithExpressionsInAttributeInMarkupDocument()
{
ParseDocumentTest("<a href='~/Foo/@id/Baz' />",
new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<a"),
new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href='", 2, 0, 2), new LocationTagged<string>("'", 22, 0, 22)), new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href='", 2, 0, 2), new LocationTagged<string>("'", 22, 0, 22)),
Factory.Markup(" href='").With(SpanCodeGenerator.Null), Factory.Markup(" href='").With(SpanCodeGenerator.Null),
Factory.Markup("~/Foo/") Factory.Markup("~/Foo/")
.WithEditorHints(EditorHints.VirtualPath) .WithEditorHints(EditorHints.VirtualPath)
.With(new LiteralAttributeCodeGenerator( .With(new LiteralAttributeCodeGenerator(
new LocationTagged<string>(String.Empty, 9, 0, 9), new LocationTagged<string>(String.Empty, 9, 0, 9),
new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 9, 0, 9))), new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 9, 0, 9))),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(String.Empty, 15, 0, 15), 15, 0, 15), new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(String.Empty, 15, 0, 15), 15, 0, 15),
new ExpressionBlock( new ExpressionBlock(
Factory.CodeTransition().Accepts(AcceptedCharacters.None), Factory.CodeTransition().Accepts(AcceptedCharacters.None),
@ -96,32 +129,7 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
Factory.Markup("/Baz") Factory.Markup("/Baz")
.With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 18, 0, 18), new LocationTagged<string>("/Baz", 18, 0, 18))), .With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 18, 0, 18), new LocationTagged<string>("/Baz", 18, 0, 18))),
Factory.Markup("'").With(SpanCodeGenerator.Null)), Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))); Factory.Markup(" />"))));
}
[Fact]
public void UrlWithExpressionsInAttributeInMarkupDocument()
{
ParseDocumentTest("<a href='~/Foo/@id/Baz' />",
new MarkupBlock(
Factory.Markup("<a"),
new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href='", 2, 0, 2), new LocationTagged<string>("'", 22, 0, 22)),
Factory.Markup(" href='").With(SpanCodeGenerator.Null),
Factory.Markup("~/Foo/")
.WithEditorHints(EditorHints.VirtualPath)
.With(new LiteralAttributeCodeGenerator(
new LocationTagged<string>(String.Empty, 9, 0, 9),
new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 9, 0, 9))),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(String.Empty, 15, 0, 15), 15, 0, 15),
new ExpressionBlock(
Factory.CodeTransition().Accepts(AcceptedCharacters.None),
Factory.Code("id")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace))),
Factory.Markup("/Baz")
.With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 18, 0, 18), new LocationTagged<string>("/Baz", 18, 0, 18))),
Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />")));
} }
[Fact] [Fact]
@ -135,24 +143,28 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
Factory.MetaCode("section Foo {") Factory.MetaCode("section Foo {")
.AutoCompleteWith(null, atEndOfSpan: true), .AutoCompleteWith(null, atEndOfSpan: true),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <a"), Factory.Markup(" "),
new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href='", 17, 0, 17), new LocationTagged<string>("'", 37, 0, 37)), new MarkupTagBlock(
Factory.Markup(" href='").With(SpanCodeGenerator.Null), Factory.Markup("<a"),
Factory.Markup("~/Foo/") new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href='", 17, 0, 17), new LocationTagged<string>("'", 37, 0, 37)),
.WithEditorHints(EditorHints.VirtualPath) Factory.Markup(" href='").With(SpanCodeGenerator.Null),
.With(new LiteralAttributeCodeGenerator( Factory.Markup("~/Foo/")
new LocationTagged<string>(String.Empty, 24, 0, 24), .WithEditorHints(EditorHints.VirtualPath)
new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 24, 0, 24))), .With(new LiteralAttributeCodeGenerator(
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(String.Empty, 30, 0, 30), 30, 0, 30), new LocationTagged<string>(String.Empty, 24, 0, 24),
new ExpressionBlock( new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 24, 0, 24))),
Factory.CodeTransition().Accepts(AcceptedCharacters.None), new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(String.Empty, 30, 0, 30), 30, 0, 30),
Factory.Code("id") new ExpressionBlock(
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) Factory.CodeTransition().Accepts(AcceptedCharacters.None),
.Accepts(AcceptedCharacters.NonWhiteSpace))), Factory.Code("id")
Factory.Markup("/Baz") .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 33, 0, 33), new LocationTagged<string>("/Baz", 33, 0, 33))), .Accepts(AcceptedCharacters.NonWhiteSpace))),
Factory.Markup("'").With(SpanCodeGenerator.Null)), Factory.Markup("/Baz")
Factory.Markup(" /> ")), .With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 33, 0, 33), new LocationTagged<string>("/Baz", 33, 0, 33))),
Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />")),
Factory.Markup(" ")
),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None)), Factory.MetaCode("}").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml())); Factory.EmptyHtml()));
} }
@ -162,16 +174,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<a href='~/Foo+Bar:Baz(Biz),Boz' />", ParseBlockTest("<a href='~/Foo+Bar:Baz(Biz),Boz' />",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<a"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href='", 2, 0, 2), new LocationTagged<string>("'", 31, 0, 31)), Factory.Markup("<a"),
Factory.Markup(" href='").With(SpanCodeGenerator.Null), new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href='", 2, 0, 2), new LocationTagged<string>("'", 31, 0, 31)),
Factory.Markup("~/Foo+Bar:Baz(Biz),Boz") Factory.Markup(" href='").With(SpanCodeGenerator.Null),
.WithEditorHints(EditorHints.VirtualPath) Factory.Markup("~/Foo+Bar:Baz(Biz),Boz")
.With(new LiteralAttributeCodeGenerator( .WithEditorHints(EditorHints.VirtualPath)
new LocationTagged<string>(String.Empty, 9, 0, 9), .With(new LiteralAttributeCodeGenerator(
new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 9, 0, 9))), new LocationTagged<string>(String.Empty, 9, 0, 9),
Factory.Markup("'").With(SpanCodeGenerator.Null)), new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 9, 0, 9))),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))); Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -179,16 +192,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseDocumentTest("<a href='~/Foo+Bar:Baz(Biz),Boz' />", ParseDocumentTest("<a href='~/Foo+Bar:Baz(Biz),Boz' />",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<a"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href='", 2, 0, 2), new LocationTagged<string>("'", 31, 0, 31)), Factory.Markup("<a"),
Factory.Markup(" href='").With(SpanCodeGenerator.Null), new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href='", 2, 0, 2), new LocationTagged<string>("'", 31, 0, 31)),
Factory.Markup("~/Foo+Bar:Baz(Biz),Boz") Factory.Markup(" href='").With(SpanCodeGenerator.Null),
.WithEditorHints(EditorHints.VirtualPath) Factory.Markup("~/Foo+Bar:Baz(Biz),Boz")
.With(new LiteralAttributeCodeGenerator( .WithEditorHints(EditorHints.VirtualPath)
new LocationTagged<string>(String.Empty, 9, 0, 9), .With(new LiteralAttributeCodeGenerator(
new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 9, 0, 9))), new LocationTagged<string>(String.Empty, 9, 0, 9),
Factory.Markup("'").With(SpanCodeGenerator.Null)), new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 9, 0, 9))),
Factory.Markup(" />"))); Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />"))));
} }
[Fact] [Fact]
@ -196,23 +210,24 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseBlockTest("<a href=~/Foo+Bar:Baz(Biz),Boz/@id/Boz />", ParseBlockTest("<a href=~/Foo+Bar:Baz(Biz),Boz/@id/Boz />",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<a"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href=", 2, 0, 2), new LocationTagged<string>(String.Empty, 38, 0, 38)), Factory.Markup("<a"),
Factory.Markup(" href=").With(SpanCodeGenerator.Null), new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href=", 2, 0, 2), new LocationTagged<string>(String.Empty, 38, 0, 38)),
Factory.Markup("~/Foo+Bar:Baz(Biz),Boz/") Factory.Markup(" href=").With(SpanCodeGenerator.Null),
.WithEditorHints(EditorHints.VirtualPath) Factory.Markup("~/Foo+Bar:Baz(Biz),Boz/")
.With(new LiteralAttributeCodeGenerator( .WithEditorHints(EditorHints.VirtualPath)
new LocationTagged<string>(String.Empty, 8, 0, 8), .With(new LiteralAttributeCodeGenerator(
new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 8, 0, 8))), new LocationTagged<string>(String.Empty, 8, 0, 8),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(String.Empty, 31, 0, 31), 31, 0, 31), new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 8, 0, 8))),
new ExpressionBlock( new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(String.Empty, 31, 0, 31), 31, 0, 31),
Factory.CodeTransition() new ExpressionBlock(
.Accepts(AcceptedCharacters.None), Factory.CodeTransition()
Factory.Code("id") .Accepts(AcceptedCharacters.None),
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) Factory.Code("id")
.Accepts(AcceptedCharacters.NonWhiteSpace))), .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
Factory.Markup("/Boz").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 34, 0, 34), new LocationTagged<string>("/Boz", 34, 0, 34)))), .Accepts(AcceptedCharacters.NonWhiteSpace))),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))); Factory.Markup("/Boz").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 34, 0, 34), new LocationTagged<string>("/Boz", 34, 0, 34)))),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))));
} }
[Fact] [Fact]
@ -220,23 +235,24 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{ {
ParseDocumentTest("<a href=~/Foo+Bar:Baz(Biz),Boz/@id/Boz />", ParseDocumentTest("<a href=~/Foo+Bar:Baz(Biz),Boz/@id/Boz />",
new MarkupBlock( new MarkupBlock(
Factory.Markup("<a"), new MarkupTagBlock(
new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href=", 2, 0, 2), new LocationTagged<string>(String.Empty, 38, 0, 38)), Factory.Markup("<a"),
Factory.Markup(" href=").With(SpanCodeGenerator.Null), new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href=", 2, 0, 2), new LocationTagged<string>(String.Empty, 38, 0, 38)),
Factory.Markup("~/Foo+Bar:Baz(Biz),Boz/") Factory.Markup(" href=").With(SpanCodeGenerator.Null),
.WithEditorHints(EditorHints.VirtualPath) Factory.Markup("~/Foo+Bar:Baz(Biz),Boz/")
.With(new LiteralAttributeCodeGenerator( .WithEditorHints(EditorHints.VirtualPath)
new LocationTagged<string>(String.Empty, 8, 0, 8), .With(new LiteralAttributeCodeGenerator(
new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 8, 0, 8))), new LocationTagged<string>(String.Empty, 8, 0, 8),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(String.Empty, 31, 0, 31), 31, 0, 31), new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 8, 0, 8))),
new ExpressionBlock( new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(String.Empty, 31, 0, 31), 31, 0, 31),
Factory.CodeTransition() new ExpressionBlock(
.Accepts(AcceptedCharacters.None), Factory.CodeTransition()
Factory.Code("id") .Accepts(AcceptedCharacters.None),
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) Factory.Code("id")
.Accepts(AcceptedCharacters.NonWhiteSpace))), .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
Factory.Markup("/Boz").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 34, 0, 34), new LocationTagged<string>("/Boz", 34, 0, 34)))), .Accepts(AcceptedCharacters.NonWhiteSpace))),
Factory.Markup(" />"))); Factory.Markup("/Boz").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 34, 0, 34), new LocationTagged<string>("/Boz", 34, 0, 34)))),
Factory.Markup(" />"))));
} }
[Fact] [Fact]
@ -250,23 +266,27 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
Factory.MetaCode("section Foo {") Factory.MetaCode("section Foo {")
.AutoCompleteWith(null, atEndOfSpan: true), .AutoCompleteWith(null, atEndOfSpan: true),
new MarkupBlock( new MarkupBlock(
Factory.Markup(" <a"), Factory.Markup(" "),
new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href=", 17, 0, 17), new LocationTagged<string>(String.Empty, 53, 0, 53)), new MarkupTagBlock(
Factory.Markup(" href=").With(SpanCodeGenerator.Null), Factory.Markup("<a"),
Factory.Markup("~/Foo+Bar:Baz(Biz),Boz/") new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href=", 17, 0, 17), new LocationTagged<string>(String.Empty, 53, 0, 53)),
.WithEditorHints(EditorHints.VirtualPath) Factory.Markup(" href=").With(SpanCodeGenerator.Null),
.With(new LiteralAttributeCodeGenerator( Factory.Markup("~/Foo+Bar:Baz(Biz),Boz/")
new LocationTagged<string>(String.Empty, 23, 0, 23), .WithEditorHints(EditorHints.VirtualPath)
new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 23, 0, 23))), .With(new LiteralAttributeCodeGenerator(
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(String.Empty, 46, 0, 46), 46, 0, 46), new LocationTagged<string>(String.Empty, 23, 0, 23),
new ExpressionBlock( new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 23, 0, 23))),
Factory.CodeTransition() new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(String.Empty, 46, 0, 46), 46, 0, 46),
.Accepts(AcceptedCharacters.None), new ExpressionBlock(
Factory.Code("id") Factory.CodeTransition()
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .Accepts(AcceptedCharacters.None),
.Accepts(AcceptedCharacters.NonWhiteSpace))), Factory.Code("id")
Factory.Markup("/Boz").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 49, 0, 49), new LocationTagged<string>("/Boz", 49, 0, 49)))), .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
Factory.Markup(" /> ")), .Accepts(AcceptedCharacters.NonWhiteSpace))),
Factory.Markup("/Boz").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 49, 0, 49), new LocationTagged<string>("/Boz", 49, 0, 49)))),
Factory.Markup(" />")),
Factory.Markup(" ")
),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None)), Factory.MetaCode("}").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml())); Factory.EmptyHtml()));
} }