public IEnumerator FindAllRentingPoolObjectsInScene()
        {
            yield return(SceneManager.LoadSceneAsync("TestScene", LoadSceneMode.Additive));

            var testScene = SceneManager.GetSceneByName("TestScene");

            SceneManager.SetActiveScene(testScene);

            var go   = new GameObject(); // in TestScene
            var pool = CreatePool(numberOfInstances: 1);

            yield return(pool.PreloadAsync().ToYieldInstruction());

            yield return(pool.PreactivateAsync().ToYieldInstruction());

            var obj = pool.Rent();

            obj.transform.SetParent(go.transform);

            var id         = obj.GetComponent <PoolObjectController>().Id;
            var allObjects = ObjectPoolUtils.FindAllRentingPoolObjectsInScene(testScene, id)
                             .Select(c => c.Behaviour);
            var enumerator = allObjects.GetEnumerator();

            enumerator.MoveNext().IsTrue();
            enumerator.Current.Is(obj);

            foreach (var o in allObjects)
            {
                pool.Return(o);
            }

            yield return(SceneManager.UnloadSceneAsync(testScene));
        }
        public IEnumerator NestedPoolObjectCanReturnToThePool()
        {
            var pool = CreatePool(numberOfInstances: 1);

            yield return(pool.PreloadAsync().ToYieldInstruction());

            yield return(pool.PreactivateAsync().ToYieldInstruction());

            var parent    = pool.Rent();
            var child1    = pool.Rent();
            var child2    = pool.Rent();
            var grandson1 = pool.Rent();
            var grandson2 = pool.Rent();

            child1.transform.SetParent(parent.transform);
            child2.transform.SetParent(parent.transform);
            grandson1.transform.SetParent(child1.transform);
            grandson2.transform.SetParent(child2.transform);

            var revercedDeepFirst = ObjectPoolUtils.ResolveNestedPoolObjects(parent.GetComponent <PoolObjectController>())
                                    .Select(c => c.Behaviour);
            var enumerator = revercedDeepFirst.GetEnumerator();

            enumerator.MoveNext();
            enumerator.Current.Is(grandson2);
            enumerator.MoveNext();
            enumerator.Current.Is(child2);
            enumerator.MoveNext();
            enumerator.Current.Is(grandson1);
            enumerator.MoveNext();
            enumerator.Current.Is(child1);
            enumerator.MoveNext();
            enumerator.Current.Is(parent);
            enumerator.MoveNext().IsFalse();

            foreach (var c in revercedDeepFirst)
            {
                pool.Return(c);
            }
        }
        public IEnumerator AllPoolObjectCanReturnByCallingFindAllRentingPoolObjects()
        {
            var numberOfInstances = 3;
            var pool = CreatePool(numberOfInstances: numberOfInstances);

            yield return(pool.PreloadAsync().ToYieldInstruction());

            yield return(pool.PreactivateAsync().ToYieldInstruction());

            pool.Count.Is(numberOfInstances);
            var obj = pool.Rent();

            pool.Count.Is(numberOfInstances - 1);

            var id  = obj.GetComponent <PoolObjectController>().Id;
            var all = ObjectPoolUtils.FindAllRentingPoolObjects(id);

            foreach (var o in all)
            {
                pool.Return(o.Behaviour);
            }

            pool.Count.Is(numberOfInstances);
        }