// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Linq;
using Microsoft.AspNetCore.Razor.Language.Extensions;
using Xunit;
namespace Microsoft.AspNetCore.Razor.Language.Legacy
{
public class HtmlToCodeSwitchTest : CsHtmlMarkupParserTestBase
{
public HtmlToCodeSwitchTest()
{
UseBaselineTests = true;
}
[Fact]
public void ParseBlockSwitchesWhenCharacterBeforeSwapIsNonAlphanumeric()
{
ParseBlockTest("
foo#@i
");
}
[Fact]
public void ParseBlockSwitchesToCodeWhenSwapCharacterEncounteredMidTag()
{
ParseBlockTest("");
}
[Fact]
public void ParseBlockSwitchesToCodeWhenSwapCharacterEncounteredInAttributeValue()
{
ParseBlockTest("");
}
[Fact]
public void ParseBlockSwitchesToCodeWhenSwapCharacterEncounteredInTagContent()
{
ParseBlockTest("@bar@boz");
}
[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");
}
[Fact]
public void ParseBlockSupportsCodeWithinComment()
{
ParseBlockTest("");
}
[Fact]
public void ParseBlockSupportsCodeWithinSGMLDeclaration()
{
ParseBlockTest("");
}
[Fact]
public void ParseBlockSupportsCodeWithinCDataDeclaration()
{
ParseBlockTest("");
}
[Fact]
public void ParseBlockSupportsCodeWithinXMLProcessingInstruction()
{
ParseBlockTest("");
}
[Fact]
public void ParseBlockDoesNotSwitchToCodeOnEmailAddressInText()
{
ParseBlockTest("anurse@microsoft.com");
}
[Fact]
public void ParseBlockDoesNotSwitchToCodeOnEmailAddressInAttribute()
{
ParseBlockTest("Email me");
}
[Fact]
public void ParseBlockGivesWhitespacePreceedingAtToCodeIfThereIsNoMarkupOnThatLine()
{
ParseBlockTest(" " + Environment.NewLine
+ " @foreach(var p in Products) {" + Environment.NewLine
+ " - Product: @p.Name
" + Environment.NewLine
+ " }" + Environment.NewLine
+ "
");
}
[Fact]
public void ParseDocumentGivesWhitespacePreceedingAtToCodeIfThereIsNoMarkupOnThatLine()
{
ParseDocumentTest(" " + Environment.NewLine
+ " @foreach(var p in Products) {" + Environment.NewLine
+ " - Product: @p.Name
" + Environment.NewLine
+ " }" + Environment.NewLine
+ "
");
}
[Fact]
public void SectionContextGivesWhitespacePreceedingAtToCodeIfThereIsNoMarkupOnThatLine()
{
var sectionDescriptor = SectionDirective.Directive;
ParseDocumentTest("@section foo {" + Environment.NewLine
+ " " + Environment.NewLine
+ " @foreach(var p in Products) {" + Environment.NewLine
+ " - Product: @p.Name
" + Environment.NewLine
+ " }" + Environment.NewLine
+ "
" + Environment.NewLine
+ "}",
new[] { SectionDirective.Directive, });
}
[Fact]
public void CSharpCodeParserDoesNotAcceptLeadingOrTrailingWhitespaceInDesignMode()
{
ParseBlockTest(" " + Environment.NewLine
+ " @foreach(var p in Products) {" + Environment.NewLine
+ " - Product: @p.Name
" + Environment.NewLine
+ " }" + Environment.NewLine
+ "
",
designTime: true);
}
// Tests for "@@" escape sequence:
[Fact]
public void ParseBlockTreatsTwoAtSignsAsEscapeSequence()
{
ParseBlockTest("@@bar");
}
[Fact]
public void ParseBlockTreatsPairsOfAtSignsAsEscapeSequence()
{
ParseBlockTest("@@@@@bar");
}
[Fact]
public void ParseDocumentTreatsTwoAtSignsAsEscapeSequence()
{
ParseDocumentTest("@@bar");
}
[Fact]
public void ParseDocumentTreatsPairsOfAtSignsAsEscapeSequence()
{
var factory = new SpanFactory();
ParseDocumentTest("@@@@@bar");
}
[Fact]
public void SectionBodyTreatsTwoAtSignsAsEscapeSequence()
{
ParseDocumentTest(
"@section Foo { @@bar }",
new[] { SectionDirective.Directive, });
}
[Fact]
public void SectionBodyTreatsPairsOfAtSignsAsEscapeSequence()
{
ParseDocumentTest(
"@section Foo { @@@@@bar }",
new[] { SectionDirective.Directive, });
}
}
}