IEnumerator Run()
        {
            GlobalCompositionRoot.Instance.EnsureIsInitialized();

            var testMethods = this.GetType().GetAllMethods(
                BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
                              .Where(x => x.GetCustomAttributes(typeof(InstallerTestAttribute), false).Any()).ToList();

            foreach (var method in testMethods)
            {
                var wrapper = new InstallerWrapper();
                wrapper.InstallCallback = () =>
                {
                    Container = wrapper.GetContainer();
                    method.Invoke(this, new object[0]);
                };

                var settings = new SceneCompositionRoot.StaticSettings()
                {
                    Installers = new List <IInstaller>()
                    {
                        wrapper
                    },
                    ParentNewObjectsUnderRoot = true,
                    OnlyInjectWhenActive      = true,
                };

                var oldRootObjects = this.gameObject.scene.GetRootGameObjects();

                var root = SceneCompositionRoot.Instantiate(gameObject, settings);

                // Wait a few frames to have it start up
                yield return(null);

                yield return(null);

                yield return(null);

                yield return(null);

                GameObject.Destroy(root.gameObject);

                foreach (Transform childTransform in this.gameObject.transform)
                {
                    GameObject.Destroy(childTransform.gameObject);
                }

                foreach (var obj in this.gameObject.scene.GetRootGameObjects().Except(oldRootObjects))
                {
                    GameObject.Destroy(obj);
                }

                yield return(null);

                Log.Trace("Installer Test '{0}' passed successfully", method.Name);
            }

            Log.Trace("All Installer Tests passed successfully");
            IntegrationTest.Pass();
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="UnifiedPackageInstaller"/> class.
        /// </summary>
        /// <param name="installer">The installer.</param>
        /// <param name="packagesFolderFolder">The packages folder folder.</param>
        public UnifiedPackageInstaller([NotNull] InstallerWrapper installer, [NotNull] string packagesFolderFolder)
        {
            Diagnostics.Assert.ArgumentNotNull(installer, "installer");
            Diagnostics.Assert.ArgumentNotNull(packagesFolderFolder, "packagesFolderFolder");

            this.installer      = installer;
            this.PackagesFolder = packagesFolderFolder;
        }
        IEnumerator Run()
        {
            GlobalCompositionRoot.Instance.EnsureIsInitialized();

            var testMethods = this.GetType().GetAllMethods(
                BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
                .Where(x => x.GetCustomAttributes(typeof(InstallerTestAttribute), false).Any()).ToList();

            foreach (var method in testMethods)
            {
                var wrapper = new InstallerWrapper();
                wrapper.InstallCallback = () =>
                {
                    Container = wrapper.GetContainer();
                    method.Invoke(this, new object[0]);
                };

                var settings = new SceneCompositionRoot.StaticSettings()
                {
                    Installers = new List<IInstaller>() { wrapper },
                    ParentNewObjectsUnderRoot = true,
                    OnlyInjectWhenActive = true,
                };

                var oldRootObjects = this.gameObject.scene.GetRootGameObjects();

                var root = SceneCompositionRoot.Instantiate(gameObject, settings);

                // Wait a few frames to have it start up
                yield return null;
                yield return null;
                yield return null;
                yield return null;

                GameObject.Destroy(root.gameObject);

                foreach (Transform childTransform in this.gameObject.transform)
                {
                    GameObject.Destroy(childTransform.gameObject);
                }

                foreach (var obj in this.gameObject.scene.GetRootGameObjects().Except(oldRootObjects))
                {
                    GameObject.Destroy(obj);
                }

                yield return null;

                Log.Trace("Installer Test '{0}' passed successfully", method.Name);
            }

            Log.Trace("All Installer Tests passed successfully");
            IntegrationTest.Pass();
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="SequencedInstaller"/> class.
        /// </summary>
        /// <param name="installer">The installer.</param>
        public SequencedInstaller([NotNull] InstallerWrapper installer)
        {
            Assert.ArgumentNotNull(installer, "installer");

            this.installer = installer;
        }