Update RendererTests to be more explicit about batch expectations

This commit is contained in:
Steve Sanderson 2018-01-29 20:28:38 +00:00
parent 080e6395cb
commit 55592f583b
1 changed files with 34 additions and 29 deletions

View File

@ -31,7 +31,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
renderer.RenderNewBatch(componentId); renderer.RenderNewBatch(componentId);
// Assert // Assert
Assert.Collection(renderer.RenderTreesByComponentId[componentId], Assert.Collection(renderer.Batches.Single().RenderTreesByComponentId[componentId],
node => AssertNode.Element(node, "my element", 1), node => AssertNode.Element(node, "my element", 1),
node => AssertNode.Text(node, "some text")); node => AssertNode.Text(node, "some text"));
} }
@ -52,7 +52,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
// Act/Assert // Act/Assert
var componentId = renderer.AssignComponentId(component); var componentId = renderer.AssignComponentId(component);
renderer.RenderNewBatch(componentId); renderer.RenderNewBatch(componentId);
var componentNode = renderer.RenderTreesByComponentId[componentId] var componentNode = renderer.Batches.Single().RenderTreesByComponentId[componentId]
.Single(node => node.NodeType == RenderTreeNodeType.Component); .Single(node => node.NodeType == RenderTreeNodeType.Component);
var nestedComponentId = componentNode.ComponentId; var nestedComponentId = componentNode.ComponentId;
@ -60,7 +60,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
Assert.IsType<MessageComponent>(componentNode.Component); Assert.IsType<MessageComponent>(componentNode.Component);
// The nested component was rendered as part of the batch // The nested component was rendered as part of the batch
Assert.Collection(renderer.RenderTreesByComponentId[nestedComponentId], Assert.Collection(renderer.Batches.Single().RenderTreesByComponentId[nestedComponentId],
node => AssertNode.Text(node, "Nested component output")); node => AssertNode.Text(node, "Nested component output"));
} }
@ -74,13 +74,13 @@ namespace Microsoft.AspNetCore.Blazor.Test
// Act/Assert: first render // Act/Assert: first render
renderer.RenderNewBatch(componentId); renderer.RenderNewBatch(componentId);
Assert.Collection(renderer.RenderTreesByComponentId[componentId], Assert.Collection(renderer.Batches.Single().RenderTreesByComponentId[componentId],
node => AssertNode.Text(node, "Initial message")); node => AssertNode.Text(node, "Initial message"));
// Act/Assert: second render // Act/Assert: second render
component.Message = "Modified message"; component.Message = "Modified message";
renderer.RenderNewBatch(componentId); renderer.RenderNewBatch(componentId);
Assert.Collection(renderer.RenderTreesByComponentId[componentId], Assert.Collection(renderer.Batches[1].RenderTreesByComponentId[componentId],
node => AssertNode.Text(node, "Modified message")); node => AssertNode.Text(node, "Modified message"));
} }
@ -96,7 +96,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
}); });
var parentComponentId = renderer.AssignComponentId(parentComponent); var parentComponentId = renderer.AssignComponentId(parentComponent);
renderer.RenderNewBatch(parentComponentId); renderer.RenderNewBatch(parentComponentId);
var nestedComponentNode = renderer.RenderTreesByComponentId[parentComponentId] var nestedComponentNode = renderer.Batches.Single().RenderTreesByComponentId[parentComponentId]
.Single(node => node.NodeType == RenderTreeNodeType.Component); .Single(node => node.NodeType == RenderTreeNodeType.Component);
var nestedComponent = (MessageComponent)nestedComponentNode.Component; var nestedComponent = (MessageComponent)nestedComponentNode.Component;
var nestedComponentId = nestedComponentNode.ComponentId; var nestedComponentId = nestedComponentNode.ComponentId;
@ -104,13 +104,13 @@ namespace Microsoft.AspNetCore.Blazor.Test
// Act/Assert: inital render // Act/Assert: inital render
nestedComponent.Message = "Render 1"; nestedComponent.Message = "Render 1";
renderer.RenderNewBatch(nestedComponentId); renderer.RenderNewBatch(nestedComponentId);
Assert.Collection(renderer.RenderTreesByComponentId[nestedComponentId], Assert.Collection(renderer.Batches[1].RenderTreesByComponentId[nestedComponentId],
node => AssertNode.Text(node, "Render 1")); node => AssertNode.Text(node, "Render 1"));
// Act/Assert: re-render // Act/Assert: re-render
nestedComponent.Message = "Render 2"; nestedComponent.Message = "Render 2";
renderer.RenderNewBatch(nestedComponentId); renderer.RenderNewBatch(nestedComponentId);
Assert.Collection(renderer.RenderTreesByComponentId[nestedComponentId], Assert.Collection(renderer.Batches[2].RenderTreesByComponentId[nestedComponentId],
node => AssertNode.Text(node, "Render 2")); node => AssertNode.Text(node, "Render 2"));
} }
@ -129,7 +129,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
renderer.RenderNewBatch(componentId); renderer.RenderNewBatch(componentId);
var (eventHandlerNodeIndex, _) = FirstWithIndex( var (eventHandlerNodeIndex, _) = FirstWithIndex(
renderer.RenderTreesByComponentId[componentId], renderer.Batches.Single().RenderTreesByComponentId[componentId],
node => node.AttributeValue != null); node => node.AttributeValue != null);
// Assert: Event not yet fired // Assert: Event not yet fired
@ -157,7 +157,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
renderer.RenderNewBatch(parentComponentId); renderer.RenderNewBatch(parentComponentId);
// Arrange: Render nested component // Arrange: Render nested component
var nestedComponentNode = renderer.RenderTreesByComponentId[parentComponentId] var nestedComponentNode = renderer.Batches.Single().RenderTreesByComponentId[parentComponentId]
.Single(node => node.NodeType == RenderTreeNodeType.Component); .Single(node => node.NodeType == RenderTreeNodeType.Component);
var nestedComponent = (EventComponent)nestedComponentNode.Component; var nestedComponent = (EventComponent)nestedComponentNode.Component;
nestedComponent.Handler = args => { receivedArgs = args; }; nestedComponent.Handler = args => { receivedArgs = args; };
@ -166,7 +166,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
// Find nested component's event handler ndoe // Find nested component's event handler ndoe
var (eventHandlerNodeIndex, _) = FirstWithIndex( var (eventHandlerNodeIndex, _) = FirstWithIndex(
renderer.RenderTreesByComponentId[nestedComponentId], renderer.Batches[1].RenderTreesByComponentId[nestedComponentId],
node => node.AttributeValue != null); node => node.AttributeValue != null);
// Assert: Event not yet fired // Assert: Event not yet fired
@ -217,12 +217,12 @@ namespace Microsoft.AspNetCore.Blazor.Test
// Act/Assert: Render component in renderer1 // Act/Assert: Render component in renderer1
renderer1.RenderNewBatch(renderer1ComponentId); renderer1.RenderNewBatch(renderer1ComponentId);
Assert.True(renderer1.RenderTreesByComponentId.ContainsKey(renderer1ComponentId)); Assert.True(renderer1.Batches.Single().RenderTreesByComponentId.ContainsKey(renderer1ComponentId));
Assert.False(renderer2.RenderTreesByComponentId.ContainsKey(renderer2ComponentId)); Assert.Empty(renderer2.Batches);
// Act/Assert: Render same component in renderer2 // Act/Assert: Render same component in renderer2
renderer2.RenderNewBatch(renderer2ComponentId); renderer2.RenderNewBatch(renderer2ComponentId);
Assert.True(renderer2.RenderTreesByComponentId.ContainsKey(renderer2ComponentId)); Assert.True(renderer2.Batches.Single().RenderTreesByComponentId.ContainsKey(renderer2ComponentId));
} }
[Fact] [Fact]
@ -313,7 +313,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
var rootComponentId = renderer.AssignComponentId(component); var rootComponentId = renderer.AssignComponentId(component);
renderer.RenderNewBatch(rootComponentId); renderer.RenderNewBatch(rootComponentId);
var nestedComponentInstance = (MessageComponent)renderer.RenderTreesByComponentId[rootComponentId] var nestedComponentInstance = (MessageComponent)renderer.Batches.Single().RenderTreesByComponentId[rootComponentId]
.Single(node => node.NodeType == RenderTreeNodeType.Component) .Single(node => node.NodeType == RenderTreeNodeType.Component)
.Component; .Component;
@ -322,7 +322,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
renderer.RenderNewBatch(rootComponentId); renderer.RenderNewBatch(rootComponentId);
// Assert // Assert
Assert.Collection(renderer.RenderTreesByComponentId[rootComponentId], Assert.Collection(renderer.Batches[1].RenderTreesByComponentId[rootComponentId],
node => AssertNode.Text(node, "Modified message"), node => AssertNode.Text(node, "Modified message"),
node => Assert.Same(nestedComponentInstance, node.Component)); node => Assert.Same(nestedComponentInstance, node.Component));
} }
@ -346,7 +346,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
var rootComponentId = renderer.AssignComponentId(component); var rootComponentId = renderer.AssignComponentId(component);
renderer.RenderNewBatch(rootComponentId); renderer.RenderNewBatch(rootComponentId);
var originalComponentInstance = (FakeComponent)renderer.RenderTreesByComponentId[rootComponentId] var originalComponentInstance = (FakeComponent)renderer.Batches.Single().RenderTreesByComponentId[rootComponentId]
.Single(node => node.NodeType == RenderTreeNodeType.Component) .Single(node => node.NodeType == RenderTreeNodeType.Component)
.Component; .Component;
@ -359,7 +359,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
firstRender = false; firstRender = false;
renderer.RenderNewBatch(rootComponentId); renderer.RenderNewBatch(rootComponentId);
var updatedComponentInstance = (FakeComponent)renderer.RenderTreesByComponentId[rootComponentId] var updatedComponentInstance = (FakeComponent)renderer.Batches[1].RenderTreesByComponentId[rootComponentId]
.Single(node => node.NodeType == RenderTreeNodeType.Component) .Single(node => node.NodeType == RenderTreeNodeType.Component)
.Component; .Component;
@ -386,23 +386,19 @@ namespace Microsoft.AspNetCore.Blazor.Test
var rootComponentId = renderer.AssignComponentId(component); var rootComponentId = renderer.AssignComponentId(component);
renderer.RenderNewBatch(rootComponentId); renderer.RenderNewBatch(rootComponentId);
var childComponentId = renderer.RenderTreesByComponentId[rootComponentId] var childComponentId = renderer.Batches.Single().RenderTreesByComponentId[rootComponentId]
.Single(node => node.NodeType == RenderTreeNodeType.Component) .Single(node => node.NodeType == RenderTreeNodeType.Component)
.ComponentId; .ComponentId;
// This isn't strictly necessary for the test, but it's more common for components
// to be updated after their first render than before it
renderer.RenderNewBatch(childComponentId);
// Act: Second render // Act: Second render
firstRender = false; firstRender = false;
renderer.RenderNewBatch(rootComponentId); renderer.RenderNewBatch(rootComponentId);
var updatedComponentNode = renderer.RenderTreesByComponentId[rootComponentId] var updatedComponentNode = renderer.Batches[1].RenderTreesByComponentId[rootComponentId]
.Single(node => node.NodeType == RenderTreeNodeType.Component); .Single(node => node.NodeType == RenderTreeNodeType.Component);
// Assert // Assert
Assert.Collection(renderer.RenderTreesByComponentId[updatedComponentNode.ComponentId], Assert.Collection(renderer.Batches[1].RenderTreesByComponentId[updatedComponentNode.ComponentId],
node => AssertNode.Text(node, "second")); node => AssertNode.Text(node, "second"));
} }
@ -421,8 +417,8 @@ namespace Microsoft.AspNetCore.Blazor.Test
private class TestRenderer : Renderer private class TestRenderer : Renderer
{ {
public IDictionary<int, ArrayRange<RenderTreeNode>> RenderTreesByComponentId { get; } public List<CapturedBatch> Batches { get; }
= new Dictionary<int, ArrayRange<RenderTreeNode>>(); = new List<CapturedBatch>();
public new int AssignComponentId(IComponent component) public new int AssignComponentId(IComponent component)
=> base.AssignComponentId(component); => base.AssignComponentId(component);
@ -435,15 +431,24 @@ namespace Microsoft.AspNetCore.Blazor.Test
protected internal override void UpdateDisplay(RenderBatch renderBatch) protected internal override void UpdateDisplay(RenderBatch renderBatch)
{ {
// TODO: Capture the batches and rephrase assertions in terms of those var capturedBatch = new CapturedBatch();
Batches.Add(capturedBatch);
for (var i = 0; i < renderBatch.UpdatedComponents.Count; i++) for (var i = 0; i < renderBatch.UpdatedComponents.Count; i++)
{ {
ref var renderTreeDiff = ref renderBatch.UpdatedComponents.Array[i]; ref var renderTreeDiff = ref renderBatch.UpdatedComponents.Array[i];
RenderTreesByComponentId[renderTreeDiff.ComponentId] = renderTreeDiff.CurrentState; capturedBatch.RenderTreesByComponentId[renderTreeDiff.ComponentId] =
renderTreeDiff.CurrentState.ToArray();
} }
} }
} }
private class CapturedBatch
{
public IDictionary<int, RenderTreeNode[]> RenderTreesByComponentId { get; }
= new Dictionary<int, RenderTreeNode[]>();
}
private class TestComponent : IComponent private class TestComponent : IComponent
{ {
private Action<RenderTreeBuilder> _renderAction; private Action<RenderTreeBuilder> _renderAction;