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); }
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未运行,执行器被劫持成功!"); }
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); }
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); }
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); }