Blazor API Review: RenderTreeBuilder

Fixes: #12415
This commit is contained in:
Ryan Nowak 2019-07-22 20:51:33 -07:00 committed by Ryan Nowak
parent c76cb9248d
commit 6526022f6c
21 changed files with 174 additions and 232 deletions

View File

@ -108,7 +108,7 @@ namespace Test
Assert.Collection(
frames,
frame => AssertFrame.Component(frame, "Test.RenderChildContent", 2, 0),
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 1),
frame => AssertFrame.Attribute(frame, "ChildContent", 1),
frame => AssertFrame.Markup(frame, "\n <div></div>\n", 2));
}
@ -131,7 +131,7 @@ namespace Test
frames,
frame => AssertFrame.Component(frame, "Test.RenderChildContentString", 3, 0),
frame => AssertFrame.Attribute(frame, "Value", "HI", 1),
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 2),
frame => AssertFrame.Attribute(frame, "ChildContent", 2),
frame => AssertFrame.MarkupWhitespace(frame, 3),
frame => AssertFrame.Element(frame, "div", 2, 4),
frame => AssertFrame.Text(frame, "hi", 5),
@ -158,7 +158,7 @@ namespace Test
Assert.Collection(
frames,
frame => AssertFrame.Component(frame, "Test.RenderChildContent", 2, 0),
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 1),
frame => AssertFrame.Attribute(frame, "ChildContent", 1),
frame => AssertFrame.Markup(frame, "\n <div></div>\n ", 2));
}
@ -183,10 +183,10 @@ namespace Test
Assert.Collection(
frames,
frame => AssertFrame.Component(frame, "Test.RenderChildContent", 2, 0),
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 1),
frame => AssertFrame.Attribute(frame, "ChildContent", 1),
frame => AssertFrame.MarkupWhitespace(frame, 2),
frame => AssertFrame.Component(frame, "Test.RenderChildContent", 2, 3),
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 4),
frame => AssertFrame.Attribute(frame, "ChildContent", 4),
frame => AssertFrame.MarkupWhitespace(frame, 6),
frame => AssertFrame.Markup(frame, "\n <div></div>\n ", 5));
}
@ -208,7 +208,7 @@ namespace Test
Assert.Collection(
frames,
frame => AssertFrame.Component(frame, "Test.RenderChildContent", 2, 2),
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 3),
frame => AssertFrame.Attribute(frame, "ChildContent", 3),
frame => AssertFrame.Element(frame, "div", 2, 0),
frame => AssertFrame.Text(frame, "hi", 1));
}
@ -230,7 +230,7 @@ namespace Test
Assert.Collection(
frames,
frame => AssertFrame.Component(frame, "Test.RenderChildContentString", 3, 2),
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 3),
frame => AssertFrame.Attribute(frame, "ChildContent", 3),
frame => AssertFrame.Attribute(frame, "Value", "HI", 4),
frame => AssertFrame.Element(frame, "div", 2, 0),
frame => AssertFrame.Text(frame, "hi", 1));
@ -253,7 +253,7 @@ namespace Test
Assert.Collection(
frames,
frame => AssertFrame.Component(frame, "Test.RenderChildContent", 2, 2),
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 3),
frame => AssertFrame.Attribute(frame, "ChildContent", 3),
frame => AssertFrame.Element(frame, "div", 2, 0),
frame => AssertFrame.Text(frame, "hi", 1));
}
@ -275,7 +275,7 @@ namespace Test
Assert.Collection(
frames,
frame => AssertFrame.Component(frame, "Test.RenderChildContent", 2, 2),
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 3),
frame => AssertFrame.Attribute(frame, "ChildContent", 3),
frame => AssertFrame.Element(frame, "div", 2, 0),
frame => AssertFrame.Text(frame, "hi", 1));
}
@ -299,7 +299,7 @@ namespace Test
Assert.Collection(
frames,
frame => AssertFrame.Component(frame, "Test.RenderChildContent", 2, 2),
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 3),
frame => AssertFrame.Attribute(frame, "ChildContent", 3),
frame => AssertFrame.Element(frame, "div", 2, 0),
frame => AssertFrame.Text(frame, "hi", 1));
}
@ -327,7 +327,7 @@ namespace Test
frame => AssertFrame.Attribute(frame, "Name", "billg", 3),
frame => AssertFrame.Attribute(frame, "Header", typeof(RenderFragment<string>), 4),
frame => AssertFrame.Attribute(frame, "Value", "HI", 5),
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, typeof(RenderFragment<string>), 6),
frame => AssertFrame.Attribute(frame, "ChildContent", typeof(RenderFragment<string>), 6),
frame => AssertFrame.Attribute(frame, "Footer", typeof(RenderFragment), 10),
frame => AssertFrame.Element(frame, "div", 2, 0),
frame => AssertFrame.Text(frame, "billg", 1),
@ -360,7 +360,7 @@ namespace Test
frame => AssertFrame.Attribute(frame, "Name", "billg", 1),
frame => AssertFrame.Attribute(frame, "Value", "HI", 2),
frame => AssertFrame.Attribute(frame, "Header", typeof(RenderFragment<string>), 3),
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, typeof(RenderFragment<string>), 6),
frame => AssertFrame.Attribute(frame, "ChildContent", typeof(RenderFragment<string>), 6),
frame => AssertFrame.Attribute(frame, "Footer", typeof(RenderFragment), 10),
frame => AssertFrame.Element(frame, "div", 2, 4),
frame => AssertFrame.Text(frame, "billg", 5),
@ -395,7 +395,7 @@ namespace Test
frame => AssertFrame.Attribute(frame, "Name", "billg", 1),
frame => AssertFrame.Attribute(frame, "Value", "HI", 2),
frame => AssertFrame.Attribute(frame, "Header", typeof(RenderFragment<string>), 3),
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, typeof(RenderFragment<string>), 6),
frame => AssertFrame.Attribute(frame, "ChildContent", typeof(RenderFragment<string>), 6),
frame => AssertFrame.Attribute(frame, "Footer", typeof(RenderFragment), 10),
frame => AssertFrame.Element(frame, "div", 2, 4),
frame => AssertFrame.Text(frame, "billg", 5),

View File

@ -345,7 +345,7 @@ namespace Test
frames,
frame => AssertFrame.Component(frame, "Test.MyComponent", 3, 0),
frame => AssertFrame.Attribute(frame, "MyAttr", "abc", 1),
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 2));
frame => AssertFrame.Attribute(frame, "ChildContent", 2));
// Assert: Captured ChildContent frames are correct
var childFrames = GetFrames((RenderFragment)frames[2].AttributeValue);
@ -385,7 +385,7 @@ namespace Test
Assert.Collection(
frames,
frame => AssertFrame.Component(frame, "Test.MyComponent", 2, 0),
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 1));
frame => AssertFrame.Attribute(frame, "ChildContent", 1));
// Assert: first level of ChildContent is correct
// Note that we don't really need the sequence numbers to continue on from the
@ -397,7 +397,7 @@ namespace Test
Assert.Collection(
innerFrames,
frame => AssertFrame.Component(frame, "Test.MyComponent", 2, 2),
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 3));
frame => AssertFrame.Attribute(frame, "ChildContent", 3));
// Assert: second level of ChildContent is correct
Assert.Collection(
@ -540,7 +540,7 @@ namespace Test
frame => AssertFrame.Element(frame, "body", 5, 3),
frame => AssertFrame.MarkupWhitespace(frame, 4),
frame => AssertFrame.Component(frame, "Test.MyComponent", 2, 5),
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 6),
frame => AssertFrame.Attribute(frame, "ChildContent", 6),
frame => AssertFrame.MarkupWhitespace(frame, 16),
frame => AssertFrame.MarkupWhitespace(frame, 17));

View File

@ -170,7 +170,7 @@ namespace Test
frames,
frame => AssertFrame.Component(frame, genericComponentType.FullName, 3, 0),
frame => AssertFrame.Attribute(frame, "Items", typeof(List<int>), 1),
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 2),
frame => AssertFrame.Attribute(frame, "ChildContent", 2),
frame => AssertFrame.MarkupWhitespace(frame, 3),
frame => AssertFrame.Element(frame, "div", 2, 4),
frame => AssertFrame.Text(frame, "0", 5),

View File

@ -397,7 +397,7 @@ namespace Microsoft.AspNetCore.Blazor.Build.Test
protected ArrayRange<RenderTreeFrame> GetFrames(RenderFragment fragment)
{
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
fragment(builder);
return builder.GetFrames();
}

View File

@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.Components.Performance
// A simple component for basic tests -- this is similar to what MVC scaffolding generates
// for bootstrap3 form fields, but modified to be more Component-like.
original = new RenderTreeBuilder(renderer);
original = new RenderTreeBuilder();
original.OpenElement(0, "div");
original.AddAttribute(1, "class", "form-group");
@ -50,7 +50,7 @@ namespace Microsoft.AspNetCore.Components.Performance
original.CloseElement();
// Now simulate some input
modified = new RenderTreeBuilder(renderer);
modified = new RenderTreeBuilder();
modified.OpenElement(0, "div");
modified.AddAttribute(1, "class", "form-group");

View File

@ -555,15 +555,12 @@ namespace Microsoft.AspNetCore.Components.RenderTree
public ArrayRange(T[] array, int count) { throw null; }
public Microsoft.AspNetCore.Components.RenderTree.ArrayRange<T> Clone() { throw null; }
}
public partial class RenderTreeBuilder : System.IDisposable
public sealed partial class RenderTreeBuilder : System.IDisposable
{
public const string ChildContent = "ChildContent";
public RenderTreeBuilder(Microsoft.AspNetCore.Components.Rendering.Renderer renderer) { }
public RenderTreeBuilder() { }
public void AddAttribute(int sequence, in Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame frame) { }
public void AddAttribute(int sequence, string name, Microsoft.AspNetCore.Components.EventCallback value) { }
public void AddAttribute(int sequence, string name, System.Action value) { }
public void AddAttribute(int sequence, string name, bool value) { }
public void AddAttribute(int sequence, string name, System.Func<System.Threading.Tasks.Task> value) { }
public void AddAttribute(int sequence, string name, System.MulticastDelegate value) { }
public void AddAttribute(int sequence, string name, object value) { }
public void AddAttribute(int sequence, string name, string value) { }

View File

@ -5,7 +5,6 @@ using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Rendering;
namespace Microsoft.AspNetCore.Components.RenderTree
{
@ -17,13 +16,12 @@ namespace Microsoft.AspNetCore.Components.RenderTree
/// <summary>
/// Provides methods for building a collection of <see cref="RenderTreeFrame"/> entries.
/// </summary>
public class RenderTreeBuilder : IDisposable
public sealed class RenderTreeBuilder : IDisposable
{
private readonly static object BoxedTrue = true;
private readonly static object BoxedFalse = false;
private readonly static string ComponentReferenceCaptureInvalidParentMessage = $"Component reference captures may only be added as children of frames of type {RenderTreeFrameType.Component}";
private readonly Renderer _renderer;
private readonly ArrayBuilder<RenderTreeFrame> _entries = new ArrayBuilder<RenderTreeFrame>();
private readonly Stack<int> _openElementIndices = new Stack<int>();
private RenderTreeFrameType? _lastNonAttributeFrameType;
@ -33,16 +31,7 @@ namespace Microsoft.AspNetCore.Components.RenderTree
/// <summary>
/// The reserved parameter name used for supplying child content.
/// </summary>
public const string ChildContent = nameof(ChildContent);
/// <summary>
/// Constructs an instance of <see cref="RenderTreeBuilder"/>.
/// </summary>
/// <param name="renderer">The associated <see cref="Renderer"/>.</param>
public RenderTreeBuilder(Renderer renderer)
{
_renderer = renderer ?? throw new ArgumentNullException(nameof(renderer));
}
private const string ChildContent = nameof(ChildContent);
/// <summary>
/// Appends a frame representing an element, i.e., a container for other frames.
@ -206,40 +195,6 @@ namespace Microsoft.AspNetCore.Components.RenderTree
}
}
/// <summary>
/// <para>
/// Appends a frame representing an <see cref="Action"/>-valued attribute.
/// </para>
/// <para>
/// The attribute is associated with the most recently added element. If the value is <c>null</c> and the
/// current element is not a component, the frame will be omitted.
/// </para>
/// </summary>
/// <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
/// <param name="name">The name of the attribute.</param>
/// <param name="value">The value of the attribute.</param>
public void AddAttribute(int sequence, string name, Action value)
{
AddAttribute(sequence, name, (MulticastDelegate)value);
}
/// <summary>
/// <para>
/// Appends a frame representing a <see cref="Func{Task}"/>-valued attribute.
/// </para>
/// <para>
/// The attribute is associated with the most recently added element. If the value is <c>null</c> and the
/// current element is not a component, the frame will be omitted.
/// </para>
/// </summary>
/// <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
/// <param name="name">The name of the attribute.</param>
/// <param name="value">The value of the attribute.</param>
public void AddAttribute(int sequence, string name, Func<Task> value)
{
AddAttribute(sequence, name, (MulticastDelegate)value);
}
/// <summary>
/// <para>
/// Appends a frame representing a delegate-valued attribute.

View File

@ -36,8 +36,8 @@ namespace Microsoft.AspNetCore.Components.Rendering
Component = component ?? throw new ArgumentNullException(nameof(component));
_renderer = renderer ?? throw new ArgumentNullException(nameof(renderer));
_cascadingParameters = CascadingParameterState.FindCascadingParameters(this);
CurrrentRenderTree = new RenderTreeBuilder(renderer);
_renderTreeBuilderPrevious = new RenderTreeBuilder(renderer);
CurrentRenderTree = new RenderTreeBuilder();
_renderTreeBuilderPrevious = new RenderTreeBuilder();
if (_cascadingParameters != null)
{
@ -49,7 +49,7 @@ namespace Microsoft.AspNetCore.Components.Rendering
public int ComponentId { get; }
public IComponent Component { get; }
public ComponentState ParentComponentState { get; }
public RenderTreeBuilder CurrrentRenderTree { get; private set; }
public RenderTreeBuilder CurrentRenderTree { get; private set; }
public void RenderIntoBatch(RenderBatchBuilder batchBuilder, RenderFragment renderFragment)
{
@ -61,17 +61,17 @@ namespace Microsoft.AspNetCore.Components.Rendering
}
// Swap the old and new tree builders
(CurrrentRenderTree, _renderTreeBuilderPrevious) = (_renderTreeBuilderPrevious, CurrrentRenderTree);
(CurrentRenderTree, _renderTreeBuilderPrevious) = (_renderTreeBuilderPrevious, CurrentRenderTree);
CurrrentRenderTree.Clear();
renderFragment(CurrrentRenderTree);
CurrentRenderTree.Clear();
renderFragment(CurrentRenderTree);
var diff = RenderTreeDiffBuilder.ComputeDiff(
_renderer,
batchBuilder,
ComponentId,
_renderTreeBuilderPrevious.GetFrames(),
CurrrentRenderTree.GetFrames());
CurrentRenderTree.GetFrames());
batchBuilder.UpdatedComponentDiffs.Append(diff);
}
@ -85,7 +85,7 @@ namespace Microsoft.AspNetCore.Components.Rendering
disposable.Dispose();
}
RenderTreeDiffBuilder.DisposeFrames(batchBuilder, CurrrentRenderTree.GetFrames());
RenderTreeDiffBuilder.DisposeFrames(batchBuilder, CurrentRenderTree.GetFrames());
if (_hasAnyCascadingParameterSubscriptions)
{
@ -188,7 +188,7 @@ namespace Microsoft.AspNetCore.Components.Rendering
private void DisposeBuffers()
{
((IDisposable)_renderTreeBuilderPrevious).Dispose();
((IDisposable)CurrrentRenderTree).Dispose();
((IDisposable)CurrentRenderTree).Dispose();
_latestDirectParametersSnapshot?.Dispose();
}
}

View File

@ -93,7 +93,7 @@ namespace Microsoft.AspNetCore.Components.Rendering
/// </summary>
/// <param name="componentId">The id for the component.</param>
/// <returns>The <see cref="RenderTreeBuilder"/> representing the current render tree.</returns>
private protected ArrayRange<RenderTreeFrame> GetCurrentRenderTreeFrames(int componentId) => GetRequiredComponentState(componentId).CurrrentRenderTree.GetFrames();
private protected ArrayRange<RenderTreeFrame> GetCurrentRenderTreeFrames(int componentId) => GetRequiredComponentState(componentId).CurrentRenderTree.GetFrames();
/// <summary>
/// Performs the first render for a root component, waiting for this component and all
@ -644,7 +644,7 @@ namespace Microsoft.AspNetCore.Components.Rendering
if (componentState != null)
{
RenderTreeUpdater.UpdateToMatchClientState(
componentState.CurrrentRenderTree,
componentState.CurrentRenderTree,
eventHandlerId,
fieldInfo.FieldValue);
}

View File

@ -484,10 +484,10 @@ namespace Microsoft.AspNetCore.Components
{
builder.OpenComponent<CascadingValue<Task<AuthenticationState>>>(0);
builder.AddAttribute(1, nameof(CascadingValue<Task<AuthenticationState>>.Value), AuthenticationState);
builder.AddAttribute(2, RenderTreeBuilder.ChildContent, (RenderFragment)(builder =>
builder.AddAttribute(2, "ChildContent", (RenderFragment)(builder =>
{
builder.OpenComponent<NeverReRenderComponent>(0);
builder.AddAttribute(1, RenderTreeBuilder.ChildContent, _childContent);
builder.AddAttribute(1, "ChildContent", _childContent);
builder.CloseComponent();
}));
builder.CloseComponent();

View File

@ -180,7 +180,7 @@ namespace Microsoft.AspNetCore.Components
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
builder.OpenComponent<CascadingAuthenticationState>(0);
builder.AddAttribute(1, RenderTreeBuilder.ChildContent, new RenderFragment(childBuilder =>
builder.AddAttribute(1, "ChildContent", new RenderFragment(childBuilder =>
{
childBuilder.OpenComponent<ReceiveAuthStateComponent>(0);
childBuilder.CloseComponent();

View File

@ -21,7 +21,7 @@ namespace Microsoft.AspNetCore.Components.Test
{
builder.OpenComponent<CascadingValue<string>>(0);
builder.AddAttribute(1, "Value", "Hello");
builder.AddAttribute(2, RenderTreeBuilder.ChildContent, new RenderFragment(childBuilder =>
builder.AddAttribute(2, "ChildContent", new RenderFragment(childBuilder =>
{
childBuilder.OpenComponent<CascadingParameterConsumerComponent<string>>(0);
childBuilder.AddAttribute(1, "RegularParameter", "Goodbye");
@ -59,7 +59,7 @@ namespace Microsoft.AspNetCore.Components.Test
{
builder.OpenComponent<CascadingValue<string>>(0);
builder.AddAttribute(1, "Value", "Hello");
builder.AddAttribute(2, RenderTreeBuilder.ChildContent, new RenderFragment(childBuilder =>
builder.AddAttribute(2, "ChildContent", new RenderFragment(childBuilder =>
{
childBuilder.OpenComponent<CascadingParameterConsumerComponent<string>>(0);
childBuilder.AddAttribute(1, "RegularParameter", regularParameterValue);
@ -107,7 +107,7 @@ namespace Microsoft.AspNetCore.Components.Test
{
builder.OpenComponent<CascadingValue<string>>(0);
builder.AddAttribute(1, "Value", providedValue);
builder.AddAttribute(2, RenderTreeBuilder.ChildContent, new RenderFragment(childBuilder =>
builder.AddAttribute(2, "ChildContent", new RenderFragment(childBuilder =>
{
childBuilder.OpenComponent<CascadingParameterConsumerComponent<string>>(0);
childBuilder.AddAttribute(1, "RegularParameter", "Goodbye");
@ -152,7 +152,7 @@ namespace Microsoft.AspNetCore.Components.Test
{
builder.OpenComponent<CascadingValue<string>>(0);
builder.AddAttribute(1, "Value", "Unchanging value");
builder.AddAttribute(2, RenderTreeBuilder.ChildContent, new RenderFragment(childBuilder =>
builder.AddAttribute(2, "ChildContent", new RenderFragment(childBuilder =>
{
childBuilder.OpenComponent<CascadingParameterConsumerComponent<string>>(0);
childBuilder.AddAttribute(1, "RegularParameter", "Goodbye");
@ -192,12 +192,12 @@ namespace Microsoft.AspNetCore.Components.Test
builder.OpenComponent<CascadingValue<int>>(0);
builder.AddAttribute(1, "Value", 123);
builder.AddAttribute(2, "IsFixed", true);
builder.AddAttribute(3, RenderTreeBuilder.ChildContent, new RenderFragment(builder2 =>
builder.AddAttribute(3, "ChildContent", new RenderFragment(builder2 =>
{
// Then also have a non-fixed cascading value so we can show that unsubscription works
builder2.OpenComponent<CascadingValue<string>>(0);
builder2.AddAttribute(1, "Value", providedValue);
builder2.AddAttribute(2, RenderTreeBuilder.ChildContent, new RenderFragment(builder3 =>
builder2.AddAttribute(2, "ChildContent", new RenderFragment(builder3 =>
{
if (displayNestedComponent)
{
@ -258,7 +258,7 @@ namespace Microsoft.AspNetCore.Components.Test
builder.OpenComponent<CascadingValue<string>>(0);
builder.AddAttribute(1, "Value", providedValue);
builder.AddAttribute(2, "IsFixed", true);
builder.AddAttribute(3, RenderTreeBuilder.ChildContent, new RenderFragment(childBuilder =>
builder.AddAttribute(3, "ChildContent", new RenderFragment(childBuilder =>
{
if (shouldIncludeChild)
{

View File

@ -459,7 +459,7 @@ namespace Microsoft.AspNetCore.Components.Test
public ParameterCollection Build()
{
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
builder.OpenComponent<FakeComponent>(0);
foreach (var kvp in _keyValuePairs)
{

View File

@ -16,20 +16,11 @@ namespace Microsoft.AspNetCore.Components.Test
{
public class RenderTreeBuilderTest
{
[Fact]
public void RequiresNonnullRenderer()
{
Assert.Throws<ArgumentNullException>(() =>
{
new RenderTreeBuilder(null);
});
}
[Fact]
public void StartsEmpty()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Assert
var frames = builder.GetFrames();
@ -41,7 +32,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CanAddText()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var nullString = (string)null;
// Act
@ -61,7 +52,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CanAddMarkup()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenElement(0, "some elem");
@ -84,7 +75,7 @@ namespace Microsoft.AspNetCore.Components.Test
// as opposed to calling builder.AddMarkupContent directly.
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act - can use either constructor or cast
builder.AddContent(0, (MarkupString)"Some markup");
@ -101,7 +92,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CanAddNullMarkup()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.AddMarkupContent(0, null);
@ -116,7 +107,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CanAddNonStringValueAsText()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var nullObject = (object)null;
// Act
@ -134,7 +125,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void UnclosedElementsHaveNoSubtreeLength()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenElement(0, "my element");
@ -148,7 +139,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void ClosedEmptyElementsHaveSubtreeLengthOne()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.AddContent(0, "some frame so that the element isn't at position zero");
@ -165,7 +156,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void ClosedElementsHaveCorrectSubtreeLength()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenElement(0, "my element");
@ -184,7 +175,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CanNestElements()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.AddContent(0, "standalone text 1"); // 0: standalone text 1
@ -224,7 +215,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CanAddAttributes()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
Action<UIEventArgs> eventHandler = eventInfo => { };
// Act
@ -251,7 +242,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CanAddMultipleAttributes_AllowsNull()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenElement(0, "myelement");
@ -269,7 +260,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CanAddMultipleAttributes_InterspersedWithOtherAttributes()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
Action<UIEventArgs> eventHandler = eventInfo => { };
// Act
@ -367,7 +358,7 @@ namespace Microsoft.AspNetCore.Components.Test
private void CanAddMultipleAttributesTest(IEnumerable<KeyValuePair<string, object>> attributes)
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenElement(0, "myelement");
@ -389,7 +380,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CannotAddAttributeAtRoot()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act/Assert
Assert.Throws<InvalidOperationException>(() =>
@ -402,7 +393,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CannotAddDelegateAttributeAtRoot()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act/Assert
Assert.Throws<InvalidOperationException>(() =>
@ -415,7 +406,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CannotAddAttributeToText()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act/Assert
Assert.Throws<InvalidOperationException>(() =>
@ -430,7 +421,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CannotAddEventHandlerAttributeToText()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act/Assert
Assert.Throws<InvalidOperationException>(() =>
@ -445,7 +436,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CannotAddAttributeToRegion()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act/Assert
Assert.Throws<InvalidOperationException>(() =>
@ -459,7 +450,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CannotAddAttributeToElementReferenceCapture()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act/Assert
Assert.Throws<InvalidOperationException>(() =>
@ -474,7 +465,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CannotAddAttributeToComponentReferenceCapture()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act/Assert
Assert.Throws<InvalidOperationException>(() =>
@ -489,7 +480,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CanAddChildComponentsUsingGenericParam()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenElement(10, "parent"); // 0: <parent>
@ -516,7 +507,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CanAddChildComponentsUsingTypeArgument()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
var componentType = typeof(TestComponent);
@ -544,7 +535,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CanAddRegions()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenElement(10, "parent"); // 0: <parent>
@ -572,7 +563,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CanAddFragments()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
RenderFragment fragment = fragmentBuilder =>
{
fragmentBuilder.AddContent(0, "Hello from the fragment");
@ -599,7 +590,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CanAddElementReferenceCaptureInsideElement()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
Action<ElementReference> referenceCaptureAction = elementReference => { };
// Act
@ -621,7 +612,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CannotAddElementReferenceCaptureWithNoParent()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act/Assert
Assert.Throws<InvalidOperationException>(() =>
@ -634,7 +625,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CannotAddElementReferenceCaptureInsideComponent()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act/Assert
Assert.Throws<InvalidOperationException>(() =>
@ -648,7 +639,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CannotAddElementReferenceCaptureInsideRegion()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act/Assert
Assert.Throws<InvalidOperationException>(() =>
@ -667,7 +658,7 @@ namespace Microsoft.AspNetCore.Components.Test
// just works.
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
Action<ElementReference> referenceCaptureAction1 = elementReference => { };
Action<ElementReference> referenceCaptureAction2 = elementReference => { };
@ -688,7 +679,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CanAddComponentReferenceCaptureInsideComponent()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
Action<object> myAction = elementReference => { };
// Act
@ -710,7 +701,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CannotAddComponentReferenceCaptureWithNoParent()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act/Assert
Assert.Throws<InvalidOperationException>(() =>
@ -723,7 +714,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CannotAddComponentReferenceCaptureInsideElement()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act/Assert
Assert.Throws<InvalidOperationException>(() =>
@ -737,7 +728,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CannotAddComponentReferenceCaptureInsideRegion()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act/Assert
Assert.Throws<InvalidOperationException>(() =>
@ -756,7 +747,7 @@ namespace Microsoft.AspNetCore.Components.Test
// just works.
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
Action<object> referenceCaptureAction1 = elementReference => { };
Action<object> referenceCaptureAction2 = elementReference => { };
@ -777,7 +768,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CanClear()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.AddContent(0, "some text");
@ -794,7 +785,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_BoolTrue_AddsFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenElement(0, "elem");
@ -812,7 +803,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_BoolFalse_IgnoresFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenElement(0, "elem");
@ -831,7 +822,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Component_Bool_SetsAttributeValue(bool value)
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenComponent<TestComponent>(0);
@ -849,7 +840,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_StringValue_AddsFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenElement(0, "elem");
@ -867,7 +858,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_StringNull_IgnoresFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenElement(0, "elem");
@ -886,7 +877,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Component_StringValue_SetsAttributeValue(string value)
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenComponent<TestComponent>(0);
@ -904,7 +895,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_EventHandler_AddsFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var value = new Action<UIEventArgs>((e) => { });
@ -924,7 +915,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_NullEventHandler_IgnoresFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenElement(0, "elem");
@ -941,7 +932,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_Action_AddsFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var value = new Action(() => { });
@ -961,7 +952,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_NullAction_IgnoresFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenElement(0, "elem");
@ -985,7 +976,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Component_EventHandlerValue_SetsAttributeValue(Action<UIEventArgs> value)
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenComponent<TestComponent>(0);
@ -1003,7 +994,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_EventCallback_AddsFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var callback = new EventCallback(null, new Action(() => { }));
// Act
@ -1022,7 +1013,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_EventCallback_Default_DoesNotAddFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var callback = default(EventCallback);
// Act
@ -1040,7 +1031,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_EventCallbackWithReceiver_AddsFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var receiver = Mock.Of<IHandleEvent>();
var callback = new EventCallback(receiver, new Action(() => { }));
@ -1060,7 +1051,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Component_EventCallback_AddsFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var receiver = Mock.Of<IHandleEvent>();
var callback = new EventCallback(receiver, new Action(() => { }));
@ -1080,7 +1071,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_EventCallbackOfT_AddsFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var callback = new EventCallback<string>(null, new Action<string>((s) => { }));
// Act
@ -1099,7 +1090,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_EventCallbackOfT_Default_DoesNotAddFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var callback = default(EventCallback<string>);
// Act
@ -1117,7 +1108,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_EventCallbackWithReceiverOfT_AddsFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var receiver = Mock.Of<IHandleEvent>();
var callback = new EventCallback<string>(receiver, new Action<string>((s) => { }));
@ -1137,7 +1128,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Component_EventCallbackOfT_AddsFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var receiver = Mock.Of<IHandleEvent>();
var callback = new EventCallback<string>(receiver, new Action<string>((s) => { }));
@ -1157,7 +1148,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_ObjectBoolTrue_AddsFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenElement(0, "elem");
@ -1175,7 +1166,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_ObjectBoolFalse_IgnoresFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenElement(0, "elem");
@ -1194,7 +1185,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Component_ObjectBoolValue_SetsAttributeValue(bool value)
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenComponent<TestComponent>(0);
@ -1212,7 +1203,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_ObjectStringValue_AddsFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenElement(0, "elem");
@ -1230,7 +1221,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Component_ObjectStringValue_SetsAttributeValue()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenComponent<TestComponent>(0);
@ -1248,7 +1239,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_ObjectEventHandler_AddsFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var value = new Action<UIEventArgs>((e) => { });
@ -1268,7 +1259,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Component_ObjectUIEventHandleValue_SetsAttributeValue()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var value = new Action<UIEventArgs>((e) => { });
@ -1288,7 +1279,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_ObjectAction_AddsFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var value = new Action(() => { });
@ -1308,7 +1299,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Component_ObjectAction_SetsAttributeValue()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var value = new Action(() => { });
@ -1328,7 +1319,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_ObjectEventCallback_AddsFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var callback = new EventCallback(null, new Action(() => { }));
// Act
@ -1347,7 +1338,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_ObjectEventCallback_Default_DoesNotAddFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var callback = default(EventCallback);
// Act
@ -1365,7 +1356,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_ObjectEventCallbackWithReceiver_AddsFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var receiver = Mock.Of<IHandleEvent>();
var callback = new EventCallback(receiver, new Action(() => { }));
@ -1385,7 +1376,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Component_ObjectEventCallback_AddsFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var receiver = Mock.Of<IHandleEvent>();
var callback = new EventCallback(receiver, new Action(() => { }));
@ -1405,7 +1396,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_ObjectEventCallbackOfT_AddsFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var callback = new EventCallback<string>(null, new Action<string>((s) => { }));
// Act
@ -1424,7 +1415,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_ObjectEventCallbackOfT_Default_DoesNotAddFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var callback = default(EventCallback<string>);
// Act
@ -1442,7 +1433,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_ObjectEventCallbackWithReceiverOfT_AddsFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var receiver = Mock.Of<IHandleEvent>();
var callback = new EventCallback<string>(receiver, new Action<string>((s) => { }));
@ -1462,7 +1453,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void AddAttribute_Element_ObjectNull_IgnoresFrame()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenElement(0, "elem");
@ -1479,7 +1470,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CanAddKeyToElement()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var keyValue = new object();
// Act
@ -1505,7 +1496,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CanAddKeyToComponent()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
var keyValue = new object();
// Act
@ -1531,7 +1522,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CannotAddKeyOutsideComponentOrElement_TreeRoot()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act/Assert
var ex = Assert.Throws<InvalidOperationException>(() =>
@ -1545,7 +1536,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void CannotAddKeyOutsideComponentOrElement_RegionRoot()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act/Assert
builder.OpenElement(0, "some element");
@ -1561,7 +1552,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void IgnoresNullElementKey()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenElement(0, "elem");
@ -1582,7 +1573,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void IgnoresNullComponentKey()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
// Act
builder.OpenComponent<TestComponent>(0);
@ -1603,7 +1594,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void ProcessDuplicateAttributes_DoesNotRemoveDuplicatesWithoutAddMultipleAttributes()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
builder.OpenElement(0, "div");
builder.AddAttribute(0, "id", "hi");
builder.AddAttribute(0, "id", "bye");
@ -1627,7 +1618,7 @@ namespace Microsoft.AspNetCore.Components.Test
// Arrange
var capture = (Action<ElementReference>)((_) => { });
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
builder.OpenElement(0, "div");
builder.AddAttribute(0, "id", "hi");
builder.AddMultipleAttributes(0, new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase)
@ -1652,7 +1643,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void ProcessDuplicateAttributes_StopsAtFirstNonAttributeFrame_Content()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
builder.OpenElement(0, "div");
builder.AddAttribute(0, "id", "hi");
builder.AddMultipleAttributes(0, new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase)
@ -1677,7 +1668,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void ProcessDuplicateAttributes_CanRemoveDuplicateInsideElement()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
builder.OpenElement(0, "div");
builder.AddAttribute(0, "id", "hi");
builder.AddMultipleAttributes(0, new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase)
@ -1700,7 +1691,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void ProcessDuplicateAttributes_CanRemoveDuplicateInsideComponent()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
builder.OpenComponent<TestComponent>(0);
builder.AddAttribute(0, "id", "hi");
builder.AddMultipleAttributes(0, new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase)
@ -1724,7 +1715,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void ProcessDuplicateAttributes_SilentFrameFollowedBySameAttribute()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
builder.OpenComponent<TestComponent>(0);
builder.AddAttribute(0, "id", (string)null);
builder.AddMultipleAttributes(0, new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase)
@ -1747,7 +1738,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void ProcessDuplicateAttributes_DoesNotRemoveDuplicatesInsideChildElement()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
builder.OpenElement(0, "div");
builder.AddAttribute(0, "id", "hi");
builder.AddMultipleAttributes(0, new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase)
@ -1777,7 +1768,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void ProcessDuplicateAttributes_CanRemoveOverwrittenAttributes()
{
// Arrange
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
builder.OpenElement(0, "div");
builder.AddAttribute(0, "A", "hi");
builder.AddAttribute(0, "2", new EventCallback(null, (Action)(() => { })));

View File

@ -23,8 +23,8 @@ namespace Microsoft.AspNetCore.Components.Test
public RenderTreeDiffBuilderTest()
{
renderer = new FakeRenderer();
oldTree = new RenderTreeBuilder(renderer);
newTree = new RenderTreeBuilder(renderer);
oldTree = new RenderTreeBuilder();
newTree = new RenderTreeBuilder();
}
void IDisposable.Dispose()
@ -217,7 +217,7 @@ namespace Microsoft.AspNetCore.Components.Test
oldTree.SetKey("retained key");
oldTree.AddAttribute(1, "ParamName", "Param old value");
oldTree.CloseComponent();
using var initial = new RenderTreeBuilder(renderer);
using var initial = new RenderTreeBuilder();
GetRenderedBatch(initial, oldTree, false); // Assign initial IDs
var oldComponent = GetComponents<CaptureSetParametersComponent>(oldTree).Single();
@ -265,7 +265,7 @@ namespace Microsoft.AspNetCore.Components.Test
oldTree.CloseComponent();
// Instantiate initial components
using var initial = new RenderTreeBuilder(renderer);
using var initial = new RenderTreeBuilder();
GetRenderedBatch(initial, oldTree, false);
var oldComponents = GetComponents(oldTree);
@ -297,7 +297,7 @@ namespace Microsoft.AspNetCore.Components.Test
oldTree.CloseComponent();
// Instantiate initial component
using var renderTreeBuilder = new RenderTreeBuilder(renderer);
using var renderTreeBuilder = new RenderTreeBuilder();
GetRenderedBatch(renderTreeBuilder, oldTree, false);
var oldComponent = GetComponents(oldTree).Single();
Assert.NotNull(oldComponent);
@ -736,7 +736,7 @@ namespace Microsoft.AspNetCore.Components.Test
// Arrange
oldTree.OpenComponent<FakeComponent>(123);
oldTree.CloseComponent();
using var initial = new RenderTreeBuilder(renderer);
using var initial = new RenderTreeBuilder();
GetRenderedBatch(initial, oldTree, false); // Assign initial IDs
newTree.OpenComponent<FakeComponent2>(123);
newTree.CloseComponent();
@ -1553,7 +1553,7 @@ namespace Microsoft.AspNetCore.Components.Test
newTree.CloseElement(); // </container>
using var batchBuilder = new RenderBatchBuilder();
using var renderTreeBuilder = new RenderTreeBuilder(renderer);
using var renderTreeBuilder = new RenderTreeBuilder();
RenderTreeDiffBuilder.ComputeDiff(renderer, batchBuilder, 0, renderTreeBuilder.GetFrames(), oldTree.GetFrames());
var originalFakeComponentInstance = oldTree.GetFrames().Array[2].Component;
var originalFakeComponent2Instance = oldTree.GetFrames().Array[3].Component;
@ -1639,7 +1639,7 @@ namespace Microsoft.AspNetCore.Components.Test
newTree.CloseComponent();
using var batchBuilder = new RenderBatchBuilder();
using var renderTree = new RenderTreeBuilder(renderer);
using var renderTree = new RenderTreeBuilder();
RenderTreeDiffBuilder.ComputeDiff(renderer, batchBuilder, 0, renderTree.GetFrames(), oldTree.GetFrames());
var originalComponentInstance = (FakeComponent)oldTree.GetFrames().Array[0].Component;
@ -1679,7 +1679,7 @@ namespace Microsoft.AspNetCore.Components.Test
}
using var batchBuilder = new RenderBatchBuilder();
using var renderTreeBuilder = new RenderTreeBuilder(renderer);
using var renderTreeBuilder = new RenderTreeBuilder();
RenderTreeDiffBuilder.ComputeDiff(renderer, batchBuilder, 0, renderTreeBuilder.GetFrames(), oldTree.GetFrames());
var originalComponentInstance = (CaptureSetParametersComponent)oldTree.GetFrames().Array[0].Component;
Assert.Equal(1, originalComponentInstance.SetParametersCallCount);
@ -1709,7 +1709,7 @@ namespace Microsoft.AspNetCore.Components.Test
}
using var batchBuilder = new RenderBatchBuilder();
using var renderTreeBuilder = new RenderTreeBuilder(renderer);
using var renderTreeBuilder = new RenderTreeBuilder();
RenderTreeDiffBuilder.ComputeDiff(renderer, batchBuilder, 0, renderTreeBuilder.GetFrames(), oldTree.GetFrames());
var componentInstance = (CaptureSetParametersComponent)oldTree.GetFrames().Array[0].Component;
Assert.Equal(1, componentInstance.SetParametersCallCount);
@ -1735,7 +1735,7 @@ namespace Microsoft.AspNetCore.Components.Test
newTree.CloseComponent(); // </DisposableComponent>
using var batchBuilder = new RenderBatchBuilder();
using var renderTree = new RenderTreeBuilder(renderer);
using var renderTree = new RenderTreeBuilder();
RenderTreeDiffBuilder.ComputeDiff(renderer, batchBuilder, 0, renderTree.GetFrames(), oldTree.GetFrames());
// Act/Assert
@ -1945,7 +1945,7 @@ namespace Microsoft.AspNetCore.Components.Test
oldTree.AddAttribute(1, nameof(FakeComponent.StringProperty), "Second param");
oldTree.CloseComponent();
using var renderTreeBuilder = new RenderTreeBuilder(renderer);
using var renderTreeBuilder = new RenderTreeBuilder();
GetRenderedBatch(renderTreeBuilder, oldTree, false); // Assign initial IDs
var oldComponents = GetComponents<CaptureSetParametersComponent>(oldTree);
@ -2147,7 +2147,7 @@ namespace Microsoft.AspNetCore.Components.Test
{
if (initializeFromFrames)
{
using var renderTreeBuilder = new RenderTreeBuilder(renderer);
using var renderTreeBuilder = new RenderTreeBuilder();
using var initializeBatchBuilder = new RenderBatchBuilder();
var emptyFrames = renderTreeBuilder.GetFrames();

View File

@ -17,9 +17,9 @@ namespace Microsoft.AspNetCore.Components.Test
// Arrange
var valuePropName = "testprop";
var renderer = new TestRenderer();
var builder = new RenderTreeBuilder(renderer);
var builder = new RenderTreeBuilder();
builder.OpenElement(0, "elem");
builder.AddAttribute(1, "eventname", () => { });
builder.AddAttribute(1, "eventname", (Action)(() => { }));
builder.SetUpdatesAttributeName(valuePropName);
builder.AddAttribute(2, valuePropName, "initial value");
builder.CloseElement();
@ -45,9 +45,9 @@ namespace Microsoft.AspNetCore.Components.Test
// Arrange
var valuePropName = "testprop";
var renderer = new TestRenderer();
var builder = new RenderTreeBuilder(renderer);
var builder = new RenderTreeBuilder();
builder.OpenElement(0, "elem");
builder.AddAttribute(1, "eventname", () => { });
builder.AddAttribute(1, "eventname", (Action)(() => { }));
builder.SetUpdatesAttributeName(valuePropName);
builder.AddAttribute(2, valuePropName, "initial value");
builder.CloseElement();
@ -70,14 +70,14 @@ namespace Microsoft.AspNetCore.Components.Test
// Arrange
var valuePropName = "testprop";
var renderer = new TestRenderer();
var builder = new RenderTreeBuilder(renderer);
var builder = new RenderTreeBuilder();
builder.OpenElement(0, "elem");
builder.AddAttribute(1, "eventname", () => { });
builder.AddAttribute(1, "eventname", (Action)(() => { }));
builder.SetUpdatesAttributeName(valuePropName);
builder.AddAttribute(2, valuePropName, "unchanged 1");
builder.CloseElement();
builder.OpenElement(3, "elem");
builder.AddAttribute(4, "eventname", () => { });
builder.AddAttribute(4, "eventname", (Action)(() => { }));
builder.SetUpdatesAttributeName(valuePropName);
builder.AddAttribute(5, "unrelated prop before", "unchanged 2");
builder.AddAttribute(6, valuePropName, "initial value");
@ -108,9 +108,9 @@ namespace Microsoft.AspNetCore.Components.Test
// Arrange
var valuePropName = "testprop";
var renderer = new TestRenderer();
var builder = new RenderTreeBuilder(renderer);
var builder = new RenderTreeBuilder();
builder.OpenElement(0, "elem");
builder.AddAttribute(1, "eventname", () => { });
builder.AddAttribute(1, "eventname", (Action)(() => { }));
builder.SetUpdatesAttributeName(valuePropName);
builder.CloseElement();
var frames = builder.GetFrames();
@ -133,13 +133,13 @@ namespace Microsoft.AspNetCore.Components.Test
// Arrange
var valuePropName = "testprop";
var renderer = new TestRenderer();
var builder = new RenderTreeBuilder(renderer);
var builder = new RenderTreeBuilder();
builder.OpenElement(0, "grandparent");
builder.OpenRegion(1);
builder.OpenElement(2, "sibling before"); // To show that non-ancestors aren't expanded
builder.CloseElement();
builder.OpenElement(3, "elem with handler");
builder.AddAttribute(4, "eventname", () => { });
builder.AddAttribute(4, "eventname", (Action)(() => { }));
builder.SetUpdatesAttributeName(valuePropName);
builder.CloseElement(); // elem with handler
builder.CloseRegion();

View File

@ -814,7 +814,7 @@ namespace Microsoft.AspNetCore.Components.Test
parentComponent.RenderFragment = (builder) =>
{
builder.OpenComponent<EventComponent>(0);
builder.AddAttribute(1, nameof(EventComponent.OnClickAction), parentComponent.SomeMethod);
builder.AddAttribute(1, nameof(EventComponent.OnClickAction), (Action)parentComponent.SomeMethod);
builder.CloseComponent();
};
parentComponent.OnEvent = () =>
@ -855,10 +855,10 @@ namespace Microsoft.AspNetCore.Components.Test
parentComponent.RenderFragment = (builder) =>
{
builder.OpenComponent<EventComponent>(0);
builder.AddAttribute(1, nameof(EventComponent.OnClickAction), () =>
builder.AddAttribute(1, nameof(EventComponent.OnClickAction), (Action)(() =>
{
parentComponent.SomeMethod();
});
}));
builder.CloseComponent();
};
parentComponent.OnEvent = () =>
@ -1133,10 +1133,10 @@ namespace Microsoft.AspNetCore.Components.Test
parentComponent.RenderFragment = (builder) =>
{
builder.OpenComponent<EventComponent>(0);
builder.AddAttribute(1, nameof(EventComponent.OnClickAction), () =>
builder.AddAttribute(1, nameof(EventComponent.OnClickAction), (Action)(() =>
{
// Do nothing.
});
}));
builder.CloseComponent();
};
@ -1434,10 +1434,10 @@ namespace Microsoft.AspNetCore.Components.Test
parentComponent.RenderFragment = (builder) =>
{
builder.OpenComponent<EventComponent>(0);
builder.AddAttribute(1, nameof(EventComponent.OnClickAsyncAction), async () =>
builder.AddAttribute(1, nameof(EventComponent.OnClickAsyncAction), (Func<Task>)(async () =>
{
await tcs.Task;
});
}));
builder.CloseComponent();
};
@ -1543,11 +1543,11 @@ namespace Microsoft.AspNetCore.Components.Test
parentComponent.RenderFragment = (builder) =>
{
builder.OpenComponent<EventComponent>(0);
builder.AddAttribute(1, nameof(EventComponent.OnClickAsyncAction), async () =>
builder.AddAttribute(1, nameof(EventComponent.OnClickAsyncAction), (Func<Task>)(async () =>
{
await tcs.Task;
throw new TaskCanceledException();
});
}));
builder.CloseComponent();
};
@ -1661,11 +1661,11 @@ namespace Microsoft.AspNetCore.Components.Test
parentComponent.RenderFragment = (builder) =>
{
builder.OpenComponent<EventComponent>(0);
builder.AddAttribute(1, nameof(EventComponent.OnClickAsyncAction), async () =>
builder.AddAttribute(1, nameof(EventComponent.OnClickAsyncAction), (Func<Task>)(async () =>
{
await tcs.Task;
throw new InvalidTimeZoneException();
});
}));
builder.CloseComponent();
};

View File

@ -1,10 +1,9 @@
// 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 Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.RenderTree;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.RenderTree;
namespace Microsoft.AspNetCore.Components.Test.Helpers
{
@ -20,7 +19,7 @@ namespace Microsoft.AspNetCore.Components.Test.Helpers
private static ParameterCollection DictionaryToParameterCollection(
IDictionary<string, object> parameters)
{
var builder = new RenderTreeBuilder(new TestRenderer());
var builder = new RenderTreeBuilder();
builder.OpenComponent<AbstractComponent>(0);
foreach (var pair in parameters)
{

View File

@ -110,7 +110,7 @@ namespace Microsoft.AspNetCore.Components.Forms
builder.OpenComponent<CascadingValue<EditContext>>(3);
builder.AddAttribute(4, "IsFixed", true);
builder.AddAttribute(5, "Value", _fixedEditContext);
builder.AddAttribute(6, RenderTreeBuilder.ChildContent, ChildContent?.Invoke(_fixedEditContext));
builder.AddAttribute(6, "ChildContent", ChildContent?.Invoke(_fixedEditContext));
builder.CloseComponent();
builder.CloseElement();

View File

@ -437,7 +437,7 @@ namespace Microsoft.AspNetCore.Components.Forms
{
builder.OpenComponent<CascadingValue<EditContext>>(0);
builder.AddAttribute(1, "Value", EditContext);
builder.AddAttribute(2, RenderTreeBuilder.ChildContent, new RenderFragment(childBuilder =>
builder.AddAttribute(2, "ChildContent", new RenderFragment(childBuilder =>
{
childBuilder.OpenComponent<TComponent>(0);
childBuilder.AddAttribute(0, "Value", Value);

View File

@ -2,12 +2,12 @@
<div class="top-row pl-4 navbar navbar-dark">
<a class="navbar-brand" href="">MvcSandbox</a>
<button class="navbar-toggler" onclick="@ToggleNavMenu">
<button class="navbar-toggler" @onclick="@ToggleNavMenu">
<span class="navbar-toggler-icon"></span>
</button>
</div>
<div class="@NavMenuCssClass" onclick="@ToggleNavMenu">
<div class="@NavMenuCssClass" @onclick="@ToggleNavMenu">
<ul class="nav flex-column">
<li class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">