OnEventInterruptCallback GetInterruptCallback(EventInterruptedData eventInterruptedData) { return(_interrupterDict .Where(_t => _t.Key.DoMatch(eventInterruptedData.SenderModel, eventInterruptedData.SenderViewObj, eventInterruptedData.EventType)) .Select(_t => _t.Value) .FirstOrDefault()); }
public void DontMatchBinderFailed() { var modelID = "modelID"; var interruptModelName = "Interrupt"; Model senderModel = null; IViewObject senderViewObject = null; int senderEventData = 0; System.Type recieverEventType = null; ControllerInfo senderControllerInfo = null; var eventInterrupter = new EventInterrupter(); var binderMap = new ModelViewBinderMap() { UseEventInterrupter = eventInterrupter }; var binderInstanceMap = binderMap.CreateBinderInstaceMap(); eventInterrupter.Add(new EventDispatchQuery(modelID, ""), (_binderInstanceMap, _interruptedData) => { senderModel = _interruptedData.SenderModel; senderViewObject = _interruptedData.SenderViewObj; recieverEventType = _interruptedData.EventType; senderEventData = (int)_interruptedData.SendEventData; senderControllerInfo = _interruptedData.SenderControllerInfo; var interruptModel = new Model() { Name = interruptModelName }; return(interruptModel, true); } ); //run Test var interruptedData = EventInterruptedData.Create <ITestEventHandler>( new Model() { Name = modelID } , new EmptyViewObject() { UseBindInfo = new ModelViewBinder.BindInfo(typeof(EmptyViewObject)) } , 100 , new ControllerInfo(TestEventName.Test)); Assert.Throws <UnityEngine.Assertions.AssertionException>(() => { eventInterrupter.Interrupt(binderInstanceMap, interruptedData); }, "OnEventInterruptCallbackでModelを返した時、ModelViewBinderInstanceMapへ登録が失敗した時は例外を投げるようにしてください"); }
/// <summary> /// /// </summary> /// <param name="binderInstanceMap"></param> /// <param name="eventInterruptedData"></param> /// <returns>trueなら割り込み対象になったイベントを即時送信することを表します。</returns> public bool Interrupt(ModelViewBinderInstanceMap binderInstanceMap, EventInterruptedData eventInterruptedData) { OnEventInterruptCallback matchPredicate = GetInterruptCallback(eventInterruptedData); Assert.IsNotNull(matchPredicate); var(createdModel, doSendImmediate) = matchPredicate(binderInstanceMap, eventInterruptedData); if (createdModel != null) { if (!binderInstanceMap.BindInstances.ContainsKey(createdModel)) { Assert.IsTrue(binderInstanceMap.BinderMap.Binders.Any(_b => _b.DoMatch(createdModel)), $"OnEventInterruptCallbackで生成したModelは必ずModelViewBinderInstanceMapに追加されるようにしてください。"); binderInstanceMap.Add(createdModel, false, (binderInstance) => { binderInstance.HoldedEventInterruptedData = eventInterruptedData; }); } else { binderInstanceMap.BindInstances[createdModel].HoldedEventInterruptedData = eventInterruptedData; } } return(doSendImmediate); }
public bool DoMatch(EventInterruptedData eventInterruptedData) => null != GetInterruptCallback(eventInterruptedData);
public void BasicPasses() { var modelID = "modelID"; var interruptModelName = "Interrupt"; Model senderModel = null; IViewObject senderViewObject = null; int senderEventData = 0; System.Type recieverEventType = null; ControllerInfo senderControllerInfo = null; var eventInterrupter = new EventInterrupter(); var binderMap = new ModelViewBinderMap(null, new ModelViewBinder("*", null)) { UseEventInterrupter = eventInterrupter }; var binderInstanceMap = binderMap.CreateBinderInstaceMap(); eventInterrupter.Add(new EventDispatchQuery(modelID, ""), (_binderInstanceMap, _interruptedData) => { senderModel = _interruptedData.SenderModel; senderViewObject = _interruptedData.SenderViewObj; recieverEventType = _interruptedData.EventType; senderEventData = (int)_interruptedData.SendEventData; senderControllerInfo = _interruptedData.SenderControllerInfo; var interruptModel = new Model() { Name = interruptModelName }; return(interruptModel, false); } ); //run Test var interruptedData = EventInterruptedData.Create <ITestEventHandler>( new Model() { Name = modelID } , new EmptyViewObject() , 100 , new ControllerInfo(TestEventName.Test)); interruptedData.SenderViewObj.Bind(interruptedData.SenderModel, new ModelViewBinder.BindInfo(typeof(EmptyViewObject)), null); Assert.IsTrue(eventInterrupter.DoMatch(interruptedData)); var doSendImmediate = eventInterrupter.Interrupt(binderInstanceMap, interruptedData); Assert.IsFalse(doSendImmediate, $"設定したコールバックが返すdoSendImmediateと異なります"); Debug.Log($"Success to EventInterrupter#Interrupt!!"); {//設定したPredicateが実行されているか確認 Assert.AreSame(interruptedData.SenderModel, senderModel); Assert.AreSame(interruptedData.SenderViewObj, senderViewObject); Assert.AreEqual(interruptedData.EventType, recieverEventType); Assert.AreEqual(interruptedData.SendEventData, senderEventData); Assert.AreSame(interruptedData.SenderControllerInfo, senderControllerInfo); } Debug.Log($"Success to Check EventInterrupter#Interrupt Callback!!"); {//自動的にModelをModelViewBinderInstanceMapに登録しているか確認 Assert.IsTrue(binderInstanceMap.BindInstances.Any(_b => _b.Value.Model.Name == interruptModelName)); var interruptBinderInstace = binderInstanceMap.BindInstances.Values.First(_b => _b.Model.Name == interruptModelName); Assert.IsTrue(interruptBinderInstace.HasEventInterruptedData); var holdInterruptedData = interruptBinderInstace.HoldedEventInterruptedData; Assert.AreSame(interruptedData.SenderModel, holdInterruptedData.SenderModel); Assert.AreSame(interruptedData.SenderViewObj, holdInterruptedData.SenderViewObj); Assert.AreEqual(interruptedData.EventType, holdInterruptedData.EventType); Assert.AreEqual(interruptedData.SendEventData, holdInterruptedData.SendEventData); Assert.AreSame(interruptedData.SenderControllerInfo, holdInterruptedData.SenderControllerInfo); } Debug.Log($"Success to Add Created Model in Interrupt Callback to BinderInstanceMap!!"); }