public IEnumerator PopAndPushPasses() { var creator = new UnityViewInstanceCreator() .AddUnityViewObjects(); var pool = new UnityViewInstanceCreatorObjectPool(creator); yield return(null); var bindInfo = new ModelViewBinder.BindInfo(typeof(CubeViewObject)); var cubeViewObj = pool.PopOrCreate(bindInfo) as CubeViewObject; Assert.IsNotNull(cubeViewObj); Assert.IsTrue(cubeViewObj.gameObject.activeSelf); Assert.IsNull(cubeViewObj.transform.parent); pool.Push(cubeViewObj); Assert.IsFalse(cubeViewObj.gameObject.activeSelf); Assert.AreSame(pool.PoolingObjParent, cubeViewObj.transform.parent); var viewObj = pool.PopOrCreate(bindInfo); Assert.AreSame(cubeViewObj, viewObj); Assert.IsTrue(cubeViewObj.gameObject.activeSelf); Assert.IsNull(cubeViewObj.transform.parent); }
public void ValidateBindInfoPasses() { var viewInstanceCreator = new DefaultViewInstanceCreator( (typeof(SpecifiedAttributeViewObj), new SpecifiedAttributeViewObj.ParamBinder()), (typeof(NoneAttributeViewObj), new NoneAttributeViewObj.ParamBinder()), (typeof(InvalidAttributeViewObj), new InvalidAttributeViewObj.ParamBinder()) ); ModelViewValidator.DoEnabled = true; {//Check BasicUsage var model = new AppleModel(); var bindInfo = new ModelViewBinder.BindInfo(typeof(SpecifiedAttributeViewObj)); Assert.IsTrue(ModelViewValidator.ValidateBindInfo(model, bindInfo, viewInstanceCreator)); } {//Check None Attributes var model = new AppleModel(); var bindInfo = new ModelViewBinder.BindInfo(typeof(NoneAttributeViewObj)); Assert.IsTrue(ModelViewValidator.ValidateBindInfo(model, bindInfo, viewInstanceCreator)); } {//Check Invalid Attributes var bindInfo = new ModelViewBinder.BindInfo(typeof(InvalidAttributeViewObj)); var apple = new AppleModel(); Assert.IsFalse(ModelViewValidator.ValidateBindInfo(apple, bindInfo, viewInstanceCreator), "Invalid Model Case"); bindInfo = new ModelViewBinder.BindInfo( ModelViewBinder.BindInfo.ToID(typeof(InvalidAttributeViewObj)), typeof(InvalidAttributeViewObj).FullName, "invalidBinderKey"); var orange = new OrangeModel(); Assert.IsFalse(ModelViewValidator.ValidateBindInfo(orange, bindInfo, viewInstanceCreator), "Invalid Model Case"); } }
protected override void OnPopOrCreated(ModelViewBinder.BindInfo bindInfo, IViewObject viewObj) { if (viewObj is MonoBehaviour) { var behaviour = viewObj as MonoBehaviour; behaviour.gameObject.SetActive(true); behaviour.transform.SetParent(null); } }
public void UseParamBinderPasses() { var creator = new TestCreator(); var bindInfo = new ModelViewBinder.BindInfo("A", "A", "a") .SetUseParamBinder(new ViewObj.ParamBinder(100)); var paramBinder = creator.GetParamBinder(bindInfo); Assert.AreSame(bindInfo.UseParamBinder, paramBinder); }
public IViewObject PopOrCreate(IViewInstanceCreator creator, ModelViewBinder.BindInfo bindInfo) { var viewObj = Pop() as IViewObject; if (viewObj == null) { viewObj = creator.CreateViewObj(bindInfo, true); } viewObj.OnUnbinded.Add(OnViewObjectUnbinded); return(viewObj); }
public IViewObject PopOrCreate(ModelViewBinder.BindInfo bindInfo) { var viewType = UseCreator.GetViewObjType(bindInfo); AddDictIfNotContains(viewType); var viewObj = _viewObjectPoolDict[viewType].PopOrCreate(UseCreator, bindInfo); OnPopOrCreated(bindInfo, viewObj); return(viewObj); }
public IEnumerator CreatorPasses() { yield return(null); var creator = new UnityViewInstanceCreator() .AddUnityViewObjects(); var bindInfo = new ModelViewBinder.BindInfo(typeof(CubeViewObject)) .SetViewCreateType(ViewObjectCreateType.Cache); var cubeViewObj = creator.CreateViewObj(bindInfo) as CubeViewObject; { Assert.IsTrue(cubeViewObj is CubeViewObject); Assert.IsTrue(cubeViewObj.gameObject.activeSelf); Assert.IsNull(cubeViewObj.transform.parent); Assert.AreSame(bindInfo, cubeViewObj.UseBindInfo); } Debug.Log($"Success to IViewInstanceCreator#CreateViewObj!"); { cubeViewObj.UseModel = new Model(); Assert.IsTrue(cubeViewObj.DoBinding()); cubeViewObj.Unbind(); Assert.IsFalse(cubeViewObj.gameObject.activeSelf); Assert.AreSame(creator.PoolingViewObjParent, cubeViewObj.transform.parent); Assert.IsNull(cubeViewObj.UseModel); Assert.IsNull(cubeViewObj.UseBindInfo); } Debug.Log($"Success to IViewObject#Unbind!"); { var cachedViewObj = creator.CreateViewObj(bindInfo) as CubeViewObject; Assert.AreSame(cubeViewObj, cachedViewObj); Assert.IsTrue(cachedViewObj.gameObject.activeSelf); Assert.IsNull(cachedViewObj.transform.parent); Assert.AreSame(bindInfo, cachedViewObj.UseBindInfo); } Debug.Log($"Success to IViewInstanceCreator#CreateViewObj(Cached)!"); { cubeViewObj.UseModel = new Model(); Assert.IsTrue(cubeViewObj.DoBinding()); cubeViewObj.Unbind(); // <- cache in Pool!! cubeViewObj.Destroy(); var newViewObj = creator.CreateViewObj(bindInfo); Assert.AreNotSame(cubeViewObj, newViewObj, $"IViewObject#Destroyが呼び出された場合にCacheされていたら、Cacheから取り除くようにしてください"); } Debug.Log($"Success to IViewObject#Destroy!(Remove from ObjPool)"); }
public void ParamBinderSubclassValidateBindInfoPasses() { var viewInstanceCreator = new DefaultViewInstanceCreator( (typeof(SpecifiedAttributeViewObj), new SpecifiedAttributeViewObjParamBinderSubClass()) ); ModelViewValidator.DoEnabled = true; var model = new AppleModel(); var bindInfo = new ModelViewBinder.BindInfo(typeof(SpecifiedAttributeViewObj)); Assert.IsTrue(ModelViewValidator.ValidateBindInfo(model, bindInfo, viewInstanceCreator)); }
public void PopAndPushPasses() { var creator = new DefaultViewInstanceCreator( (typeof(PoolingViewObj), new EmptyModelViewParamBinder()), (typeof(EmptyViewObject), new EmptyModelViewParamBinder()) ); var objPool = new ViewInstanceCreatorObjectPool(creator); Assert.AreSame(creator, objPool.UseCreator); {//PoolingViewObj var poolingBindInfo = new ModelViewBinder.BindInfo(typeof(PoolingViewObj)); PoolingViewObj.newCounter = 0; var viewObj = objPool.PopOrCreate(poolingBindInfo) as PoolingViewObj; Assert.IsTrue(viewObj is PoolingViewObj); Assert.AreEqual(0, viewObj.DestroyCallCount); Assert.AreEqual(0, viewObj.BindCallCount); Assert.AreEqual(0, viewObj.UnbindCallCount); Assert.AreEqual(1, PoolingViewObj.newCounter); objPool.Push(viewObj); PoolingViewObj.newCounter = 0; var popViewObj = objPool.PopOrCreate(poolingBindInfo) as PoolingViewObj; Assert.AreSame(viewObj, popViewObj); Assert.AreEqual(0, PoolingViewObj.newCounter); PoolingViewObj.newCounter = 0; var popViewObj2 = objPool.PopOrCreate(poolingBindInfo) as PoolingViewObj; Assert.AreNotSame(viewObj, popViewObj2); Assert.AreEqual(1, PoolingViewObj.newCounter); } Debug.Log("Success Basic Pop and Push"); {//EmptyViewObject var emptyBindInfo = new ModelViewBinder.BindInfo(typeof(EmptyViewObject)); var viewObj = objPool.PopOrCreate(emptyBindInfo) as EmptyViewObject; Assert.IsTrue(viewObj is EmptyViewObject); objPool.Push(viewObj); var popViewObj = objPool.PopOrCreate(emptyBindInfo) as EmptyViewObject; Assert.AreSame(viewObj, popViewObj); var popViewObj2 = objPool.PopOrCreate(emptyBindInfo) as EmptyViewObject; Assert.AreNotSame(viewObj, popViewObj2); } }
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 IEnumerator SetToPasses() { yield return(null); var assetPath = PackageDefines.GetHinodeAssetPath(TEST_ASSET_DIR_PATH, "testViewObjPrefab.prefab"); var testViewObjPrefab = AssetDatabase.LoadAssetAtPath <ButtonViewObject>(assetPath); Assert.IsNotNull(testViewObjPrefab, $"テスト用のPrefabの読み込みに失敗しました... assetPath={assetPath}"); var bundleFilepath = PackageDefines.GetHinodeAssetPath(TEST_ASSET_DIR_PATH, "test_view_instance_creator_bundle"); var bundle = AssetBundle.LoadFromFile(bundleFilepath); Assert.IsNotNull(bundle, $"Failed to load AssetBundle({bundleFilepath}) For Test..."); var settings = ScriptableObject.CreateInstance <UnityViewInstanceCreatorSettings>(); settings .AddInfo(UnityViewInstanceCreatorSettings.InstanceInfo.CreateAsset <EmptyModelViewParamBinder>(testViewObjPrefab) .SetInstanceKey("instA") .SetBinderKey("binderA") ) .AddInfo(UnityViewInstanceCreatorSettings.InstanceInfo.CreateAssetBundle <ButtonViewObject, EmptyModelViewParamBinder>(bundle.name, "assets/testviewobjprefab.prefab") .SetInstanceKey("instB") .SetBinderKey("binderB") ) ; Debug.Log($"{bundle.GetAllAssetNames().Aggregate("", (_s, _c) => $"{_s}{_c};")}"); settings.EntryAssetBundle(bundle); // var creator = new UnityViewInstanceCreator(); settings.SetTo(creator); foreach (var info in settings.Infos) { var bindInfo = new ModelViewBinder.BindInfo("", info.InstanceKey, info.BinderKey); Assert.AreEqual(info.InstanceType, creator.GetViewObjType(bindInfo), $"instanceKey={info.InstanceKey}, binderKey={info.BinderKey}"); Assert.AreEqual(info.ParamBinderType, creator.GetParamBinderType(bindInfo), $"instanceKey={info.InstanceKey}, binderKey={info.BinderKey}"); } bundle.Unload(true); }
public void DoMatchThrowExceptionFail() { var query = ".style"; var selector = new ViewLayoutSelector(query, "view1"); var model = new Model() { Name = "Model", StylingID = new ModelIDList(query) }; var otherModel = new Model() { Name = "otherModel", StylingID = model.StylingID }; var testData = new List <(Model, IViewObject)>() { (null, null), (model, new EmptyViewObject() { UseModel = null, UseBindInfo = null }), (model, new EmptyViewObject() { UseModel = model, UseBindInfo = null }), (model, new EmptyViewObject() { UseModel = null, UseBindInfo = new ModelViewBinder.BindInfo("view1", typeof(EmptyViewObject)) }), (model, new EmptyViewObject() { UseModel = otherModel, UseBindInfo = new ModelViewBinder.BindInfo("view1", typeof(EmptyViewObject)) }), }; foreach (var(m, v) in testData) { Assert.Throws <UnityEngine.Assertions.AssertionException>(() => { selector.DoMatch(m, v); }, $"Failed test... selecotr={selector}, model={m}, viewObj={v}"); } }
public IEnumerator InsertPasses() { yield return(null); var parent = new GameObject("parent"); var binder = new ModelViewBinder.BindInfo(typeof(MonoBehaviourViewObject)); var child1 = MonoBehaviourViewObject.Create("child1"); var child2 = MonoBehaviourViewObject.Create("child2"); var child3 = MonoBehaviourViewObject.Create("child3"); child1.transform.SetParent(parent.transform); child2.transform.SetParent(parent.transform); child3.transform.SetParent(parent.transform); child1.Bind(new SiblingOrderModel(100), binder, null); child2.Bind(new SiblingOrderModel(200), binder, null); child3.Bind(new SiblingOrderModel(300), binder, null); SiblingOrderViewLayoutAccessor.Insert(parent.transform, child1); SiblingOrderViewLayoutAccessor.Insert(parent.transform, child2); SiblingOrderViewLayoutAccessor.Insert(parent.transform, child3); AssertionUtils.AssertEnumerable( new Transform[] { child3.transform, child2.transform, child1.transform }, parent.transform.GetChildEnumerable(), ""); var child4 = MonoBehaviourViewObject.Create("child4"); child4.transform.SetParent(parent.transform); child4.Bind(new SiblingOrderModel(150), binder, null); SiblingOrderViewLayoutAccessor.Insert(parent.transform, child4); AssertionUtils.AssertEnumerable( new Transform[] { child3.transform, child2.transform, child4.transform, child1.transform }, parent.transform.GetChildEnumerable(), ""); }
public void CreatorPasses() { var creator = new DefaultViewInstanceCreator( (typeof(PoolingViewObj), new EmptyModelViewParamBinder()), (typeof(EmptyViewObject), new EmptyModelViewParamBinder()) ); var cacheBindInfo = new ModelViewBinder.BindInfo(typeof(PoolingViewObj)) { ViewObjectCreateType = ViewObjectCreateType.Cache }; var viewObj = creator.CreateViewObj(cacheBindInfo); viewObj.UseModel = new Model(); Assert.IsTrue(viewObj is PoolingViewObj); viewObj.Unbind(); { PoolingViewObj.newCounter = 0; var viewObj2 = creator.CreateViewObj(cacheBindInfo); Assert.AreSame(viewObj, viewObj2, $"IViewObject#Unbindされた時に、Cacheされていません。"); Assert.AreEqual(0, PoolingViewObj.newCounter); PoolingViewObj.newCounter = 0; var viewObj3 = creator.CreateViewObj(cacheBindInfo); Assert.AreNotSame(viewObj, viewObj3); Assert.AreEqual(1, PoolingViewObj.newCounter); } { PoolingViewObj.newCounter = 0; viewObj.Unbind(); viewObj.Destroy(); var viewObj2 = creator.CreateViewObj(cacheBindInfo); Assert.AreNotSame(viewObj, viewObj2, $"IViewObject#Destroyが呼び出された場合にCacheされていたら、Cacheから取り除くようにしてください"); Assert.AreEqual(1, PoolingViewObj.newCounter); } }
public void GetParamBinderPasses() { var creator = new TestCreator(); var viewObjAbindInfo = new ModelViewBinder.BindInfo("A", "A", "a"); var paramBinderA = creator.GetParamBinder(viewObjAbindInfo); Assert.IsTrue(paramBinderA is ViewObj.ParamBinder); Assert.AreEqual(1, (paramBinderA as ViewObj.ParamBinder).Value); var viewObjBbindInfo = new ModelViewBinder.BindInfo("A", "A", "b"); var paramBinderB = creator.GetParamBinder(viewObjBbindInfo); Assert.IsTrue(paramBinderB is ViewObj.ParamBinder); Assert.AreEqual(-1, (paramBinderB as ViewObj.ParamBinder).Value); Assert.Throws <UnityEngine.Assertions.AssertionException>(() => { var bindInfo = new ModelViewBinder.BindInfo("B", "B", "abc"); var nullParamBinder = creator.GetParamBinder(bindInfo); }); }
public void CreateViewObjPasses() { var creator = new TestCreator(); var viewObjAbindInfo = new ModelViewBinder.BindInfo("A", "A", "a"); var viewObjA = creator.CreateViewObj(viewObjAbindInfo); Assert.IsTrue(viewObjA is ViewObj); Assert.AreEqual(1, (viewObjA as ViewObj).Value); Assert.AreSame(viewObjAbindInfo, viewObjA.UseBindInfo); var viewObjBbindInfo = new ModelViewBinder.BindInfo("B", "B", "b"); var viewObjB = creator.CreateViewObj(viewObjBbindInfo); Assert.IsTrue(viewObjB is ViewObj); Assert.AreEqual(-1, (viewObjB as ViewObj).Value); Assert.AreSame(viewObjBbindInfo, viewObjB.UseBindInfo); Assert.Throws <UnityEngine.Assertions.AssertionException>(() => { var bindInfo = new ModelViewBinder.BindInfo("B", "__invalid", "b"); var nullObj = creator.CreateViewObj(bindInfo); }); }
protected virtual void OnBind(Model targetModel, ModelViewBinder.BindInfo bindInfo, ModelViewBinderInstanceMap binderInstanceMap) { }
protected override void OnBind(Model targetModel, ModelViewBinder.BindInfo bindInfo, ModelViewBinderInstanceMap binderInstanceMap) { BindCallCount++; }
/// <summary> /// ModelViewBinder.BindInfoの検証を行う /// /// 指定したModelとbindInfoが持つIViewObjectとIModelViewParamBinderが使用可能かどうかを検証します。 /// </summary> /// <param name="model"></param> /// <param name="bindInfo"></param> /// <param name="viewInstanceCreator"></param> /// <seealso cref="AvailableModelAttribute"/> /// <seealso cref="AvailableModelViewParamBinderAttribute"/> public static bool ValidateBindInfo(Model model, ModelViewBinder.BindInfo bindInfo, IViewInstanceCreator viewInstanceCreator) { if (!DoEnabled) { return(true); } bool isValid = true; System.Type viewType = null; try { viewType = viewInstanceCreator.GetViewObjType(bindInfo); if (viewType == null) { Logger.LogWarning(LogPriority, () => $"!!Validate!! InstanceKey('{bindInfo.InstanceKey}') in BindInfo don't get IViewObject..." ); isValid = false; } else { var availableModelTypes = viewType.GetCustomAttributes(false) .OfType <AvailableModelAttribute>() .SelectMany(_a => _a.AvailableModels) .Distinct(); if (availableModelTypes.Any()) { if (!availableModelTypes.Any(_t => model.GetType().IsSameOrInheritedType(_t))) { Logger.LogWarning(LogPriority, () => $"!!Validate!! '{viewType}' is not available Model('{model}')..." ); isValid = false; } } } } catch (System.Exception e) { Logger.LogWarning(LogPriority, () => $"!!Validate!! InstanceKey('{bindInfo.InstanceKey}') in BindInfo don't get IViewObject..." + $"{System.Environment.NewLine }---{System.Environment.NewLine}{e}{System.Environment.NewLine}---" ); return(false); } try { var paramBinderType = viewInstanceCreator.GetParamBinderType(bindInfo); if (paramBinderType == null) { Logger.LogWarning(LogPriority, () => $"!!Validate!! BinderKey('{bindInfo.BinderKey}') in BindInfo don't get IModelViewParamBinder..." ); isValid = false; } else { var availableParamBinders = viewType.GetCustomAttributes(false) .OfType <AvailableModelViewParamBinderAttribute>() .SelectMany(_a => _a.AvailableParamBinders) .Distinct(); if (availableParamBinders.Any()) { if (!availableParamBinders.Any(_t => paramBinderType.IsSameOrInheritedType(_t))) { Logger.LogWarning(LogPriority, () => $"!!Validate!! '{viewType}' is not available ParamBinder('{paramBinderType}')..." ); isValid = false; } } } } catch (System.Exception e) { Logger.LogWarning(LogPriority, () => $"!!Validate!! BinderKey('{bindInfo.BinderKey}') in BindInfo don't get IModelViewParamBinder..." + $"{System.Environment.NewLine}---{System.Environment.NewLine}{e}{System.Environment.NewLine}---" ); return(false); } return(isValid); }
protected override void OnBind(Model targetModel, ModelViewBinder.BindInfo bindInfo, ModelViewBinderInstanceMap binderInstanceMap) { UsedBinderInstanceMap = binderInstanceMap; }
protected override void OnBind(Model targetModel, ModelViewBinder.BindInfo bindInfo, ModelViewBinderInstanceMap binderInstanceMap) { UseModel = targetModel; UseBindInfo = bindInfo; }
protected virtual void OnPopOrCreated(ModelViewBinder.BindInfo bindInfo, IViewObject viewObj) { }