// 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 { public CSharpBlockTest() { UseBaselineTests = true; } [Fact] public void ParseBlock_NestedCodeBlockWithCSharpAt() { ParseBlockTest("{ if (true) { var val = @x; if (val != 3) { } } }"); } [Fact] public void ParseBlock_NestedCodeBlockWithMarkupSetsDotAsMarkup() { ParseBlockTest("if (true) { @if(false) {
Foo
foo++; } while (fooFoo
", suffix: "}"); } [Fact] public void ParseBlockSupportsTryStatementWithOneCatchClause() { SingleSpanBlockTest("try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } }"); } [Fact] public void ParseBlockSupportsMarkupWithinCatchClause() { RunSimpleWrappedMarkupTest( prefix: "try { var foo = new { } } catch(Foo Bar Baz) {", markup: "Foo
", suffix: "}"); } [Fact] public void ParseBlockSupportsTryStatementWithMultipleCatchClause() { 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 ParseBlockSupportsExceptionLessCatchClauses() { SingleSpanBlockTest("try { var foo = new { } } catch { var foo = new { } }"); } [Fact] public void ParseBlockSupportsMarkupWithinAdditionalCatchClauses() { 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 ParseBlockSupportsTryStatementWithFinallyClause() { SingleSpanBlockTest("try { var foo = new { } } finally { var foo = new { } }"); } [Fact] public void ParseBlockSupportsMarkupWithinFinallyClause() { RunSimpleWrappedMarkupTest( prefix: "try { var foo = new { } } finally {", markup: "Foo
", suffix: "}"); } [Fact] public void ParseBlockStopsParsingCatchClausesAfterFinallyBlock() { var content = "try { var foo = new { } } finally { var foo = new { } }"; SingleSpanBlockTest(content + " catch(Foo Bar Baz) { }"); } [Fact] public void ParseBlockDoesNotAllowMultipleFinallyBlocks() { var content = "try { var foo = new { } } finally { var foo = new { } }"; SingleSpanBlockTest(content + " finally { }"); } [Fact] public void ParseBlockAcceptsTrailingDotIntoImplicitExpressionWhenEmbeddedInCode() { // Arrange ParseBlockTest(@"if(foo) { @foo. }"); } [Fact] public void ParseBlockParsesExpressionOnSwitchCharacterFollowedByOpenParen() { // Arrange ParseBlockTest(@"if(foo) { @(foo + bar) }"); } [Fact] public void ParseBlockParsesExpressionOnSwitchCharacterFollowedByIdentifierStart() { // Arrange ParseBlockTest(@"if(foo) { @foo[4].bar() }"); } [Fact] public void ParseBlockTreatsDoubleAtSignAsEscapeSequenceIfAtStatementStart() { // Arrange ParseBlockTest(@"if(foo) { @@class.Foo() }"); } [Fact] public void ParseBlockTreatsAtSignsAfterFirstPairAsPartOfCSharpStatement() { // Arrange ParseBlockTest(@"if(foo) { @@@@class.Foo() }"); } [Fact] public void ParseBlockDoesNotParseMarkupStatementOrExpressionOnSwitchCharacterNotFollowedByOpenAngleOrColon() { // Arrange ParseBlockTest("if(foo) { @\"Foo\".ToString(); }"); } [Fact] public void ParsersCanNestRecursively() { // Arrange ParseBlockTest("foreach(var c in db.Categories) {" + Environment.NewLine + "