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); }, "クエリパスが一致しない時は例外を投げて、生成しないようにしてください"); }
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); }
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()); } }
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, ""); } }
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)); }
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); } }
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); } } }
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); } } }
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); }
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()); } } }
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のコールバック両方とも呼び出すようにしてください"); } } }
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!!"); }
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); } }
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()); } }
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); } }
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()); } } }
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の追加・削除を遅延処理で同時に実行される場合は何もしないようにしてください"); } }