public async Task CreateBinder_DateTimeOffset()
        {
            // Arrange
            var value     = DateTimeOffset.Now;
            var component = new EventCountingComponent();
            Action <DateTimeOffset> setter = (_) => value = _;

            var binder = EventCallback.Factory.CreateBinder(component, setter, value);

            var expectedValue = new DateTime(2018, 3, 4, 1, 2, 3);

            // Act
            await binder.InvokeAsync(new UIChangeEventArgs()
            {
                Value = expectedValue.ToString(),
            });

            Assert.Equal(expectedValue, value);
            Assert.Equal(1, component.Count);
        }
        public async Task CreateBinder_NullableDecimal()
        {
            // Arrange
            var value                = (decimal?)17;
            var component            = new EventCountingComponent();
            Action <decimal?> setter = (_) => value = _;

            var binder = EventCallback.Factory.CreateBinder(component, setter, value);

            var expectedValue = (decimal?)42;

            // Act
            await binder.InvokeAsync(new UIChangeEventArgs()
            {
                Value = "42",
            });

            Assert.Equal(expectedValue, value);
            Assert.Equal(1, component.Count);
        }
        public async Task CreateBinder_NullableEnum()
        {
            // Arrange
            var value     = (AttributeTargets?)AttributeTargets.All;
            var component = new EventCountingComponent();
            Action <AttributeTargets?> setter = (_) => value = _;

            var binder = EventCallback.Factory.CreateBinder(component, setter, value);

            var expectedValue = AttributeTargets.Class;

            // Act
            await binder.InvokeAsync(new UIChangeEventArgs()
            {
                Value = expectedValue.ToString(),
            });

            Assert.Equal(expectedValue, value);
            Assert.Equal(1, component.Count);
        }
        public async Task CreateBinder_Bool()
        {
            // Arrange
            var           value     = false;
            var           component = new EventCountingComponent();
            Action <bool> setter    = (_) => value = _;

            var binder = EventCallback.Factory.CreateBinder(component, setter, value);

            var expectedValue = true;

            // Act
            await binder.InvokeAsync(new UIChangeEventArgs()
            {
                Value = true,
            });

            Assert.Equal(expectedValue, value);
            Assert.Equal(1, component.Count);
        }
        public async Task CreateBinder_NumericType_WithInvariantCulture()
        {
            // Arrange
            var          value     = 17_000;
            var          component = new EventCountingComponent();
            Action <int> setter    = (_) => value = _;

            var binder = EventCallback.Factory.CreateBinder(component, setter, value, CultureInfo.InvariantCulture);

            var expectedValue = 42_000;

            // Act
            await binder.InvokeAsync(new ChangeEventArgs()
            {
                Value = "42,000.00",
            });

            Assert.Equal(expectedValue, value);
            Assert.Equal(1, component.Count);
        }
        public async Task CreateBinder_NullableGuid()
        {
            // Arrange
            var            value     = (Guid?)Guid.NewGuid();
            var            component = new EventCountingComponent();
            Action <Guid?> setter    = (_) => value = _;

            var binder = EventCallback.Factory.CreateBinder(component, setter, value);

            var expectedValue = Guid.NewGuid();

            // Act
            await binder.InvokeAsync(new ChangeEventArgs()
            {
                Value = expectedValue.ToString(),
            });

            Assert.Equal(expectedValue, value);
            Assert.Equal(1, component.Count);
        }
        public async Task CreateBinder_NullableDateTime()
        {
            // Arrange
            var value                 = (DateTime?)DateTime.Now;
            var component             = new EventCountingComponent();
            Action <DateTime?> setter = (_) => value = _;

            var binder = EventCallback.Factory.CreateBinder(component, setter, value);

            var expectedValue = new DateTime(2018, 3, 4, 1, 2, 3);

            // Act
            await binder.InvokeAsync(new ChangeEventArgs()
            {
                Value = expectedValue.ToString(CultureInfo.InvariantCulture),
            });

            Assert.Equal(expectedValue, value);
            Assert.Equal(1, component.Count);
        }
        public async Task CreateBinder_String()
        {
            // Arrange
            var             value     = "hi";
            var             component = new EventCountingComponent();
            Action <string> setter    = (_) => value = _;

            var binder = EventCallback.Factory.CreateBinder(component, setter, value);

            var expectedValue = "bye";

            // Act
            await binder.InvokeAsync(new ChangeEventArgs()
            {
                Value = expectedValue,
            });

            Assert.Equal(expectedValue, value);
            Assert.Equal(1, component.Count);
        }
        public async Task CreateBinder_NullableDateTimeOffset_Format()
        {
            // Arrange
            var value     = (DateTimeOffset?)DateTimeOffset.Now;
            var component = new EventCountingComponent();
            Action <DateTimeOffset?> setter = (_) => value = _;
            var format = "ddd yyyy-MM-dd";

            var binder = EventCallback.Factory.CreateBinder(component, setter, value, format);

            var expectedValue = new DateTime(2018, 3, 4);

            // Act
            await binder.InvokeAsync(new UIChangeEventArgs()
            {
                Value = expectedValue.ToString(format),
            });

            Assert.Equal(expectedValue, value);
            Assert.Equal(1, component.Count);
        }
        public async Task CreateBinder_ThrowsConversionException()
        {
            // Arrange
            var          value     = 17;
            var          component = new EventCountingComponent();
            Action <int> setter    = (_) => value = _;

            var binder = EventCallback.Factory.CreateBinder(component, setter, value);

            // Act
            await Assert.ThrowsAsync <FormatException>(() =>
            {
                return(binder.InvokeAsync(new UIChangeEventArgs()
                {
                    Value = "not-an-integer!",
                }));
            });

            Assert.Equal(17, value);
            Assert.Equal(1, component.Count);
        }