public void RequiresTypeParameter()
        {
            var instance    = new DynamicComponent();
            var renderer    = new TestRenderer();
            var componentId = renderer.AssignRootComponentId(instance);

            var ex = Assert.Throws <InvalidOperationException>(
                () => renderer.RenderRootComponent(componentId, ParameterView.Empty));

            Assert.StartsWith(
                $"{ nameof(DynamicComponent)} requires a non-null value for the parameter {nameof(DynamicComponent.Type)}.",
                ex.Message);
        }
        public void RejectsUnknownParameters()
        {
            var ex = Assert.Throws <InvalidOperationException>(() =>
            {
                var parameters = new Dictionary <string, object>
                {
                    { "unknownparameter", 123 }
                };
                _ = new DynamicComponent().SetParametersAsync(ParameterView.FromDictionary(parameters));
            });

            Assert.StartsWith(
                $"{ nameof(DynamicComponent)} does not accept a parameter with the name 'unknownparameter'.",
                ex.Message);
        }
        public void CanRenderComponentByType()
        {
            // Arrange
            var instance    = new DynamicComponent();
            var renderer    = new TestRenderer();
            var componentId = renderer.AssignRootComponentId(instance);
            var parameters  = ParameterView.FromDictionary(new Dictionary <string, object>
            {
                { nameof(DynamicComponent.Type), typeof(TestComponent) },
            });

            // Act
            renderer.RenderRootComponent(componentId, parameters);

            // Assert
            var batch = renderer.Batches.Single();

            AssertFrame.Component <TestComponent>(batch.ReferenceFrames[0], 2, 0);
            AssertFrame.Text(batch.ReferenceFrames[2], "Hello from TestComponent with IntProp=0", 0);
        }
        public void CanRenderComponentByTypeWithParameters()
        {
            // Arrange
            var instance        = new DynamicComponent();
            var renderer        = new TestRenderer();
            var childParameters = new Dictionary <string, object>
            {
                { nameof(TestComponent.IntProp), 123 },
                { nameof(TestComponent.ChildContent), (RenderFragment)(builder =>
                    {
                        builder.AddContent(0, "This is some child content");
                    }) },
            };
            var parameters = ParameterView.FromDictionary(new Dictionary <string, object>
            {
                { nameof(DynamicComponent.Type), typeof(TestComponent) },
                { nameof(DynamicComponent.Parameters), childParameters },
            });

            // Act
            renderer.RenderRootComponent(
                renderer.AssignRootComponentId(instance),
                parameters);

            // Assert
            var batch = renderer.Batches.Single();

            // It renders a reference to the child component with its parameters
            AssertFrame.Component <TestComponent>(batch.ReferenceFrames[0], 4, 0);
            AssertFrame.Attribute(batch.ReferenceFrames[1], nameof(TestComponent.IntProp), 123, 1);
            AssertFrame.Attribute(batch.ReferenceFrames[2], nameof(TestComponent.ChildContent), 1);

            // The child component itself is rendered
            AssertFrame.Text(batch.ReferenceFrames[4], "Hello from TestComponent with IntProp=123", 0);
            AssertFrame.Text(batch.ReferenceFrames[5], "This is some child content", 0);
        }
        public void CanAccessToChildComponentInstance()
        {
            // Arrange
            var instance        = new DynamicComponent();
            var renderer        = new TestRenderer();
            var childParameters = new Dictionary <string, object>
            {
                { nameof(TestComponent.IntProp), 123 },
            };
            var parameters = ParameterView.FromDictionary(new Dictionary <string, object>
            {
                { nameof(DynamicComponent.Type), typeof(TestComponent) },
                { nameof(DynamicComponent.Parameters), childParameters },
            });

            // Act
            renderer.RenderRootComponent(
                renderer.AssignRootComponentId(instance),
                parameters);

            // Assert
            Assert.IsType <TestComponent>(instance.Instance);
            Assert.Equal(123, ((TestComponent)instance.Instance).IntProp);
        }