public void Listener_Should_GetWorkingDispatcher()
        {
            // Arrange
            var    originalDispatchedAction     = new object();
            var    actionDispatchedFromListener = new object();
            object actionReceivedByReducer      = null;

            var listener = new Listener <object>(
                (action, state, dispatcher) =>
            {
                if (action == originalDispatchedAction)
                {
                    dispatcher(actionDispatchedFromListener);
                }
            });
            var listenerMiddleware = new ListenerMiddleware <object>();

            listenerMiddleware.ActionReceived += listener;
            var store = new Store <object>((state, action) => actionReceivedByReducer = action, null, listenerMiddleware.CreateMiddleware);

            // Act
            store.Dispatch(originalDispatchedAction);

            // Assert
            Assert.That(actionReceivedByReducer, Is.SameAs(actionDispatchedFromListener));
        }
        public void Listener_Should_GetStateBeforeAction()
        {
            // Arrange
            var    initialState            = new object();
            var    newState                = new object();
            object stateReceivedByListener = null;

            var listener           = new Listener <object>((action, state, dispatcher) => stateReceivedByListener = state);
            var listenerMiddleware = new ListenerMiddleware <object>();

            listenerMiddleware.ActionReceived += listener;
            var store = new Store <object>(Reducers.Return(newState), initialState, listenerMiddleware.CreateMiddleware);

            // Act
            store.Dispatch(null);

            // Assert
            Assert.That(stateReceivedByListener, Is.SameAs(initialState));
        }
        public void ListenerMiddleware_Should_CallNextBeforeCallingListener()
        {
            // Arrange
            var i = 0;
            var reducerCalledPosition  = 0;
            var listenerCalledPosition = 0;

            var listener           = new Listener <object>((action, state, dispatcher) => listenerCalledPosition = ++i);
            var listenerMiddleware = new ListenerMiddleware <object>();

            listenerMiddleware.ActionReceived += listener;
            var store = new Store <object>((state, action) => reducerCalledPosition = ++i, null, listenerMiddleware.CreateMiddleware);

            // Act
            store.Dispatch(null);

            // Assert
            Assert.That(reducerCalledPosition, Is.EqualTo(1));
            Assert.That(listenerCalledPosition, Is.EqualTo(2));
        }
        public void When_InitializedWithMultipleListeners_Should_PassActionToAllListeners()
        {
            // Arrange
            var    dispatchedAction          = new object();
            object actionReceivedByListener1 = null;
            object actionReceivedByListener2 = null;

            var listener1          = new Listener <object>((action, state, dispatcher) => actionReceivedByListener1 = action);
            var listener2          = new Listener <object>((action, state, dispatcher) => actionReceivedByListener2 = action);
            var listenerMiddleware = new ListenerMiddleware <object>();

            listenerMiddleware.ActionReceived += listener1;
            listenerMiddleware.ActionReceived += listener2;
            var store = new Store <object>(Reducers.Passthrough, null, listenerMiddleware.CreateMiddleware);

            // Act
            store.Dispatch(dispatchedAction);

            // Assert
            Assert.That(actionReceivedByListener1, Is.SameAs(dispatchedAction));
            Assert.That(actionReceivedByListener2, Is.SameAs(dispatchedAction));
        }