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 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の追加・削除を遅延処理で同時に実行される場合は何もしないようにしてください"); } }