172 lines
6.7 KiB
C#
Raw Normal View History

// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.Web.Razor.Generator;
using System.Web.Razor.Parser;
using System.Web.Razor.Parser.SyntaxTree;
using System.Web.Razor.Resources;
using System.Web.Razor.Test.Framework;
using Xunit;
namespace System.Web.Razor.Test.Parser.VB
{
public class VBSpecialKeywordsTest : VBHtmlCodeParserTestBase
{
[Fact]
public void ParseInheritsStatementMarksInheritsSpanAsCanGrowIfMissingTrailingSpace()
{
ParseBlockTest("inherits",
new DirectiveBlock(
Factory.MetaCode("inherits")),
new RazorError(
RazorResources.ParseError_InheritsKeyword_Must_Be_Followed_By_TypeName,
8, 0, 8));
}
[Fact]
public void InheritsBlockAcceptsMultipleGenericArguments()
{
ParseBlockTest("inherits Foo.Bar(Of Biz(Of Qux), String, Integer).Baz",
new DirectiveBlock(
Factory.MetaCode("inherits ").Accepts(AcceptedCharacters.None),
Factory.Code("Foo.Bar(Of Biz(Of Qux), String, Integer).Baz")
.AsBaseType("Foo.Bar(Of Biz(Of Qux), String, Integer).Baz")));
}
[Fact]
public void InheritsDirectiveSupportsVSTemplateTokens()
{
ParseBlockTest("@Inherits $rootnamespace$.MyBase",
new DirectiveBlock(
Factory.CodeTransition(),
Factory.MetaCode("Inherits ")
.Accepts(AcceptedCharacters.None),
Factory.Code("$rootnamespace$.MyBase")
.AsBaseType("$rootnamespace$.MyBase")));
}
[Fact]
public void InheritsBlockOutputsErrorIfInheritsNotFollowedByTypeButAcceptsEntireLineAsCode()
{
ParseBlockTest(@"inherits
foo",
new DirectiveBlock(
Factory.MetaCode("inherits ").Accepts(AcceptedCharacters.None),
Factory.Code("\r\n").AsBaseType(String.Empty)),
new RazorError(
RazorResources.ParseError_InheritsKeyword_Must_Be_Followed_By_TypeName,
8, 0, 8));
}
[Fact]
public void ParseBlockShouldSupportNamespaceImports()
{
ParseBlockTest("Imports Foo.Bar.Baz.Biz.Boz",
new DirectiveBlock(
Factory.MetaCode("Imports Foo.Bar.Baz.Biz.Boz")
.With(new AddImportCodeGenerator(
ns: " Foo.Bar.Baz.Biz.Boz",
namespaceKeywordLength: SyntaxConstants.VB.ImportsKeywordLength))));
}
[Fact]
public void ParseBlockShowsErrorIfNamespaceNotOnSameLineAsImportsKeyword()
{
ParseBlockTest(@"Imports
Foo",
new DirectiveBlock(
Factory.MetaCode("Imports\r\n")
.With(new AddImportCodeGenerator(
ns: "\r\n",
namespaceKeywordLength: SyntaxConstants.VB.ImportsKeywordLength))),
new RazorError(
RazorResources.ParseError_NamespaceOrTypeAliasExpected,
7, 0, 7));
}
[Fact]
public void ParseBlockShowsErrorIfTypeBeingAliasedNotOnSameLineAsImportsKeyword()
{
ParseBlockTest(@"Imports Foo =
System.Bar",
new DirectiveBlock(
Factory.MetaCode("Imports Foo =\r\n")
.With(new AddImportCodeGenerator(
ns: " Foo =\r\n",
namespaceKeywordLength: SyntaxConstants.VB.ImportsKeywordLength))));
}
[Fact]
public void ParseBlockShouldSupportTypeAliases()
{
ParseBlockTest("Imports Foo = Bar.Baz.Biz.Boz",
new DirectiveBlock(
Factory.MetaCode("Imports Foo = Bar.Baz.Biz.Boz")
.With(new AddImportCodeGenerator(
ns: " Foo = Bar.Baz.Biz.Boz",
namespaceKeywordLength: SyntaxConstants.VB.ImportsKeywordLength))));
}
[Fact]
public void ParseBlockThrowsErrorIfOptionIsNotFollowedByStrictOrExplicit()
{
ParseBlockTest("Option FizzBuzz On",
new DirectiveBlock(
Factory.MetaCode("Option FizzBuzz On")
.With(new SetVBOptionCodeGenerator(optionName: null, value: true))),
new RazorError(
String.Format(RazorResources.ParseError_UnknownOption, "FizzBuzz"),
7, 0, 7));
}
[Fact]
public void ParseBlockThrowsErrorIfOptionStrictIsNotFollowedByOnOrOff()
{
ParseBlockTest("Option Strict Yes",
new DirectiveBlock(
Factory.MetaCode("Option Strict Yes")
.With(SetVBOptionCodeGenerator.Strict(true))),
new RazorError(
String.Format(
RazorResources.ParseError_InvalidOptionValue,
"Strict", "Yes"),
14, 0, 14));
}
[Fact]
public void ParseBlockReadsToAfterOnKeywordIfOptionStrictBlock()
{
ParseBlockTest("Option Strict On Foo Bar Baz",
new DirectiveBlock(
Factory.MetaCode("Option Strict On")
.With(SetVBOptionCodeGenerator.Strict(true))));
}
[Fact]
public void ParseBlockReadsToAfterOffKeywordIfOptionStrictBlock()
{
ParseBlockTest("Option Strict Off Foo Bar Baz",
new DirectiveBlock(
Factory.MetaCode("Option Strict Off")
.With(SetVBOptionCodeGenerator.Strict(false))));
}
[Fact]
public void ParseBlockReadsToAfterOnKeywordIfOptionExplicitBlock()
{
ParseBlockTest("Option Explicit On Foo Bar Baz",
new DirectiveBlock(
Factory.MetaCode("Option Explicit On")
.With(SetVBOptionCodeGenerator.Explicit(true))));
}
[Fact]
public void ParseBlockReadsToAfterOffKeywordIfOptionExplicitBlock()
{
ParseBlockTest("Option Explicit Off Foo Bar Baz",
new DirectiveBlock(
Factory.MetaCode("Option Explicit Off")
.With(SetVBOptionCodeGenerator.Explicit(false))));
}
}
}