Skip to content
This repository was archived by the owner on Dec 19, 2018. It is now read-only.

Commit

Permalink
Add code generation tests for tag helpers.
Browse files Browse the repository at this point in the history
  • Loading branch information
NTaylorMullen committed Sep 25, 2014
1 parent a9b9b7a commit 8eaa6cc
Show file tree
Hide file tree
Showing 11 changed files with 547 additions and 11 deletions.
3 changes: 2 additions & 1 deletion src/Microsoft.AspNet.Razor/Parser/RazorParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ public RazorParser(ParserBase codeParser, ParserBase markupParser)

internal ParserBase CodeParser { get; private set; }
internal ParserBase MarkupParser { get; private set; }
internal IList<ISyntaxTreeRewriter> Optimizers { get; private set; }
// Internal for testing
internal IList<ISyntaxTreeRewriter> Optimizers { get; set; }

public bool DesignTimeMode { get; set; }

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System.Linq;
using System.Reflection;
using Microsoft.AspNet.Razor.Parser;
using Microsoft.AspNet.Razor.Parser.TagHelpers.Internal;
using Microsoft.AspNet.Razor.TagHelpers;
using Moq;
using Xunit;

namespace Microsoft.AspNet.Razor.Test.Generator
{
public class CSharpTagHelperRenderingTest : CSharpRazorCodeGeneratorTest
{
[Theory]
[InlineData("BasicTagHelpers")]
[InlineData("ComplexTagHelpers")]
public void TagHelpers_ChangeGeneratedOutput(string testType)
{
var inputTypePropertyInfo = new Mock<PropertyInfo>();
inputTypePropertyInfo.Setup(ipi => ipi.PropertyType).Returns(typeof(string));
inputTypePropertyInfo.Setup(ipi => ipi.Name).Returns("Type");
var checkedPropertyInfo = new Mock<PropertyInfo>();
checkedPropertyInfo.Setup(ipi => ipi.PropertyType).Returns(typeof(bool));
checkedPropertyInfo.Setup(ipi => ipi.Name).Returns("Checked");
// Arrange
var tagHelperProvider = new TagHelperDescriptorProvider(
new TagHelperDescriptor[]
{
new TagHelperDescriptor("p", "pTagHelper", ContentBehavior.None),
new TagHelperDescriptor("input",
"inputTagHelper",
ContentBehavior.None,
new TagHelperAttributeDescriptor[] {
new TagHelperAttributeDescriptor("type", inputTypePropertyInfo.Object)
}),
new TagHelperDescriptor("input",
"inputTagHelper2",
ContentBehavior.None,
new TagHelperAttributeDescriptor[] {
new TagHelperAttributeDescriptor("type", inputTypePropertyInfo.Object),
new TagHelperAttributeDescriptor("checked", checkedPropertyInfo.Object)
}),
});

// Act & Assert
RunTagHelperTest(testType, tagHelperProvider);
}

[Fact]
public void TagHelpers_ContentBehavior()
{
// Arrange
var tagHelperProvider = new TagHelperDescriptorProvider(
new TagHelperDescriptor[]
{
new TagHelperDescriptor("modify", "modifyTagHelper", ContentBehavior.Modify),
new TagHelperDescriptor("none", "noneTagHelper", ContentBehavior.None),
new TagHelperDescriptor("append", "appendTagHelper", ContentBehavior.Append),
new TagHelperDescriptor("prepend", "prependTagHelper", ContentBehavior.Prepend),
new TagHelperDescriptor("replace", "replaceTagHelper", ContentBehavior.Replace),
});

// Act & Assert
RunTagHelperTest("ContentBehaviorTagHelpers", tagHelperProvider);
}

private void RunTagHelperTest(string testName, TagHelperDescriptorProvider tagHelperProvider)
{
RunTest(
name: testName,
templateEngineConfig: (engine) =>
{
return new TagHelperTemplateEngine(engine, tagHelperProvider);
});
}

private class TagHelperTemplateEngine : RazorTemplateEngine
{
private TagHelperDescriptorProvider _tagHelperProvider;

public TagHelperTemplateEngine(RazorTemplateEngine engine, TagHelperDescriptorProvider tagHelperProvider)
: base(engine.Host)
{
_tagHelperProvider = tagHelperProvider;
}

protected internal override RazorParser CreateParser()
{
var parser = base.CreateParser();
var optimizers = parser.Optimizers.Where(opmzr => !(opmzr is TagHelperParseTreeRewriter));

parser.Optimizers = optimizers.Concat(new[] {
new TagHelperParseTreeRewriter(_tagHelperProvider)
}).ToList();

return parser;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ protected void RunTest(string name,
TestSpan[] spans = null,
TabTest tabTest = TabTest.Both,
Action<RazorEngineHost> hostConfig = null,
Func<RazorTemplateEngine, RazorTemplateEngine> templateEngineConfig = null,
Action<GeneratorResults> onResults = null)
{
bool testRun = false;
Expand All @@ -55,6 +56,7 @@ protected void RunTest(string name,
spans: spans,
withTabs: true,
hostConfig: hostConfig,
templateEngineConfig: templateEngineConfig,
onResults: onResults);
}

Expand All @@ -74,6 +76,7 @@ protected void RunTest(string name,
spans: spans,
withTabs: false,
hostConfig: hostConfig,
templateEngineConfig: templateEngineConfig,
onResults: onResults);
}

Expand All @@ -84,14 +87,15 @@ protected void RunTest(string name,
}

private void RunTestInternal(string name,
string baselineName,
bool generatePragmas,
bool designTimeMode,
IList<LineMapping> expectedDesignTimePragmas,
TestSpan[] spans,
bool withTabs,
Action<RazorEngineHost> hostConfig,
Action<GeneratorResults> onResults = null)
string baselineName,
bool generatePragmas,
bool designTimeMode,
IList<LineMapping> expectedDesignTimePragmas,
TestSpan[] spans,
bool withTabs,
Action<RazorEngineHost> hostConfig,
Func<RazorTemplateEngine, RazorTemplateEngine> templateEngineConfig,
Action<GeneratorResults> onResults = null)
{
// Load the test files
if (baselineName == null)
Expand All @@ -111,7 +115,8 @@ private void RunTestInternal(string name,
host.DefaultClassName = name;

// Add support for templates, etc.
host.GeneratedClassContext = new GeneratedClassContext(GeneratedClassContext.DefaultExecuteMethodName,
host.GeneratedClassContext = new GeneratedClassContext(GeneratedTagHelperRenderingContext.Default,
GeneratedClassContext.DefaultExecuteMethodName,
GeneratedClassContext.DefaultWriteMethodName,
GeneratedClassContext.DefaultWriteLiteralMethodName,
"WriteTo",
Expand All @@ -133,6 +138,11 @@ private void RunTestInternal(string name,

RazorTemplateEngine engine = new RazorTemplateEngine(host);

if(templateEngineConfig != null)
{
engine = templateEngineConfig(engine);
}

// Generate code for the file
GeneratorResults results = null;
using (StringTextBuffer buffer = new StringTextBuffer(source))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,14 @@ protected static RazorEngineHost CreateHost()
{
return new RazorEngineHost(new TLanguage())
{
GeneratedClassContext = new GeneratedClassContext("Execute", "Write", "WriteLiteral", "WriteTo", "WriteLiteralTo", "Template", "DefineSection"),
GeneratedClassContext = new GeneratedClassContext(GeneratedTagHelperRenderingContext.Default,
"Execute",
"Write",
"WriteLiteral",
"WriteTo",
"WriteLiteralTo",
"Template",
"DefineSection"),
DesignTimeMode = true
};
}
Expand Down
1 change: 1 addition & 0 deletions test/Microsoft.AspNet.Razor.Test/RazorEngineHostTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ private static RazorEngineHost CreateHost()
private static void VerifyCommonDefaults(RazorEngineHost host)
{
Assert.Equal(GeneratedClassContext.Default, host.GeneratedClassContext);
Assert.Equal(GeneratedTagHelperRenderingContext.Default, host.GeneratedClassContext.GeneratedTagHelperRenderingContext);
Assert.Empty(host.NamespaceImports);
Assert.False(host.DesignTimeMode);
Assert.Equal(RazorEngineHost.InternalDefaultClassName, host.DefaultClassName);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
namespace TestOutput
{
using System;
using System.Threading.Tasks;

public class BasicTagHelpers
{
#line hidden
public BasicTagHelpers()
{
}

#pragma warning disable 1998
public override async Task ExecuteAsync()
{
ITagHelperManager __tagHelperManager = CreateTagHelper();
var __tagHelperBufferValue = string.Empty;
pTagHelper __p_pTagHelper_None = null;
inputTagHelper __input_inputTagHelper_None = null;
inputTagHelper2 __input_inputTagHelper2_None = null;
WriteLiteral("<div class=\"randomNonTagHelperAttribute\">\r\n ");
__p_pTagHelper_None = CreateTagHelper<pTagHelper>();
__tagHelperManager.AddActiveTagHelper(__p_pTagHelper_None);
__tagHelperManager.AddHTMLAttribute("class", "Hello World");
__tagHelperManager.StartActiveTagHelpers("p");
__tagHelperManager.ExecuteTagHelpers();
WriteLiteral(__tagHelperManager.GenerateTagStart());
WriteLiteral("\r\n ");
__p_pTagHelper_None = CreateTagHelper<pTagHelper>();
__tagHelperManager.AddActiveTagHelper(__p_pTagHelper_None);
__tagHelperManager.StartActiveTagHelpers("p");
__tagHelperManager.ExecuteTagHelpers();
WriteLiteral(__tagHelperManager.GenerateTagStart());
WriteLiteral(__tagHelperManager.GenerateTagEnd());
__tagHelperManager.EndTagHelpers();
WriteLiteral("\r\n ");
__input_inputTagHelper_None = CreateTagHelper<inputTagHelper>();
__input_inputTagHelper_None.Type = "text";
__tagHelperManager.AddTagHelperAttribute("type", __input_inputTagHelper_None.Type);
__tagHelperManager.AddActiveTagHelper(__input_inputTagHelper_None);
__input_inputTagHelper2_None = CreateTagHelper<inputTagHelper2>();
__input_inputTagHelper2_None.Type = __input_inputTagHelper_None.Type;
__tagHelperManager.AddActiveTagHelper(__input_inputTagHelper2_None);
__tagHelperManager.StartActiveTagHelpers("input");
__tagHelperManager.ExecuteTagHelpers();
WriteLiteral(__tagHelperManager.GenerateTagStart());
WriteLiteral(__tagHelperManager.GenerateTagEnd());
__tagHelperManager.EndTagHelpers();
WriteLiteral("\r\n ");
__input_inputTagHelper_None = CreateTagHelper<inputTagHelper>();
__input_inputTagHelper_None.Type = "checkbox";
__tagHelperManager.AddTagHelperAttribute("type", __input_inputTagHelper_None.Type);
__tagHelperManager.AddActiveTagHelper(__input_inputTagHelper_None);
__input_inputTagHelper2_None = CreateTagHelper<inputTagHelper2>();
__input_inputTagHelper2_None.Type = __input_inputTagHelper_None.Type;
__input_inputTagHelper2_None.Checked = true;
__tagHelperManager.AddTagHelperAttribute("checked", __input_inputTagHelper2_None.Checked);
__tagHelperManager.AddActiveTagHelper(__input_inputTagHelper2_None);
__tagHelperManager.StartActiveTagHelpers("input");
__tagHelperManager.ExecuteTagHelpers();
WriteLiteral(__tagHelperManager.GenerateTagStart());
WriteLiteral(__tagHelperManager.GenerateTagEnd());
__tagHelperManager.EndTagHelpers();
WriteLiteral("\r\n ");
WriteLiteral(__tagHelperManager.GenerateTagEnd());
__tagHelperManager.EndTagHelpers();
WriteLiteral("\r\n</div>");
}
#pragma warning restore 1998
}
}
Loading

0 comments on commit 8eaa6cc

Please sign in to comment.