Example #1
0
        public async Task should_allow_for_async_execution_of_code()
        {
            var storeReducerReached = 0;
            var reducer             = new SimpleReducer <List <string> >(() => new List <string> {
                "a"
            }).When <SomeAction>((s, e) =>
            {
                storeReducerReached += 1;
                return(s);
            });
            var store = new Store <List <string> >(reducer);

            var result = await store.Dispatch(store.asyncAction <int>(async(dispatcher, store2) =>
            {
                await Task.Delay(300);
                Assert.That(store2()[0], Is.EqualTo("a"));
                dispatcher(new SomeAction());
                return(112);
            }));

            Assert.That(storeReducerReached, Is.EqualTo(1));
            Assert.That(result, Is.EqualTo(112));

            await store.Dispatch(new AsyncAction1());

            Assert.That(storeReducerReached, Is.EqualTo(2));
        }
Example #2
0
        public async Task should_allow_for_passing_parameters_to_async_actions()
        {
            var storeReducerReached = 0;
            var reducer             = new SimpleReducer <List <string> >(() => new List <string> {
                "a"
            }).When <SomeAction>((s, e) =>
            {
                storeReducerReached += 1;
                return(s);
            });
            var store = new Store <List <string> >(reducer);

            var action1 = store.asyncAction <LoginInfo, int>(async(dispatcher, store2, msg) =>
            {
                await Task.Delay(300);
                Assert.That(msg.username, Is.EqualTo("John"));
                dispatcher(new SomeAction());
                return(112);
            });
            var result = await store.Dispatch(action1(new LoginInfo
            {
                username = "******"
            }));

            Assert.That(storeReducerReached, Is.EqualTo(1));
            Assert.That(result, Is.EqualTo(112));

            var result2 = await store.Dispatch(new AsyncAction2 { Param = 60 });

            Assert.That(storeReducerReached, Is.EqualTo(2));
            Assert.That(result2, Is.EqualTo(60));
        }
        public static SimpleReducer <MovieState> All()
        {
            var reducer = new SimpleReducer <MovieState>()
                          .When <LoadMoviesAction>((state, action) =>
            {
                return(new MovieState
                {
                    Error = string.Empty,
                    Movies = new Movie[0],
                    Status = LoadStatus.Loading
                });
            })
                          .When <LoadMoviesErrorAction>((state, action) => new MovieState
            {
                Error  = action.Error,
                Movies = new Movie[0],
                Status = LoadStatus.Error
            })
                          .When <LoadMoviesSuccessAction>((state, action) => new MovieState
            {
                Error  = string.Empty,
                Movies = action.Movies,
                Status = LoadStatus.Loaded
            })
                          .When <SelectMovieAction>((state, action) => new MovieState
            {
                Error        = state.Error,
                Movies       = state.Movies,
                CurrentMovie = action.SelectedMovie,
                Status       = state.Status
            });

            return(reducer);
        }
Example #4
0
        public void should_allow_middleware_to_hook_into_dispatching()
        {
            var storeReducerReached = 0;
            var reducer = new SimpleReducer<List<string>>().When<SomeAction>((s, e) =>
            {
                storeReducerReached += 1;
                return s;
            });
            var store = new Store<List<string>>(reducer);
            var middlewareCounter = 0;
            store.Middleware(
                s => next => action =>
                {
                    middlewareCounter += 3;
                    Assert.That(middlewareCounter, Is.EqualTo(3));
                    next(action);
                    middlewareCounter += 3000;
                    Assert.That(middlewareCounter, Is.EqualTo(3333));
                },
                s => next => action =>
                {
                    middlewareCounter += 30;
                    Assert.That(middlewareCounter, Is.EqualTo(33));
                    Assert.That(storeReducerReached, Is.EqualTo(0));
                    next(action);
                    Assert.That(storeReducerReached, Is.EqualTo(1));
                    middlewareCounter += 300;
                    Assert.That(middlewareCounter, Is.EqualTo(333));
                }
                );

            store.Dispatch(new SomeAction());
            Assert.That(middlewareCounter, Is.EqualTo(3333));
            Assert.That(storeReducerReached, Is.EqualTo(1));
        }
Example #5
0
        public void should_notify_subscribers_while_they_are_subscribed()
        {
            var reducer = new SimpleReducer <List <string> >(() => new List <string> {
                "Use ReduxVVM"
            });
            var store = new Store <List <string> >(reducer);

            var changed = 0;
            var unsub   = store.Subscribe(state =>
            {
                Assert.NotNull(state);
                changed += 1;
            });

            store.Dispatch(new ItemAdded {
                item = "Read the Redux docs"
            });
            store.Dispatch(new ItemAdded {
                item = "Read the Redux docs"
            });

            Assert.That(changed, Is.EqualTo(2));
            unsub();
            store.Dispatch(new ItemAdded {
                item = ""
            });

            Assert.That(changed, Is.EqualTo(2));
        }
Example #6
0
        public async void should_allow_for_passing_parameters_to_async_actions()
        {
            var storeReducerReached = 0;
            var reducer = new SimpleReducer<List<string>>(() => new List<string> {"a"}).When<SomeAction>((s, e) =>
            {
                storeReducerReached += 1;
                return s;
            });
            var store = new Store<List<string>>(reducer);

            var action1 = store.asyncAction<LoginInfo, int>(async (dispatcher, store2, msg) =>
            {
                await Task.Delay(300);
                Assert.That(msg.username, Is.EqualTo("John"));
                dispatcher(new SomeAction());
                return 112;
            });
            var result = await store.Dispatch(action1(new LoginInfo
            {
                username = "******"
            }));

            Assert.That(storeReducerReached, Is.EqualTo(1));
            Assert.That(result, Is.EqualTo(112));
        }
Example #7
0
        public void should_prvide_way_to_create_deep_hierarchy_of_reducers()
        {
            var originReducer = new SimpleReducer<Address>().When<SetOrigin>((s, e) => e.newAddress);
            var destinationReducer = new CompositeReducer<Destination>()
                .Part(s => s.deliver,
                    new SimpleReducer<DeliveryMethod>().When<BehindSchedule>((s, a) => DeliveryMethod.REGULAR)
                        .When<SetDelivery>((_, a) => a.method))
                .Part(s => s.addr, new SimpleReducer<Address>().When<SetDestination>((s, a) => a.newAddress));
            var orderReducer = new CompositeReducer<Order>()
                .Part(s => s.origin, originReducer)
                .Part(s => s.destination, destinationReducer);
            var store = new Store<Order>(orderReducer);
            store.Dispatch(new SetOrigin {newAddress = new Address {streetNr = "Laugavegur 26", city = "Reykjavík"}});
            store.Dispatch(new SetDestination {newAddress = new Address {streetNr = "5th Avenue", city = "New York"}});
            store.Dispatch(new SetDelivery {method = DeliveryMethod.GUARANTEED});

            store.Dispatch(new BehindSchedule());

            Assert.AreEqual(new Order
            {
                origin = new Address {streetNr = "Laugavegur 26", city = "Reykjavík"},
                destination =
                    new Destination
                    {
                        addr = new Address {streetNr = "5th Avenue", city = "New York"},
                        deliver = DeliveryMethod.REGULAR
                    }
            }, store.GetState());
        }
Example #8
0
        public static SimpleReducer <AuthState> All()
        {
            var reducer = new SimpleReducer <AuthState>()
                          .When <StartLogin>((state, action) =>
            {
                return(new AuthState(LoginStatus.LoginStarted, action.Username, string.Empty));
            })
                          .When <LoginSucceeded>((state, action) =>
            {
                return(new AuthState(LoginStatus.LoggedIn, state.UserName, action.Token));
            })
                          .When <LoginFailed>((state, action) =>
            {
                return(new AuthState(LoginStatus.LoginError, state.UserName, state.Token, action.Error));
            })
                          .When <LoadUser>((state, action) =>
            {
                var status = string.IsNullOrEmpty(action.Token) ?
                             LoginStatus.None :
                             LoginStatus.LoggedIn;

                return(new AuthState(status, action.Username, action.Token));
            })
                          .When <StartLogout>((state, action) => new AuthState(LoginStatus.None, String.Empty, String.Empty));

            return(reducer);
        }
Example #9
0
        public void should_allow_middleware_to_shortcut_lower_middleware()
        {
            var storeReducerReached = 0;
            var reducer             = new SimpleReducer <List <string> >().When <SomeAction>((s, e) =>
            {
                storeReducerReached += 1;
                return(s);
            });
            var stateStore        = new Store <List <string> >(reducer);
            var middlewareCounter = 0;

            stateStore.Middleware(
                store => next => action =>
            {
                middlewareCounter += 3;
                Assert.That(middlewareCounter, Is.EqualTo(3));
                middlewareCounter += 3000;
                Assert.That(middlewareCounter, Is.EqualTo(3003));
            },
                store => next => action =>
            {
                middlewareCounter += 30;
                Assert.That(middlewareCounter, Is.EqualTo(33));
                Assert.That(storeReducerReached, Is.EqualTo(0));
                next(action);
                Assert.That(storeReducerReached, Is.EqualTo(1));
                middlewareCounter += 300;
                Assert.That(middlewareCounter, Is.EqualTo(333));
            }
                );

            stateStore.Dispatch(new SomeAction());
            Assert.That(middlewareCounter, Is.EqualTo(3003));
            Assert.That(storeReducerReached, Is.EqualTo(0));
        }
Example #10
0
        public async Task all_in_one_example()
        {
            var reducer = new SimpleReducer <AppState>()
                          .When <LoginStarted>((state, action) => {
                state.Username = action.Username;
                state.Token    = "";
                state.Status   = LoginStatus.LoginInProgress;
                return(state);
            })
                          .When <LoginSucceeded>((state, action) => {
                state.Token  = action.Token;
                state.Status = LoginStatus.LoggedIn;
                return(state);
            })
                          .When <LoginFailed>((state, action) => {
                state.Status = LoginStatus.NotLoggedIn;
                return(state);
            });

            var store = new Store <AppState>(reducer);

            var loginAsyncAction = store.asyncAction(async(dispatch, getState) => {
                dispatch(new LoginStarted {
                    Username = "******"
                });

                // faking authentication of user
                await Task.Delay(500);
                var authenticated = new Random().Next() % 2 == 0;

                if (authenticated)
                {
                    dispatch(new LoginSucceeded {
                        Token = "1234"
                    });
                }
                else
                {
                    dispatch(new LoginFailed());
                }
                return(authenticated);
            });

            var logged = await store.Dispatch(loginAsyncAction);

            if (logged)
            {
                Assert.That(store.GetState().Status, Is.EqualTo(LoginStatus.LoggedIn));
            }
            else
            {
                Assert.That(store.GetState().Status, Is.EqualTo(LoginStatus.NotLoggedIn));
            }
        }
Example #11
0
        public void should_prvide_way_to_combine_reducers()
        {
            var topicReducer = new SimpleReducer<string>().When<TopicSet>((s, e) => e.topic);
            var visibilityReducer = new SimpleReducer<bool>().When<FilterVisibility>((s, e) => e.visible);
            var reducer = new CompositeReducer<AppStore>(() => new AppStore {redditTopic = "react", visibility = false})
                .Part(s => s.redditTopic, topicReducer)
                .Part(s => s.visibility, visibilityReducer);
            var store = new Store<AppStore>(reducer);
            store.Dispatch(new TopicSet {topic = "Redux is awesome"});
            store.Dispatch(new FilterVisibility {visible = true});

            Assert.AreEqual(new AppStore {redditTopic = "Redux is awesome", visibility = true}, store.GetState());
        }
Example #12
0
        public void should_register_root_reducer_with_builder()
        {
            var reducer = new SimpleReducer<List<string>>(() => new List<string> {"Use ReduxVVM"})
                .When<ItemAdded>((state, action) =>
                {
                    var newSatte = new List<string>(state);
                    newSatte.Add(action.item);
                    return newSatte;
                })
                .Get();
            var store = new Store<List<string>>(reducer);
            store.Dispatch(new ItemAdded {item = "Read the Redux docs"});

            CollectionAssert.AreEqual(store.GetState(), new List<string> {"Use ReduxVVM", "Read the Redux docs"});
        }
Example #13
0
        public void should_return_same_state_when_command_not_for_that_reducer()
        {
            var reducer = new SimpleReducer <List <string> >(() => new List <string> {
                "Use ReduxVVM"
            });
            var store = new Store <List <string> >(reducer);

            store.Dispatch(new ItemAdded {
                item = "Read the Redux docs"
            });

            CollectionAssert.AreEqual(store.GetState(), new List <string> {
                "Use ReduxVVM"
            });
        }
Example #14
0
        public async Task should_execute_async_action_inside_async_action()
        {
            var storeReducerReached = 0;
            var reducer             = new SimpleReducer <List <string> >(() => new List <string> {
                "a"
            }).When <SomeAction>((s, e) =>
            {
                storeReducerReached += 1;
                return(s);
            });
            var store = new Store <List <string> >(reducer);

            var result = await store.Dispatch(new AsyncAction3 { Param = 60 });

            Assert.That(storeReducerReached, Is.EqualTo(2));
            Assert.That(result, Is.EqualTo(120));
        }
Example #15
0
        public void should_prvide_way_to_create_deep_hierarchy_of_reducers()
        {
            var originReducer      = new SimpleReducer <Address>().When <SetOrigin>((s, e) => e.newAddress);
            var destinationReducer = new CompositeReducer <Destination>()
                                     .Part(state => state.deliver,
                                           new SimpleReducer <DeliveryMethod>().When <BehindSchedule>((s, a) => DeliveryMethod.REGULAR)
                                           .When <SetDelivery>((_, a) => a.method))
                                     .Part(state => state.addr, new SimpleReducer <Address>().When <SetDestination>((s, a) => a.newAddress));
            var orderReducer = new CompositeReducer <Order>()
                               .Part(state => state.origin, originReducer)
                               .Part(state => state.destination, destinationReducer);
            var store = new Store <Order>(orderReducer);

            store.Dispatch(new SetOrigin {
                newAddress = new Address {
                    streetNr = "Laugavegur 26", city = "Reykjavík"
                }
            });
            store.Dispatch(new SetDestination {
                newAddress = new Address {
                    streetNr = "5th Avenue", city = "New York"
                }
            });
            store.Dispatch(new SetDelivery {
                method = DeliveryMethod.GUARANTEED
            });

            store.Dispatch(new BehindSchedule());

            Assert.AreEqual(new Order
            {
                origin = new Address {
                    streetNr = "Laugavegur 26", city = "Reykjavík"
                },
                destination =
                    new Destination
                {
                    addr = new Address {
                        streetNr = "5th Avenue", city = "New York"
                    },
                    deliver = DeliveryMethod.REGULAR
                }
            }, store.GetState());
        }
Example #16
0
        public async void all_in_one_example(){
            var reducer = new SimpleReducer<AppState>()
                .When<LoginStarted>((status, action) => {
                    status.Username = action.Username;
                    status.Token = "";
                    status.Status = LoginStatus.LoginInProgress;
                    return status;
                })
                .When<LoginSucceeded>((status, action) => {
                    status.Token = action.Token;
                    status.Status = LoginStatus.LoggedIn;
                    return status;
                })
                .When<LoginFailed>((status, action) => {
                    status.Status = LoginStatus.NotLoggedIn;
                    return status;
                });

            var store = new Store<AppState>(reducer);

            var loginAsyncAction = store.asyncAction(async(dispatch, getState) => {
                dispatch(new LoginStarted{Username = "******"});

                // faking authentication of user
                await Task.Delay(500);
                var authenticated = new Random().Next() % 2 == 0;

                if (authenticated) {
                    dispatch(new LoginSucceeded{Token = "1234"});
                } else {
                    dispatch(new LoginFailed());
                }
                return  authenticated;
            });

            var logged = await store.Dispatch(loginAsyncAction);

            if (logged){
                Assert.That(store.GetState().Status, Is.EqualTo(LoginStatus.LoggedIn));
            } else {
                Assert.That(store.GetState().Status, Is.EqualTo(LoginStatus.NotLoggedIn));
            }
        }
Example #17
0
        public void should_notify_subscribers_while_they_are_subscribed()
        {
            var reducer = new SimpleReducer<List<string>>(() => new List<string> {"Use ReduxVVM"});
            var store = new Store<List<string>>(reducer);

            var changed = 0;
            var unsub = store.Subscribe(state =>
            {
                Assert.NotNull(state);
                changed += 1;
            });

            store.Dispatch(new ItemAdded {item = "Read the Redux docs"});
            store.Dispatch(new ItemAdded {item = "Read the Redux docs"});

            Assert.That(changed, Is.EqualTo(2));
            unsub();
            store.Dispatch(new ItemAdded {item = ""});

            Assert.That(changed, Is.EqualTo(2));
        }
Example #18
0
        public async void should_allow_for_async_execution_of_code()
        {
            var storeReducerReached = 0;
            var reducer = new SimpleReducer<List<string>>(() => new List<string> {"a"}).When<SomeAction>((s, e) =>
            {
                storeReducerReached += 1;
                return s;
            });
            var store = new Store<List<string>>(reducer);

            var result = await store.Dispatch(store.asyncAction<int>(async (dispatcher, store2) =>
            {
                await Task.Delay(300);
                Assert.That(store2()[0], Is.EqualTo("a"));
                dispatcher(new SomeAction());
                return 112;
            }));

            Assert.That(storeReducerReached, Is.EqualTo(1));
            Assert.That(result, Is.EqualTo(112));
        }
Example #19
0
        public void should_register_root_reducer_with_builder()
        {
            var reducer = new SimpleReducer <List <string> >(() => new List <string> {
                "Use ReduxVVM"
            })
                          .When <ItemAdded>((state, action) =>
            {
                var newSatte = new List <string>(state);
                newSatte.Add(action.item);
                return(newSatte);
            })
                          .Get();
            var store = new Store <List <string> >(reducer);

            store.Dispatch(new ItemAdded {
                item = "Read the Redux docs"
            });

            CollectionAssert.AreEqual(store.GetState(), new List <string> {
                "Use ReduxVVM", "Read the Redux docs"
            });
        }
Example #20
0
        public void should_prvide_way_to_combine_reducers()
        {
            var topicReducer      = new SimpleReducer <string>().When <TopicSet>((s, e) => e.topic);
            var visibilityReducer = new SimpleReducer <bool>().When <FilterVisibility>((s, e) => e.visible);
            var reducer           = new CompositeReducer <AppStore>(() => new AppStore {
                redditTopic = "react", visibility = false
            })
                                    .Part(state => state.redditTopic, topicReducer)
                                    .Part(state => state.visibility, visibilityReducer);
            var store = new Store <AppStore>(reducer);

            store.Dispatch(new TopicSet {
                topic = "Redux is awesome"
            });
            store.Dispatch(new FilterVisibility {
                visible = true
            });

            Assert.AreEqual(new AppStore {
                redditTopic = "Redux is awesome", visibility = true
            }, store.GetState());
        }
        public static SimpleReducer <TicketsState> All()
        {
            var reducer = new SimpleReducer <TicketsState>()
                          .When <LoadTicketsAction>((s, a) => new TicketsState
            {
                Error   = null,
                Tickets = new Ticket[0],
                Status  = LoadStatus.Loading
            })
                          .When <LoadTicketsErrorAction>((s, a) => new TicketsState
            {
                Error   = a.Error,
                Tickets = new Ticket[0],
                Status  = LoadStatus.Error
            })
                          .When <LoadTicketsSuccessAction>((s, a) => new TicketsState
            {
                Error   = null,
                Tickets = a.Tickets,
                Status  = LoadStatus.Loaded
            });

            return(reducer);
        }
Example #22
0
 public StorePro(SimpleReducer <T> rootReducer) : base(rootReducer)
 {
     init();
 }
Example #23
0
 public RxStore(SimpleReducer <TState> rootReducer) : base(rootReducer)
 {
     _stateChanged = new BehaviorSubject <TState>(GetState());
     SubscribeToStateChange();
 }
Example #24
0
        public void should_return_same_state_when_command_not_for_that_reducer()
        {
            var reducer = new SimpleReducer<List<string>>(() => new List<string> {"Use ReduxVVM"});
            var store = new Store<List<string>>(reducer);
            store.Dispatch(new ItemAdded {item = "Read the Redux docs"});

            CollectionAssert.AreEqual(store.GetState(), new List<string> {"Use ReduxVVM"});
        }