public void Execute_MultipleCustomDirectives_RemovesDirectiveNodesFromDocument() { // Arrange var content = "@custom \"Hello\"" + Environment.NewLine + "@custom \"World\""; var sourceDocument = TestRazorSourceDocument.Create(content); var codeDocument = RazorCodeDocument.Create(sourceDocument); var defaultEngine = RazorProjectEngine.Create(b => { b.AddDirective(DirectiveDescriptor.CreateDirective("custom", DirectiveKind.SingleLine, d => d.AddStringToken())); }).Engine; var documentNode = Lower(codeDocument, defaultEngine); var pass = new DirectiveRemovalOptimizationPass() { Engine = defaultEngine, }; // Act pass.Execute(codeDocument, documentNode); // Assert Children(documentNode, node => Assert.IsType <NamespaceDeclarationIntermediateNode>(node)); var @namespace = documentNode.Children[0]; Children(@namespace, node => Assert.IsType <ClassDeclarationIntermediateNode>(node)); var @class = @namespace.Children[0]; var method = SingleChild <MethodDeclarationIntermediateNode>(@class); Assert.Empty(method.Children); }
public void DirectiveDescriptor_FileScoped_CanBeBeneathOtherWhiteSpaceCommentsAndDirectives() { // Arrange var customDescriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.SingleLine, builder => { builder.Usage = DirectiveUsage.FileScopedSinglyOccurring; builder.AddTypeToken(); }); var somethingDescriptor = DirectiveDescriptor.CreateDirective( "something", DirectiveKind.SingleLine, builder => { builder.Usage = DirectiveUsage.FileScopedMultipleOccurring; builder.AddMemberToken(); }); // Act & Assert ParseDocumentTest( @"@* There are two directives beneath this *@ @custom System.Text.Encoding.ASCIIEncoding @something Else <p>This is extra</p>", new[] { customDescriptor, somethingDescriptor }); }
public void Lower_WithMultipleImports_SingleLineFileScopedSinglyOccurring() { // Arrange var source = TestRazorSourceDocument.Create("<p>Hi!</p>"); var imports = new[] { TestRazorSourceDocument.Create("@test value1"), TestRazorSourceDocument.Create("@test value2"), }; var codeDocument = TestRazorCodeDocument.Create(source, imports); // Act var documentNode = Lower(codeDocument, b => { b.AddDirective(DirectiveDescriptor.CreateDirective( "test", DirectiveKind.SingleLine, builder => { builder.AddMemberToken(); builder.Usage = DirectiveUsage.FileScopedSinglyOccurring; })); }); // Assert Children( documentNode, n => Directive("test", n, c => DirectiveToken(DirectiveTokenKind.Member, "value2", c)), n => Html("<p>Hi!</p>", n)); }
public void CreateDirective_CreatesDirective_WithProvidedKind() { // Arrange & Act var directive = DirectiveDescriptor.CreateDirective("test", DirectiveKind.SingleLine); // Assert Assert.Equal("test", directive.Directive); Assert.Equal(DirectiveKind.SingleLine, directive.Kind); }
public void DirectiveDescriptor_AttributeToken_ErrorsIfDoesNotStartWithOpenBracket() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.SingleLine, b => b.AddAttributeToken()); // Act & Assert ParseDocumentTest("@custom Serializable]", new[] { descriptor }); }
public void Directives_CanUseReservedWord_Namespace() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "namespace", DirectiveKind.SingleLine); // Act & Assert ParseDocumentTest( "@namespace", new[] { descriptor }); }
public void Directives_CanUseReservedWord_Class() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "class", DirectiveKind.SingleLine); // Act & Assert ParseCodeBlockTest( "@class", new[] { descriptor }); }
public void ExtensibleDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.SingleLine, b => b.AddTypeToken()); // Act & Assert ParseDocumentTest(Environment.NewLine + " @custom System.Text.Encoding.ASCIIEncoding", new[] { descriptor }); }
public void DirectiveDescriptor_ErrorsForInvalidMemberTokens() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.SingleLine, b => b.AddMemberToken()); // Act & Assert ParseDocumentTest( "@custom -Some_Member", new[] { descriptor }); }
public void DirectiveDescriptor_AllowsWhiteSpaceAroundTokens() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.SingleLine, b => b.AddTypeToken().AddMemberToken()); // Act & Assert ParseDocumentTest( "@custom System.Text.Encoding.ASCIIEncoding Some_Member ", new[] { descriptor }); }
public void OptionalDirectiveTokens_WithMultipleOptionalTokens_AreParsed() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.SingleLine, b => b.AddOptionalStringToken().AddOptionalTypeToken()); // Act & Assert ParseDocumentTest( "@custom \"{formaction}?/{id}?\" System.String", new[] { descriptor }); }
public void DirectiveDescriptor_ErrorsWhenMissingEndBrace() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.CodeBlock, b => b.AddStringToken()); // Act & Assert ParseDocumentTest( "@custom \"Hello\" {", new[] { descriptor }); }
public void DirectiveDescriptor_ErrorsExtraContentAfterDirective() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.SingleLine, b => b.AddStringToken()); // Act & Assert ParseDocumentTest( "@custom \"hello\" \"world\"", new[] { descriptor }); }
public void Parser_ParsesNamespaceDirectiveToken_WithMultipleSegments() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.SingleLine, b => b.AddNamespaceToken()); // Act & Assert ParseDocumentTest( "@custom BaseNamespace.Foo.Bar", new[] { descriptor }); }
public void DirectiveDescriptor_CanHandleInvalidNamespaceTokens() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.SingleLine, b => b.AddNamespaceToken()); // Act & Assert ParseDocumentTest( "@custom System<" + Environment.NewLine, new[] { descriptor }); }
public void DirectiveDescriptor_CanHandleEOFIncompleteNamespaceTokens() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.SingleLine, b => b.AddNamespaceToken()); // Act & Assert ParseDocumentTest( "@custom System.", new[] { descriptor }); }
public void DirectiveDescriptor_TokensMustBeSeparatedBySpace() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.SingleLine, b => b.AddStringToken().AddStringToken()); // Act & Assert ParseDocumentTest( "@custom \"string1\"\"string2\"", new[] { descriptor }); }
public void OptionalDirectiveTokens_WithBraces_AreParsed() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.SingleLine, b => b.AddOptionalStringToken()); // Act & Assert ParseCodeBlockTest( "@custom \"{formaction}?/{id}?\"", new[] { descriptor }); }
public void DirectiveDescriptor_NoErrorsSemicolonAfterDirective() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.SingleLine, b => b.AddStringToken()); // Act & Assert ParseDocumentTest( "@custom \"hello\" ; ", new[] { descriptor }); }
public void DirectiveDescriptor_UnderstandsStringTokens() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.SingleLine, b => b.AddStringToken()); // Act & Assert ParseDocumentTest( "@custom \"AString\"", new[] { descriptor }); }
public void DirectiveDescriptor_AllowsTupleTypes_IgnoresTrailingWhitespace() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.SingleLine, b => b.AddTypeToken()); // Act & Assert ParseDocumentTest( $"@custom (bool, int?) ", new[] { descriptor }); }
public void DirectiveDescriptor_StringToken_ParserErrorForPartialQuotedValue() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.SingleLine, b => b.AddStringToken()); // Act & Assert ParseDocumentTest( "@custom AString\"", new[] { descriptor }); }
public void DirectiveDescriptor_ErrorsWhenExtraContentBeforeBlockStart() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.CodeBlock, b => b.AddStringToken()); // Act & Assert ParseDocumentTest( "@custom \"Hello\" World { foo(); bar(); }", new[] { descriptor }); }
public void OptionalDirectiveTokens_AreSkipped() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.SingleLine, b => b.AddOptionalStringToken()); // Act & Assert ParseCodeBlockTest( "@custom ", new[] { descriptor }); }
public void OptionalDirectiveTokens_WithSimpleTokens_AreParsed() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.SingleLine, b => b.AddOptionalStringToken()); // Act & Assert ParseDocumentTest( "@custom \"simple-value\"", new[] { descriptor }); }
public void DirectiveDescriptor_UnderstandsRazorBlocks() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.RazorBlock, b => b.AddStringToken()); // Act & Assert ParseDocumentTest( "@custom \"Header\" { <p>F{o}o</p> }", new[] { descriptor }); }
public void OptionalMemberTokens_WithMemberSpecified_IsParsed() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "TestDirective", DirectiveKind.SingleLine, b => b.AddOptionalMemberToken().AddOptionalStringToken()); // Act & Assert ParseDocumentTest( "@TestDirective PropertyName", new[] { descriptor }); }
public void DirectiveDescriptor_UnderstandsCodeBlocks() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.CodeBlock, b => b.AddStringToken()); // Act & Assert ParseDocumentTest( "@custom \"Name\" { foo(); bar(); }", new[] { descriptor }); }
public void DirectiveDescriptor_UnderstandsMultipleTokens() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "custom", DirectiveKind.SingleLine, b => b.AddTypeToken().AddMemberToken().AddStringToken()); // Act & Assert ParseDocumentTest( "@custom System.Text.Encoding.ASCIIEncoding Some_Member \"AString\"", new[] { descriptor }); }
public void OptionalMemberTokens_WithMissingMember_IsParsed() { // Arrange var descriptor = DirectiveDescriptor.CreateDirective( "TestDirective", DirectiveKind.SingleLine, b => b.AddOptionalMemberToken().AddOptionalStringToken()); // Act & Assert ParseCodeBlockTest( "@TestDirective ", new[] { descriptor }); }