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
{
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)
: base(ThisBlockType, children, codeGenerator)
: this(ThisBlockType, codeGenerator, children)
{
}

View File

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

View File

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

View File

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

View File

@ -432,7 +432,10 @@ namespace Microsoft.AspNet.Razor.Test.Generator
tabTest: withTabs ? TabTest.Tabs : TabTest.NoTabs,
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.Code, 17, 31),
new TestSpan(SpanKind.Markup, 31, 38),

View File

@ -1,6 +1,7 @@
// 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 System.Collections.Generic;
using System.IO;
using System.Linq;
@ -17,14 +18,14 @@ namespace Microsoft.AspNet.Razor.Test.Generator
public void CalculatePaddingForEmptySpanReturnsZero()
{
// 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);
// Act
int padding = paddingBuilder.CalculatePadding(span, 0);
var padding = paddingBuilder.CalculatePadding(span, 0);
// Assert
Assert.Equal(0, padding);
@ -35,9 +36,9 @@ namespace Microsoft.AspNet.Razor.Test.Generator
public void CalculatePaddingForEmptySpanWith4Spaces(bool designTime, bool isIndentingWithTabs, int tabSize)
{
// 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);
@ -53,14 +54,14 @@ namespace Microsoft.AspNet.Razor.Test.Generator
public void CalculatePaddingForIfSpanWith5Spaces(bool designTime, bool isIndentingWithTabs, int tabSize)
{
// 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);
// Act
int padding = paddingBuilder.CalculatePadding(span, 1);
var padding = paddingBuilder.CalculatePadding(span, 1);
// Assert
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)
{
// Arrange
RazorEngineHost host = CreateHost(designTime, isIndentingWithTabs, tabSize);
var host = CreateHost(designTime, isIndentingWithTabs, tabSize);
// no new lines involved
Span spanFlat = GenerateSpan(" @if (true)", SpanKind.Code, 2, "if (true)");
Span spanNewlines = GenerateSpan("\t<div>\r\n @if (true)", SpanKind.Code, 3, "if (true)");
var spanFlat = GenerateSpan(" @if (true)", SpanKind.Code, 2, "if (true)");
var spanNewlines = GenerateSpan("\t<div>" + Environment.NewLine + " @if (true)", SpanKind.Code, 5, "if (true)");
var paddingBuilder = new CSharpPaddingBuilder(host);
// Act
string paddingFlat = paddingBuilder.BuildStatementPadding(spanFlat);
string paddingNewlines = paddingBuilder.BuildStatementPadding(spanNewlines);
var paddingFlat = paddingBuilder.BuildStatementPadding(spanFlat);
var paddingNewlines = paddingBuilder.BuildStatementPadding(spanNewlines);
// Assert
string code = " if (true)";
var code = " if (true)";
VerifyPadded(numTabs, numSpaces, code, paddingFlat);
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)
{
// Arrange
RazorEngineHost host = CreateHost(designTime, isIndentingWithTabs, tabSize);
var host = CreateHost(designTime, isIndentingWithTabs, tabSize);
// no new lines involved
Span 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 spanFlat = GenerateSpan("\t\t@if (true)", SpanKind.Code, 2, "if (true)");
var spanNewlines = GenerateSpan("\t<div>" + Environment.NewLine + "\t\t@if (true)", SpanKind.Code, 5, "if (true)");
var paddingBuilder = new CSharpPaddingBuilder(host);
// Act
string paddingFlat = paddingBuilder.BuildStatementPadding(spanFlat);
string paddingNewlines = paddingBuilder.BuildStatementPadding(spanNewlines);
var paddingFlat = paddingBuilder.BuildStatementPadding(spanFlat);
var paddingNewlines = paddingBuilder.BuildStatementPadding(spanNewlines);
// Assert
string code = " if (true)";
var code = " if (true)";
VerifyPadded(numTabs, numSpaces, code, paddingFlat);
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)
{
// 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);
// Act
string padding = paddingBuilder.BuildStatementPadding(span);
var padding = paddingBuilder.BuildStatementPadding(span);
// Assert
string code = " if (true) { \r\n";
VerifyPadded(numTabs, numSpaces, code, padding);
}
private static void VerifyPadded(int numTabs, int numSpaces, string code, string padding)
{
string padded = padding + code;
string expectedPadding = new string('\t', numTabs) + new string(' ', numSpaces);
var padded = padding + code;
var expectedPadding = new string('\t', numTabs) + new string(' ', numSpaces);
Assert.Equal(expectedPadding, padding);
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)
{
Span[] spans = GenerateSpans(text, spanKind, spanIndex, spanText);
var spans = GenerateSpans(text, spanKind, spanIndex, spanText);
return spans[spanIndex];
}

View File

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

View File

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

View File

@ -136,7 +136,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
.AutoCompleteWith(null, atEndOfSpan: true)
.Accepts(AcceptedCharacters.Any),
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("}")
.Accepts(AcceptedCharacters.None)));
}

View File

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

View File

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

View File

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

View File

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

View File

@ -79,7 +79,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new SectionBlock(new SectionCodeGenerator(string.Empty),
Factory.CodeTransition(),
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(
RazorResources.FormatParseError_Unexpected_Character_At_Section_Name_Start(RazorResources.FormatErrorComponent_Character("9")),
9, 0, 9));
@ -94,7 +100,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new SectionBlock(new SectionCodeGenerator("foo"),
Factory.CodeTransition(),
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));
}
@ -115,7 +127,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.MetaCode("section bar {")
.AutoCompleteWith(null, atEndOfSpan: true),
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.Markup(" ")),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None)),
@ -152,8 +170,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.MetaCode("section foo {")
.AutoCompleteWith("}", atEndOfSpan: true),
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.
Factory.Markup(" <p>Foo", "{", "}", "</p>")))),
Factory.Markup("Foo", "{", "}"),
new MarkupTagBlock(
Factory.Markup("</p>"))))),
new RazorError(
RazorResources.FormatParseError_Expected_X("}"),
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{")
.AutoCompleteWith(null, atEndOfSpan: true),
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.EmptyHtml()));
}
@ -206,7 +235,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.MetaCode("section foo {")
.AutoCompleteWith(null, atEndOfSpan: true),
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.EmptyHtml()));
}
@ -222,7 +257,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.MetaCode("section foo{")
.AutoCompleteWith(null, atEndOfSpan: true),
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.EmptyHtml()));
}
@ -238,7 +279,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.MetaCode("section foo {")
.AutoCompleteWith(null, atEndOfSpan: true),
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.EmptyHtml()));
}
@ -372,7 +419,10 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.MetaCode("section s {")
.AutoCompleteWith(null, atEndOfSpan: true),
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.EmptyHtml()));
}

View File

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

View File

@ -21,14 +21,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
return new TemplateBlock(
new MarkupBlock(
Factory.MarkupTransition(),
Factory.Markup("<p>Foo #"),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Foo #"),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("item")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.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(
new MarkupBlock(
Factory.MarkupTransition(),
Factory.Markup("<p>Foo #"),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Foo #"),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("Html.Repeat(10, ")
@ -48,21 +53,25 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new TemplateBlock(
new MarkupBlock(
Factory.MarkupTransition(),
Factory.Markup("<p>"),
new MarkupTagBlock(
Factory.Markup("<p>").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml(),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("item")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)
),
Factory.Markup("</p>").Accepts(AcceptedCharacters.None)
new MarkupTagBlock(
Factory.Markup("</p>").Accepts(AcceptedCharacters.None))
)
),
Factory.Code(")")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.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 MarkupBlock(
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(" )")
@ -75,7 +79,11 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.MetaCode("{").Accepts(AcceptedCharacters.None),
Factory.Code("\r\n ").AsStatement(),
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.MetaCode("}").Accepts(AcceptedCharacters.None)
@ -93,7 +101,11 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.Code("\r\n ").AsStatement(),
new MarkupBlock(
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.MetaCode("}").Accepts(AcceptedCharacters.None)
@ -172,13 +184,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
.With(new SingleLineMarkupEditHandler(CSharpLanguageCharacteristics.Instance.TokenizeString, AcceptedCharacters.None))
),
new MarkupBlock(
Factory.Markup("<br/>\r\n")
.Accepts(AcceptedCharacters.None)
new MarkupTagBlock(
Factory.Markup("<br/>").Accepts(AcceptedCharacters.None)),
Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)
),
new MarkupBlock(
Factory.Markup("<a>Foo</a>\r\n")
.Accepts(AcceptedCharacters.None)
),
new MarkupTagBlock(
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(
Factory.MarkupTransition(),
Factory.MetaMarkup(":", HtmlSymbolType.Colon),
@ -204,13 +220,19 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new StatementBlock(
Factory.Code("if(foo) {\r\n var foo = \"After this statement there are 10 spaces\"; \r\n").AsStatement(),
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(
Factory.Code(" ").AsStatement(),
Factory.CodeTransition(),
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(
Factory.Markup(" "),
@ -228,15 +250,33 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new StatementBlock(
Factory.Code("if(foo) {").AsStatement(),
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(),
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(),
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)
));
@ -250,15 +290,33 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.MetaCode("{").Accepts(AcceptedCharacters.None),
Factory.Code(" if(foo) {").AsStatement(),
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(),
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(),
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.MetaCode("}").Accepts(AcceptedCharacters.None)
@ -287,22 +345,52 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new StatementBlock(
Factory.Code("switch(foo) {\r\n case 0:\r\n").AsStatement(),
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(),
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(),
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(
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(),
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)));
}
@ -330,22 +418,52 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.MetaCode("{").Accepts(AcceptedCharacters.None),
Factory.Code(" switch(foo) {\r\n case 0:\r\n").AsStatement(),
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(),
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(),
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(
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(),
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.MetaCode("}").Accepts(AcceptedCharacters.None)));
@ -358,7 +476,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
new StatementBlock(
Factory.Code("for(int i = 0; i < 10; i++) {").AsStatement(),
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)
));
@ -372,7 +496,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.MetaCode("{").Accepts(AcceptedCharacters.None),
Factory.Code(" for(int i = 0; i < 10; i++) {").AsStatement(),
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.MetaCode("}").Accepts(AcceptedCharacters.None)));
@ -422,9 +552,11 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.Code("if (i > 0) {").AsStatement(),
new MarkupBlock(
Factory.Markup(" "),
Factory.MarkupTransition("<text>").Accepts(AcceptedCharacters.None),
Factory.Markup(";"),
Factory.MarkupTransition("</text>").Accepts(AcceptedCharacters.None),
new MarkupTagBlock(
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.Code("}").AsStatement()));
@ -439,9 +571,11 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
Factory.Code(" if (i > 0) {").AsStatement(),
new MarkupBlock(
Factory.Markup(" "),
Factory.MarkupTransition("<text>").Accepts(AcceptedCharacters.None),
Factory.Markup(";"),
Factory.MarkupTransition("</text>").Accepts(AcceptedCharacters.None),
new MarkupTagBlock(
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.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(),
new MarkupBlock(
Factory.Markup(" "),
Factory.MarkupTransition("<text>").Accepts(AcceptedCharacters.None),
Factory.Markup("The number is "),
new MarkupTagBlock(
Factory.MarkupTransition("<text>").Accepts(AcceptedCharacters.None)),
Factory.Markup("The number is ").Accepts(AcceptedCharacters.None),
new ExpressionBlock(
Factory.CodeTransition(),
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.Code(" }\r\n if(!false) {\r\n").AsStatement(),
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.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.
using System;
using System.Linq;
using Microsoft.AspNet.Razor.Editor;
using Microsoft.AspNet.Razor.Generator;
using Microsoft.AspNet.Razor.Parser;
@ -19,12 +20,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<a href='Foo' />",
new MarkupBlock(
Factory.Markup("<a"),
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 12, 0, 12)),
Factory.Markup(" href='").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("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None)));
new MarkupTagBlock(
Factory.Markup("<a"),
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 12, 0, 12)),
Factory.Markup(" href='").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("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))));
}
[Fact]
@ -32,14 +34,15 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<a href='Foo Bar Baz' />",
new MarkupBlock(
Factory.Markup("<a"),
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 20, 0, 20)),
Factory.Markup(" href='").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(" Bar").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(" ", 12, 0, 12), value: new LocationTagged<string>("Bar", 13, 0, 13))),
Factory.Markup(" Baz").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(" ", 16, 0, 16), value: new LocationTagged<string>("Baz", 17, 0, 17))),
Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None)));
new MarkupTagBlock(
Factory.Markup("<a"),
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 20, 0, 20)),
Factory.Markup(" href='").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(" Bar").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(" ", 12, 0, 12), value: new LocationTagged<string>("Bar", 13, 0, 13))),
Factory.Markup(" Baz").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(" ", 16, 0, 16), value: new LocationTagged<string>("Baz", 17, 0, 17))),
Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))));
}
[Fact]
@ -47,14 +50,15 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<a href=\"Foo Bar Baz\" />",
new MarkupBlock(
Factory.Markup("<a"),
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href=\"", 2, 0, 2), suffix: new LocationTagged<string>("\"", 20, 0, 20)),
Factory.Markup(" href=\"").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(" Bar").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(" ", 12, 0, 12), value: new LocationTagged<string>("Bar", 13, 0, 13))),
Factory.Markup(" Baz").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(" ", 16, 0, 16), value: new LocationTagged<string>("Baz", 17, 0, 17))),
Factory.Markup("\"").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None)));
new MarkupTagBlock(
Factory.Markup("<a"),
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href=\"", 2, 0, 2), suffix: new LocationTagged<string>("\"", 20, 0, 20)),
Factory.Markup(" href=\"").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(" Bar").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(" ", 12, 0, 12), value: new LocationTagged<string>("Bar", 13, 0, 13))),
Factory.Markup(" Baz").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged<string>(" ", 16, 0, 16), value: new LocationTagged<string>("Baz", 17, 0, 17))),
Factory.Markup("\"").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))));
}
[Fact]
@ -62,11 +66,12 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<a href=Foo Bar Baz />",
new MarkupBlock(
Factory.Markup("<a"),
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(" href=").With(SpanCodeGenerator.Null),
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)));
new MarkupTagBlock(
Factory.Markup("<a"),
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(" href=").With(SpanCodeGenerator.Null),
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]
@ -74,17 +79,18 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<a href='@foo' />",
new MarkupBlock(
Factory.Markup("<a"),
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 13, 0, 13)),
Factory.Markup(" href='").With(SpanCodeGenerator.Null),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(string.Empty, 9, 0, 9), 9, 0, 9),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("foo")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace))),
Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None)));
new MarkupTagBlock(
Factory.Markup("<a"),
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 13, 0, 13)),
Factory.Markup(" href='").With(SpanCodeGenerator.Null),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(string.Empty, 9, 0, 9), 9, 0, 9),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("foo")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace))),
Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))));
}
[Fact]
@ -92,25 +98,26 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<a href='@foo bar @baz' />",
new MarkupBlock(
Factory.Markup("<a"),
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 22, 0, 22)),
Factory.Markup(" href='").With(SpanCodeGenerator.Null),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(string.Empty, 9, 0, 9), 9, 0, 9),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("foo")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace))),
Factory.Markup(" bar").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(" ", 13, 0, 13), new LocationTagged<string>("bar", 14, 0, 14))),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(" ", 17, 0, 17), 18, 0, 18),
Factory.Markup(" ").With(SpanCodeGenerator.Null),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("baz")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace))),
Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None)));
new MarkupTagBlock(
Factory.Markup("<a"),
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 22, 0, 22)),
Factory.Markup(" href='").With(SpanCodeGenerator.Null),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(string.Empty, 9, 0, 9), 9, 0, 9),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("foo")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace))),
Factory.Markup(" bar").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(" ", 13, 0, 13), new LocationTagged<string>("bar", 14, 0, 14))),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(" ", 17, 0, 17), 18, 0, 18),
Factory.Markup(" ").With(SpanCodeGenerator.Null),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("baz")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace))),
Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))));
}
[Fact]
@ -118,22 +125,23 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<a href='@foo ~/Foo/Bar' />",
new MarkupBlock(
Factory.Markup("<a"),
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 23, 0, 23)),
Factory.Markup(" href='").With(SpanCodeGenerator.Null),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(string.Empty, 9, 0, 9), 9, 0, 9),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("foo")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace))),
Factory.Markup(" ~/Foo/Bar")
.WithEditorHints(EditorHints.VirtualPath)
.With(new LiteralAttributeCodeGenerator(
new LocationTagged<string>(" ", 13, 0, 13),
new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 14, 0, 14))),
Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None)));
new MarkupTagBlock(
Factory.Markup("<a"),
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 23, 0, 23)),
Factory.Markup(" href='").With(SpanCodeGenerator.Null),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(string.Empty, 9, 0, 9), 9, 0, 9),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("foo")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace))),
Factory.Markup(" ~/Foo/Bar")
.WithEditorHints(EditorHints.VirtualPath)
.With(new LiteralAttributeCodeGenerator(
new LocationTagged<string>(" ", 13, 0, 13),
new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 14, 0, 14))),
Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))));
}
[Fact]
@ -141,16 +149,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<input value=@foo />",
new MarkupBlock(
Factory.Markup("<input"),
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(" value=").With(SpanCodeGenerator.Null),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(string.Empty, 13, 0, 13), 13, 0, 13),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("foo")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)))),
Factory.Markup(" />").Accepts(AcceptedCharacters.None)));
new MarkupTagBlock(
Factory.Markup("<input"),
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(" value=").With(SpanCodeGenerator.Null),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(string.Empty, 13, 0, 13), 13, 0, 13),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("foo")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)))),
Factory.Markup(" />").Accepts(AcceptedCharacters.None))));
}
[Fact]
@ -158,16 +167,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseDocumentTest("<input value=@foo />",
new MarkupBlock(
Factory.Markup("<input"),
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(" value=").With(SpanCodeGenerator.Null),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(string.Empty, 13, 0, 13), 13, 0, 13),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("foo")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)))),
Factory.Markup(" />")));
new MarkupTagBlock(
Factory.Markup("<input"),
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(" value=").With(SpanCodeGenerator.Null),
new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged<string>(string.Empty, 13, 0, 13), 13, 0, 13),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("foo")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)))),
Factory.Markup(" />"))));
}
[Fact]
@ -182,16 +192,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
Assert.Equal(0, results.ParserErrors.Count);
EvaluateParseTree(rewritten,
new MarkupBlock(
Factory.Markup("<a"),
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 18, 0, 18)),
Factory.Markup(" href='").With(SpanCodeGenerator.Null),
Factory.Markup("~/Foo/Bar")
.WithEditorHints(EditorHints.VirtualPath)
.With(new LiteralAttributeCodeGenerator(
new LocationTagged<string>(string.Empty, 9, 0, 9),
new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 9, 0, 9))),
Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />")));
new MarkupTagBlock(
Factory.Markup("<a"),
new MarkupBlock(new AttributeBlockCodeGenerator(name: "href", prefix: new LocationTagged<string>(" href='", 2, 0, 2), suffix: new LocationTagged<string>("'", 18, 0, 18)),
Factory.Markup(" href='").With(SpanCodeGenerator.Null),
Factory.Markup("~/Foo/Bar")
.WithEditorHints(EditorHints.VirtualPath)
.With(new LiteralAttributeCodeGenerator(
new LocationTagged<string>(string.Empty, 9, 0, 9),
new LocationTagged<SpanCodeGenerator>(new ResolveUrlCodeGenerator(), 9, 0, 9))),
Factory.Markup("'").With(SpanCodeGenerator.Null)),
Factory.Markup(" />"))));
}
[Fact]
@ -264,7 +275,7 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
// Assert
Assert.Equal(0, results.ParserErrors.Count);
EvaluateParseTree(rewritten, new MarkupBlock(Factory.Markup(code)));
Assert.Equal(rewritten.Children.Count(), results.Document.Children.Count());
}
[Fact]
@ -272,16 +283,19 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<span data-foo='@foo'></span>",
new MarkupBlock(
Factory.Markup("<span"),
new MarkupBlock(
Factory.Markup(" data-foo='"),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("foo")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("'")),
Factory.Markup("></span>").Accepts(AcceptedCharacters.None)));
new MarkupTagBlock(
Factory.Markup("<span"),
new MarkupBlock(
Factory.Markup(" data-foo='"),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("foo")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("'")),
Factory.Markup(">").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("</span>").Accepts(AcceptedCharacters.None))));
}
[Fact]
@ -289,16 +303,19 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseDocumentTest("<span data-foo='@foo'></span>",
new MarkupBlock(
Factory.Markup("<span"),
new MarkupBlock(
Factory.Markup(" data-foo='"),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("foo")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("'")),
Factory.Markup("></span>")));
new MarkupTagBlock(
Factory.Markup("<span"),
new MarkupBlock(
Factory.Markup(" data-foo='"),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("foo")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)),
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.Code("\r\n").AsStatement(),
new MarkupBlock(
Factory.Markup("<")))),
new MarkupTagBlock(
Factory.Markup("<"))))),
new RazorError(
RazorResources.FormatParseError_Expected_EndOfBlock_Before_EOF(RazorResources.BlockName_Code, "}", "{"),
1, 0, 1));
@ -57,10 +58,12 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
Factory.MetaCode("{").Accepts(AcceptedCharacters.None),
Factory.Code("\r\n").AsStatement(),
new MarkupBlock(
Factory.Markup("<\r\n")
new MarkupTagBlock(
Factory.Markup("<\r\n"))
),
new MarkupBlock(
Factory.Markup(@"</html>").Accepts(AcceptedCharacters.None)
new MarkupTagBlock(
Factory.Markup("</html>").Accepts(AcceptedCharacters.None))
),
Factory.EmptyCSharp().AsStatement()
)
@ -79,7 +82,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
ParseBlockTest("< " + Environment.NewLine
+ " ",
new MarkupBlock(
Factory.Markup("< \r\n ")),
new MarkupTagBlock(
Factory.Markup("< \r\n "))),
designTimeParser: true,
expectedErrors: new RazorError(RazorResources.FormatParseError_UnfinishedTag(string.Empty), 0, 0, 0));
}
@ -87,7 +91,18 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
[Fact]
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]
@ -118,31 +133,77 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
[Fact]
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]
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]
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]
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]
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]
@ -150,16 +211,25 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<foo bar=\"baz\"><biz><boz zoop=zork/></biz></foo>",
new MarkupBlock(
Factory.Markup("<foo"),
new MarkupBlock(new AttributeBlockCodeGenerator("bar", new LocationTagged<string>(" bar=\"", 4, 0, 4), new LocationTagged<string>("\"", 13, 0, 13)),
Factory.Markup(" bar=\"").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("\"").With(SpanCodeGenerator.Null)),
Factory.Markup("><biz><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("/></biz></foo>").Accepts(AcceptedCharacters.None)));
new MarkupTagBlock(
Factory.Markup("<foo"),
new MarkupBlock(new AttributeBlockCodeGenerator("bar", new LocationTagged<string>(" bar=\"", 4, 0, 4), new LocationTagged<string>("\"", 13, 0, 13)),
Factory.Markup(" bar=\"").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("\"").With(SpanCodeGenerator.Null)),
Factory.Markup(">").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("<biz>").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]
@ -167,12 +237,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<foo><bar baz=\">\" /></foo>",
new MarkupBlock(
Factory.Markup("<foo><bar"),
new MarkupBlock(new AttributeBlockCodeGenerator("baz", new LocationTagged<string>(" baz=\"", 9, 0, 9), new LocationTagged<string>("\"", 16, 0, 16)),
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(" /></foo>").Accepts(AcceptedCharacters.None)));
new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("<bar"),
new MarkupBlock(new AttributeBlockCodeGenerator("baz", new LocationTagged<string>(" baz=\"", 9, 0, 9), new LocationTagged<string>("\"", 16, 0, 16)),
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]
@ -180,12 +255,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<foo><bar baz=\'>\' /></foo>",
new MarkupBlock(
Factory.Markup("<foo><bar"),
new MarkupBlock(new AttributeBlockCodeGenerator("baz", new LocationTagged<string>(" baz='", 9, 0, 9), new LocationTagged<string>("'", 16, 0, 16)),
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(" /></foo>").Accepts(AcceptedCharacters.None)));
new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("<bar"),
new MarkupBlock(new AttributeBlockCodeGenerator("baz", new LocationTagged<string>(" baz='", 9, 0, 9), new LocationTagged<string>("'", 16, 0, 16)),
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]
@ -193,12 +273,19 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<foo><bar baz=\"/\"></bar></foo>",
new MarkupBlock(
Factory.Markup("<foo><bar"),
new MarkupBlock(new AttributeBlockCodeGenerator("baz", new LocationTagged<string>(" baz=\"", 9, 0, 9), new LocationTagged<string>("\"", 16, 0, 16)),
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("></bar></foo>").Accepts(AcceptedCharacters.None)));
new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("<bar"),
new MarkupBlock(new AttributeBlockCodeGenerator("baz", new LocationTagged<string>(" baz=\"", 9, 0, 9), new LocationTagged<string>("\"", 16, 0, 16)),
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]
@ -206,19 +293,29 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<foo><bar baz=\'/\'></bar></foo>",
new MarkupBlock(
Factory.Markup("<foo><bar"),
new MarkupBlock(new AttributeBlockCodeGenerator("baz", new LocationTagged<string>(" baz='", 9, 0, 9), new LocationTagged<string>("'", 16, 0, 16)),
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("></bar></foo>").Accepts(AcceptedCharacters.None)));
new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None)),
new MarkupTagBlock(
Factory.Markup("<bar"),
new MarkupBlock(new AttributeBlockCodeGenerator("baz", new LocationTagged<string>(" baz='", 9, 0, 9), new LocationTagged<string>("'", 16, 0, 16)),
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]
public void ParseBlockTerminatesAtEOF()
{
SingleSpanBlockTest("<foo>", "<foo>", BlockType.Markup, SpanKind.Markup,
new RazorError(RazorResources.FormatParseError_MissingEndTag("foo"), new SourceLocation(0, 0, 0)));
ParseBlockTest("<foo>",
new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<foo>").Accepts(AcceptedCharacters.None))),
new RazorError(RazorResources.FormatParseError_MissingEndTag("foo"), new SourceLocation(0, 0, 0)));
}
[Fact]
@ -230,7 +327,15 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
[Fact]
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]
@ -254,18 +359,25 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
[Fact]
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]
public void ParseBlockTreatsMalformedTagsAsContent()
{
SingleSpanBlockTest(
"<foo></!-- bar --></foo>",
"<foo></!-- bar -->",
BlockType.Markup,
SpanKind.Markup,
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 RazorError(RazorResources.FormatParseError_MissingEndTag("foo"), 0, 0, 0));
}
@ -273,43 +385,87 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
[Fact]
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]
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]
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]
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]
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]
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]
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]
@ -317,7 +473,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<text/>",
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",
new MarkupBlock(
Factory.MarkupTransition("<text>"),
Factory.Markup("Foo Bar <foo> Baz"),
Factory.MarkupTransition("</text>"),
new MarkupTagBlock(
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)
));
}
@ -338,9 +500,18 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<text><text>Foo Bar <foo> Baz</text></text> zoop",
new MarkupBlock(
Factory.MarkupTransition("<text>"),
Factory.Markup("<text>Foo Bar <foo> Baz</text>"),
Factory.MarkupTransition("</text>"),
new MarkupTagBlock(
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)
));
}
@ -350,7 +521,16 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<foo><text><bar></bar></foo>",
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/",
new MarkupBlock(
Factory.Markup("<br/")
),
new MarkupTagBlock(
Factory.Markup("<br/"))),
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>",
new MarkupBlock(
Factory.Markup("<div>Foo "),
new MarkupTagBlock(
Factory.Markup("<div>").Accepts(AcceptedCharacters.None)),
Factory.Markup("Foo "),
new StatementBlock(
Factory.CodeTransition(),
Factory.Code("if(true) {}").AsStatement()),
Factory.Markup(" Bar</div>").Accepts(AcceptedCharacters.None)));
Factory.Markup(" Bar"),
new MarkupTagBlock(
Factory.Markup("</div>").Accepts(AcceptedCharacters.None))));
}
[Fact]
@ -381,14 +565,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest(@"<script>foo<bar baz='@boz'></script>",
new MarkupBlock(
Factory.Markup("<script>foo<bar baz='"),
new MarkupTagBlock(
Factory.Markup("<script>").Accepts(AcceptedCharacters.None)),
Factory.Markup("foo<bar baz='"),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("boz")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: false)
.Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("'></script>")
.Accepts(AcceptedCharacters.None)));
Factory.Markup("'>"),
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));
}
[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]
public void ParseDocumentCorrectlyHandlesSingleLineOfMarkupWithEmbeddedStatement()
{
ParseDocumentTest("<div>Foo @if(true) {} Bar</div>",
new MarkupBlock(
Factory.Markup("<div>Foo "),
BlockFactory.MarkupTagBlock("<div>"),
Factory.Markup("Foo "),
new StatementBlock(
Factory.CodeTransition(),
Factory.Code("if(true) {}").AsStatement()),
Factory.Markup(" Bar</div>")));
Factory.Markup(" Bar"),
BlockFactory.MarkupTagBlock("</div>")));
}
[Fact]
@ -89,7 +103,10 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
Factory.MetaCode("section Foo {")
.AutoCompleteWith(null, atEndOfSpan: true),
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.EmptyHtml()));
}
@ -97,7 +114,7 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
[Fact]
public void ParseDocumentParsesWholeContentAsOneSpanIfNoSwapCharacterEncountered()
{
SingleSpanDocumentTest("foo <bar>baz</bar>", BlockType.Markup, SpanKind.Markup);
SingleSpanDocumentTest("foo baz", BlockType.Markup, SpanKind.Markup);
}
[Fact]
@ -146,7 +163,7 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
[Fact]
public void ParseDocumentDoesNotSwitchToCodeOnEmailAddressInText()
{
SingleSpanDocumentTest("<foo>anurse@microsoft.com</foo>", BlockType.Markup, SpanKind.Markup);
SingleSpanDocumentTest("anurse@microsoft.com", BlockType.Markup, SpanKind.Markup);
}
[Fact]
@ -154,37 +171,56 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseDocumentTest("<a href=\"mailto:anurse@microsoft.com\">Email me</a>",
new MarkupBlock(
Factory.Markup("<a"),
new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href=\"", 2, 0, 2), new LocationTagged<string>("\"", 36, 0, 36)),
Factory.Markup(" href=\"").With(SpanCodeGenerator.Null),
Factory.Markup("mailto:anurse@microsoft.com")
.With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 9, 0, 9), new LocationTagged<string>("mailto:anurse@microsoft.com", 9, 0, 9))),
Factory.Markup("\"").With(SpanCodeGenerator.Null)),
Factory.Markup(">Email me</a>")));
new MarkupTagBlock(
Factory.Markup("<a"),
new MarkupBlock(new AttributeBlockCodeGenerator("href", new LocationTagged<string>(" href=\"", 2, 0, 2), new LocationTagged<string>("\"", 36, 0, 36)),
Factory.Markup(" href=\"").With(SpanCodeGenerator.Null),
Factory.Markup("mailto:anurse@microsoft.com")
.With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(String.Empty, 9, 0, 9), new LocationTagged<string>("mailto:anurse@microsoft.com", 9, 0, 9))),
Factory.Markup("\"").With(SpanCodeGenerator.Null)),
Factory.Markup(">")),
Factory.Markup("Email me"),
BlockFactory.MarkupTagBlock("</a>")));
}
[Fact]
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]
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]
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]
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]
@ -192,7 +228,9 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseDocumentTest("<foo>${bar}</foo>",
new MarkupBlock(
Factory.Markup("<foo>${bar}</foo>")));
BlockFactory.MarkupTagBlock("<foo>"),
Factory.Markup("${bar}"),
BlockFactory.MarkupTagBlock("</foo>")));
}
[Fact]
@ -200,13 +238,15 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseDocumentTest(@"<script>foo<bar baz='@boz'></script>",
new MarkupBlock(
Factory.Markup("<script>foo<bar baz='"),
BlockFactory.MarkupTagBlock("<script>"),
Factory.Markup("foo<bar baz='"),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("boz")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: false)
.Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("'></script>")));
Factory.Markup("'>"),
BlockFactory.MarkupTagBlock("</script>")));
}
[Fact]
@ -219,13 +259,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
Factory.CodeTransition(),
Factory.MetaCode("section Foo {"),
new MarkupBlock(
Factory.Markup(" <script>foo<bar baz='"),
Factory.Markup(" "),
BlockFactory.MarkupTagBlock("<script>"),
Factory.Markup("foo<bar baz='"),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("boz")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: false)
.Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("'></script> ")),
Factory.Markup("'>"),
BlockFactory.MarkupTagBlock("</script>"),
Factory.Markup(" ")),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml()));
}
@ -234,7 +278,7 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
public void ParseBlockCanParse1000NestedElements()
{
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]
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]
@ -23,9 +29,10 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<text foo bar></text>",
new MarkupBlock(
Factory.MarkupTransition("<text").Accepts(AcceptedCharacters.Any),
Factory.Markup(" foo bar>"),
Factory.MarkupTransition("</text>")),
new MarkupTagBlock(
Factory.MarkupTransition("<text foo bar>").Accepts(AcceptedCharacters.Any)),
new MarkupTagBlock(
Factory.MarkupTransition("</text>"))),
new RazorError(RazorResources.ParseError_TextTagCannotContainAttributes, SourceLocation.Zero));
}
@ -34,9 +41,10 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<text></text foo bar>",
new MarkupBlock(
Factory.MarkupTransition("<text>"),
Factory.MarkupTransition("</text").Accepts(AcceptedCharacters.Any),
Factory.Markup(" ")),
new MarkupTagBlock(
Factory.MarkupTransition("<text>")),
new MarkupTagBlock(
Factory.MarkupTransition("</text foo bar>").Accepts(AcceptedCharacters.Any))),
new RazorError(RazorResources.ParseError_TextTagCannotContainAttributes, 6, 0, 6));
}
@ -53,7 +61,9 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("</foo> bar baz",
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));
}
@ -62,7 +72,12 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<p><foo></bar>",
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)));
}
@ -71,7 +86,9 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<foo>blah blah blah blah blah",
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)));
}
@ -80,10 +97,11 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<foo bar=baz",
new MarkupBlock(
new MarkupTagBlock(
Factory.Markup("<foo"),
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("baz").With(new LiteralAttributeCodeGenerator(new LocationTagged<string>(string.Empty, 9, 0, 9), new LocationTagged<string>("baz", 9, 0, 9))))),
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("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)));
}
}

View File

@ -15,9 +15,12 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
var factory = SpanFactory.CreateCsHtml();
testMethod("<foo>@@bar</foo>",
new MarkupBlock(
factory.Markup("<foo>"),
new MarkupTagBlock(
factory.Markup("<foo>").Accepts(lastSpanAcceptedCharacters)),
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)
@ -25,7 +28,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
var factory = SpanFactory.CreateCsHtml();
testMethod("<foo>@@@@@bar</foo>",
new MarkupBlock(
factory.Markup("<foo>"),
new MarkupTagBlock(
factory.Markup("<foo>").Accepts(lastSpanAcceptedCharacters)),
factory.Markup("@").Hidden(),
factory.Markup("@"),
factory.Markup("@").Hidden(),
@ -35,7 +39,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
factory.Code("bar")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.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",
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));
}
[Fact]
public void EmptyTag()
{
// This can happen in situations where a user is in VS' HTML editor and they're modifying
// the contents of an HTML tag.
ParseBlockTest("<></> Bar",
new MarkupBlock(
Factory.Markup("<></> ").Accepts(AcceptedCharacters.None)));
BlockFactory.MarkupTagBlock("<>", AcceptedCharacters.None),
BlockFactory.MarkupTagBlock("</>", AcceptedCharacters.None),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)));
}
[Fact]
@ -55,7 +61,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<!--Foo--> Bar",
new MarkupBlock(
Factory.Markup("<!--Foo--> ").Accepts(AcceptedCharacters.None)));
Factory.Markup("<!--Foo-->").Accepts(AcceptedCharacters.None),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)));
}
[Fact]
@ -63,7 +70,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<!DOCTYPE html> foo",
new MarkupBlock(
Factory.Markup("<!DOCTYPE html> ").Accepts(AcceptedCharacters.None)));
Factory.Markup("<!DOCTYPE html>").Accepts(AcceptedCharacters.None),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)));
}
[Fact]
@ -71,7 +79,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<?xml version=\"1.0\" ?> foo",
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]
@ -79,7 +88,10 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<p>Foo</p> Bar",
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]
@ -87,9 +99,11 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<text>Foo</text>}",
new MarkupBlock(
Factory.MarkupTransition("<text>"),
Factory.Markup("Foo"),
Factory.MarkupTransition("</text>")));
new MarkupTagBlock(
Factory.MarkupTransition("<text>")),
Factory.Markup("Foo").Accepts(AcceptedCharacters.None),
new MarkupTagBlock(
Factory.MarkupTransition("</text>"))));
}
[Fact]
@ -97,7 +111,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<![CDATA[Foo]]> Bar",
new MarkupBlock(
Factory.Markup("<![CDATA[Foo]]> ").Accepts(AcceptedCharacters.None)));
Factory.Markup("<![CDATA[Foo]]>").Accepts(AcceptedCharacters.None),
Factory.Markup(" ").Accepts(AcceptedCharacters.None)));
}
[Fact]
@ -105,7 +120,9 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseDocumentTest("<script>foo < bar && quantity.toString() !== orderQty.val()</script>",
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]
@ -114,8 +131,7 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<" + tagName + ">foo",
new MarkupBlock(
Factory.Markup("<" + tagName + ">")
.Accepts(AcceptedCharacters.None)));
BlockFactory.MarkupTagBlock("<" + tagName + ">", AcceptedCharacters.None)));
}
[Theory]
@ -124,8 +140,7 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<" + tagName + "><other>foo",
new MarkupBlock(
Factory.Markup("<" + tagName + ">")
.Accepts(AcceptedCharacters.None)));
BlockFactory.MarkupTagBlock("<" + tagName + ">", AcceptedCharacters.None)));
}
[Theory]
@ -134,8 +149,9 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<" + tagName + "> </" + tagName + ">foo",
new MarkupBlock(
Factory.Markup("<" + tagName + "> </" + tagName + ">")
.Accepts(AcceptedCharacters.None)));
BlockFactory.MarkupTagBlock("<" + tagName + ">", AcceptedCharacters.None),
Factory.Markup(" "),
BlockFactory.MarkupTagBlock("</" + tagName + ">", AcceptedCharacters.None)));
}
[Theory]
@ -144,8 +160,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html
{
ParseBlockTest("<" + tagName + "></" + tagName,
new MarkupBlock(
Factory.Markup("<" + tagName + "></" + tagName)
.Accepts(AcceptedCharacters.Any)));
BlockFactory.MarkupTagBlock("<" + tagName + ">", AcceptedCharacters.None),
BlockFactory.MarkupTagBlock("</" + tagName)));
}
}
}

View File

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

View File

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