Exemplo n.º 1
0
        public void TestObjectManager()
        {
            IPoolable r     = null;
            string    type1 = typeof(TestTarget1).Name;
            string    type2 = typeof(TestTarget2).Name;

            //			ObjectManager manager = new ObjectManager();
            ObjectManager manager = ObjectManager.Instance;

            Assert.AreEqual(manager.m_idlePool.Count, 0);
            Assert.AreEqual(manager.m_busyPool.Count, 1);

            ///
            /// RegistClass
            ///
            manager.RegistClassType(type1, new TestTarget1Factory());
            Assert.AreEqual(manager.m_idlePool.Count, 0);
            Assert.AreEqual(manager.m_busyPool.Count, 1);

            manager.RegistClassType(type2, new TestTarget2Factory());
            Assert.AreEqual(manager.m_idlePool.Count, 0);
            Assert.AreEqual(manager.m_busyPool.Count, 1);

            ///
            /// Apply
            ///

            /*
             * BusyPool:Create Set(admin)
             * BusyPool:Create Set(test)
             *	==>[busypool(admin)==1]
             */
            var tt11 = manager.Apply(type1, "test");

            (tt11 as TestTarget1).Id = 11;
            Assert.AreEqual(tt11.GetType().Name, type1);
            Assert.AreEqual(manager.m_busyPool.CountSet("test"), 1);
            Assert.AreEqual(manager.m_busyPool.Count, 2);
            Assert.AreEqual(manager.m_busyPool.CountSet("admin"), 1);

            /*
             * BusyPool:Create Set(System)
             *	==>[busypool(admin)==2]
             */
            var tt12 = manager.Apply(type1);

            (tt12 as TestTarget1).Id = 12;
            Assert.AreEqual(tt12.GetType().Name, type1);
            Assert.AreEqual(manager.m_busyPool.CountSet(), 1);
            Assert.AreEqual(manager.m_busyPool.Count, 3);
            Assert.AreEqual(manager.m_busyPool.CountSet("admin"), 2);

            /*
             * BusyPool:no change
             */
            var tt21 = manager.Apply(type2, "test");

            (tt21 as TestTarget2).Id = 21;
            Assert.AreEqual(tt21.GetType().Name, type2);
            Assert.AreEqual(manager.m_busyPool.CountSet("test"), 2);
            Assert.AreEqual(manager.m_busyPool.Count, 3);
            Assert.AreEqual(manager.m_busyPool.CountSet("admin"), 2);

            /*
             * BusyPool:no change
             */
            var tt22 = manager.Apply(type2);

            (tt22 as TestTarget2).Id = 22;
            Assert.AreEqual(tt22.GetType().Name, type2);
            Assert.AreEqual(manager.m_busyPool.CountSet(), 2);
            Assert.AreEqual(manager.m_busyPool.Count, 3);

            ///
            /// Recycle
            ///

            /*
             * IdlePool:create set(TestTarget1)
             *	==>[busypool(admin)==3]
             */
            tt11.Dispose();
            Assert.AreEqual(manager.m_idlePool.Count, 1);
            Assert.AreEqual(manager.m_idlePool.CountSet(type1), 1);
            Assert.AreEqual(manager.m_busyPool.Count, 3);
            Assert.AreEqual(manager.m_busyPool.CountSet("admin"), 3);

            /*
             */
            tt12.Dispose();
            Assert.AreEqual(manager.m_idlePool.Count, 1);
            Assert.AreEqual(manager.m_idlePool.CountSet(type1), 2);
            Assert.AreEqual(manager.m_busyPool.Count, 3);
            Assert.AreEqual(manager.m_busyPool.CountSet("admin"), 3);

            /*
             * BusyPool:remove set(test)
             *	==>[busypool(admin)==2]
             *	==>[idlepool:create(Self.ObjectSet)]
             *		==>[busypool(admin)==3]
             *		&&>[idlepool(Self.ObjectSet)==1]
             * IdlePool:reuse(TestTarget1)
             *	==>[busypool(admin)==4]
             *	&&>[idlepool(Self.ObjectSet)==0]
             */
            tt21.Dispose();
            Assert.AreEqual(manager.m_idlePool.Count, 3);
            Assert.AreEqual(manager.m_idlePool.CountSet(type2), 1);
            Assert.AreEqual(manager.m_busyPool.Count, 2);
            Assert.AreEqual(manager.m_idlePool.CountSet("Self.ObjectSet"), 0);
            Assert.AreEqual(manager.m_busyPool.CountSet("admin"), 4);

            /*
             * BusyPool:remove set(System)
             *	==>[busypool(admin)==3]
             *	&&>[idlepool(Self.ObjectSet)==1]
             */
            tt22.Dispose();
            Assert.AreEqual(manager.m_idlePool.Count, 3);
            Assert.AreEqual(manager.m_idlePool.CountSet(type2), 2);
            Assert.AreEqual(manager.m_busyPool.Count, 1);

            Assert.AreEqual(manager.m_busyPool.CountSet("test"), 0);
            Assert.AreEqual(manager.m_busyPool.CountSet(""), 0);

            ///
            /// ReApply & Recycle
            ///
            r = manager.Apply(type1, "test");
            Assert.AreEqual(manager.m_busyPool.CountSet("test"), 1);
            Assert.AreEqual(r.GetType().Name, type1);
            Assert.AreEqual(manager.m_idlePool.CountSet(type1), 1);
            Assert.AreEqual(manager.m_idlePool.CountSet(type2), 2);

            r = manager.Apply(type1, "test");
            Assert.AreEqual(manager.m_busyPool.CountSet("test"), 2);
            Assert.AreEqual(r.GetType().Name, type1);
            Assert.AreEqual(manager.m_idlePool.CountSet(type1), 0);
            Assert.AreEqual(manager.m_idlePool.CountSet(type2), 2);

            r = manager.Apply(type2, "test");
            Assert.AreEqual(manager.m_busyPool.CountSet("test"), 3);
            Assert.AreEqual(r.GetType().Name, type2);
            Assert.AreEqual(manager.m_idlePool.CountSet(type1), 0);
            Assert.AreEqual(manager.m_idlePool.CountSet(type2), 1);

            r = manager.Apply(type2, "test");
            Assert.AreEqual(manager.m_busyPool.CountSet("test"), 4);
            Assert.AreEqual(r.GetType().Name, type2);
            Assert.AreEqual(manager.m_idlePool.CountSet(type1), 0);
            Assert.AreEqual(manager.m_idlePool.CountSet(type2), 0);

            r = manager.Apply(type2, "test");
            Assert.AreEqual(manager.m_busyPool.CountSet("test"), 5);
            Assert.AreEqual(r.GetType().Name, type2);
            Assert.AreEqual(manager.m_idlePool.CountSet(type1), 0);
            Assert.AreEqual(manager.m_idlePool.CountSet(type2), 0);

            manager.Recycle("test");
            Assert.AreEqual(manager.m_busyPool.CountSet("test"), 0);
            Assert.AreEqual(manager.m_idlePool.CountSet(type1), 2);
            Assert.AreEqual(manager.m_idlePool.CountSet(type2), 3);
        }