diff --git a/test/Microsoft.AspNet.Razor.Test/Framework/BlockFactory.cs b/test/Microsoft.AspNet.Razor.Test/Framework/BlockFactory.cs new file mode 100644 index 0000000000..c2c7dafdcd --- /dev/null +++ b/test/Microsoft.AspNet.Razor.Test/Framework/BlockFactory.cs @@ -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) + ); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Razor.Test/Framework/BlockTypes.cs b/test/Microsoft.AspNet.Razor.Test/Framework/BlockTypes.cs index 18ca9be2f1..139b0882a3 100644 --- a/test/Microsoft.AspNet.Razor.Test/Framework/BlockTypes.cs +++ b/test/Microsoft.AspNet.Razor.Test/Framework/BlockTypes.cs @@ -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 children) + : base(blockType, children, codeGenerator) + { + } + public MarkupBlock(IBlockCodeGenerator codeGenerator, IEnumerable children) - : base(ThisBlockType, children, codeGenerator) + : this(ThisBlockType, codeGenerator, children) { } diff --git a/test/Microsoft.AspNet.Razor.Test/Framework/CsHtmlCodeParserTestBase.cs b/test/Microsoft.AspNet.Razor.Test/Framework/CsHtmlCodeParserTestBase.cs index 0733260049..b59b8ba13d 100644 --- a/test/Microsoft.AspNet.Razor.Test/Framework/CsHtmlCodeParserTestBase.cs +++ b/test/Microsoft.AspNet.Razor.Test/Framework/CsHtmlCodeParserTestBase.cs @@ -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(); diff --git a/test/Microsoft.AspNet.Razor.Test/Framework/CsHtmlMarkupParserTestBase.cs b/test/Microsoft.AspNet.Razor.Test/Framework/CsHtmlMarkupParserTestBase.cs index fdd1d13807..9945af1292 100644 --- a/test/Microsoft.AspNet.Razor.Test/Framework/CsHtmlMarkupParserTestBase.cs +++ b/test/Microsoft.AspNet.Razor.Test/Framework/CsHtmlMarkupParserTestBase.cs @@ -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(); diff --git a/test/Microsoft.AspNet.Razor.Test/Framework/ParserTestBase.cs b/test/Microsoft.AspNet.Razor.Test/Framework/ParserTestBase.cs index 1e667c08fc..238a394595 100644 --- a/test/Microsoft.AspNet.Razor.Test/Framework/ParserTestBase.cs +++ b/test/Microsoft.AspNet.Razor.Test/Framework/ParserTestBase.cs @@ -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) { diff --git a/test/Microsoft.AspNet.Razor.Test/Generator/CSharpRazorCodeGeneratorTest.cs b/test/Microsoft.AspNet.Razor.Test/Generator/CSharpRazorCodeGeneratorTest.cs index c8f09d38bc..8dc4527b31 100644 --- a/test/Microsoft.AspNet.Razor.Test/Generator/CSharpRazorCodeGeneratorTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/Generator/CSharpRazorCodeGeneratorTest.cs @@ -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), diff --git a/test/Microsoft.AspNet.Razor.Test/Generator/CodeTree/CSharpPaddingBuilderTests.cs b/test/Microsoft.AspNet.Razor.Test/Generator/CodeTree/CSharpPaddingBuilderTests.cs index 80a4080a41..226357cc66 100644 --- a/test/Microsoft.AspNet.Razor.Test/Generator/CodeTree/CSharpPaddingBuilderTests.cs +++ b/test/Microsoft.AspNet.Razor.Test/Generator/CodeTree/CSharpPaddingBuilderTests.cs @@ -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
\r\n @if (true)", SpanKind.Code, 3, "if (true)"); + var spanFlat = GenerateSpan(" @if (true)", SpanKind.Code, 2, "if (true)"); + var spanNewlines = GenerateSpan("\t
" + 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
\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
" + 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\r\n\r\n\t\t@if (true) { \r\n\r\n"; + var text = string.Format("{0}{0}{0}\t\t@if (true) {{ {0}{0}", 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]; } diff --git a/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpAutoCompleteTest.cs b/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpAutoCompleteTest.cs index 78bb1a7c18..4c12e71a83 100644 --- a/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpAutoCompleteTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpAutoCompleteTest.cs @@ -121,10 +121,10 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp .AsStatement() .With(new AutoCompleteEditHandler(CSharpLanguageCharacteristics.Instance.TokenizeString) { AutoCompleteString = "}" }), new MarkupBlock( - Factory.Markup(@"

") - .With(new MarkupCodeGenerator()) - .Accepts(AcceptedCharacters.None) - ), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("

").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

Foo

"))), + Factory.Markup("\r\n"), + new MarkupTagBlock( + Factory.Markup("

")), + Factory.Markup("Foo"), + new MarkupTagBlock( + Factory.Markup("

")))), 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(@"

") - .With(new MarkupCodeGenerator()) - .Accepts(AcceptedCharacters.None) - ), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None))), Factory.Span(SpanKind.Code, new CSharpSymbol(Factory.LocationTracker.CurrentLocation, String.Empty, CSharpSymbolType.Unknown)) .With(new StatementCodeGenerator()) ), diff --git a/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpBlockTest.cs b/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpBlockTest.cs index 9113235717..418dde69df 100644 --- a/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpBlockTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpBlockTest.cs @@ -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("

Foo

").Accepts(AcceptedCharacters.None) + Factory.Markup(" "), + BlockFactory.MarkupTagBlock("

", AcceptedCharacters.None), + Factory.Markup("Foo"), + BlockFactory.MarkupTagBlock("

", AcceptedCharacters.None), + Factory.Markup(" ").Accepts(AcceptedCharacters.None) ), Factory.Code("foo++; } while (foo);").AsStatement().Accepts(AcceptedCharacters.None) )); @@ -478,7 +482,16 @@ catch(bar) { baz(); }", BlockType.Statement, SpanKind.Code); [Fact] public void ParseBlockSupportsMarkupWithinTryClause() { - RunSimpleWrappedMarkupTest("try {", "

Foo

", "}"); + RunSimpleWrappedMarkupTest( + prefix: "try {", + markup: "

Foo

", + suffix: "}", + expectedMarkup: new MarkupBlock( + Factory.Markup(" "), + BlockFactory.MarkupTagBlock("

", AcceptedCharacters.None), + Factory.Markup("Foo"), + BlockFactory.MarkupTagBlock("

", 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) {", "

Foo

", "}"); + RunSimpleWrappedMarkupTest( + prefix: "try { var foo = new { } } catch(Foo Bar Baz) {", + markup: "

Foo

", + suffix: "}", + expectedMarkup: new MarkupBlock( + Factory.Markup(" "), + BlockFactory.MarkupTagBlock("

", AcceptedCharacters.None), + Factory.Markup("Foo"), + BlockFactory.MarkupTagBlock("

", 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) {", "

Foo

", "}"); + 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: "

Foo

", + suffix: "}", + expectedMarkup: new MarkupBlock( + Factory.Markup(" "), + BlockFactory.MarkupTagBlock("

", AcceptedCharacters.None), + Factory.Markup("Foo"), + BlockFactory.MarkupTagBlock("

", 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 {", "

Foo

", "}", acceptedCharacters: AcceptedCharacters.None); + RunSimpleWrappedMarkupTest( + prefix: "try { var foo = new { } } finally {", + markup: "

Foo

", + suffix: "}", + expectedMarkup: new MarkupBlock( + Factory.Markup(" "), + BlockFactory.MarkupTagBlock("

", AcceptedCharacters.None), + Factory.Markup("Foo"), + BlockFactory.MarkupTagBlock("

", 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("
\r\n

"), + Factory.Markup(" "), + BlockFactory.MarkupTagBlock("
", AcceptedCharacters.None), + Factory.Markup("\r\n "), + BlockFactory.MarkupTagBlock("

", AcceptedCharacters.None), + Factory.EmptyHtml(), new ExpressionBlock( Factory.CodeTransition(), Factory.Code("c.Name") .AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .Accepts(AcceptedCharacters.NonWhiteSpace)), - Factory.Markup("

\r\n
    \r\n"), + BlockFactory.MarkupTagBlock("

", AcceptedCharacters.None), + Factory.Markup("\r\n "), + BlockFactory.MarkupTagBlock("
    ", 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("
  • (" href=\"", 193, 5, 30), new LocationTagged("\"", 256, 5, 93)), - Factory.Markup(" href=\"").With(SpanCodeGenerator.Null), - new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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("
  • ", AcceptedCharacters.None), + new MarkupTagBlock( + Factory.Markup("(" href=\"", 193, 5, 30), new LocationTagged("\"", 256, 5, 93)), + Factory.Markup(" href=\"").With(SpanCodeGenerator.Null), + new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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("
  • \r\n").Accepts(AcceptedCharacters.None)), + BlockFactory.MarkupTagBlock("", AcceptedCharacters.None), + BlockFactory.MarkupTagBlock("", AcceptedCharacters.None), + Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)), Factory.Code(" }\r\n").AsStatement().Accepts(AcceptedCharacters.None)), - Factory.Markup("
\r\n
\r\n") - .Accepts(AcceptedCharacters.None)), + Factory.Markup(" "), + BlockFactory.MarkupTagBlock("", AcceptedCharacters.None), + Factory.Markup("\r\n "), + BlockFactory.MarkupTagBlock("
", 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) )); } diff --git a/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpDirectivesTest.cs b/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpDirectivesTest.cs index 1105b95117..42d100a4f6 100644 --- a/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpDirectivesTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpDirectivesTest.cs @@ -136,7 +136,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp .AutoCompleteWith(null, atEndOfSpan: true) .Accepts(AcceptedCharacters.Any), new MarkupBlock( - Factory.Markup("

F", "{", "o", "}", "o", "

")), + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

")), + Factory.Markup("F", "{", "o", "}", "o"), + new MarkupTagBlock( + Factory.Markup("

")), + Factory.Markup(" ")), Factory.MetaCode("}") .Accepts(AcceptedCharacters.None))); } diff --git a/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpErrorTest.cs b/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpErrorTest.cs index e6ed563061..0b5420b52a 100644 --- a/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpErrorTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpErrorTest.cs @@ -389,16 +389,21 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp new StatementBlock( Factory.Code("if(foo) ").AsStatement(), new MarkupBlock( - Factory.Markup("

Bar

").Accepts(AcceptedCharacters.None) - ), + BlockFactory.MarkupTagBlock("

", AcceptedCharacters.None), + Factory.Markup("Bar"), + BlockFactory.MarkupTagBlock("

", AcceptedCharacters.None), + Factory.Markup(" ").Accepts(AcceptedCharacters.None)), Factory.Code("else if(bar) ").AsStatement(), new MarkupBlock( - Factory.Markup("

Baz

").Accepts(AcceptedCharacters.None) - ), + BlockFactory.MarkupTagBlock("

", AcceptedCharacters.None), + Factory.Markup("Baz"), + BlockFactory.MarkupTagBlock("

", AcceptedCharacters.None), + Factory.Markup(" ").Accepts(AcceptedCharacters.None)), Factory.Code("else ").AsStatement(), new MarkupBlock( - Factory.Markup("

Boz

").Accepts(AcceptedCharacters.None) - ), + BlockFactory.MarkupTagBlock("

", AcceptedCharacters.None), + Factory.Markup("Boz"), + BlockFactory.MarkupTagBlock("

", 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("

Bar

").Accepts(AcceptedCharacters.None) - ), + BlockFactory.MarkupTagBlock("

", AcceptedCharacters.None), + Factory.Markup("Bar"), + BlockFactory.MarkupTagBlock("

", 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("

Foo

").Accepts(AcceptedCharacters.None) - ), + Factory.Markup(" "), + BlockFactory.MarkupTagBlock("

", AcceptedCharacters.None), + Factory.Markup("Foo"), + BlockFactory.MarkupTagBlock("

", 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("

Foo is "), + BlockFactory.MarkupTagBlock("

", AcceptedCharacters.None), + Factory.Markup("Foo is "), new ExpressionBlock( Factory.CodeTransition(), Factory.Code("foo") .AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .Accepts(AcceptedCharacters.NonWhiteSpace)), - Factory.Markup("

\r\n").Accepts(AcceptedCharacters.None)), + BlockFactory.MarkupTagBlock("

", 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("").Accepts(AcceptedCharacters.None)), + BlockFactory.MarkupTagBlock("", AcceptedCharacters.None), + BlockFactory.MarkupTagBlock("", AcceptedCharacters.None)), Factory.EmptyCSharp().AsStatement(), Factory.MetaCode("}").Accepts(AcceptedCharacters.None)), expectedErrors: new[] { diff --git a/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpHelperTest.cs b/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpHelperTest.cs index c7d28e9b20..6051574b6c 100644 --- a/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpHelperTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpHelperTest.cs @@ -205,7 +205,12 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp .AsStatement() .AutoCompleteWith("}"), new MarkupBlock( - Factory.Markup("

Foo

").Accepts(AcceptedCharacters.None)), + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Foo"), + new MarkupTagBlock( + Factory.Markup("

").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("

"), + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.EmptyHtml(), new ExpressionBlock( Factory.CodeTransition(), Factory.Code("foo") .AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .Accepts(AcceptedCharacters.NonWhiteSpace)), - Factory.Markup("

\r\n").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("

").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(@"

"), + Factory.Markup(@" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.EmptyHtml(), new ExpressionBlock( Factory.CodeTransition(), Factory.Code("foo") .AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .Accepts(AcceptedCharacters.NonWhiteSpace)), - Factory.Markup("

\r\n").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)), Factory.EmptyCSharp().AsStatement()), Factory.Code("}").Hidden().Accepts(AcceptedCharacters.None)), Factory.EmptyHtml())); diff --git a/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpNestedStatementsTest.cs b/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpNestedStatementsTest.cs index fe8bcd3bca..d226493501 100644 --- a/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpNestedStatementsTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpNestedStatementsTest.cs @@ -92,9 +92,14 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp Factory.Code("while(true) {") .AsStatement(), new MarkupBlock( - Factory.Markup("

Hello

") - .With(new MarkupCodeGenerator()) - .Accepts(AcceptedCharacters.None)), + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Hello"), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup(" ").Accepts(AcceptedCharacters.None) + ), Factory.Code("}") .AsStatement() .Accepts(AcceptedCharacters.None))); diff --git a/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpRazorCommentsTest.cs b/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpRazorCommentsTest.cs index 20e4568a68..bde7c67054 100644 --- a/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpRazorCommentsTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpRazorCommentsTest.cs @@ -125,8 +125,9 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp Factory.Code("\r\n").AsStatement(), new MarkupBlock( Factory.Markup(" "), - Factory.MarkupTransition("Foo

}")), + Factory.Markup("9 { "), + new MarkupTagBlock( + Factory.Markup("

")), + Factory.Markup("Foo"), + new MarkupTagBlock( + Factory.Markup("

")), + 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 {

Foo

}")), + Factory.Markup("-bar { "), + new MarkupTagBlock( + Factory.Markup("

")), + Factory.Markup("Foo"), + new MarkupTagBlock( + Factory.Markup("

")), + 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("

Foo

")), + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

")), + Factory.Markup("Foo"), + new MarkupTagBlock( + Factory.Markup("

")), + 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("

")), // Need to provide the markup span as fragments, since the parser will split the {} into separate symbols. - Factory.Markup("

Foo", "{", "}", "

")))), + Factory.Markup("Foo", "{", "}"), + new MarkupTagBlock( + Factory.Markup("

"))))), 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

Foo

\r\n")), + Factory.Markup("\r\n"), + new MarkupTagBlock( + Factory.Markup("

")), + Factory.Markup("Foo"), + new MarkupTagBlock( + Factory.Markup("

")), + 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("

Foo

")), + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

")), + Factory.Markup("Foo"), + new MarkupTagBlock( + Factory.Markup("

")), + 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("

Foo

")), + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

")), + Factory.Markup("Foo"), + new MarkupTagBlock( + Factory.Markup("

")), + 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(" ")), + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("")), + 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 + " \" '-->")), + Factory.Markup(Environment.NewLine), + new MarkupTagBlock( + Factory.Markup(" \" '-->")), Factory.MetaCode("}").Accepts(AcceptedCharacters.None)), Factory.EmptyHtml())); } diff --git a/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpSpecialBlockTest.cs b/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpSpecialBlockTest.cs index b9a387a9e1..7b178c7e6b 100644 --- a/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpSpecialBlockTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpSpecialBlockTest.cs @@ -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

A real tag!

\r\n") - .Accepts(AcceptedCharacters.None)), + Factory.Markup("\t"), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("A real tag!"), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)), Factory.Code("}").AsStatement() )); } diff --git a/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpTemplateTest.cs b/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpTemplateTest.cs index fa44cfb6e3..022d6724e5 100644 --- a/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpTemplateTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpTemplateTest.cs @@ -21,14 +21,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp return new TemplateBlock( new MarkupBlock( Factory.MarkupTransition(), - Factory.Markup("

Foo #"), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Foo #"), new ExpressionBlock( Factory.CodeTransition(), Factory.Code("item") .AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .Accepts(AcceptedCharacters.NonWhiteSpace) ), - Factory.Markup("

").Accepts(AcceptedCharacters.None) + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)) ) ); } @@ -40,7 +43,9 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp return new TemplateBlock( new MarkupBlock( Factory.MarkupTransition(), - Factory.Markup("

Foo #"), + new MarkupTagBlock( + Factory.Markup("

").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("

"), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.EmptyHtml(), new ExpressionBlock( Factory.CodeTransition(), Factory.Code("item") .AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .Accepts(AcceptedCharacters.NonWhiteSpace) ), - Factory.Markup("

").Accepts(AcceptedCharacters.None) + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)) ) ), Factory.Code(")") .AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .Accepts(AcceptedCharacters.NonWhiteSpace) ), - Factory.Markup("

").Accepts(AcceptedCharacters.None) + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)) ) ); } diff --git a/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpToMarkupSwitchTest.cs b/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpToMarkupSwitchTest.cs index 512742b585..d61a04f9fb 100644 --- a/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpToMarkupSwitchTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/Parser/CSharp/CSharpToMarkupSwitchTest.cs @@ -34,7 +34,11 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp new TemplateBlock( new MarkupBlock( Factory.MarkupTransition(), - Factory.Markup("

Foo

").Accepts(AcceptedCharacters.None) + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Foo"), + new MarkupTagBlock( + Factory.Markup("

").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("

Foo

").Accepts(AcceptedCharacters.None) + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Foo"), + new MarkupTagBlock( + Factory.Markup("

").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("

Foo

").Accepts(AcceptedCharacters.None) + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Foo"), + new MarkupTagBlock( + Factory.Markup("

").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("
\r\n") - .Accepts(AcceptedCharacters.None) + new MarkupTagBlock( + Factory.Markup("
").Accepts(AcceptedCharacters.None)), + Factory.Markup("\r\n").Accepts(AcceptedCharacters.None) ), new MarkupBlock( - Factory.Markup("Foo\r\n") - .Accepts(AcceptedCharacters.None) - ), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + Factory.Markup("Foo"), + new MarkupTagBlock( + Factory.Markup("").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("

\r\n Foo\r\n"), + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").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

\r\n").Accepts(AcceptedCharacters.None) + Factory.Markup("\r\n "), + new MarkupTagBlock( + Factory.Markup("

").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("

Bar

").Accepts(AcceptedCharacters.None) + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Bar"), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup(" ").Accepts(AcceptedCharacters.None) ), Factory.Code("} else if(bar) {").AsStatement(), new MarkupBlock( - Factory.Markup("

Baz

").Accepts(AcceptedCharacters.None) + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Baz"), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup(" ").Accepts(AcceptedCharacters.None) ), Factory.Code("} else {").AsStatement(), new MarkupBlock( - Factory.Markup("

Boz

").Accepts(AcceptedCharacters.None) + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Boz"), + new MarkupTagBlock( + Factory.Markup("

").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("

Bar

").Accepts(AcceptedCharacters.None) + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Bar"), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup(" ").Accepts(AcceptedCharacters.None) ), Factory.Code("} else if(bar) {").AsStatement(), new MarkupBlock( - Factory.Markup("

Baz

").Accepts(AcceptedCharacters.None) + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Baz"), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup(" ").Accepts(AcceptedCharacters.None) ), Factory.Code("} else {").AsStatement(), new MarkupBlock( - Factory.Markup("

Boz

").Accepts(AcceptedCharacters.None) + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Boz"), + new MarkupTagBlock( + Factory.Markup("

").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("

Foo

\r\n").Accepts(AcceptedCharacters.None) + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Foo"), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("\r\n").Accepts(AcceptedCharacters.None) ), Factory.Code(" break;\r\n case 1:\r\n").AsStatement(), new MarkupBlock( - Factory.Markup("

Bar

\r\n").Accepts(AcceptedCharacters.None) + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Bar"), + new MarkupTagBlock( + Factory.Markup("

").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("

Baz

\r\n").Accepts(AcceptedCharacters.None) + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Baz"), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("\r\n").Accepts(AcceptedCharacters.None) ), new MarkupBlock( - Factory.Markup("

Boz

\r\n").Accepts(AcceptedCharacters.None) + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Boz"), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("\r\n").Accepts(AcceptedCharacters.None) ), Factory.Code(" }\r\n default:\r\n").AsStatement(), new MarkupBlock( - Factory.Markup("

Biz

\r\n").Accepts(AcceptedCharacters.None) + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Biz"), + new MarkupTagBlock( + Factory.Markup("

").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("

Foo

\r\n").Accepts(AcceptedCharacters.None) + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Foo"), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("\r\n").Accepts(AcceptedCharacters.None) ), Factory.Code(" break;\r\n case 1:\r\n").AsStatement(), new MarkupBlock( - Factory.Markup("

Bar

\r\n").Accepts(AcceptedCharacters.None) + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Bar"), + new MarkupTagBlock( + Factory.Markup("

").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("

Baz

\r\n").Accepts(AcceptedCharacters.None) + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Baz"), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("\r\n").Accepts(AcceptedCharacters.None) ), new MarkupBlock( - Factory.Markup("

Boz

\r\n").Accepts(AcceptedCharacters.None) + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Boz"), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("\r\n").Accepts(AcceptedCharacters.None) ), Factory.Code(" }\r\n default:\r\n").AsStatement(), new MarkupBlock( - Factory.Markup("

Biz

\r\n").Accepts(AcceptedCharacters.None) + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Biz"), + new MarkupTagBlock( + Factory.Markup("

").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("

Foo

").Accepts(AcceptedCharacters.None) + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Foo"), + new MarkupTagBlock( + Factory.Markup("

").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("

Foo

").Accepts(AcceptedCharacters.None) + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("Foo"), + new MarkupTagBlock( + Factory.Markup("

").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("").Accepts(AcceptedCharacters.None), - Factory.Markup(";"), - Factory.MarkupTransition("").Accepts(AcceptedCharacters.None), + new MarkupTagBlock( + Factory.MarkupTransition("").Accepts(AcceptedCharacters.None)), + Factory.Markup(";").Accepts(AcceptedCharacters.None), + new MarkupTagBlock( + Factory.MarkupTransition("").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("").Accepts(AcceptedCharacters.None), - Factory.Markup(";"), - Factory.MarkupTransition("").Accepts(AcceptedCharacters.None), + new MarkupTagBlock( + Factory.MarkupTransition("").Accepts(AcceptedCharacters.None)), + Factory.Markup(";").Accepts(AcceptedCharacters.None), + new MarkupTagBlock( + Factory.MarkupTransition("").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("").Accepts(AcceptedCharacters.None), - Factory.Markup("The number is "), + new MarkupTagBlock( + Factory.MarkupTransition("").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("").Accepts(AcceptedCharacters.None), + new MarkupTagBlock( + Factory.MarkupTransition("").Accepts(AcceptedCharacters.None)), Factory.Markup("\r\n").Accepts(AcceptedCharacters.None) ), Factory.Code(" }\r\n if(!false) {\r\n").AsStatement(), new MarkupBlock( - Factory.Markup("

A real tag!

\r\n").Accepts(AcceptedCharacters.None) + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("A real tag!"), + new MarkupTagBlock( + Factory.Markup("

").Accepts(AcceptedCharacters.None)), + Factory.Markup("\r\n").Accepts(AcceptedCharacters.None) ), Factory.Code(" }\r\n").AsStatement(), Factory.MetaCode("}").Accepts(AcceptedCharacters.None))); diff --git a/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlAttributeTest.cs b/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlAttributeTest.cs index fcc0dfe0a4..89034a460d 100644 --- a/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlAttributeTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlAttributeTest.cs @@ -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("", new MarkupBlock( - Factory.Markup("(" href='", 2, 0, 2), suffix: new LocationTagged("'", 12, 0, 12)), - Factory.Markup(" href='").With(SpanCodeGenerator.Null), - Factory.Markup("Foo").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged(string.Empty, 9, 0, 9), value: new LocationTagged("Foo", 9, 0, 9))), - Factory.Markup("'").With(SpanCodeGenerator.Null)), - Factory.Markup(" />").Accepts(AcceptedCharacters.None))); + new MarkupTagBlock( + Factory.Markup("(" href='", 2, 0, 2), suffix: new LocationTagged("'", 12, 0, 12)), + Factory.Markup(" href='").With(SpanCodeGenerator.Null), + Factory.Markup("Foo").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged(string.Empty, 9, 0, 9), value: new LocationTagged("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("", new MarkupBlock( - Factory.Markup("(" href='", 2, 0, 2), suffix: new LocationTagged("'", 20, 0, 20)), - Factory.Markup(" href='").With(SpanCodeGenerator.Null), - Factory.Markup("Foo").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged(string.Empty, 9, 0, 9), value: new LocationTagged("Foo", 9, 0, 9))), - Factory.Markup(" Bar").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged(" ", 12, 0, 12), value: new LocationTagged("Bar", 13, 0, 13))), - Factory.Markup(" Baz").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged(" ", 16, 0, 16), value: new LocationTagged("Baz", 17, 0, 17))), - Factory.Markup("'").With(SpanCodeGenerator.Null)), - Factory.Markup(" />").Accepts(AcceptedCharacters.None))); + new MarkupTagBlock( + Factory.Markup("(" href='", 2, 0, 2), suffix: new LocationTagged("'", 20, 0, 20)), + Factory.Markup(" href='").With(SpanCodeGenerator.Null), + Factory.Markup("Foo").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged(string.Empty, 9, 0, 9), value: new LocationTagged("Foo", 9, 0, 9))), + Factory.Markup(" Bar").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged(" ", 12, 0, 12), value: new LocationTagged("Bar", 13, 0, 13))), + Factory.Markup(" Baz").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged(" ", 16, 0, 16), value: new LocationTagged("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("", new MarkupBlock( - Factory.Markup("(" href=\"", 2, 0, 2), suffix: new LocationTagged("\"", 20, 0, 20)), - Factory.Markup(" href=\"").With(SpanCodeGenerator.Null), - Factory.Markup("Foo").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged(string.Empty, 9, 0, 9), value: new LocationTagged("Foo", 9, 0, 9))), - Factory.Markup(" Bar").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged(" ", 12, 0, 12), value: new LocationTagged("Bar", 13, 0, 13))), - Factory.Markup(" Baz").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged(" ", 16, 0, 16), value: new LocationTagged("Baz", 17, 0, 17))), - Factory.Markup("\"").With(SpanCodeGenerator.Null)), - Factory.Markup(" />").Accepts(AcceptedCharacters.None))); + new MarkupTagBlock( + Factory.Markup("(" href=\"", 2, 0, 2), suffix: new LocationTagged("\"", 20, 0, 20)), + Factory.Markup(" href=\"").With(SpanCodeGenerator.Null), + Factory.Markup("Foo").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged(string.Empty, 9, 0, 9), value: new LocationTagged("Foo", 9, 0, 9))), + Factory.Markup(" Bar").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged(" ", 12, 0, 12), value: new LocationTagged("Bar", 13, 0, 13))), + Factory.Markup(" Baz").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged(" ", 16, 0, 16), value: new LocationTagged("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("", new MarkupBlock( - Factory.Markup("(" href=", 2, 0, 2), suffix: new LocationTagged(string.Empty, 11, 0, 11)), - Factory.Markup(" href=").With(SpanCodeGenerator.Null), - Factory.Markup("Foo").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged(string.Empty, 8, 0, 8), value: new LocationTagged("Foo", 8, 0, 8)))), - Factory.Markup(" Bar Baz />").Accepts(AcceptedCharacters.None))); + new MarkupTagBlock( + Factory.Markup("(" href=", 2, 0, 2), suffix: new LocationTagged(string.Empty, 11, 0, 11)), + Factory.Markup(" href=").With(SpanCodeGenerator.Null), + Factory.Markup("Foo").With(new LiteralAttributeCodeGenerator(prefix: new LocationTagged(string.Empty, 8, 0, 8), value: new LocationTagged("Foo", 8, 0, 8)))), + Factory.Markup(" Bar Baz />").Accepts(AcceptedCharacters.None)))); } [Fact] @@ -74,17 +79,18 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("", new MarkupBlock( - Factory.Markup("(" href='", 2, 0, 2), suffix: new LocationTagged("'", 13, 0, 13)), - Factory.Markup(" href='").With(SpanCodeGenerator.Null), - new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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("(" href='", 2, 0, 2), suffix: new LocationTagged("'", 13, 0, 13)), + Factory.Markup(" href='").With(SpanCodeGenerator.Null), + new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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("", new MarkupBlock( - Factory.Markup("(" href='", 2, 0, 2), suffix: new LocationTagged("'", 22, 0, 22)), - Factory.Markup(" href='").With(SpanCodeGenerator.Null), - new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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(" ", 13, 0, 13), new LocationTagged("bar", 14, 0, 14))), - new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(" ", 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("(" href='", 2, 0, 2), suffix: new LocationTagged("'", 22, 0, 22)), + Factory.Markup(" href='").With(SpanCodeGenerator.Null), + new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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(" ", 13, 0, 13), new LocationTagged("bar", 14, 0, 14))), + new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(" ", 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("", new MarkupBlock( - Factory.Markup("(" href='", 2, 0, 2), suffix: new LocationTagged("'", 23, 0, 23)), - Factory.Markup(" href='").With(SpanCodeGenerator.Null), - new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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(" ", 13, 0, 13), - new LocationTagged(new ResolveUrlCodeGenerator(), 14, 0, 14))), - Factory.Markup("'").With(SpanCodeGenerator.Null)), - Factory.Markup(" />").Accepts(AcceptedCharacters.None))); + new MarkupTagBlock( + Factory.Markup("(" href='", 2, 0, 2), suffix: new LocationTagged("'", 23, 0, 23)), + Factory.Markup(" href='").With(SpanCodeGenerator.Null), + new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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(" ", 13, 0, 13), + new LocationTagged(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("", new MarkupBlock( - Factory.Markup("(" value=", 6, 0, 6), suffix: new LocationTagged(string.Empty, 17, 0, 17)), - Factory.Markup(" value=").With(SpanCodeGenerator.Null), - new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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("(" value=", 6, 0, 6), suffix: new LocationTagged(string.Empty, 17, 0, 17)), + Factory.Markup(" value=").With(SpanCodeGenerator.Null), + new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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("", new MarkupBlock( - Factory.Markup("(" value=", 6, 0, 6), suffix: new LocationTagged(string.Empty, 17, 0, 17)), - Factory.Markup(" value=").With(SpanCodeGenerator.Null), - new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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("(" value=", 6, 0, 6), suffix: new LocationTagged(string.Empty, 17, 0, 17)), + Factory.Markup(" value=").With(SpanCodeGenerator.Null), + new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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("(" href='", 2, 0, 2), suffix: new LocationTagged("'", 18, 0, 18)), - Factory.Markup(" href='").With(SpanCodeGenerator.Null), - Factory.Markup("~/Foo/Bar") - .WithEditorHints(EditorHints.VirtualPath) - .With(new LiteralAttributeCodeGenerator( - new LocationTagged(string.Empty, 9, 0, 9), - new LocationTagged(new ResolveUrlCodeGenerator(), 9, 0, 9))), - Factory.Markup("'").With(SpanCodeGenerator.Null)), - Factory.Markup(" />"))); + new MarkupTagBlock( + Factory.Markup("(" href='", 2, 0, 2), suffix: new LocationTagged("'", 18, 0, 18)), + Factory.Markup(" href='").With(SpanCodeGenerator.Null), + Factory.Markup("~/Foo/Bar") + .WithEditorHints(EditorHints.VirtualPath) + .With(new LiteralAttributeCodeGenerator( + new LocationTagged(string.Empty, 9, 0, 9), + new LocationTagged(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("", new MarkupBlock( - Factory.Markup("").Accepts(AcceptedCharacters.None))); + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] @@ -289,16 +303,19 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseDocumentTest("", new MarkupBlock( - Factory.Markup(""))); + new MarkupTagBlock( + Factory.Markup("")), + new MarkupTagBlock( + Factory.Markup("")))); } } } diff --git a/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlBlockTest.cs b/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlBlockTest.cs index f8987b1198..bbc889357e 100644 --- a/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlBlockTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlBlockTest.cs @@ -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(@"").Accepts(AcceptedCharacters.None) + new MarkupTagBlock( + Factory.Markup("").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("
  • Foo

  • ", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); + ParseBlockTest("
  • Foo

  • ", + new MarkupBlock( + new MarkupTagBlock( + Factory.Markup("
  • ").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("

    ").Accepts(AcceptedCharacters.None)), + Factory.Markup("Foo"), + new MarkupTagBlock( + Factory.Markup("

    ").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("
  • ").Accepts(AcceptedCharacters.None)) + )); } [Fact] @@ -118,31 +133,77 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html [Fact] public void ParseBlockStopsAtMatchingCloseTagToStartTag() { - SingleSpanBlockTest("
    ", "", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); + ParseBlockTest("", + new MarkupBlock( + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)) + )); } [Fact] public void ParseBlockParsesUntilMatchingEndTagIfFirstNonWhitespaceCharacterIsStartTag() { - SingleSpanBlockTest("", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); + ParseBlockTest("", + new MarkupBlock( + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)) + )); } [Fact] public void ParseBlockAllowsUnclosedTagsAsLongAsItCanRecoverToAnExpectedEndTag() { - SingleSpanBlockTest("", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); + ParseBlockTest("", + new MarkupBlock( + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)) + )); } [Fact] public void ParseBlockWithSelfClosingTagJustEmitsTag() { - SingleSpanBlockTest("", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); + ParseBlockTest("", + new MarkupBlock( + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)) + )); } [Fact] public void ParseBlockCanHandleSelfClosingTagsWithinBlock() { - SingleSpanBlockTest("", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); + ParseBlockTest("", + new MarkupBlock( + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)) + )); } [Fact] @@ -150,16 +211,25 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("", new MarkupBlock( - Factory.Markup("(" bar=\"", 4, 0, 4), new LocationTagged("\"", 13, 0, 13)), - Factory.Markup(" bar=\"").With(SpanCodeGenerator.Null), - Factory.Markup("baz").With(new LiteralAttributeCodeGenerator(new LocationTagged(String.Empty, 10, 0, 10), new LocationTagged("baz", 10, 0, 10))), - Factory.Markup("\"").With(SpanCodeGenerator.Null)), - Factory.Markup(">(" zoop=", 24, 0, 24), new LocationTagged(String.Empty, 34, 0, 34)), - Factory.Markup(" zoop=").With(SpanCodeGenerator.Null), - Factory.Markup("zork").With(new LiteralAttributeCodeGenerator(new LocationTagged(String.Empty, 30, 0, 30), new LocationTagged("zork", 30, 0, 30)))), - Factory.Markup("/>").Accepts(AcceptedCharacters.None))); + new MarkupTagBlock( + Factory.Markup("(" bar=\"", 4, 0, 4), new LocationTagged("\"", 13, 0, 13)), + Factory.Markup(" bar=\"").With(SpanCodeGenerator.Null), + Factory.Markup("baz").With(new LiteralAttributeCodeGenerator(new LocationTagged(String.Empty, 10, 0, 10), new LocationTagged("baz", 10, 0, 10))), + Factory.Markup("\"").With(SpanCodeGenerator.Null)), + Factory.Markup(">").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("(" zoop=", 24, 0, 24), new LocationTagged(String.Empty, 34, 0, 34)), + Factory.Markup(" zoop=").With(SpanCodeGenerator.Null), + Factory.Markup("zork").With(new LiteralAttributeCodeGenerator(new LocationTagged(String.Empty, 30, 0, 30), new LocationTagged("zork", 30, 0, 30)))), + Factory.Markup("/>").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] @@ -167,12 +237,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("\" />", new MarkupBlock( - Factory.Markup("(" baz=\"", 9, 0, 9), new LocationTagged("\"", 16, 0, 16)), - Factory.Markup(" baz=\"").With(SpanCodeGenerator.Null), - Factory.Markup(">").With(new LiteralAttributeCodeGenerator(new LocationTagged(String.Empty, 15, 0, 15), new LocationTagged(">", 15, 0, 15))), - Factory.Markup("\"").With(SpanCodeGenerator.Null)), - Factory.Markup(" />").Accepts(AcceptedCharacters.None))); + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("(" baz=\"", 9, 0, 9), new LocationTagged("\"", 16, 0, 16)), + Factory.Markup(" baz=\"").With(SpanCodeGenerator.Null), + Factory.Markup(">").With(new LiteralAttributeCodeGenerator(new LocationTagged(String.Empty, 15, 0, 15), new LocationTagged(">", 15, 0, 15))), + Factory.Markup("\"").With(SpanCodeGenerator.Null)), + Factory.Markup(" />").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] @@ -180,12 +255,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("\' />", new MarkupBlock( - Factory.Markup("(" baz='", 9, 0, 9), new LocationTagged("'", 16, 0, 16)), - Factory.Markup(" baz='").With(SpanCodeGenerator.Null), - Factory.Markup(">").With(new LiteralAttributeCodeGenerator(new LocationTagged(String.Empty, 15, 0, 15), new LocationTagged(">", 15, 0, 15))), - Factory.Markup("'").With(SpanCodeGenerator.Null)), - Factory.Markup(" />").Accepts(AcceptedCharacters.None))); + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("(" baz='", 9, 0, 9), new LocationTagged("'", 16, 0, 16)), + Factory.Markup(" baz='").With(SpanCodeGenerator.Null), + Factory.Markup(">").With(new LiteralAttributeCodeGenerator(new LocationTagged(String.Empty, 15, 0, 15), new LocationTagged(">", 15, 0, 15))), + Factory.Markup("'").With(SpanCodeGenerator.Null)), + Factory.Markup(" />").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] @@ -193,12 +273,19 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("", new MarkupBlock( - Factory.Markup("(" baz=\"", 9, 0, 9), new LocationTagged("\"", 16, 0, 16)), - Factory.Markup(" baz=\"").With(SpanCodeGenerator.Null), - Factory.Markup("/").With(new LiteralAttributeCodeGenerator(new LocationTagged(String.Empty, 15, 0, 15), new LocationTagged("/", 15, 0, 15))), - Factory.Markup("\"").With(SpanCodeGenerator.Null)), - Factory.Markup(">").Accepts(AcceptedCharacters.None))); + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("(" baz=\"", 9, 0, 9), new LocationTagged("\"", 16, 0, 16)), + Factory.Markup(" baz=\"").With(SpanCodeGenerator.Null), + Factory.Markup("/").With(new LiteralAttributeCodeGenerator(new LocationTagged(String.Empty, 15, 0, 15), new LocationTagged("/", 15, 0, 15))), + Factory.Markup("\"").With(SpanCodeGenerator.Null)), + Factory.Markup(">").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] @@ -206,19 +293,29 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("", new MarkupBlock( - Factory.Markup("(" baz='", 9, 0, 9), new LocationTagged("'", 16, 0, 16)), - Factory.Markup(" baz='").With(SpanCodeGenerator.Null), - Factory.Markup("/").With(new LiteralAttributeCodeGenerator(new LocationTagged(String.Empty, 15, 0, 15), new LocationTagged("/", 15, 0, 15))), - Factory.Markup("'").With(SpanCodeGenerator.Null)), - Factory.Markup(">").Accepts(AcceptedCharacters.None))); + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("(" baz='", 9, 0, 9), new LocationTagged("'", 16, 0, 16)), + Factory.Markup(" baz='").With(SpanCodeGenerator.Null), + Factory.Markup("/").With(new LiteralAttributeCodeGenerator(new LocationTagged(String.Empty, 15, 0, 15), new LocationTagged("/", 15, 0, 15))), + Factory.Markup("'").With(SpanCodeGenerator.Null)), + Factory.Markup(">").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] public void ParseBlockTerminatesAtEOF() { - SingleSpanBlockTest("", "", BlockType.Markup, SpanKind.Markup, - new RazorError(RazorResources.FormatParseError_MissingEndTag("foo"), new SourceLocation(0, 0, 0))); + ParseBlockTest("", + new MarkupBlock( + new MarkupTagBlock( + Factory.Markup("").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("barbaz", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); + ParseBlockTest("barbaz", + new MarkupBlock( + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + Factory.Markup("bar"), + Factory.Markup("").Accepts(AcceptedCharacters.None), + Factory.Markup("baz"), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] @@ -254,18 +359,25 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html [Fact] public void ParseBlockTerminatesCommentAtFirstOccurrenceOfEndSequence() { - SingleSpanBlockTest("-->", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); + ParseBlockTest("-->", + new MarkupBlock( + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + Factory.Markup("").Accepts(AcceptedCharacters.None), + Factory.Markup("-->"), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] public void ParseBlockTreatsMalformedTagsAsContent() { - SingleSpanBlockTest( - "", - "", - BlockType.Markup, - SpanKind.Markup, - AcceptedCharacters.None, + ParseBlockTest("", + new MarkupBlock( + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").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("", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); + ParseBlockTest("", + new MarkupBlock( + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + Factory.Markup("").Accepts(AcceptedCharacters.None), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] public void ParseBlockTerminatesSGMLDeclarationAtFirstCloseAngle() { - SingleSpanBlockTest(" baz>", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); + ParseBlockTest(" baz>", + new MarkupBlock( + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + Factory.Markup("").Accepts(AcceptedCharacters.None), + Factory.Markup(" baz>"), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] public void ParseBlockParsesXMLProcessingInstructionAsEmptyTag() { - SingleSpanBlockTest("", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); + ParseBlockTest("", + new MarkupBlock( + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + Factory.Markup("").Accepts(AcceptedCharacters.None), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] public void ParseBlockTerminatesXMLProcessingInstructionAtQuestionMarkCloseAnglePair() { - SingleSpanBlockTest(" baz", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); + ParseBlockTest(" baz", + new MarkupBlock( + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + Factory.Markup("").Accepts(AcceptedCharacters.None), + Factory.Markup(" baz"), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] public void ParseBlockDoesNotTerminateXMLProcessingInstructionAtCloseAngleUnlessPreceededByQuestionMark() { - SingleSpanBlockTest(" baz?>", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); + ParseBlockTest(" baz?>", + new MarkupBlock( + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + Factory.Markup(" baz?>").Accepts(AcceptedCharacters.None), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] public void ParseBlockSupportsScriptTagsWithLessThanSignsInThem() { - SingleSpanBlockTest(@"", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); + ParseBlockTest(@"", + new MarkupBlock( + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] public void ParseBlockSupportsScriptTagsWithSpacedLessThanSignsInThem() { - SingleSpanBlockTest(@"", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); + ParseBlockTest(@"", + new MarkupBlock( + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] @@ -317,7 +473,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("", new MarkupBlock( - Factory.MarkupTransition("") + new MarkupTagBlock( + Factory.MarkupTransition("")) )); } @@ -326,9 +483,14 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("Foo Bar Baz zoop", new MarkupBlock( - Factory.MarkupTransition(""), - Factory.Markup("Foo Bar Baz"), - Factory.MarkupTransition(""), + new MarkupTagBlock( + Factory.MarkupTransition("")), + Factory.Markup("Foo Bar ").Accepts(AcceptedCharacters.None), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + Factory.Markup(" Baz"), + new MarkupTagBlock( + Factory.MarkupTransition("")), Factory.Markup(" ").Accepts(AcceptedCharacters.None) )); } @@ -338,9 +500,18 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("Foo Bar Baz zoop", new MarkupBlock( - Factory.MarkupTransition(""), - Factory.Markup("Foo Bar Baz"), - Factory.MarkupTransition(""), + new MarkupTagBlock( + Factory.MarkupTransition("")), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + Factory.Markup("Foo Bar "), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + Factory.Markup(" Baz"), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.MarkupTransition("")), Factory.Markup(" ").Accepts(AcceptedCharacters.None) )); } @@ -350,7 +521,16 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("", new MarkupBlock( - Factory.Markup("").Accepts(AcceptedCharacters.None) + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)) )); } @@ -359,8 +539,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("
    Foo @if(true) {} Bar
    ", new MarkupBlock( - Factory.Markup("
    Foo "), + new MarkupTagBlock( + Factory.Markup("
    ").Accepts(AcceptedCharacters.None)), + Factory.Markup("Foo "), new StatementBlock( Factory.CodeTransition(), Factory.Code("if(true) {}").AsStatement()), - Factory.Markup(" Bar
    ").Accepts(AcceptedCharacters.None))); + Factory.Markup(" Bar"), + new MarkupTagBlock( + Factory.Markup("
    ").Accepts(AcceptedCharacters.None)))); } [Fact] @@ -381,14 +565,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest(@"", new MarkupBlock( - Factory.Markup("") - .Accepts(AcceptedCharacters.None))); + Factory.Markup("'>"), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } } } diff --git a/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlDocumentTest.cs b/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlDocumentTest.cs index 08ea639ae6..4046f2b960 100644 --- a/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlDocumentTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlDocumentTest.cs @@ -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("

    Foo

    ", + new MarkupBlock( + BlockFactory.MarkupTagBlock("
    "), + BlockFactory.MarkupTagBlock("

    "), + Factory.Markup(" Foo "), + BlockFactory.MarkupTagBlock("

    "), + BlockFactory.MarkupTagBlock("
    "))); + } + [Fact] public void ParseDocumentCorrectlyHandlesSingleLineOfMarkupWithEmbeddedStatement() { ParseDocumentTest("
    Foo @if(true) {} Bar
    ", new MarkupBlock( - Factory.Markup("
    Foo "), + BlockFactory.MarkupTagBlock("
    "), + Factory.Markup("Foo "), new StatementBlock( Factory.CodeTransition(), Factory.Code("if(true) {}").AsStatement()), - Factory.Markup(" Bar
    "))); + Factory.Markup(" Bar"), + BlockFactory.MarkupTagBlock("
    "))); } [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 \r\n")), + Factory.Markup("\r\n "), + BlockFactory.MarkupTagBlock(""), + BlockFactory.MarkupTagBlock(""), + 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 baz", 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("anurse@microsoft.com", 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("Email me", new MarkupBlock( - Factory.Markup("(" href=\"", 2, 0, 2), new LocationTagged("\"", 36, 0, 36)), - Factory.Markup(" href=\"").With(SpanCodeGenerator.Null), - Factory.Markup("mailto:anurse@microsoft.com") - .With(new LiteralAttributeCodeGenerator(new LocationTagged(String.Empty, 9, 0, 9), new LocationTagged("mailto:anurse@microsoft.com", 9, 0, 9))), - Factory.Markup("\"").With(SpanCodeGenerator.Null)), - Factory.Markup(">Email me"))); + new MarkupTagBlock( + Factory.Markup("(" href=\"", 2, 0, 2), new LocationTagged("\"", 36, 0, 36)), + Factory.Markup(" href=\"").With(SpanCodeGenerator.Null), + Factory.Markup("mailto:anurse@microsoft.com") + .With(new LiteralAttributeCodeGenerator(new LocationTagged(String.Empty, 9, 0, 9), new LocationTagged("mailto:anurse@microsoft.com", 9, 0, 9))), + Factory.Markup("\"").With(SpanCodeGenerator.Null)), + Factory.Markup(">")), + Factory.Markup("Email me"), + BlockFactory.MarkupTagBlock(""))); } [Fact] public void ParseDocumentDoesNotReturnErrorOnMismatchedTags() { - SingleSpanDocumentTest("Foo

    Baz", BlockType.Markup, SpanKind.Markup); + ParseDocumentTest("Foo

    Baz", + new MarkupBlock( + Factory.Markup("Foo "), + BlockFactory.MarkupTagBlock("
    "), + BlockFactory.MarkupTagBlock("

    "), + BlockFactory.MarkupTagBlock("

    "), + BlockFactory.MarkupTagBlock("

    "), + Factory.Markup(" Baz"))); } [Fact] public void ParseDocumentReturnsOneMarkupSegmentIfNoCodeBlocksEncountered() { - SingleSpanDocumentTest("Foo

    BazBar Qux", BlockType.Markup, SpanKind.Markup); + SingleSpanDocumentTest("Foo BazBar Qux", BlockType.Markup, SpanKind.Markup); } [Fact] public void ParseDocumentRendersTextPseudoTagAsMarkup() { - SingleSpanDocumentTest("Foo Foo", BlockType.Markup, SpanKind.Markup); + ParseDocumentTest("Foo Foo", + new MarkupBlock( + Factory.Markup("Foo "), + BlockFactory.MarkupTagBlock(""), + Factory.Markup("Foo"), + BlockFactory.MarkupTagBlock(""))); } [Fact] public void ParseDocumentAcceptsEndTagWithNoMatchingStartTag() { - SingleSpanDocumentTest("Foo

    Bar", BlockType.Markup, SpanKind.Markup); + ParseDocumentTest("Foo
    Bar", + new MarkupBlock( + Factory.Markup("Foo "), + BlockFactory.MarkupTagBlock("
    "), + Factory.Markup(" Bar"))); } [Fact] @@ -192,7 +228,9 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseDocumentTest("${bar}", new MarkupBlock( - Factory.Markup("${bar}"))); + BlockFactory.MarkupTagBlock(""), + Factory.Markup("${bar}"), + BlockFactory.MarkupTagBlock(""))); } [Fact] @@ -200,13 +238,15 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseDocumentTest(@"", new MarkupBlock( - Factory.Markup(""))); + Factory.Markup("'>"), + BlockFactory.MarkupTagBlock(""))); } [Fact] @@ -219,13 +259,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html Factory.CodeTransition(), Factory.MetaCode("section Foo {"), new MarkupBlock( - Factory.Markup(" ")), + Factory.Markup("'>"), + BlockFactory.MarkupTagBlock(""), + 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); } } } diff --git a/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlErrorTest.cs b/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlErrorTest.cs index 710fc953d8..147c342d1d 100644 --- a/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlErrorTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlErrorTest.cs @@ -15,7 +15,13 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html [Fact] public void ParseBlockAllowsInvalidTagNamesAsLongAsParserCanIdentifyEndTag() { - SingleSpanBlockTest("<1-foo+bar>foo", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); + ParseBlockTest("<1-foo+bar>foo", + new MarkupBlock( + new MarkupTagBlock( + Factory.Markup("<1-foo+bar>").Accepts(AcceptedCharacters.None)), + Factory.Markup("foo"), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] @@ -23,9 +29,10 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("", new MarkupBlock( - Factory.MarkupTransition(""), - Factory.MarkupTransition("")), + new MarkupTagBlock( + Factory.MarkupTransition("").Accepts(AcceptedCharacters.Any)), + new MarkupTagBlock( + Factory.MarkupTransition(""))), new RazorError(RazorResources.ParseError_TextTagCannotContainAttributes, SourceLocation.Zero)); } @@ -34,9 +41,10 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("", new MarkupBlock( - Factory.MarkupTransition(""), - Factory.MarkupTransition("")), + new MarkupTagBlock( + Factory.MarkupTransition("").Accepts(AcceptedCharacters.Any))), new RazorError(RazorResources.ParseError_TextTagCannotContainAttributes, 6, 0, 6)); } @@ -53,7 +61,9 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest(" bar baz", new MarkupBlock( - Factory.Markup(" ").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").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("

    ", new MarkupBlock( - Factory.Markup("

    ").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("

    ").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").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("blah blah blah blah blah", new MarkupBlock( - Factory.Markup("blah blah blah blah blah")), + new MarkupTagBlock( + Factory.Markup("").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("(" bar=", 4, 0, 4), new LocationTagged(String.Empty, 12, 0, 12)), - Factory.Markup(" bar=").With(SpanCodeGenerator.Null), - Factory.Markup("baz").With(new LiteralAttributeCodeGenerator(new LocationTagged(string.Empty, 9, 0, 9), new LocationTagged("baz", 9, 0, 9))))), + new MarkupBlock(new AttributeBlockCodeGenerator("bar", new LocationTagged(" bar=", 4, 0, 4), new LocationTagged(String.Empty, 12, 0, 12)), + Factory.Markup(" bar=").With(SpanCodeGenerator.Null), + Factory.Markup("baz").With(new LiteralAttributeCodeGenerator(new LocationTagged(string.Empty, 9, 0, 9), new LocationTagged("baz", 9, 0, 9)))))), new RazorError(RazorResources.FormatParseError_UnfinishedTag("foo"), new SourceLocation(0, 0, 0))); } } diff --git a/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlParserTestUtils.cs b/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlParserTestUtils.cs index 29beaeefe7..6be8bfc643 100644 --- a/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlParserTestUtils.cs +++ b/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlParserTestUtils.cs @@ -15,9 +15,12 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html var factory = SpanFactory.CreateCsHtml(); testMethod("@@bar", new MarkupBlock( - factory.Markup(""), + new MarkupTagBlock( + factory.Markup("").Accepts(lastSpanAcceptedCharacters)), factory.Markup("@").Hidden(), - factory.Markup("@bar").Accepts(lastSpanAcceptedCharacters))); + factory.Markup("@bar"), + new MarkupTagBlock( + factory.Markup("").Accepts(lastSpanAcceptedCharacters)))); } public static void RunMultiAtEscapeTest(Action testMethod, AcceptedCharacters lastSpanAcceptedCharacters = AcceptedCharacters.None) @@ -25,7 +28,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html var factory = SpanFactory.CreateCsHtml(); testMethod("@@@@@bar", new MarkupBlock( - factory.Markup(""), + new MarkupTagBlock( + factory.Markup("").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("").Accepts(lastSpanAcceptedCharacters))); + new MarkupTagBlock( + factory.Markup("").Accepts(lastSpanAcceptedCharacters)))); } } } diff --git a/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlTagsTest.cs b/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlTagsTest.cs index ef028c3982..5151deffb0 100644 --- a/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlTagsTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlTagsTest.cs @@ -38,16 +38,22 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("

    Bar", new MarkupBlock( - Factory.Markup("

    ").Accepts(AcceptedCharacters.None)), + BlockFactory.MarkupTagBlock("

    ", 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(" Bar", new MarkupBlock( - Factory.Markup(" ").Accepts(AcceptedCharacters.None))); + Factory.Markup("").Accepts(AcceptedCharacters.None), + Factory.Markup(" ").Accepts(AcceptedCharacters.None))); } [Fact] @@ -63,7 +70,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest(" foo", new MarkupBlock( - Factory.Markup(" ").Accepts(AcceptedCharacters.None))); + Factory.Markup("").Accepts(AcceptedCharacters.None), + Factory.Markup(" ").Accepts(AcceptedCharacters.None))); } [Fact] @@ -71,7 +79,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest(" foo", new MarkupBlock( - Factory.Markup(" ").Accepts(AcceptedCharacters.None))); + Factory.Markup("").Accepts(AcceptedCharacters.None), + Factory.Markup(" ").Accepts(AcceptedCharacters.None))); } [Fact] @@ -79,7 +88,10 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("

    Foo

    Bar", new MarkupBlock( - Factory.Markup("

    Foo

    ").Accepts(AcceptedCharacters.None))); + BlockFactory.MarkupTagBlock("

    ", AcceptedCharacters.None), + Factory.Markup("Foo"), + BlockFactory.MarkupTagBlock("

    ", AcceptedCharacters.None), + Factory.Markup(" ").Accepts(AcceptedCharacters.None))); } [Fact] @@ -87,9 +99,11 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("Foo}", new MarkupBlock( - Factory.MarkupTransition(""), - Factory.Markup("Foo"), - Factory.MarkupTransition(""))); + new MarkupTagBlock( + Factory.MarkupTransition("")), + Factory.Markup("Foo").Accepts(AcceptedCharacters.None), + new MarkupTagBlock( + Factory.MarkupTransition("")))); } [Fact] @@ -97,7 +111,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest(" Bar", new MarkupBlock( - Factory.Markup(" ").Accepts(AcceptedCharacters.None))); + Factory.Markup("").Accepts(AcceptedCharacters.None), + Factory.Markup(" ").Accepts(AcceptedCharacters.None))); } [Fact] @@ -105,7 +120,9 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseDocumentTest("", new MarkupBlock( - Factory.Markup(""))); + BlockFactory.MarkupTagBlock(""))); } [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 + ">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 + "> foo", new MarkupBlock( - Factory.Markup("<" + tagName + "> ") - .Accepts(AcceptedCharacters.None))); + BlockFactory.MarkupTagBlock("<" + tagName + ">", AcceptedCharacters.None), + Factory.Markup(" "), + BlockFactory.MarkupTagBlock("", AcceptedCharacters.None))); } [Theory] @@ -144,8 +160,8 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("<" + tagName + ">", AcceptedCharacters.None), + BlockFactory.MarkupTagBlock("foo#@i

    ", new MarkupBlock( - Factory.Markup("

    foo#"), + new MarkupTagBlock( + Factory.Markup("

    ").Accepts(AcceptedCharacters.None)), + Factory.Markup("foo#"), new ExpressionBlock( Factory.CodeTransition(), Factory.Code("i").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharacters.NonWhiteSpace)), - Factory.Markup("

    ").Accepts(AcceptedCharacters.None))); + new MarkupTagBlock( + Factory.Markup("

    ").Accepts(AcceptedCharacters.None)))); } [Fact] @@ -32,13 +35,14 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("", new MarkupBlock( - Factory.Markup("").Accepts(AcceptedCharacters.None))); + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] @@ -46,17 +50,18 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("", new MarkupBlock( - Factory.Markup("(" bar=\"", 4, 0, 4), new LocationTagged("\"", 14, 0, 14)), - Factory.Markup(" bar=\"").With(SpanCodeGenerator.Null), - new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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("(" bar=\"", 4, 0, 4), new LocationTagged("\"", 14, 0, 14)), + Factory.Markup(" bar=\"").With(SpanCodeGenerator.Null), + new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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("@bar@boz", new MarkupBlock( - Factory.Markup(""), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + Factory.EmptyHtml(), new ExpressionBlock( Factory.CodeTransition(), Factory.Code("bar") .AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .Accepts(AcceptedCharacters.NonWhiteSpace)), - Factory.Markup(""), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + Factory.EmptyHtml(), new ExpressionBlock( Factory.CodeTransition(), Factory.Code("boz") .AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .Accepts(AcceptedCharacters.NonWhiteSpace)), - Factory.Markup("").Accepts(AcceptedCharacters.None))); + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").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("@:
  • Foo @Bar Baz" + Environment.NewLine + "bork", new MarkupBlock( @@ -102,13 +115,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("", new MarkupBlock( - Factory.Markup("").Accepts(AcceptedCharacters.None))); + Factory.Markup(" -->").Accepts(AcceptedCharacters.None), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] @@ -116,13 +133,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("", new MarkupBlock( - Factory.Markup("").Accepts(AcceptedCharacters.None)), + Factory.Markup("").Accepts(AcceptedCharacters.None))); + Factory.Markup(" baz>").Accepts(AcceptedCharacters.None), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] @@ -130,13 +151,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("", new MarkupBlock( - Factory.Markup("").Accepts(AcceptedCharacters.None)), + Factory.Markup("").Accepts(AcceptedCharacters.None))); + Factory.Markup(" baz]]>").Accepts(AcceptedCharacters.None), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] @@ -144,19 +169,29 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("", new MarkupBlock( - Factory.Markup("").Accepts(AcceptedCharacters.None)), + Factory.Markup("").Accepts(AcceptedCharacters.None))); + Factory.Markup(" baz?>").Accepts(AcceptedCharacters.None), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] public void ParseBlockDoesNotSwitchToCodeOnEmailAddressInText() { - SingleSpanBlockTest("anurse@microsoft.com", BlockType.Markup, SpanKind.Markup, acceptedCharacters: AcceptedCharacters.None); + ParseBlockTest("anurse@microsoft.com", + new MarkupBlock( + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + Factory.Markup("anurse@microsoft.com"), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)))); } [Fact] @@ -164,13 +199,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("Email me", new MarkupBlock( - Factory.Markup("(" href=\"", 2, 0, 2), new LocationTagged("\"", 36, 0, 36)), - Factory.Markup(" href=\"").With(SpanCodeGenerator.Null), - Factory.Markup("mailto:anurse@microsoft.com") - .With(new LiteralAttributeCodeGenerator(new LocationTagged(String.Empty, 9, 0, 9), new LocationTagged("mailto:anurse@microsoft.com", 9, 0, 9))), - Factory.Markup("\"").With(SpanCodeGenerator.Null)), - Factory.Markup(">Email me").Accepts(AcceptedCharacters.None))); + new MarkupTagBlock( + Factory.Markup("(" href=\"", 2, 0, 2), new LocationTagged("\"", 36, 0, 36)), + Factory.Markup(" href=\"").With(SpanCodeGenerator.Null), + Factory.Markup("mailto:anurse@microsoft.com") + .With(new LiteralAttributeCodeGenerator(new LocationTagged(String.Empty, 9, 0, 9), new LocationTagged("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("").Accepts(AcceptedCharacters.None)))); } [Fact] @@ -182,21 +221,31 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html + " }" + Environment.NewLine + " ", new MarkupBlock( - Factory.Markup("
      \r\n"), + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("
        ").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("
      • Product: "), + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("
      • ").Accepts(AcceptedCharacters.None)), + Factory.Markup("Product: "), new ExpressionBlock( Factory.CodeTransition(), Factory.Code("p.Name") .AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .Accepts(AcceptedCharacters.NonWhiteSpace)), - Factory.Markup("
      • \r\n").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)), Factory.Code(" }\r\n").AsStatement().Accepts(AcceptedCharacters.None)), - Factory.Markup("
      ").Accepts(AcceptedCharacters.None))); + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("
    ").Accepts(AcceptedCharacters.None)))); } [Fact] @@ -208,21 +257,31 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html + " }" + Environment.NewLine + " ", new MarkupBlock( - Factory.Markup("
      \r\n"), + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("
        ")), + 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("
      • Product: "), + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("
      • ").Accepts(AcceptedCharacters.None)), + Factory.Markup("Product: "), new ExpressionBlock( Factory.CodeTransition(), Factory.Code("p.Name") .AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .Accepts(AcceptedCharacters.NonWhiteSpace)), - Factory.Markup("
      • \r\n").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)), Factory.Code(" }\r\n").AsStatement().Accepts(AcceptedCharacters.None)), - Factory.Markup("
      "))); + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("
    ")))); } [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
      \r\n"), + Factory.Markup("\r\n "), + new MarkupTagBlock( + Factory.Markup("
        ")), + 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("
      • Product: "), + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("
      • ").Accepts(AcceptedCharacters.None)), + Factory.Markup("Product: "), new ExpressionBlock( Factory.CodeTransition(), Factory.Code("p.Name") .AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .Accepts(AcceptedCharacters.NonWhiteSpace)), - Factory.Markup("
      • \r\n").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None)), + Factory.Markup("\r\n").Accepts(AcceptedCharacters.None)), Factory.Code(" }\r\n").AsStatement().Accepts(AcceptedCharacters.None)), - Factory.Markup("
      \r\n")), + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("
    ")), + Factory.Markup("\r\n")), Factory.MetaCode("}").Accepts(AcceptedCharacters.None)), Factory.EmptyHtml())); } @@ -269,18 +339,26 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html + " }" + Environment.NewLine + " ", new MarkupBlock( - Factory.Markup("
      \r\n "), + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("
        ").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("
      • Product: "), + new MarkupTagBlock( + Factory.Markup("
      • ").Accepts(AcceptedCharacters.None)), + Factory.Markup("Product: "), new ExpressionBlock( Factory.CodeTransition(), Factory.Code("p.Name").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharacters.NonWhiteSpace)), - Factory.Markup("
      • ").Accepts(AcceptedCharacters.None)), + new MarkupTagBlock( + Factory.Markup("").Accepts(AcceptedCharacters.None))), Factory.Code("\r\n }").AsStatement().Accepts(AcceptedCharacters.None)), - Factory.Markup("\r\n
      ").Accepts(AcceptedCharacters.None)), + Factory.Markup("\r\n "), + new MarkupTagBlock( + Factory.Markup("
    ").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(" "), + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("")), Factory.Markup("@").Hidden(), - Factory.Markup("@bar ")), + Factory.Markup("@bar"), + new MarkupTagBlock( + Factory.Markup("")), + 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(" "), + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("")), 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(" ")), + new MarkupTagBlock( + Factory.Markup("")), + Factory.Markup(" ")), Factory.MetaCode("}").Accepts(AcceptedCharacters.None)), Factory.EmptyHtml())); } diff --git a/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlUrlAttributeTest.cs b/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlUrlAttributeTest.cs index d51ef57b60..a09f4abd9c 100644 --- a/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlUrlAttributeTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/Parser/Html/HtmlUrlAttributeTest.cs @@ -19,16 +19,17 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseBlockTest("", new MarkupBlock( - Factory.Markup("(" href='", 2, 0, 2), new LocationTagged("'", 22, 0, 22)), - Factory.Markup(" href='").With(SpanCodeGenerator.Null), - Factory.Markup("~/Foo/Bar/Baz") - .WithEditorHints(EditorHints.VirtualPath) - .With(new LiteralAttributeCodeGenerator( - new LocationTagged(String.Empty, 9, 0, 9), - new LocationTagged(new ResolveUrlCodeGenerator(), 9, 0, 9))), - Factory.Markup("'").With(SpanCodeGenerator.Null)), - Factory.Markup(" />").Accepts(AcceptedCharacters.None))); + new MarkupTagBlock( + Factory.Markup("(" href='", 2, 0, 2), new LocationTagged("'", 22, 0, 22)), + Factory.Markup(" href='").With(SpanCodeGenerator.Null), + Factory.Markup("~/Foo/Bar/Baz") + .WithEditorHints(EditorHints.VirtualPath) + .With(new LiteralAttributeCodeGenerator( + new LocationTagged(String.Empty, 9, 0, 9), + new LocationTagged(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("", new MarkupBlock( - Factory.Markup("(" href='", 2, 0, 2), new LocationTagged("'", 22, 0, 22)), - Factory.Markup(" href='").With(SpanCodeGenerator.Null), - Factory.Markup("~/Foo/Bar/Baz") - .WithEditorHints(EditorHints.VirtualPath) - .With(new LiteralAttributeCodeGenerator( - new LocationTagged(String.Empty, 9, 0, 9), - new LocationTagged(new ResolveUrlCodeGenerator(), 9, 0, 9))), - Factory.Markup("'").With(SpanCodeGenerator.Null)), - Factory.Markup(" />"))); + new MarkupTagBlock( + Factory.Markup("(" href='", 2, 0, 2), new LocationTagged("'", 22, 0, 22)), + Factory.Markup(" href='").With(SpanCodeGenerator.Null), + Factory.Markup("~/Foo/Bar/Baz") + .WithEditorHints(EditorHints.VirtualPath) + .With(new LiteralAttributeCodeGenerator( + new LocationTagged(String.Empty, 9, 0, 9), + new LocationTagged(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(" (" href='", 17, 0, 17), new LocationTagged("'", 37, 0, 37)), - Factory.Markup(" href='").With(SpanCodeGenerator.Null), - Factory.Markup("~/Foo/Bar/Baz") - .WithEditorHints(EditorHints.VirtualPath) - .With(new LiteralAttributeCodeGenerator( - new LocationTagged(String.Empty, 24, 0, 24), - new LocationTagged(new ResolveUrlCodeGenerator(), 24, 0, 24))), - Factory.Markup("'").With(SpanCodeGenerator.Null)), - Factory.Markup(" /> ")), + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("(" href='", 17, 0, 17), new LocationTagged("'", 37, 0, 37)), + Factory.Markup(" href='").With(SpanCodeGenerator.Null), + Factory.Markup("~/Foo/Bar/Baz") + .WithEditorHints(EditorHints.VirtualPath) + .With(new LiteralAttributeCodeGenerator( + new LocationTagged(String.Empty, 24, 0, 24), + new LocationTagged(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("", new MarkupBlock( - Factory.Markup("(" href='", 2, 0, 2), new LocationTagged("'", 22, 0, 22)), + Factory.Markup(" href='").With(SpanCodeGenerator.Null), + Factory.Markup("~/Foo/") + .WithEditorHints(EditorHints.VirtualPath) + .With(new LiteralAttributeCodeGenerator( + new LocationTagged(String.Empty, 9, 0, 9), + new LocationTagged(new ResolveUrlCodeGenerator(), 9, 0, 9))), + new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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.Empty, 18, 0, 18), new LocationTagged("/Baz", 18, 0, 18))), + Factory.Markup("'").With(SpanCodeGenerator.Null)), + Factory.Markup(" />").Accepts(AcceptedCharacters.None)))); + } + + [Fact] + public void UrlWithExpressionsInAttributeInMarkupDocument() + { + ParseDocumentTest("", + new MarkupBlock( + new MarkupTagBlock( + Factory.Markup("(" href='", 2, 0, 2), new LocationTagged("'", 22, 0, 22)), Factory.Markup(" href='").With(SpanCodeGenerator.Null), Factory.Markup("~/Foo/") - .WithEditorHints(EditorHints.VirtualPath) - .With(new LiteralAttributeCodeGenerator( - new LocationTagged(String.Empty, 9, 0, 9), - new LocationTagged(new ResolveUrlCodeGenerator(), 9, 0, 9))), + .WithEditorHints(EditorHints.VirtualPath) + .With(new LiteralAttributeCodeGenerator( + new LocationTagged(String.Empty, 9, 0, 9), + new LocationTagged(new ResolveUrlCodeGenerator(), 9, 0, 9))), new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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.Empty, 18, 0, 18), new LocationTagged("/Baz", 18, 0, 18))), Factory.Markup("'").With(SpanCodeGenerator.Null)), - Factory.Markup(" />").Accepts(AcceptedCharacters.None))); - } - - [Fact] - public void UrlWithExpressionsInAttributeInMarkupDocument() - { - ParseDocumentTest("", - new MarkupBlock( - Factory.Markup("(" href='", 2, 0, 2), new LocationTagged("'", 22, 0, 22)), - Factory.Markup(" href='").With(SpanCodeGenerator.Null), - Factory.Markup("~/Foo/") - .WithEditorHints(EditorHints.VirtualPath) - .With(new LiteralAttributeCodeGenerator( - new LocationTagged(String.Empty, 9, 0, 9), - new LocationTagged(new ResolveUrlCodeGenerator(), 9, 0, 9))), - new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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.Empty, 18, 0, 18), new LocationTagged("/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(" (" href='", 17, 0, 17), new LocationTagged("'", 37, 0, 37)), - Factory.Markup(" href='").With(SpanCodeGenerator.Null), - Factory.Markup("~/Foo/") - .WithEditorHints(EditorHints.VirtualPath) - .With(new LiteralAttributeCodeGenerator( - new LocationTagged(String.Empty, 24, 0, 24), - new LocationTagged(new ResolveUrlCodeGenerator(), 24, 0, 24))), - new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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.Empty, 33, 0, 33), new LocationTagged("/Baz", 33, 0, 33))), - Factory.Markup("'").With(SpanCodeGenerator.Null)), - Factory.Markup(" /> ")), + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("(" href='", 17, 0, 17), new LocationTagged("'", 37, 0, 37)), + Factory.Markup(" href='").With(SpanCodeGenerator.Null), + Factory.Markup("~/Foo/") + .WithEditorHints(EditorHints.VirtualPath) + .With(new LiteralAttributeCodeGenerator( + new LocationTagged(String.Empty, 24, 0, 24), + new LocationTagged(new ResolveUrlCodeGenerator(), 24, 0, 24))), + new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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.Empty, 33, 0, 33), new LocationTagged("/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("", new MarkupBlock( - Factory.Markup("(" href='", 2, 0, 2), new LocationTagged("'", 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.Empty, 9, 0, 9), - new LocationTagged(new ResolveUrlCodeGenerator(), 9, 0, 9))), - Factory.Markup("'").With(SpanCodeGenerator.Null)), - Factory.Markup(" />").Accepts(AcceptedCharacters.None))); + new MarkupTagBlock( + Factory.Markup("(" href='", 2, 0, 2), new LocationTagged("'", 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.Empty, 9, 0, 9), + new LocationTagged(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("", new MarkupBlock( - Factory.Markup("(" href='", 2, 0, 2), new LocationTagged("'", 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.Empty, 9, 0, 9), - new LocationTagged(new ResolveUrlCodeGenerator(), 9, 0, 9))), - Factory.Markup("'").With(SpanCodeGenerator.Null)), - Factory.Markup(" />"))); + new MarkupTagBlock( + Factory.Markup("(" href='", 2, 0, 2), new LocationTagged("'", 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.Empty, 9, 0, 9), + new LocationTagged(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("", new MarkupBlock( - Factory.Markup("(" href=", 2, 0, 2), new LocationTagged(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.Empty, 8, 0, 8), - new LocationTagged(new ResolveUrlCodeGenerator(), 8, 0, 8))), - new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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.Empty, 34, 0, 34), new LocationTagged("/Boz", 34, 0, 34)))), - Factory.Markup(" />").Accepts(AcceptedCharacters.None))); + new MarkupTagBlock( + Factory.Markup("(" href=", 2, 0, 2), new LocationTagged(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.Empty, 8, 0, 8), + new LocationTagged(new ResolveUrlCodeGenerator(), 8, 0, 8))), + new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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.Empty, 34, 0, 34), new LocationTagged("/Boz", 34, 0, 34)))), + Factory.Markup(" />").Accepts(AcceptedCharacters.None)))); } [Fact] @@ -220,23 +235,24 @@ namespace Microsoft.AspNet.Razor.Test.Parser.Html { ParseDocumentTest("", new MarkupBlock( - Factory.Markup("(" href=", 2, 0, 2), new LocationTagged(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.Empty, 8, 0, 8), - new LocationTagged(new ResolveUrlCodeGenerator(), 8, 0, 8))), - new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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.Empty, 34, 0, 34), new LocationTagged("/Boz", 34, 0, 34)))), - Factory.Markup(" />"))); + new MarkupTagBlock( + Factory.Markup("(" href=", 2, 0, 2), new LocationTagged(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.Empty, 8, 0, 8), + new LocationTagged(new ResolveUrlCodeGenerator(), 8, 0, 8))), + new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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.Empty, 34, 0, 34), new LocationTagged("/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(" (" href=", 17, 0, 17), new LocationTagged(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.Empty, 23, 0, 23), - new LocationTagged(new ResolveUrlCodeGenerator(), 23, 0, 23))), - new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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.Empty, 49, 0, 49), new LocationTagged("/Boz", 49, 0, 49)))), - Factory.Markup(" /> ")), + Factory.Markup(" "), + new MarkupTagBlock( + Factory.Markup("(" href=", 17, 0, 17), new LocationTagged(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.Empty, 23, 0, 23), + new LocationTagged(new ResolveUrlCodeGenerator(), 23, 0, 23))), + new MarkupBlock(new DynamicAttributeBlockCodeGenerator(new LocationTagged(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.Empty, 49, 0, 49), new LocationTagged("/Boz", 49, 0, 49)))), + Factory.Markup(" />")), + Factory.Markup(" ") + ), Factory.MetaCode("}").Accepts(AcceptedCharacters.None)), Factory.EmptyHtml())); }