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());
            }
        }