public void Initialize(ManagedExecutionSystem system)
        {
            int groupCount = system.ExecutionGroups.Count;

            _executionGroups   = new ManagedExecutionGroup[groupCount];
            _updateGroups      = new RuntimeGroup[groupCount];
            _fixedUpdateGroups = new RuntimeGroup[groupCount];

            for (int i = 0; i < groupCount; i++)
            {
                List <ManagedUpdatesBehaviour> updateList      = new List <ManagedUpdatesBehaviour>();
                List <ManagedUpdatesBehaviour> fixedUpdateList = new List <ManagedUpdatesBehaviour>();

                ManagedExecutionGroup currentGroup = system.ExecutionGroups[i];

                currentGroup.TraverseForType(
                    UpdateType.Normal,
                    (c) => { updateList.Add(c); }
                    );

                currentGroup.TraverseForType(
                    UpdateType.Fixed,
                    (c) => { fixedUpdateList.Add(c); }
                    );

                _executionGroups[i]   = currentGroup;
                _updateGroups[i]      = new RuntimeGroup(updateList.ToArray());
                _fixedUpdateGroups[i] = new RuntimeGroup(fixedUpdateList.ToArray());
            }
        }
        public FakeEnvironment(params string[] executionGroupNames)
        {
            int groupCount = executionGroupNames.Length;

            if (groupCount == 0)
            {
                throw new System.ArgumentException($"{nameof(FakeEnvironment)} must have at least one execution group.");
            }

            var executionGroups = new ManagedExecutionGroup[groupCount];
            var groupLookup     = new Dictionary <string, ManagedExecutionGroup>(groupCount);

            for (int i = 0; i < groupCount; i++)
            {
                var currentGroup = executionGroups[i] = ScriptableObject.CreateInstance <ManagedExecutionGroup>();
                groupLookup.Add(executionGroupNames[i], currentGroup);
            }
            this.executionGroups = new ReadOnlyDictionary <string, ManagedExecutionGroup>(groupLookup);

            system = ScriptableObject.CreateInstance <ManagedExecutionSystem>();
            system.SetExecutionGroups(executionGroups);

            _runtimeController         = new GameObject("Runtime Controller").AddComponent <TestManagedUpdatesSceneController>();
            _runtimeController.enabled = false;
        }
        public void InstantiateManagedComponents <T>(string groupName, params ObjectToggleConfig[] toggleConfig) where T : ManagedUpdatesBehaviour
        {
            ManagedExecutionGroup group = executionGroups[groupName];
            Transform             containerTransform = _runtimeController.transform;

            foreach (ObjectToggleConfig config in toggleConfig)
            {
                InstantiateManagedUpdateGameObject <T>(group, config, containerTransform);
            }
        }
        public void InstantiateManagedComponents <T>(
            out T[] components,
            string groupName,
            params ObjectToggleConfig[] toggleConfig) where T : ManagedUpdatesBehaviour
        {
            ManagedExecutionGroup group = executionGroups[groupName];
            Transform             containerTransform = _runtimeController.transform;

            components = new T[toggleConfig.Length];
            for (int i = 0; i < toggleConfig.Length; i++)
            {
                components[i] = InstantiateManagedUpdateGameObject <T>(group, toggleConfig[i], containerTransform);
            }
        }
 private T InstantiateManagedUpdateGameObject <T>(
     ManagedExecutionGroup group,
     ObjectToggleConfig config,
     Transform parent = null) where T : ManagedUpdatesBehaviour
 {
     return(ManagedUpdatesBehaviour.Create <T>(
                new ManagedUpdatesBehaviour.Config(
                    group,
                    config.HasFlag(ObjectToggleConfig.Update),
                    config.HasFlag(ObjectToggleConfig.FixedUpdate)),
                config.HasFlag(ObjectToggleConfig.GameObjectActive),
                config.HasFlag(ObjectToggleConfig.ComponentEnabled),
                parent
                ));
 }