Exemplo n.º 1
0
        public void middleware_should_hook_into_dispathching()
        {
            var packageReducerCount = 0;
            var reducer             = new ElementReducer <int>().Process <AddActin>((s, e) =>
            {
                packageReducerCount += 1;
                return(packageReducerCount);
            });
            var packageStore    = new Package <int>(reducer);
            var middlewareCount = 0;

            packageStore.Middleware(
                package => next => action =>
            {
                Logger.LogMessage("第一个拦截器开始执行,将执行第二个拦截器");
                middlewareCount += 1;
                next(action);
                middlewareCount += 1000;
                Logger.LogMessage("第一个拦截器执行完毕");
            },
                package => next => action =>
            {
                Logger.LogMessage("第二个拦截器开始执行");
                middlewareCount += 10;
                Logger.LogMessage("执行器开始执行");
                next(action);
                Logger.LogMessage("执行器开始完毕");
                middlewareCount += 100;
                Logger.LogMessage("第二个拦截器执行完毕");
            }
                );
            packageStore.Dispatch(new AddActin());
            Assert.AreEqual(1111, middlewareCount);
            Assert.AreEqual(1, packageReducerCount);
        }
Exemplo n.º 2
0
        public void middleware_should_rob_the_store_dispatcher()
        {
            var packageReducerCount = 0;
            var reducer             = new ElementReducer <int>().Process <AddActin>((s, e) =>
            {
                packageReducerCount += 1;
                return(s);
            });
            var packageStore      = new Package <int>(reducer);
            var middlewareCounter = 0;

            packageStore.Middleware(
                store => next => action =>
            {
                if (action is AddActin)
                {
                }
                middlewareCounter += 1;
                Assert.AreEqual(1, middlewareCounter);
                Logger.LogMessage("第一个拦截器开始执行,将执行第二个拦截器");
                next(action);    //执行顺序下个拦截器或最后的执行器
                middlewareCounter += 1000;
                Assert.AreEqual(1111, middlewareCounter);
                Logger.LogMessage("第一个拦截器执行完毕");
            },
                store => next => action =>
            {
                Logger.LogMessage("第二个拦截器开始执行");
                middlewareCounter += 10;

                Assert.AreEqual(11, middlewareCounter);
                middlewareCounter += 100;
                Assert.AreEqual(111, middlewareCounter);

                Logger.LogMessage("第二个拦截器执行完毕");
            }
                );

            packageStore.Dispatch(new AddActin());

            Assert.AreEqual(1111, middlewareCounter);
            Assert.AreEqual(packageReducerCount, 0);
            Logger.LogMessage("reducer未运行,执行器被劫持成功!");
        }
Exemplo n.º 3
0
        public void emit_subscriber_during_subscribed()
        {
            var reducer = new ElementReducer <List <int> >(() => new List <int> {
                1
            });
            var package = new Package <List <int> >(reducer);

            var counter = 0;
            var unsuber = package.Subscribe(state =>
            {
                counter++;
            });

            package.Dispatch(new int());
            package.Dispatch(new int());
            package.Dispatch(new int());

            Assert.AreEqual(3, counter);
            unsuber();

            package.Dispatch(new int());

            Assert.AreEqual(3, counter);
        }
Exemplo n.º 4
0
        public void middleware_should_close_dispatching()
        {
            var packageReducerCount = 0;
            var reducer             = new ElementReducer <int>().Process <AddActin>((s, e) =>
            {
                packageReducerCount += 1;
                return(packageReducerCount);
            });
            var packageStore    = new Package <int>(reducer);
            var middlewareCount = 0;

            packageStore.Middleware(
                package => next => action =>
            {
                middlewareCount += 1;
                Logger.LogMessage("拦截器关闭广播");
            },
                package => next => action =>
            {
                Logger.LogMessage("第二个拦截器开始执行");
                middlewareCount += 10;
                Logger.LogMessage("执行器开始执行");
                next(action);
                Logger.LogMessage("执行器开始完毕");
                middlewareCount += 100;
                Logger.LogMessage("第二个拦截器执行完毕");
            }
                );
            packageStore.Subscribe((i, action) =>
            {
                Logger.LogMessage("获得广播信息");
            });
            packageStore.Dispatch(new AddActin());
            Assert.AreEqual(1, middlewareCount);
            Assert.AreEqual(0, packageReducerCount);
        }
Exemplo n.º 5
0
        public void combine_reducers()
        {
            List <int> a = new List <int>();
            List <int> b = new List <int>();

            for (int i = 1; i <= 10; i++)
            {
                a.Add(i);
                b.Add(i);
            }

            CollectionAssert.AreEqual(a, b);


            var TodosReducer = new ElementReducer <List <Todo> >().Process <LoadTodos>((curPackage, action) =>
            {
                return(action.Todos);
            }).Process <AddTodoItem>((curPackage, action) =>
            {
                var todos = curPackage;
                todos.Add(action.Item);
                return(todos);
            }).Process <DeleteTodoItem>((curPackage, action) =>
            {
                var todos = curPackage;
                todos.RemoveAll(p => p.Id == action.Id);
                return(todos);
            }).Process <UpdateTodoItem>((pacakge, action) =>
            {
                var todos          = pacakge;
                var updateItem     = todos.FirstOrDefault(p => p.Id == action.Item.Id);
                updateItem.Bak     = action.Item.Bak;
                updateItem.Content = action.Item.Content;
                return(todos);
            });

            var TabReducer = new ElementReducer <Tab>().Process <TabSelect>((curPackage, action) =>
            {
                var tab = action.Selected;
                return(tab);
            });

            var reducer = new ComposableReducer <AppPackage>()
                          .Diverter(curPackage => curPackage.Todos, TodosReducer)
                          .Diverter(curPackage => curPackage.Tab, TabReducer);

            var package = new Package <AppPackage>(reducer);

            package.Middleware(
                curPackage => next => action =>
            {
                Logger.LogMessage(action.GetType().ToString());
                next(action);
            }
                );

            package.Dispatch(new LoadTodos()
            {
                Todos = new List <Todo>()
            });

            Logger.LogMessage("广播新增一条待办");
            package.Dispatch(new AddTodoItem()
            {
                Item = new Todo()
                {
                    Id      = 1,
                    Bak     = "我的第一条待办",
                    Content = "明天飞"
                }
            });

            Assert.AreEqual("明天飞", package.GetState().Todos[0].Content);

            Logger.LogMessage("广播更新一条待办");
            package.Dispatch(new UpdateTodoItem()
            {
                Item = new Todo()
                {
                    Id      = 1,
                    Bak     = "我的第一条待办",
                    Content = "明天不飞了"
                }
            });
            Assert.AreEqual("明天不飞了", package.GetState().Todos[0].Content);


            Logger.LogMessage("广播删除一条待办");
            package.Dispatch(new DeleteTodoItem()
            {
                Id = 1
            });

            Assert.AreEqual(0, package.GetState().Todos.Count);

            Logger.LogMessage("广播TabSelectedChanged");
            package.Dispatch(new TabSelect()
            {
                Selected = Tab.Completed
            });

            Assert.AreEqual(Tab.Completed, package.GetState().Tab);
        }