コード例 #1
0
        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へ登録が失敗した時は例外を投げるようにしてください");
        }
コード例 #2
0
        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!!");
        }
コード例 #3
0
        public void UsageModelViewBinderMapPasses()
        {
            #region Construct Enviroment
            EventHandlerTypeManager.Instance.EntryEventHandlerExecuter <ITestEventHandler, int>((reciever, sender, eventData) =>
            {
                reciever.Test(sender, eventData);
            });
            var eventDispatcher = new TestEventDispatcher()
            {
                SendData = 111,
            };

            var modelID            = "Model";
            var interruptTargetID  = "Target";
            var interruptModelName = "Interrupt";

            var interruptedTargetQuery = new EventDispatchQuery(modelID, "");
            var viewBinder             = new ModelViewBinder(modelID, null
                                                             , new ModelViewBinder.BindInfo(typeof(EmptyViewObject))
                                                             .AddControllerInfo(new ControllerInfo(TestEventName.Test, new EventHandlerSelector(ModelRelationShip.Self, "", ""))));
            var interruptBinder = new ModelViewBinder(interruptModelName, null
                                                      , new ModelViewBinder.BindInfo(typeof(EmptyViewObject))
                                                      .AddControllerInfo(new ControllerInfo(TestEventName.Test)
                                                                         .SetInterrupt(true))
                                                      );
            var viewCreator = new DefaultViewInstanceCreator(
                (typeof(EmptyViewObject), new EmptyModelViewParamBinder())
                );
            var binderMap = new ModelViewBinderMap(viewCreator
                                                   , viewBinder
                                                   , interruptBinder)
            {
                UseEventDispatcherMap = new EventDispatcherMap(
                    eventDispatcher
                    ),
                UseEventDispatchStateMap = new EventDispatchStateMap()
                                           .AddState(EventDispatchStateName.interrupt, interruptedTargetQuery),
            };
            var binderInstanceMap = binderMap.CreateBinderInstaceMap();
            var root = new TestModel()
            {
                Name = modelID
            };

            binderInstanceMap.RootModel = root;
            #endregion

            var eventInterrupter = new EventInterrupter();
            eventInterrupter.Add(interruptedTargetQuery,
                                 (_binderInstanceMap, interruptedData) =>
            {
                var interruptModel = new Model()
                {
                    Name = interruptModelName
                };
                return(interruptModel, true);
            }
                                 );

            binderMap.UseEventInterrupter = eventInterrupter;

            Assert.IsNotNull(binderInstanceMap.UseEventDispatchStateMap);
            Assert.IsNotNull(binderInstanceMap.UseEventInterrupter);
            Assert.IsTrue(binderInstanceMap.UseEventDispatchStateMap.DoMatch <ITestEventHandler>(EventDispatchStateName.interrupt, root, null), $"イベントの割り込みテストに使用するモデル({root})が割り込み対象になっていません。EventDispatchStateMapの設定を見直してください");

            eventDispatcher.SendTo(binderInstanceMap);

            Assert.AreSame(root, root.SenderModel);
            Assert.AreEqual(eventDispatcher.SendData, root.RecievedData);

            Debug.Log($"Success to Send First Event!!");

            {//割り込み処理が実行されているか確認
                //
                var errorMessage = "イベントが送信される際に処理の割り込みが実行されていません。";
                Assert.IsTrue(binderInstanceMap.BindInstances.Any(_b => _b.Value.Model.Name == interruptModelName), errorMessage);
                var interruptBinderInstance = binderInstanceMap.BindInstances.Values.First(_b => _b.Model.Name == interruptModelName);

                Assert.IsTrue(interruptBinderInstance.HasEventInterruptedData);
                var interruptedData = interruptBinderInstance.HoldedEventInterruptedData;
                Assert.AreSame(root, interruptedData.SenderModel);
                Assert.AreEqual(eventDispatcher.SendData, interruptedData.SendEventData);
            }
            Debug.Log($"Success to Interrupt Event of RootModel!!");

            {     //割り込みが有効化されたControllerInfoが割り込みデータを元に送信できているか確認
                { //ControllerInfo#IsInterruptModeが正しく動作しているか確認するため、rootのBinderInstanceを削除する
                    root.Name = "hoge";
                    Assert.IsFalse(binderInstanceMap.BindInstances.ContainsKey(root));
                }

                root.Reset();
                eventDispatcher.SendTo(binderInstanceMap);

                Assert.AreSame(root, root.SenderModel);
                Assert.AreEqual(eventDispatcher.SendData, root.RecievedData);
            }
            Debug.Log($"Success to Send Interrupted Event!!");
        }