public void ReceivingNativeInput_WhenHooked_CallsFactoryWithReceivedInput()
        {
            // Arrange
            var configuration = MouseEventConfiguration.CreateForAllEvents();

            _receiverMock.Setup(f => f.Configuration).Returns(configuration);
            _receiverMock.Setup(f => f.ReceiveAsync(It.IsAny <MouseInput>())).Returns(Task.FromResult(true));

            Action <NativeMouseInput> nativeInputCallback = null;

            _nativeMouseHookServiceMock.Setup(
                f => f.Hook(
                    It.IsAny <Action <NativeMouseInput> >()))
            .Callback <Action <NativeMouseInput> >(a => nativeInputCallback = a);

            var mouseInput = new MouseInput(MouseInputKey.Right, MouseInputDirection.MouseUp);

            _mouseInputFactoryMock.Setup(f => f.Create(It.IsAny <NativeMouseInput>())).Returns(mouseInput);

            _sut.HookMouse();

            var nativeMouseInput = new NativeMouseInput(NativeMouseInputKey.Left, NativeMouseInputDirection.MouseDown);

            // Act
            nativeInputCallback(nativeMouseInput);

            // Assert
            _mouseInputFactoryMock.Verify(f => f.Create(nativeMouseInput), Times.Once);
        }
        public void ReceivingNativeInput_ReceiverNotConfiguredForEvent_DoesNotCallReceiver()
        {
            // Arrange
            var mouseEventConfiguration = new MouseEventConfiguration(
                Option.CreateApplicible(MouseInputKey.Left),
                Option.CreateNotApplicable <MouseInputDirection>(true));

            _receiverMock.Setup(f => f.ReceiveAsync(It.IsAny <MouseInput>()));
            _receiverMock.Setup(f => f.Configuration).Returns(mouseEventConfiguration);

            var mouseInput = new MouseInput(MouseInputKey.Right, MouseInputDirection.MouseUp);

            _mouseInputFactoryMock.Setup(f => f.Create(It.IsAny <NativeMouseInput>())).Returns(mouseInput);

            Action <NativeMouseInput> nativeInputCallback = null;

            _nativeMouseHookServiceMock.Setup(
                f => f.Hook(
                    It.IsAny <Action <NativeMouseInput> >()
                    )).Callback <Action <NativeMouseInput> >(a => nativeInputCallback = a);

            _sut.HookMouse();
            var nativeKeyboardInput = new NativeMouseInput(NativeMouseInputKey.Right, NativeMouseInputDirection.MouseUp);

            // Act
            nativeInputCallback(nativeKeyboardInput);

            // Assert
            _receiverMock.Verify(f => f.ReceiveAsync(It.IsAny <MouseInput>()), Times.Never);
        }