// 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, }); } } }