From a0574fb9be8202a260a5a93719e92d7c6d6214ee Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Mon, 26 Jan 2015 12:06:09 -0800 Subject: [PATCH] Add tests for TagHelper order control. - Tested runtime run execution order control. #94 --- .../TagHelpers/TagHelperRunnerTest.cs | 95 ++++++++++++++++++- .../TagHelpers/TagHelperTypeResolverTest.cs | 14 +++ 2 files changed, 107 insertions(+), 2 deletions(-) diff --git a/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperRunnerTest.cs b/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperRunnerTest.cs index d8e7d829a9..a54d83d53e 100644 --- a/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperRunnerTest.cs +++ b/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperRunnerTest.cs @@ -1,8 +1,8 @@ // 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.IO; -using System.Text; +using System.Collections.Generic; +using System.Diagnostics; using System.Threading.Tasks; using Xunit; @@ -10,6 +10,77 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers { public class TagHelperRunnerTest { + public static TheoryData TagHelperOrderData + { + get + { + // tagHelperOrders, expectedTagHelperOrders + return new TheoryData + { + { + new[] { 1000, int.MaxValue, 0 }, + new[] { 0, 1000, int.MaxValue } + }, + { + new[] { int.MaxValue, int.MaxValue, int.MinValue }, + new[] { int.MinValue, int.MaxValue, int.MaxValue } + }, + { + new[] { 0, 0, int.MinValue }, + new[] { int.MinValue, 0, 0 } + }, + { + new[] { int.MinValue, -1000, 0 }, + new[] { int.MinValue, -1000, 0 } + }, + { + new[] { 0, 1000, int.MaxValue }, + new[] { 0, 1000, int.MaxValue } + }, + { + new[] { int.MaxValue, int.MinValue, int.MaxValue, -1000, int.MaxValue, 0 }, + new[] { int.MinValue, -1000, 0, int.MaxValue, int.MaxValue, int.MaxValue } + }, + { + new[] { 0, 0, 0, 0 }, + new[] { 0, 0, 0, 0 } + }, + + { + new[] { 1000, int.MaxValue, 0, -1000, int.MinValue }, + new[] { int.MinValue, -1000, 0, 1000, int.MaxValue } + }, + }; + } + } + + [Theory] + [MemberData(nameof(TagHelperOrderData))] + public async Task RunAsync_OrdersTagHelpers( + int[] tagHelperOrders, + int[] expectedTagHelperOrders) + { + // Arrange + var runner = new TagHelperRunner(); + var executionContext = new TagHelperExecutionContext("p"); + var processOrder = new List(); + + foreach (var order in tagHelperOrders) + { + var orderedTagHelper = new OrderedTagHelper(order) + { + ProcessOrderTracker = processOrder + }; + executionContext.Add(orderedTagHelper); + } + + // Act + await runner.RunAsync(executionContext); + + // Assert + Assert.Equal(expectedTagHelperOrders, processOrder); + } + [Fact] public async Task RunAsync_ProcessesAllTagHelpers() { @@ -88,5 +159,25 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers output.Attributes["foo"] = context.AllAttributes["foo"].ToString(); } } + + private class OrderedTagHelper : TagHelper + { + public OrderedTagHelper(int order) + { + Order = order; + } + + public override int Order { get; } + public IList ProcessOrderTracker { get; set; } + + public override void Process(TagHelperContext context, TagHelperOutput output) + { + // If using this class for testing, ensure that ProcessOrderTracker is always set prior to Process + // execution. + Debug.Assert(ProcessOrderTracker != null); + + ProcessOrderTracker.Add(Order); + } + } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperTypeResolverTest.cs b/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperTypeResolverTest.cs index 185406936d..7ec6d9c867 100644 --- a/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperTypeResolverTest.cs +++ b/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperTypeResolverTest.cs @@ -129,6 +129,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers public class Invalid_NestedPublicTagHelper : ITagHelper { + public int Order { get { return 0; } } + public Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { return Task.FromResult(result: true); @@ -137,6 +139,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers internal class Invalid_NestedInternalTagHelper : ITagHelper { + public int Order { get { return 0; } } + public Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { return Task.FromResult(result: true); @@ -145,6 +149,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers private class Invalid_PrivateTagHelper : ITagHelper { + public int Order { get { return 0; } } + public Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { return Task.FromResult(result: true); @@ -153,6 +159,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers protected class Invalid_ProtectedTagHelper : ITagHelper { + public int Order { get { return 0; } } + public Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { return Task.FromResult(result: true); @@ -164,6 +172,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers // In this case they do not fulfill other TagHelper requirements. public abstract class Invalid_AbstractTagHelper : ITagHelper { + public int Order { get { return 0; } } + public Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { return Task.FromResult(result: true); @@ -172,6 +182,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers public class Invalid_GenericTagHelper : ITagHelper { + public int Order { get { return 0; } } + public Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { return Task.FromResult(result: true); @@ -180,6 +192,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers internal class Invalid_InternalTagHelper : ITagHelper { + public int Order { get { return 0; } } + public Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { return Task.FromResult(result: true);