private LinkedBlockingDeque<String> PopulatedDeque(int n)
 {
     LinkedBlockingDeque<String> q = new LinkedBlockingDeque<String>(n);
     Assert.IsTrue(q.IsEmpty());
     for(int i = 0; i < n; i++)
     {
         Assert.IsTrue(q.Offer(i.ToString()));
     }
     Assert.IsFalse(q.IsEmpty());
     Assert.AreEqual(0, q.RemainingCapacity());
     Assert.AreEqual(n, q.Size());
     return q;
 }
        public override void ReturnObject(T obj)
        {
            PooledObject <T> p = allObjects[obj] as PooledObject <T>;

            if (p == null)
            {
                throw new IllegalStateException("Returned object not currently part of this pool");
            }

            if (TestOnReturn)
            {
                if (!factory.ValidateObject(obj))
                {
                    try
                    {
                        Destroy(p);
                    }
                    catch
                    {
                    }
                    return;
                }
            }

            try
            {
                factory.SuspendObject(obj);
            }
            catch
            {
                try
                {
                    Destroy(p);
                }
                catch
                {
                }

                return;
            }

            if (!p.Deallocate())
            {
                throw new IllegalStateException("Object has already been retured to this pool");
            }

            int maxIdle = MaxIdle;

            if (IsClosed || maxIdle > -1 && maxIdle <= idleObjects.Size())
            {
                try
                {
                    Destroy(p);
                }
                catch
                {
                }
            }
            else
            {
                if (Lifo)
                {
                    idleObjects.AddFirst(p);
                }
                else
                {
                    idleObjects.AddLast(p);
                }
            }
        }