// 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 Xunit; namespace Microsoft.AspNetCore.Razor.Language.Legacy { public class CSharpBlockTest : CsHtmlCodeParserTestBase { [Fact] public void NestedCodeBlockWithCSharpAt() { ParseBlockTest("{ if (true) { var val = @x; if (val != 3) { } } }"); } [Fact] public void NestedCodeBlockWithMarkupSetsDotAsMarkup() { ParseBlockTest("if (true) { @if(false) {
Foo
foo++; } while (fooFoo
", suffix: "}"); } [Fact] public void SupportsTryStatementWithOneCatchClause() { SingleSpanBlockTest("try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } }"); } [Fact] public void SupportsMarkupWithinCatchClause() { RunSimpleWrappedMarkupTest( prefix: "try { var foo = new { } } catch(Foo Bar Baz) {", markup: "Foo
", suffix: "}"); } [Fact] public void SupportsTryStatementWithMultipleCatchClause() { SingleSpanBlockTest( "try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) " + "{ var foo = new { } } catch(Foo Bar Baz) { var foo = new { } }"); } [Fact] public void SupportsExceptionLessCatchClauses() { SingleSpanBlockTest("try { var foo = new { } } catch { var foo = new { } }"); } [Fact] public void SupportsMarkupWithinAdditionalCatchClauses() { 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: "}"); } [Fact] public void SupportsTryStatementWithFinallyClause() { SingleSpanBlockTest("try { var foo = new { } } finally { var foo = new { } }"); } [Fact] public void SupportsMarkupWithinFinallyClause() { RunSimpleWrappedMarkupTest( prefix: "try { var foo = new { } } finally {", markup: "Foo
", suffix: "}"); } [Fact] public void StopsParsingCatchClausesAfterFinallyBlock() { var content = "try { var foo = new { } } finally { var foo = new { } }"; SingleSpanBlockTest(content + " catch(Foo Bar Baz) { }"); } [Fact] public void DoesNotAllowMultipleFinallyBlocks() { var content = "try { var foo = new { } } finally { var foo = new { } }"; SingleSpanBlockTest(content + " finally { }"); } [Fact] public void AcceptsTrailingDotIntoImplicitExpressionWhenEmbeddedInCode() { // Arrange ParseBlockTest(@"if(foo) { @foo. }"); } [Fact] public void ParsesExpressionOnSwitchCharacterFollowedByOpenParen() { // Arrange ParseBlockTest(@"if(foo) { @(foo + bar) }"); } [Fact] public void ParsesExpressionOnSwitchCharacterFollowedByIdentifierStart() { // Arrange ParseBlockTest(@"if(foo) { @foo[4].bar() }"); } [Fact] public void TreatsDoubleAtSignAsEscapeSequenceIfAtStatementStart() { // Arrange ParseBlockTest(@"if(foo) { @@class.Foo() }"); } [Fact] public void TreatsAtSignsAfterFirstPairAsPartOfCSharpStatement() { // Arrange ParseBlockTest(@"if(foo) { @@@@class.Foo() }"); } [Fact] public void DoesNotParseOnSwitchCharacterNotFollowedByOpenAngleOrColon() { // ParseBlockDoesNotParseMarkupStatementOrExpressionOnSwitchCharacterNotFollowedByOpenAngleOrColon // Arrange ParseBlockTest("if(foo) { @\"Foo\".ToString(); }"); } [Fact] public void ParsersCanNestRecursively() { // Arrange ParseBlockTest("foreach(var c in db.Categories) {" + Environment.NewLine + "