Ejemplo n.º 1
0
        public void DonotMatchQueryPathFailed()
        {
            var model = new ModelClass {
                Name = "apple", Value1 = 111, Value2 = 1.234f
            };
            var empry = new ModelClass {
                Name = "empty"
            };

            //作成のテスト
            var viewInstanceCreator = new DefaultViewInstanceCreator(
                (typeof(IntViewObjClass), new IntViewObjClass.Binder()),
                (typeof(FloatViewObjClass), new FloatViewObjClass.Binder())
                );
            var binder = new ModelViewBinder("apple", viewInstanceCreator,
                                             new ModelViewBinder.BindInfo(typeof(IntViewObjClass)),
                                             new ModelViewBinder.BindInfo(typeof(FloatViewObjClass))
                                             );

            Assert.Throws <UnityEngine.Assertions.AssertionException>(() =>
            {
                var empty = new ModelClass {
                    Name = "empty"
                };
                var bindInstance = binder.CreateBindInstance(empty, null);
            }, "クエリパスが一致しない時は例外を投げて、生成しないようにしてください");
        }
Ejemplo n.º 2
0
        public void GetDoDelayOperationsEnumeratorPasses()
        {
            var root = new ModelClass()
            {
                Name = "root"
            };
            var apple = new ModelClass()
            {
                Name = "apple"
            };
            var grape = new ModelClass()
            {
                Name = "grape"
            };

            root.AddChildren(apple, grape);
            var orange = new ModelClass()
            {
                Name = "orange"
            };

            grape.AddChildren(orange);

            var allBinder = new ModelViewBinder("*", null, new ModelViewBinder.BindInfo(typeof(IntViewObjClass)));

            var viewInstanceCreator = new DefaultViewInstanceCreator(
                (typeof(IntViewObjClass), new IntViewObjClass.Binder()),
                (typeof(FloatViewObjClass), new FloatViewObjClass.Binder())
                );
            var binderMap       = new ModelViewBinderMap(viewInstanceCreator, allBinder);
            var bindInstanceMap = new ModelViewBinderInstanceMap(binderMap);

            Assert.IsFalse(bindInstanceMap.EnabledDelayOperation);
            bindInstanceMap.EnabledDelayOperation = true;

            {//操作は対象になっているIModel分だけ生成されるようにする
                bindInstanceMap.Add(false, null, root.GetHierarchyEnumerable());
                bindInstanceMap.Remove(root.GetHierarchyEnumerable());

                var correctOpCount = root.GetHierarchyEnumerable().Count();
                var enumerator     = bindInstanceMap.GetDoDelayOperationsEnumerator();

                var opCount = 0;
                while (enumerator.MoveNext() && enumerator.Current != null)
                {
                    opCount++;
                }

                Assert.AreEqual(correctOpCount, opCount, "登録された操作の個数が想定されたものになっていません。操作対象となっているIModelの数だけ操作を生成してくください。");

                bindInstanceMap.Add(false, null, root.GetHierarchyEnumerable());
                correctOpCount = root.GetHierarchyEnumerable().Count();
                opCount        = 0;
                while (enumerator.MoveNext() && enumerator.Current != null)
                {
                    opCount++;
                }
                Assert.AreEqual(correctOpCount, opCount, "再び操作が追加された後でも、ModelViewBinderInstanceMap#GetDoDelayOperationsEnumerator関数の返り値のIEnumeratorが使用できるようにしてください。");
            }
        }
        public void Should_copy_and_convert_source_to_target()
        {
            var target = new BasicTarget();
            var source = CreateSource();
            var binder = new ModelViewBinder <BasicSource>(source);

            binder.Bind(e => e.B, target, e => e.X, Convert.ToString);
            binder.FillTargets();

            Assert.True(source.B.ToString() == target.X);
        }
        public void Should_trigger_change_event_on_target_and_fill_source()
        {
            var target = new ComplexTarget();
            var source = CreateSource();
            var binder = new ModelViewBinder <BasicSource>(source);

            binder.Bind(e => e.B, target);

            target.Value = 100;

            Assert.True(source.B == 100);
        }
        public void Should_copy_and_convert_target_to_source()
        {
            var target = new BasicTarget {
                X = "9", Y = 1, Z = true
            };
            var source = CreateSource();
            var binder = new ModelViewBinder <BasicSource>(source);

            binder.Bind(e => e.B, target, e => e.X, Convert.ToString, int.Parse);
            binder.FillSource();

            Assert.True(source.B.ToString() == target.X);
        }
        public void Should_disable_target()
        {
            var target = new ComplexTarget {
                Enabled = true
            };
            var source = CreateSource();
            var binder = new ModelViewBinder <BasicSource>(source);

            binder.Bind(e => e.B, target);

            binder.DisableAll();

            Assert.True(!target.Enabled);
        }
        public void Should_copy_source_to_target_and_run_a_callback()
        {
            var target = new BasicTarget();
            var source = CreateSource();
            var binder = new ModelViewBinder <BasicSource>(source);
            var runned = false;

            binder.Bind(e => e.A, target, e => e.X).Then(() => runned = true);


            binder.FillTargets();
            var result = source.A == target.X && runned;

            Assert.True(result);
        }
        public void Should_copy_source_to_target()
        {
            var target = new BasicTarget();
            var source = CreateSource();
            var binder = new ModelViewBinder <BasicSource>(source);

            binder.Bind(e => e.A, target, e => e.X);
            binder.Bind(e => e.B, target, e => e.Y);
            binder.Bind(e => e.C, target, e => e.Z);

            binder.FillTargets();
            var result = source.A == target.X && source.B == target.Y && source.C == target.Z;

            Assert.True(result);
        }
Ejemplo n.º 9
0
        public void QueryViewsPasses()
        {
            var model = new ModelClass {
                Name = "apple", Value1 = 111, Value2 = 1.234f
            };
            var empry = new ModelClass {
                Name = "empty"
            };

            //作成のテスト
            var viewInstanceCreator = new DefaultViewInstanceCreator(
                (typeof(IntViewObjClass), new IntViewObjClass.Binder()),
                (typeof(FloatViewObjClass), new FloatViewObjClass.Binder())
                );
            var binder = new ModelViewBinder("apple", viewInstanceCreator,
                                             new ModelViewBinder.BindInfo(typeof(IntViewObjClass)),
                                             new ModelViewBinder.BindInfo(typeof(FloatViewObjClass)),
                                             new ModelViewBinder.BindInfo("Int", typeof(IntViewObjClass))
                                             );
            var binderInstance = binder.CreateBindInstance(model, null);

            {//query => typeof(IntViewObjClass).FullName
                var ID = ModelViewBinder.BindInfo.ToID(typeof(IntViewObjClass));
                var queryViewResult = binderInstance.QueryViews(ID);
                Assert.AreEqual(1, queryViewResult.Count(), $"Failed to Query Views... ID={ID}");
                var intViewObj = binderInstance.ViewObjects.First(_v => _v.UseBindInfo.ID == ID);
                Assert.IsTrue(intViewObj == queryViewResult.First());
            }

            {//query => typeof(FloatViewObjClass).FullName
                var ID = ModelViewBinder.BindInfo.ToID(typeof(FloatViewObjClass));
                var queryViewResult = binderInstance.QueryViews(ID);
                Assert.AreEqual(1, queryViewResult.Count());
                var floatViewObj = binderInstance.ViewObjects.First(_v => _v.UseBindInfo.ID == ID);
                Assert.IsTrue(floatViewObj == queryViewResult.First());
            }

            {//query => Int
                var queryViewResult = binderInstance.QueryViews("Int");
                Assert.AreEqual(1, queryViewResult.Count());
                var intIdViewObj = binderInstance.ViewObjects.First(_v => _v.UseBindInfo.ID.MainID == "Int");
                Assert.IsTrue(intIdViewObj == queryViewResult.First());
            }
        }
Ejemplo n.º 10
0
        public void AddInfosFromOtherBinderPasses()
        {
            {//
                var binder = new ModelViewBinder("apple", null,
                                                 new ModelViewBinder.BindInfo(typeof(IntViewObjClass)),
                                                 new ModelViewBinder.BindInfo(typeof(FloatViewObjClass))
                                                 );
                var otherBinder = new ModelViewBinder("apple", null,
                                                      new ModelViewBinder.BindInfo("otherInt", typeof(IntViewObjClass)),
                                                      new ModelViewBinder.BindInfo("otherFloat", typeof(FloatViewObjClass))
                                                      );

                binder.AddInfosFromOtherBinder(otherBinder);
                AssertionUtils.AssertEnumerableByUnordered(
                    binder.BindInfos.Concat(otherBinder.BindInfos).Distinct()
                    , binder.BindInfos, "");
            }

            {//同じBindInfoを持つModelViewBinderの場合
                var intID                  = "intId";
                var intViewBindInfo        = new ModelViewBinder.BindInfo(intID, typeof(IntViewObjClass));
                var floatViewBindInfo      = new ModelViewBinder.BindInfo(typeof(FloatViewObjClass));
                var otherFloatViewBindInfo = new ModelViewBinder.BindInfo("otherFloat", typeof(FloatViewObjClass));
                var sameIDViewBindInfo     = new ModelViewBinder.BindInfo(intID, typeof(IntViewObjClass));
                var binder                 = new ModelViewBinder("apple", null,
                                                                 intViewBindInfo, floatViewBindInfo
                                                                 );
                var otherBinder = new ModelViewBinder("orange", null,
                                                      intViewBindInfo, // <- not add
                                                      otherFloatViewBindInfo
                                                      );
                var otherBinder2 = new ModelViewBinder("grape", null,
                                                       sameIDViewBindInfo // <- not add
                                                       );

                binder
                .AddInfosFromOtherBinder(otherBinder)
                .AddInfosFromOtherBinder(otherBinder2);
                AssertionUtils.AssertEnumerableByUnordered(new ModelViewBinder.BindInfo[] {
                    intViewBindInfo, floatViewBindInfo, otherFloatViewBindInfo,
                }, binder.BindInfos, "");
            }
        }
Ejemplo n.º 11
0
        public void DoMatchWithModelTypeAndEmptyQueryPathPasses()
        {
            //作成のテスト
            var viewInstanceCreator = new DefaultViewInstanceCreator(
                (typeof(IntViewObjClass), new IntViewObjClass.Binder()),
                (typeof(FloatViewObjClass), new FloatViewObjClass.Binder())
                );
            var appleBinder = new ModelViewBinder("", viewInstanceCreator,
                                                  new ModelViewBinder.BindInfo(typeof(IntViewObjClass)),
                                                  new ModelViewBinder.BindInfo(typeof(FloatViewObjClass))
                                                  );

            appleBinder.AddEnabledModelType <ModelClass>();

            var matchModel = new ModelClass {
                Name = "apple", Value1 = 111, Value2 = 1.234f
            };
            var notMatchQueryModel = new ModelClass {
                Name = "empty"
            };
            var notMatchTypeModel = new Model {
                Name = "apple"
            };

            Assert.IsTrue(appleBinder.DoMatch(matchModel));
            Assert.IsTrue(appleBinder.DoMatch(notMatchQueryModel));
            Assert.IsFalse(appleBinder.DoMatch(notMatchTypeModel));

            appleBinder.AddEnabledModelType <Model>();
            Assert.IsTrue(appleBinder.DoMatch(matchModel));
            Assert.IsTrue(appleBinder.DoMatch(notMatchQueryModel));
            Assert.IsTrue(appleBinder.DoMatch(notMatchTypeModel));

            appleBinder.RemoveEnabledModelType <ModelClass>();
            Assert.IsFalse(appleBinder.DoMatch(matchModel));
            Assert.IsFalse(appleBinder.DoMatch(notMatchQueryModel));
            Assert.IsTrue(appleBinder.DoMatch(notMatchTypeModel));
        }
Ejemplo n.º 12
0
        public void AutoBindOnChangedModelHierarchyPasses()
        {
            var allBinder = new ModelViewBinder("*", null, new ModelViewBinder.BindInfo(typeof(EmptyViewObjClass)));

            var viewInstanceCreator = new DefaultViewInstanceCreator(
                (typeof(EmptyViewObjClass), new EmptyViewObjClass.Binder())
                );
            var binderMap       = new ModelViewBinderMap(viewInstanceCreator, allBinder);
            var bindInstanceMap = new ModelViewBinderInstanceMap(binderMap);

            Assert.IsFalse(bindInstanceMap.EnableAutoBind);

            var root = new Model()
            {
                Name = "root"
            };
            var apple = new Model()
            {
                Name = "apple"
            };
            var orange = new Model()
            {
                Name = "orange"
            };
            var grape = new Model()
            {
                Name = "grape"
            };

            {//自動バインドのルートモデルの設定のテスト
                //RootModelの設定
                // root <- set to RootModel
                bindInstanceMap.RootModel = root;
                Assert.IsTrue(bindInstanceMap.EnableAutoBind, "ModelViewBinderInstaneMap#RootModelを設定した時はEnableAutoBindはtrueになるようにしてください。");
                var errorMessage = "ModelViewBinderInstaneMap#RootModelを設定した時はバインドも行うようにしてください。";
                Assert.AreEqual(1, bindInstanceMap.BindInstances.Count, errorMessage);
                Assert.IsTrue(bindInstanceMap.BindInstances.ContainsKey(root), errorMessage);

                //RootModelをnullにした時
                // root <- unset to RootModel
                bindInstanceMap.RootModel = null;
                Assert.IsFalse(bindInstanceMap.EnableAutoBind, "ModelViewBinderInstaneMap#RootModelをnullにした時はEnableAutoBindはfalseになるようにしてください。");
                errorMessage = "ModelViewBinderInstaneMap#RootModelをnullにした時は既存のバインドを全て削除してください。";
                Assert.AreEqual(0, bindInstanceMap.BindInstances.Count, errorMessage);

                //子を持つModelをRootModelにした時
                // root <- set to RootModel
                //   - apple <- Auto Add
                //     - orange <- Auto Add
                apple.AddChildren(orange);
                root.AddChildren(apple);
                bindInstanceMap.RootModel = root;
                Assert.IsTrue(bindInstanceMap.EnableAutoBind, "ModelViewBinderInstaneMap#RootModelを設定した時はEnableAutoBindはtrueになるようにしてください。");
                errorMessage = "子を持つModelをModelViewBinderInstaneMap#RootModelに設定した時はバインドも行うようにしてください。";
                Assert.AreEqual(3, bindInstanceMap.BindInstances.Count, errorMessage);
                Assert.IsTrue(bindInstanceMap.BindInstances.ContainsKey(root), errorMessage);
                Assert.IsTrue(bindInstanceMap.BindInstances.ContainsKey(apple), errorMessage);
                Assert.IsTrue(bindInstanceMap.BindInstances.ContainsKey(orange), errorMessage);

                bindInstanceMap.RootModel = null;
                root.Parent   = null;
                apple.Parent  = null;
                orange.Parent = null;
                grape.Parent  = null;
            }

            {//自動生成のテスト
                root.ClearChildren();
                apple.ClearChildren();
                orange.ClearChildren();
                grape.ClearChildren();

                // 子Modelの追加
                //   Appleをrootの子に追加
                // root(RootModel)
                //   - apple <- Add
                bindInstanceMap.RootModel = root;
                var count        = bindInstanceMap.BindInstances.Count;
                var errorMessage = "子を追加した時は、それに対してのバインドを自動的に追加してください";

                root.AddChildren(apple);

                Assert.AreEqual(count + 1, bindInstanceMap.BindInstances.Count, errorMessage);
                Assert.IsTrue(bindInstanceMap.BindInstances.ContainsKey(apple), errorMessage);

                // 親子構造を持つModelの追加
                //   grapeを子に持つorangeをrootの子に追加
                // root(RootModel)
                //   - apple
                //   - orange <- Add
                //     - grape <- Auto Add
                count        = bindInstanceMap.BindInstances.Count;
                errorMessage = "親子構造を持つModelを追加した時は、その全てのModelに対してバインドを行うようにしてください";

                grape.Parent  = orange;
                orange.Parent = root;

                Assert.AreEqual(count + 2, bindInstanceMap.BindInstances.Count, errorMessage);
                Assert.IsTrue(bindInstanceMap.BindInstances.ContainsKey(orange), $"Model(orange)がバインドに追加されていません。{errorMessage}");
                Assert.IsTrue(bindInstanceMap.BindInstances.ContainsKey(grape), $"Model(grape)がバインドに追加されていません。{errorMessage}");
            }

            {//自動削除のテスト
                root.ClearChildren();
                apple.ClearChildren();
                orange.ClearChildren();
                grape.ClearChildren();

                // 子Modelの削除
                // BindInstanceMapからappleを削除する
                // root(RootModel)
                //   - apple <- Remove
                //   - orange
                //     - grape
                apple.Parent              = root;
                orange.Parent             = root;
                grape.Parent              = orange;
                bindInstanceMap.RootModel = root;

                var count        = bindInstanceMap.BindInstances.Count;
                var errorMessage = "子が削除された時は、それに関連するバインドも削除してください。";

                root.RemoveChildren(apple);

                Assert.AreEqual(count - 1, bindInstanceMap.BindInstances.Count, errorMessage);
                Assert.IsFalse(bindInstanceMap.BindInstances.ContainsKey(apple), errorMessage);

                //孫を持つModelの削除
                // BindInstanceMapからorangeを削除する
                // root(RootModel)
                //   - apple
                //   - orange <- Remove
                //     - grape <- Auto Remove
                apple.Parent  = root;
                count         = bindInstanceMap.BindInstances.Count;
                errorMessage  = "孫を持つModelを削除した時はそのModel階層以下のModel全てのバインドも削除してください";
                orange.Parent = null;
                Assert.AreEqual(count - 2, bindInstanceMap.BindInstances.Count, $"想定した個数のModelが削除されていません。{errorMessage}");
                Assert.IsFalse(bindInstanceMap.BindInstances.ContainsKey(orange), $"Model(orange)のバインドが削除されていません。{errorMessage}");
                Assert.IsFalse(bindInstanceMap.BindInstances.ContainsKey(grape), $"Model(grape)のバインドが削除されていません。{errorMessage}");

                orange.Parent = root;//後のテストのために元に戻す
            }

            {//ルートModelに親を追加した時のテスト
                // ルートModelに親を追加
                // - rootParent <- Add
                //   - root(RootModel)
                //     - apple
                //     - orange
                //       - grape
                var count             = bindInstanceMap.BindInstances.Count;
                var errorMessage      = "ルートModelに親を設定した時はその親に対してはバインドを行いません。";
                var saveBindInstances = bindInstanceMap.BindInstances.ToArray();
                var rootParent        = new Model()
                {
                    Name = "rootParent"
                };
                root.Parent = rootParent;
                Assert.AreEqual(count, bindInstanceMap.BindInstances.Count, errorMessage);
                AssertionUtils.AssertEnumerable(saveBindInstances, bindInstanceMap.BindInstances, errorMessage);
            }
        }
Ejemplo n.º 13
0
        public void BasicPasses()
        {
            var viewID = "viewID";

            #region
            var viewCreator = new DefaultViewInstanceCreator(
                (typeof(EmptyViewObject), new EmptyModelViewParamBinder())
                );
            var testBinder = new ModelViewBinder("*", null,
                                                 new ModelViewBinder.BindInfo(typeof(EmptyViewObject))
                                                 .AddControllerInfo(new ControllerInfo(TestEventName.test, new EventHandlerSelector(ModelRelationShip.Self, "", ""))),
                                                 new ModelViewBinder.BindInfo(viewID, typeof(EmptyViewObject))
                                                 .AddControllerInfo(new ControllerInfo(TestEventName.test, new EventHandlerSelector(ModelRelationShip.Self, "", "")))
                                                 );
            var binderMap = new ModelViewBinderMap(viewCreator,
                                                   testBinder
                                                   );
            var binderInstanceMap = binderMap.CreateBinderInstaceMap();
            #endregion

            var root = new Model {
                Name = "root", LogicalID = new ModelIDList("test")
            };
            var child = new Model {
                Name = "root", LogicalID = new ModelIDList("test2")
            };
            child.Parent = root;
            binderInstanceMap.RootModel = root;
            var eventDispatcherStateMap = new EventDispatchStateMap()
                                          .AddState(TestDispatchStateName.test, new EventDispatchQuery("#test", ""))
                                          .AddState(TestDispatchStateName.test, new EventDispatchQuery("#test2", "viewID"))
                                          .AddState(TestDispatchStateName.testSecond, new EventDispatchQuery("#test", "viewID"))
                                          .AddState(TestDispatchStateName.testSecond, new EventDispatchQuery("#test2", ""))
            ;

            {     //DoMatch
                { //root
                    var rootBinderInstance = binderInstanceMap.BindInstances[root];
                    var defaultViewObj     = rootBinderInstance.QueryViews(ModelViewBinder.BindInfo.ToID(typeof(EmptyViewObject))).First();
                    var viewObjWithViewID  = rootBinderInstance.QueryViews(viewID).First();
                    Assert.IsTrue(eventDispatcherStateMap.DoMatch <IOnTestReciever>(TestDispatchStateName.test, root, null));
                    Assert.IsTrue(rootBinderInstance.ViewObjects
                                  .All(_v => eventDispatcherStateMap.DoMatch <IOnTestReciever>(TestDispatchStateName.test, root, _v)));

                    Assert.IsFalse(eventDispatcherStateMap.DoMatch <IOnTestReciever>(TestDispatchStateName.testSecond, root, null));
                    Assert.IsFalse(eventDispatcherStateMap.DoMatch <IOnTestReciever>(TestDispatchStateName.testSecond, root, defaultViewObj));
                    Assert.IsTrue(eventDispatcherStateMap.DoMatch <IOnTestReciever>(TestDispatchStateName.testSecond, root, viewObjWithViewID));

                    var errorMessage = "";
                    AssertionUtils.AssertEnumerableByUnordered(
                        new string[] { TestDispatchStateName.test.ToString() },
                        eventDispatcherStateMap.MatchStates <IOnTestReciever>(root, null),
                        errorMessage);

                    AssertionUtils.AssertEnumerableByUnordered(
                        new string[] { TestDispatchStateName.test.ToString() },
                        eventDispatcherStateMap.MatchStates <IOnTestReciever>(root, defaultViewObj),
                        errorMessage);

                    AssertionUtils.AssertEnumerableByUnordered(
                        new string[] { TestDispatchStateName.test.ToString(), TestDispatchStateName.testSecond.ToString() },
                        eventDispatcherStateMap.MatchStates <IOnTestReciever>(root, viewObjWithViewID),
                        errorMessage);
                }

                {//child
                    var childBinderInstace = binderInstanceMap.BindInstances[child];
                    var defaultViewObj     = childBinderInstace.QueryViews(ModelViewBinder.BindInfo.ToID(typeof(EmptyViewObject))).First();
                    var viewObjWithViewID  = childBinderInstace.QueryViews(viewID).First();
                    Assert.IsFalse(eventDispatcherStateMap.DoMatch <IOnTestReciever>(TestDispatchStateName.test, child, null));
                    Assert.IsFalse(eventDispatcherStateMap.DoMatch <IOnTestReciever>(TestDispatchStateName.test, child, defaultViewObj));
                    Assert.IsTrue(eventDispatcherStateMap.DoMatch <IOnTestReciever>(TestDispatchStateName.test, child, viewObjWithViewID));

                    Assert.IsTrue(eventDispatcherStateMap.DoMatch <IOnTestReciever>(TestDispatchStateName.testSecond, child, null));
                    Assert.IsTrue(eventDispatcherStateMap.DoMatch <IOnTestReciever>(TestDispatchStateName.testSecond, child, defaultViewObj));
                    Assert.IsTrue(eventDispatcherStateMap.DoMatch <IOnTestReciever>(TestDispatchStateName.testSecond, child, viewObjWithViewID));

                    var errorMessage = "";
                    AssertionUtils.AssertEnumerableByUnordered(
                        new string[] { TestDispatchStateName.testSecond.ToString() },
                        eventDispatcherStateMap.MatchStates <IOnTestReciever>(child, null),
                        errorMessage);

                    AssertionUtils.AssertEnumerableByUnordered(
                        new string[] { TestDispatchStateName.testSecond.ToString() },
                        eventDispatcherStateMap.MatchStates <IOnTestReciever>(child, defaultViewObj),
                        errorMessage);

                    AssertionUtils.AssertEnumerableByUnordered(
                        new string[] { TestDispatchStateName.test.ToString(), TestDispatchStateName.testSecond.ToString() },
                        eventDispatcherStateMap.MatchStates <IOnTestReciever>(child, viewObjWithViewID),
                        errorMessage);
                }
            }
        }
Ejemplo n.º 14
0
        public void BasicUsagePasses()
        {
            var model = new ModelClass {
                Name = "apple", Value1 = 111, Value2 = 1.234f
            };
            var empry = new ModelClass {
                Name = "empty"
            };

            //作成のテスト
            //var bindInfoList = ModelViewBinder.CreateBindInfoDict(
            //    (typeof(IntViewObjClass), new IntViewObjClass.Binder()),
            //    (typeof(FloatViewObjClass), new FloatViewObjClass.Binder()));
            //var binder = new ModelViewBinder("apple", bindInfoList);

            var viewInstanceCreator = new DefaultViewInstanceCreator(
                (typeof(IntViewObjClass), new IntViewObjClass.Binder()),
                (typeof(FloatViewObjClass), new FloatViewObjClass.Binder())
                );
            var binder = new ModelViewBinder("apple", viewInstanceCreator,
                                             new ModelViewBinder.BindInfo(typeof(IntViewObjClass)),
                                             new ModelViewBinder.BindInfo(typeof(FloatViewObjClass))
                                             );

            Assert.AreSame(binder.ViewInstaceCreator, viewInstanceCreator);
            { //QueryPathの検証のテスト
                Assert.IsTrue(binder.DoMatch(model));
                Assert.IsFalse(binder.DoMatch(new Model {
                    Name = "orange"
                }));
            }

            {//ViewObjectの作成のテスト
                var bindInstance = binder.CreateBindInstance(model, null);
                var intViewObj   = bindInstance.ViewObjects.FirstOrDefault(_o => _o is IntViewObjClass) as IntViewObjClass;
                var floatViewObj = bindInstance.ViewObjects.FirstOrDefault(_o => _o is FloatViewObjClass) as FloatViewObjClass;
                Assert.IsNotNull(intViewObj);
                Assert.IsNotNull(floatViewObj);

                bindInstance.UpdateViewObjects();
                Assert.AreEqual(model.Value1, intViewObj.IntValue);
                Assert.AreEqual(model.Value2, floatViewObj.FloatValue);

                //対応するModelViewBinderの取得のテスト
                {//IntViewObjClass
                    model.Value1 = -1234;
                    Assert.IsTrue(binder.BindInfos.Any(_i => _i == intViewObj.UseBindInfo));
                    var paramBinder = binder.GetParamBinder(intViewObj.UseBindInfo);
                    Assert.IsNotNull(paramBinder);
                    Assert.AreEqual(typeof(IntViewObjClass.Binder), paramBinder.GetType());
                    paramBinder.Update(model, intViewObj);
                    Assert.AreEqual(model.Value1, intViewObj.IntValue);
                }

                {//FloatViewObjClass
                    model.Value2 = 0.987f;
                    Assert.IsTrue(binder.BindInfos.Any(_i => _i == floatViewObj.UseBindInfo));
                    var paramBinder = binder.GetParamBinder(floatViewObj.UseBindInfo);
                    Assert.IsNotNull(paramBinder);
                    Assert.AreEqual(typeof(FloatViewObjClass.Binder), paramBinder.GetType());
                    paramBinder.Update(model, floatViewObj);
                    Assert.AreEqual(model.Value2, floatViewObj.FloatValue);
                }
            }
        }
Ejemplo n.º 15
0
        public void QueryPathPriorityPasses()
        {
            var root = new ModelClass()
            {
                Name = "root"
            };
            var apple = new ModelClass()
            {
                Name = "apple"
            };
            var grape = new ModelClass()
            {
                Name = "grape"
            };

            root.AddChildren(apple, grape);
            var orange = new ModelClass()
            {
                Name = "orange", LogicalID = new ModelIDList("child")
            };

            grape.AddChildren(orange);

            var allBinder = new ModelViewBinder("*", null,
                                                new ModelViewBinder.BindInfo(typeof(IntViewObjClass)));
            var appleBinder = new ModelViewBinder("apple", null,
                                                  new ModelViewBinder.BindInfo(typeof(IntViewObjClass)));
            var orangeBinder = new ModelViewBinder("orange", null,
                                                   new ModelViewBinder.BindInfo(typeof(FloatViewObjClass)));
            var childOrangeBinder = new ModelViewBinder("orange #child", null,
                                                        new ModelViewBinder.BindInfo(typeof(FloatViewObjClass)));

            Assert.IsFalse(root.DoMatchQueryPath(appleBinder.Query));

            var viewInstanceCreator = new DefaultViewInstanceCreator(
                (typeof(IntViewObjClass), new IntViewObjClass.Binder()),
                (typeof(FloatViewObjClass), new FloatViewObjClass.Binder())
                );
            var binderMap = new ModelViewBinderMap(
                viewInstanceCreator,
                allBinder,
                appleBinder,
                orangeBinder,
                childOrangeBinder);
            var bindInstanceMap = binderMap.CreateBinderInstaceMap();

            bindInstanceMap.Add(false, null, root.GetHierarchyEnumerable());

            var rootBinderInstance = bindInstanceMap.BindInstances[root];

            Assert.AreSame(allBinder, rootBinderInstance.Binder);

            var appleBinderInstance = bindInstanceMap.BindInstances[apple];

            Assert.AreSame(appleBinder, appleBinderInstance.Binder);

            // grape/orangeのものを使用すること
            var orangeBinderInstance = bindInstanceMap.BindInstances[orange];

            Assert.AreSame(childOrangeBinder, orangeBinderInstance.Binder);

            var grapeBinderInstance = bindInstanceMap.BindInstances[grape];

            Assert.AreSame(allBinder, grapeBinderInstance.Binder);
        }
Ejemplo n.º 16
0
        public void BinderInstanceMapBasicUsagePasses()
        {
            var root = new ModelClass()
            {
                Name = "root"
            };
            var apple = new ModelClass()
            {
                Name = "apple"
            };
            var noneBinderModel = new ModelClass()
            {
                Name = "grape"
            };

            root.AddChildren(apple, noneBinderModel);
            var orange = new ModelClass()
            {
                Name = "orange"
            };

            noneBinderModel.AddChildren(orange);

            var appleBinder = new ModelViewBinder("apple", null,
                                                  new ModelViewBinder.BindInfo(typeof(IntViewObjClass)));
            var orangeBinder = new ModelViewBinder("orange", null,
                                                   new ModelViewBinder.BindInfo(typeof(FloatViewObjClass)));
            var rebindBinder = new ModelViewBinder("Rebind", null,
                                                   new ModelViewBinder.BindInfo(typeof(FloatViewObjClass)));

            Assert.IsFalse(root.DoMatchQueryPath(appleBinder.Query));
            var viewInstanceCreator = new DefaultViewInstanceCreator(
                (typeof(IntViewObjClass), new IntViewObjClass.Binder()),
                (typeof(FloatViewObjClass), new FloatViewObjClass.Binder())
                );
            var binderMap = new ModelViewBinderMap(viewInstanceCreator, appleBinder, orangeBinder, rebindBinder);

            {//BinderInstanceMapのテスト
                var bindInstanceMap = new ModelViewBinderInstanceMap(binderMap);
                Assert.AreSame(binderMap, bindInstanceMap.BinderMap);

                {//BindInstanceMap#Addのテスト
                    Assert.AreEqual(0, bindInstanceMap.BindInstances.Count());
                    bindInstanceMap.Add(false, null, apple, noneBinderModel);
                    //grapeはQueryPathと一致しないので追加されない
                    AssertionUtils.AssertEnumerableByUnordered(new Model[] {
                        apple, orange
                    }, bindInstanceMap.BindInstances.Select(_b => _b.Key), "");

                    //追加された時は合わせてViewのパラメータもModelのものに更新する
                    var appleViewObj = bindInstanceMap[apple].ViewObjects.First(_v => _v is IntViewObjClass) as IntViewObjClass;
                    Assert.AreEqual(apple.IntValue, appleViewObj.IntValue);
                    foreach (var viewObj in bindInstanceMap[apple].ViewObjects)
                    {
                        Assert.AreEqual(bindInstanceMap[apple], viewObj.UseBinderInstance);
                    }
                    Assert.AreSame(bindInstanceMap, bindInstanceMap[apple].UseInstanceMap);

                    var orangeViewObj = bindInstanceMap[orange].ViewObjects.First(_v => _v is FloatViewObjClass) as FloatViewObjClass;
                    Assert.AreEqual(orange.FloatValue, orangeViewObj.FloatValue);
                    foreach (var viewObj in bindInstanceMap[orange].ViewObjects)
                    {
                        Assert.AreEqual(bindInstanceMap[orange], viewObj.UseBinderInstance);
                    }

                    //既に追加されていたら追加しない
                    bindInstanceMap.Add(false, null, apple, orange);
                    AssertionUtils.AssertEnumerableByUnordered(new Model[] {
                        apple, orange
                    }, bindInstanceMap.BindInstances.Select(_b => _b.Key), "同じModelが追加できないようにしてください");
                }

                {//マッチしないModelを追加した時のテスト
                    var empty = new Model()
                    {
                        Name = "__empty"
                    };
                    Assert.DoesNotThrow(() =>
                    {
                        bindInstanceMap.Add(empty);
                        Assert.IsFalse(bindInstanceMap.BindInstances.ContainsKey(empty), "マッチしないModelを追加した時はModelViewBinderInstanceを生成しないようにしてください");
                    }, "マッチしないModelを追加した時でもModelViewBinderInstanceMapから例外を発生させないようにしてください。");
                }

                var appleBindInstance  = bindInstanceMap[apple];
                var orangeBindInstance = bindInstanceMap[orange];
                {//BindInstanceMap#[]のテスト
                    Assert.IsNotNull(appleBindInstance);
                    Assert.AreEqual(apple, appleBindInstance.Model);

                    Assert.IsNotNull(orangeBindInstance);
                    Assert.AreEqual(orange, orangeBindInstance.Model);
                }

                {//BindInstanceMap#UpdateViewObjectsのテスト
                    apple.IntValue    = 234;
                    orange.FloatValue = 2.5432f;
                    bindInstanceMap.UpdateViewObjects();
                    var appleViewObj = appleBindInstance.ViewObjects.First(_v => _v is IntViewObjClass) as IntViewObjClass;
                    Assert.AreEqual(apple.IntValue, appleViewObj.IntValue);
                    var orangeViewObj = orangeBindInstance.ViewObjects.First(_v => _v is FloatViewObjClass) as FloatViewObjClass;
                    Assert.AreEqual(orange.FloatValue, orangeViewObj.FloatValue);
                }

                {//BindInstanceMap#Rebindのテスト
                    apple.Name = "Rebind";
                    var isSuccess = bindInstanceMap.Rebind(apple);
                    Assert.IsTrue(isSuccess, "Rebindに失敗しています");
                    Assert.AreSame(rebindBinder, bindInstanceMap.BindInstances[apple].Binder);
                    Assert.AreSame(bindInstanceMap, bindInstanceMap.BindInstances[apple].UseInstanceMap);
                }
                {
                    // 追加されていないものをRebindした時は何もしない
                    var recordedBindInstances = bindInstanceMap.BindInstances.ToArray();
                    var model = new ModelClass()
                    {
                        Name = "Tmp"
                    };
                    var isSuccess = bindInstanceMap.Rebind(model);
                    Assert.IsFalse(isSuccess, "登録されていないModelの場合はRebindしないようにしてください");
                    AssertionUtils.AssertEnumerable(recordedBindInstances, bindInstanceMap.BindInstances, "ModelViewBinderInstanceMapに追加されていないModelをRebindした時は何もしないようにしてください。");
                }

                {//BindInstanceMap#Removeのテスト
                    bindInstanceMap.Remove(apple, noneBinderModel);
                    Assert.AreEqual(0, bindInstanceMap.BindInstances.Count());
                }

                {//BindInstanceMap#ClearBindInstancesのテスト
                    bindInstanceMap.Add(false, null, apple, orange);
                    bindInstanceMap.ClearBindInstances();
                    Assert.AreEqual(0, bindInstanceMap.BindInstances.Count());
                }
            }
        }
Ejemplo n.º 17
0
        public void OnAddedCallbackPasses()
        {
            var allBinder = new ModelViewBinder("*", null,
                                                new ModelViewBinder.BindInfo(typeof(TestOnCreatedViewObjClass)));
            var viewInstanceCreator = new DefaultViewInstanceCreator(
                (typeof(TestOnCreatedViewObjClass), new TestOnCreatedViewObjClass.ParamBinder())
                );

            {//ModeViewBinder#CreateViewObjectsのテスト
                var counter = 0;
                List <ModelViewBinderInstance>     onAddedBinderInstanceList = new List <ModelViewBinderInstance>();
                ModelViewBinderMap.OnAddedCallback onAddedCallback           = (binderInstance) =>
                {
                    counter++;
                    onAddedBinderInstanceList.Add(binderInstance);
                };
                var binderMap = new ModelViewBinderMap(viewInstanceCreator, allBinder)
                {
                    DefaultOnAddedCallback = onAddedCallback
                };

                Assert.AreSame(onAddedCallback, binderMap.DefaultOnAddedCallback);

                var binderInstanceMap = new ModelViewBinderInstanceMap(binderMap);
                var root = new Model()
                {
                    Name = "root"
                };

                {//
                    counter = 0;
                    onAddedBinderInstanceList.Clear();
                    binderInstanceMap.RootModel = root;
                    Assert.AreEqual(1, counter);
                    AssertionUtils.AssertEnumerableByUnordered(
                        new ModelViewBinderInstance[] { binderInstanceMap.BindInstances[root] }
                        , onAddedBinderInstanceList
                        , "");
                }

                {//親子階層を持つModelを追加した時のテスト
                    var model = new Model()
                    {
                        Name = "model1"
                    };
                    var child = new Model()
                    {
                        Name = "child1"
                    };
                    child.Parent = model;

                    counter = 0;
                    onAddedBinderInstanceList.Clear();
                    binderInstanceMap.Add(model, false, null);

                    Assert.AreEqual(2, counter);
                    AssertionUtils.AssertEnumerableByUnordered(
                        new ModelViewBinderInstance[] {
                        binderInstanceMap.BindInstances[model],
                        binderInstanceMap.BindInstances[child],
                    }
                        , onAddedBinderInstanceList
                        , "");
                }

                {//Default意外にもカールバックを設定した時のテスト.
                    var model = new Model()
                    {
                        Name = "model1"
                    };

                    counter = 0;
                    onAddedBinderInstanceList.Clear();

                    var tmpCounter = 0;
                    binderInstanceMap.Add(model, false, (binderInstance) => {
                        tmpCounter += 100;
                        onAddedBinderInstanceList.Add(binderInstance);
                    });

                    Assert.AreEqual(1, counter);
                    Assert.AreEqual(100, tmpCounter);
                    AssertionUtils.AssertEnumerableByUnordered(
                        new ModelViewBinderInstance[] {
                        binderInstanceMap.BindInstances[model],
                        binderInstanceMap.BindInstances[model],
                    }
                        , onAddedBinderInstanceList
                        , "引数に渡したコールバックとDefaultのコールバック両方とも呼び出すようにしてください");
                }
            }
        }
Ejemplo n.º 18
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!!");
        }
Ejemplo n.º 19
0
        public void IViewObjectOnCreatedPasses()
        {
            var allBinder = new ModelViewBinder("*", null,
                                                new ModelViewBinder.BindInfo(typeof(TestOnCreatedViewObjClass)));

            var viewInstanceCreator = new DefaultViewInstanceCreator(
                (typeof(TestOnCreatedViewObjClass), new TestOnCreatedViewObjClass.ParamBinder())
                );

            var errorMessageUseModel              = $"ModeViewBinder#CreateViewObjectsに渡したModelがIViewObject#UseModelに設定されるようにしてください";
            var errorMessageUseBinderInstance     = $"ModeViewBinder#CreateViewObjectsに渡したModelViewBinderInstanceがIViewObject#UseBinderInstanceに設定されるようにしてください";
            var errorMessageUsedBinderInstanceMap = $"ModeViewBinder#CreateViewObjectsに渡したModelViewBinderInstanceMapがIViewObject#OnCreatedに渡されるようにしてください";
            {//ModeViewBinder#CreateViewObjectsのテスト
                var binderMap         = new ModelViewBinderMap(viewInstanceCreator, allBinder);
                var binderInstanceMap = new ModelViewBinderInstanceMap(binderMap);
                var root = new Model()
                {
                    Name = "root"
                };

                var viewObjs = allBinder.CreateViewObjects(root, null, binderInstanceMap);
                Assert.AreEqual(1, viewObjs.Count);

                var viewObj = viewObjs[0];
                Assert.AreSame(root, viewObj.UseModel, errorMessageUseModel);
                Assert.AreSame(null, viewObj.UseBinderInstance, errorMessageUseBinderInstance);

                var onCreatedViewObj = viewObjs[0] as TestOnCreatedViewObjClass;
                Assert.AreSame(binderInstanceMap, onCreatedViewObj.UsedBinderInstanceMap, errorMessageUsedBinderInstanceMap);
            }
            {
                //ModelViewBinderInstanceMapを指定しなかった時のテスト
                var root = new Model()
                {
                    Name = "root"
                };
                var viewObjs = allBinder.CreateViewObjects(root, null, null);
                Assert.AreEqual(1, viewObjs.Count);

                var viewObj = viewObjs[0];
                Assert.AreSame(root, viewObj.UseModel, errorMessageUseModel);

                var onCreatedViewObj = viewObj as TestOnCreatedViewObjClass;
                Assert.AreSame(null, onCreatedViewObj.UsedBinderInstanceMap, errorMessageUsedBinderInstanceMap);
            }

            {//ModelViewBinderInstanceMap#CreateBindInstanceのテスト
                var binderMap         = new ModelViewBinderMap(viewInstanceCreator, allBinder);
                var binderInstanceMap = new ModelViewBinderInstanceMap(binderMap);
                var root = new Model()
                {
                    Name = "root"
                };

                var bindInstance = binderMap.CreateBindInstance(root, binderInstanceMap);

                Assert.AreEqual(1, bindInstance.ViewObjects.Count());

                var viewObj = bindInstance.ViewObjects.First();
                Assert.AreSame(root, viewObj.UseModel, errorMessageUseModel);
                Assert.AreSame(bindInstance, viewObj.UseBinderInstance, errorMessageUseBinderInstance);

                var onCreatedViewObj = viewObj as TestOnCreatedViewObjClass;
                Assert.AreSame(binderInstanceMap, onCreatedViewObj.UsedBinderInstanceMap, errorMessageUsedBinderInstanceMap);
            }

            {//ModelViewBinderInstanceMap#Addのテスト
                var binderMap         = new ModelViewBinderMap(viewInstanceCreator, allBinder);
                var binderInstanceMap = new ModelViewBinderInstanceMap(binderMap);
                var root = new Model()
                {
                    Name = "root"
                };

                binderInstanceMap.Add(root);
                var bindInstance = binderInstanceMap.BindInstances[root];
                Assert.AreEqual(1, bindInstance.ViewObjects.Count());

                var viewObj = bindInstance.ViewObjects.First();
                Assert.AreSame(root, viewObj.UseModel, errorMessageUseModel);

                var onCreatedViewObj = viewObj as TestOnCreatedViewObjClass;
                Assert.AreSame(binderInstanceMap, onCreatedViewObj.UsedBinderInstanceMap, errorMessageUsedBinderInstanceMap);
            }
        }
Ejemplo n.º 20
0
        public void BasicUsagePasses()
        {
            var root = new ModelClass()
            {
                Name = "root"
            };
            var apple = new ModelClass()
            {
                Name = "apple"
            };
            var grape = new ModelClass()
            {
                Name = "grape"
            };

            root.AddChildren(apple, grape);
            var orange = new ModelClass()
            {
                Name = "orange"
            };

            grape.AddChildren(orange);

            var appleBinder = new ModelViewBinder("apple", null,
                                                  new ModelViewBinder.BindInfo(typeof(IntViewObjClass)));
            var orangeBinder = new ModelViewBinder("orange", null,
                                                   new ModelViewBinder.BindInfo(typeof(FloatViewObjClass)));
            var rebindBinder = new ModelViewBinder("Rebind", null,
                                                   new ModelViewBinder.BindInfo(typeof(FloatViewObjClass)));

            Assert.IsFalse(root.DoMatchQueryPath(appleBinder.Query));
            var viewInstanceCreator = new DefaultViewInstanceCreator(
                (typeof(IntViewObjClass), new IntViewObjClass.Binder()),
                (typeof(FloatViewObjClass), new FloatViewObjClass.Binder())
                );
            var binderMap = new ModelViewBinderMap(viewInstanceCreator, appleBinder, orangeBinder, rebindBinder);
            {//Constructorのテスト
                Assert.AreEqual(3, binderMap.Binders.Count());
                Assert.IsTrue(binderMap.Binders.Any(_b => _b == appleBinder), "指定したBinderがBinderMapの中にありません");
                Assert.IsTrue(binderMap.Binders.Any(_b => _b == orangeBinder), "指定したBinderがBinderMapの中にありません");
                Assert.IsTrue(binderMap.Binders.Any(_b => _b == rebindBinder), "指定したBinderがBinderMapの中にありません");

                Assert.AreSame(viewInstanceCreator, binderMap.ViewInstanceCreator);
                string errorMessage = "ModelViewBinderMapに設定されたModelViewBinder#ViewInstaceCreatorはModelViewBinderMap#ViewInstanceCreatorと同じものになるようにしてください。";
                Assert.AreSame(binderMap.ViewInstanceCreator, appleBinder.ViewInstaceCreator, errorMessage);
                Assert.AreSame(binderMap.ViewInstanceCreator, orangeBinder.ViewInstaceCreator, errorMessage);
                Assert.AreSame(binderMap.ViewInstanceCreator, rebindBinder.ViewInstaceCreator, errorMessage);
            }

            {//ModelViewBindMap#CreateBindInstanceのテスト
                var appleBindInstance  = binderMap.CreateBindInstance(apple, null);
                var orangeBindInstance = binderMap.CreateBindInstance(orange, null);
                Assert.IsNotNull(appleBindInstance);
                Assert.IsNotNull(orangeBindInstance);
                Assert.IsNull(binderMap.CreateBindInstance(root, null));
                Assert.IsNull(binderMap.CreateBindInstance(grape, null));

                Assert.AreSame(apple, appleBindInstance.Model);
                Assert.AreSame(appleBinder, appleBindInstance.Binder);
                Assert.AreEqual(1, appleBindInstance.ViewObjects.Count());
                Assert.AreEqual(typeof(IntViewObjClass), appleBindInstance.ViewObjects.First().GetType());

                Assert.AreSame(orange, orangeBindInstance.Model);
                Assert.AreSame(orangeBinder, orangeBindInstance.Binder);
                Assert.AreEqual(1, orangeBindInstance.ViewObjects.Count());
                Assert.AreEqual(typeof(FloatViewObjClass), orangeBindInstance.ViewObjects.First().GetType());
            }
        }
Ejemplo n.º 21
0
        public void AutoBindOnChangedModelIdentitiesPasses()
        {
            var nameBinderQueryPath    = "name";
            var logicalBinderQueryPath = "#log";
            var styleBinderQueryPath   = ".stl";

            var allBinder = new ModelViewBinder("*", null
                                                , new ModelViewBinder.BindInfo(typeof(EmptyViewObjClass)));
            var nameBinder = new ModelViewBinder(nameBinderQueryPath, null
                                                 , new ModelViewBinder.BindInfo(typeof(IntViewObjClass)));
            var logicalBinder = new ModelViewBinder(logicalBinderQueryPath, null
                                                    , new ModelViewBinder.BindInfo(typeof(IntViewObjClass)));
            var styleBinder = new ModelViewBinder(styleBinderQueryPath, null
                                                  , new ModelViewBinder.BindInfo(typeof(IntViewObjClass)));

            var viewInstanceCreator = new DefaultViewInstanceCreator(
                (typeof(EmptyViewObjClass), new EmptyViewObjClass.Binder()),
                (typeof(IntViewObjClass), new IntViewObjClass.Binder())
                );
            var binderMap = new ModelViewBinderMap(viewInstanceCreator,
                                                   allBinder,
                                                   nameBinder,
                                                   logicalBinder,
                                                   styleBinder);
            var bindInstanceMap = new ModelViewBinderInstanceMap(binderMap);

            var root = new ModelClass()
            {
                Name = "root"
            };
            var apple = new ModelClass()
            {
                Name = "apple", Parent = root
            };
            var orange = new ModelClass()
            {
                Name = "orange", Parent = root
            };
            var grape = new ModelClass()
            {
                Name = "grape", Parent = orange
            };

            bindInstanceMap.RootModel = root;

            {//Nameを切り替えた時のテスト
                // root.Name => "name"
                // - rootのBinder -> nameBinderに変更される
                root.Name = nameBinderQueryPath;
                Assert.AreSame(nameBinder, bindInstanceMap.BindInstances[root].Binder);

                // root.Name => "root"
                // - rootのBinder -> allBinderに変更される
                root.Name = "root";
                Assert.AreSame(allBinder, bindInstanceMap.BindInstances[root].Binder);

                // apple.Name => "name"
                // - appleのBinder -> nameBinderに変更される
                apple.Name = nameBinderQueryPath;
                Assert.AreSame(nameBinder, bindInstanceMap.BindInstances[apple].Binder, "ルートModelの階層内のModelのNameが変更された時も、バインドを切り替えるようにしてください");

                // apple.Name => "apple"
                // - appleのBinder -> allBinderに変更される
                apple.Name = "apple";
                Assert.AreSame(allBinder, bindInstanceMap.BindInstances[apple].Binder, "ルートModelの階層内のModelのNameが変更された時も、バインドを切り替えるようにしてください");

                // grape.Name => "name"
                // - grapeのBinder -> nameBinderに変更される
                grape.Name = nameBinderQueryPath;
                Assert.AreSame(nameBinder, bindInstanceMap.BindInstances[grape].Binder, "ルートModelの階層内のModelのNameが変更された時も、バインドを切り替えるようにしてください");

                // grape.Name => "root"
                // - grapeのBinder -> allBinderに変更される
                grape.Name = "grape";
                Assert.AreSame(allBinder, bindInstanceMap.BindInstances[grape].Binder, "ルートModelの階層内のModelのNameが変更された時も、バインドを切り替えるようにしてください");
            }

            {//LogicalIDを切り替えた時のテスト
                // root.LogicalID => "log"
                // - rootのBinder -> logicalBinderに変更される
                root.AddLogicalID(logicalBinderQueryPath);
                Assert.AreSame(logicalBinder, bindInstanceMap.BindInstances[root].Binder);

                // root.LogicalID => ""
                // - rootのBinder -> allBinderに変更される
                root.RemoveLogicalID(logicalBinderQueryPath);
                Assert.AreSame(allBinder, bindInstanceMap.BindInstances[root].Binder);

                var errorMessage = "ルートModelの階層内のModelのLogicalIDが変更された時も、バインドを切り替えるようにしてください";
                // orange.LogicalID => "log"
                // - orangeのBinder -> logicalBinderに変更される
                orange.AddLogicalID(logicalBinderQueryPath);
                Assert.AreSame(logicalBinder, bindInstanceMap.BindInstances[orange].Binder, errorMessage);

                // orange.LogicalID => ""
                // - orangeのBinder -> allBinderに変更される
                orange.RemoveLogicalID(logicalBinderQueryPath);
                Assert.AreSame(allBinder, bindInstanceMap.BindInstances[orange].Binder, errorMessage);

                // grape.LogicalID => "log"
                // - grapeのBinder -> logicalBinderに変更される
                grape.AddLogicalID(logicalBinderQueryPath);
                Assert.AreSame(logicalBinder, bindInstanceMap.BindInstances[grape].Binder, errorMessage);

                // grape.LogicalID => ""
                // - grapeのBinder -> allBinderに変更される
                grape.RemoveLogicalID(logicalBinderQueryPath);
                Assert.AreSame(allBinder, bindInstanceMap.BindInstances[grape].Binder, errorMessage);
            }

            {//StylingIDを切り替えた時のテスト
                // root.StylingID => "stl"
                // - rootのBinder -> styleBinderに変更される
                root.AddStylingID(styleBinderQueryPath);
                Assert.AreSame(styleBinder, bindInstanceMap.BindInstances[root].Binder);

                // root.StylingID => ""
                // - rootのBinder -> allBinderに変更される
                root.RemoveStylingID(styleBinderQueryPath);
                Assert.AreSame(allBinder, bindInstanceMap.BindInstances[root].Binder);

                var errorMessage = "ルートModelの階層内のModelのStylingIDが変更された時も、バインドを切り替えるようにしてください";
                // orange.StylingID => "log"
                // - orangeのBinder -> styleBinderに変更される
                orange.AddStylingID(styleBinderQueryPath);
                Assert.AreSame(styleBinder, bindInstanceMap.BindInstances[orange].Binder, errorMessage);

                // orange.StylingID => ""
                // - orangeのBinder -> allBinderに変更される
                orange.RemoveStylingID(styleBinderQueryPath);
                Assert.AreSame(allBinder, bindInstanceMap.BindInstances[orange].Binder, errorMessage);

                // grape.StylingID => "log"
                // - grapeのBinder -> styleBinderに変更される
                grape.AddStylingID(styleBinderQueryPath);
                Assert.AreSame(styleBinder, bindInstanceMap.BindInstances[grape].Binder, errorMessage);

                // grape.StylingID => ""
                // - grapeのBinder -> allBinderに変更される
                grape.RemoveStylingID(styleBinderQueryPath);
                Assert.AreSame(allBinder, bindInstanceMap.BindInstances[grape].Binder, errorMessage);
            }
        }
Ejemplo n.º 22
0
        public void ModelOnUpdatedPasses()
        {
            var model = new ModelClass {
                Name = "apple", Value1 = 111, Value2 = 1.234f
            };
            var empry = new ModelClass {
                Name = "empty"
            };

            var viewInstanceCreator = new DefaultViewInstanceCreator(
                (typeof(IntViewObjClass), new IntViewObjClass.Binder()),
                (typeof(FloatViewObjClass), new FloatViewObjClass.Binder())
                );
            var binder = new ModelViewBinder("apple", viewInstanceCreator,
                                             new ModelViewBinder.BindInfo(typeof(IntViewObjClass)),
                                             new ModelViewBinder.BindInfo(typeof(FloatViewObjClass))
                                             );

            {//Model#OnUpdatedと連動しているかテスト
                var obj = new ModelClass()
                {
                    Name = "apple", Value1 = 456, Value2 = 6.7f
                };
                var bindInstance = binder.CreateBindInstance(obj, null);
                var intViewObj   = bindInstance.ViewObjects.FirstOrDefault(_o => _o is IntViewObjClass) as IntViewObjClass;
                var floatViewObj = bindInstance.ViewObjects.FirstOrDefault(_o => _o is FloatViewObjClass) as FloatViewObjClass;

                {//Model#DoneUpdatedとの連動テスト
                    obj.DoneUpdate();

                    var errorMessage = "ModelViewBindInstaceの生成時には指定したModel#OnUpdatedと連動するようにしてください";
                    obj.Value1 = 9847;
                    obj.DoneUpdate();
                    Assert.AreEqual(obj.Value1, intViewObj.IntValue, errorMessage);
                    Assert.AreEqual(obj.Value2, floatViewObj.FloatValue, errorMessage);

                    obj.Value1 = -1234;
                    obj.DoneUpdate();
                    Assert.AreEqual(obj.Value1, intViewObj.IntValue, errorMessage);

                    //
                    errorMessage = $"ModelViewBindInstace#DettachModelOnUpdated()を呼び出した後はModel#OnUpdatedとの連しないようにしてください。";
                    bindInstance.DettachModelCallback();
                    obj.Value1 = -678;
                    obj.DoneUpdate();
                    Assert.AreNotEqual(obj.Value1, intViewObj.IntValue, errorMessage);

                    errorMessage = "ModelViewBindInstace#AttachModelOnUpdated()を呼び出した後は設定されたModelのModel#OnUpdatedと連動するようにしてください";
                    bindInstance.AttachModelCallback();
                    obj.Value1 = 939753;
                    obj.DoneUpdate();
                    Assert.AreEqual(obj.Value1, intViewObj.IntValue, errorMessage);
                    Assert.AreEqual(obj.Value2, floatViewObj.FloatValue, errorMessage);
                }

                {//ModelViewBindInstance#Disposeテスト
                    bindInstance.Dispose();
                    obj.Value1 = -48593;
                    obj.DoneUpdate();
                    Assert.AreNotEqual(obj.Value1, intViewObj.IntValue, $"ModelViewBindInstance#DisposeのあとはModel#OnUpdatedと連動しないようにしてください。");

                    Assert.IsNull(bindInstance.Model);
                    Assert.IsNull(bindInstance.Binder);
                    Assert.IsNull(bindInstance.UseInstanceMap);
                    Assert.IsFalse(bindInstance.ViewObjects.Any());
                    Assert.IsFalse(bindInstance.AutoLayoutViewObjects.Any());
                    Assert.IsFalse(bindInstance.EventDispatcherHelpObjectsForView.Any());
                }
            }
        }
Ejemplo n.º 23
0
        public void DelayOperationPasses()
        {
            var root = new ModelClass()
            {
                Name = "root"
            };
            var apple = new ModelClass()
            {
                Name = "apple"
            };
            var grape = new ModelClass()
            {
                Name = "grape"
            };

            root.AddChildren(apple, grape);
            var orange = new ModelClass()
            {
                Name = "orange"
            };

            grape.AddChildren(orange);

            var allBinder = new ModelViewBinder("*", null,
                                                new ModelViewBinder.BindInfo(typeof(IntViewObjClass)));

            var viewInstanceCreator = new DefaultViewInstanceCreator(
                (typeof(IntViewObjClass), new IntViewObjClass.Binder()),
                (typeof(FloatViewObjClass), new FloatViewObjClass.Binder())
                );
            var binderMap       = new ModelViewBinderMap(viewInstanceCreator, allBinder);
            var bindInstanceMap = new ModelViewBinderInstanceMap(binderMap);

            Assert.IsFalse(bindInstanceMap.EnabledDelayOperation);
            bindInstanceMap.EnabledDelayOperation = true;

            {//追加
                bindInstanceMap.Add(false, null, root.GetHierarchyEnumerable());
                Assert.IsFalse(bindInstanceMap.BindInstances.Any(), "遅延操作が有効になっている場合はBindInstanceMap#DoDelayOperation()を呼び出されるまで、追加処理を実行しないでください。");

                bindInstanceMap.DoDelayOperations();
                Assert.IsTrue(bindInstanceMap.BindInstances.Any());

                {//一度操作が実行された後は同じ操作を繰り返し実行されないようにする
                    var e       = bindInstanceMap.GetDoDelayOperationsEnumerator();
                    var opCount = 0;
                    while (e.MoveNext() && e.Current != null)
                    {
                        opCount++;
                    }
                    Assert.AreEqual(0, opCount, "一度操作を実行した後はそれを削除するようにしてください");
                }
            }

            {     //更新 Model#OnUpdatedが呼び出されるかどうかでテストしている
                var viewObj = bindInstanceMap.BindInstances[root].ViewObjects.First() as IntViewObjClass;
                { //ModelViewBindInstanceMap#UpdateViewObjects()
                    root.IntValue = 9874;
                    bindInstanceMap.UpdateViewObjects();
                    Assert.AreNotEqual(viewObj.IntValue, root.IntValue, $"遅延操作が有効な時は、ModelViewBindInstanceMap#DoDelayOperation()が呼び出されるまで更新処理を実行しないでください。");

                    bindInstanceMap.DoDelayOperations();
                    Assert.AreEqual(viewObj.IntValue, root.IntValue, $"遅延操作が更新に対応していません。");
                }

                {//Model#DoneUpdate()
                    root.IntValue++;
                    root.DoneUpdate();
                    Assert.AreNotEqual(viewObj.IntValue, root.IntValue, $"遅延操作が有効な時は、ModelViewBindInstanceMap#DoDelayOperation()が呼び出されるまで更新処理を実行しないでください。");

                    bindInstanceMap.DoDelayOperations();
                    Assert.AreEqual(viewObj.IntValue, root.IntValue, $"遅延操作が更新に対応していません。");
                }
            }

            {//削除
                var instanceCount = bindInstanceMap.BindInstances.Count();
                bindInstanceMap.Remove(bindInstanceMap.BindInstances.Keys);
                Assert.AreEqual(instanceCount, bindInstanceMap.BindInstances.Count()
                                , "遅延操作が有効になっている場合はBindInstanceMap#DoDelayOperation()を呼び出されるまで、削除処理を実行しないでください。");

                bindInstanceMap.DoDelayOperations();
                Assert.IsFalse(bindInstanceMap.BindInstances.Any());
            }

            {//追加と削除が合わせて遅延処理に登録されていたら、何もしないようにする
                bindInstanceMap.Add(false, null, root.GetHierarchyEnumerable());
                bindInstanceMap.Remove(root.GetHierarchyEnumerable());
                Assert.IsFalse(bindInstanceMap.BindInstances.Any(), "遅延操作が有効になっている場合はBindInstanceMap#DoDelayOperation()を呼び出されるまで、追加・削除処理を実行しないでください。");

                bindInstanceMap.DoDelayOperations();
                Assert.IsFalse(bindInstanceMap.BindInstances.Any(), "同じModelの追加・削除を遅延処理で同時に実行される場合は何もしないようにしてください");
            }
        }