public IEnumerator TestInputSystemGlobalHandlerListener()
        {
            // Need to remove cursors and other global event handlers
            yield return(PlayModeTestUtilities.SetupMrtkWithoutGlobalInputHandlers());

            BaseEventSystem inputSystem = (BaseEventSystem)CoreServices.InputSystem;

            var object1 = new GameObject("Object");

            var listener = object1.AddComponent <TestInputGlobalHandlerListener>();

            yield return(null);

            // No event listener registration in this test
            CollectionAssert.IsEmpty(inputSystem.EventListeners, "Event listener for old event system API shouldn't be registered");

            CollectionAssert.AreEquivalent(
                new List <System.Type> {
                typeof(IMixedRealityHandJointHandler),
                typeof(IMixedRealitySpeechHandler),
                typeof(IMixedRealityBaseInputHandler),
                typeof(IMixedRealityInputHandler <float>)
            },
                inputSystem.EventHandlersByType.Keys,
                "Input event system doesn't contain expected event handler types.");

            CollectionAssert.AreEquivalent(
                new HandleList {
                new Handle(listener)
            },
                inputSystem.EventHandlersByType[typeof(IMixedRealityHandJointHandler)],
                "Input event system doesn't contain expected IMixedRealityHandJointHandler handlers.");

            CollectionAssert.AreEquivalent(
                new HandleList {
                new Handle(listener)
            },
                inputSystem.EventHandlersByType[typeof(IMixedRealitySpeechHandler)],
                "Input event system doesn't contain expected IMixedRealitySpeechHandler handlers.");

            CollectionAssert.AreEquivalent(
                new HandleList {
                new Handle(listener)
            },
                inputSystem.EventHandlersByType[typeof(IMixedRealityBaseInputHandler)],
                "Input event system doesn't contain expected IMixedRealityBaseInputHandler handlers.");

            CollectionAssert.AreEquivalent(
                new HandleList {
                new Handle(listener)
            },
                inputSystem.EventHandlersByType[typeof(IMixedRealityInputHandler <float>)],
                "Input event system doesn't contain expected IMixedRealityInputHandler<float> handlers.");

            Object.Destroy(object1);
            yield return(null);
        }
        /// <summary>
        /// Initializes the MRTK such that there are no other input system listeners
        /// (global or per-interface).
        /// </summary>
        internal static IEnumerator SetupMrtkWithoutGlobalInputHandlers()
        {
            if (!MixedRealityToolkit.IsInitialized)
            {
                Debug.LogError("MixedRealityToolkit must be initialized before it can be configured.");
                yield break;
            }

            IMixedRealityInputSystem inputSystem = null;

            MixedRealityServiceRegistry.TryGetService(out inputSystem);

            Assert.IsNotNull(inputSystem, "Input system must be initialized");

            // Let input system to register all cursors and managers.
            yield return(null);

            // Switch off / Destroy all input components, which listen to global events
            UnityEngine.Object.Destroy(inputSystem.GazeProvider.GazeCursor as Behaviour);
            inputSystem.GazeProvider.Enabled = false;

            var diagnosticsVoiceControls = UnityEngine.Object.FindObjectsOfType <DiagnosticsSystemVoiceControls>();

            foreach (var diagnosticsComponent in diagnosticsVoiceControls)
            {
                diagnosticsComponent.enabled = false;
            }

            // Let objects be destroyed
            yield return(null);

            // Forcibly unregister all other input event listeners.
            BaseEventSystem baseEventSystem   = inputSystem as BaseEventSystem;
            MethodInfo      unregisterHandler = baseEventSystem.GetType().GetMethod("UnregisterHandler");

            // Since we are iterating over and removing these values, we need to snapshot them
            // before calling UnregisterHandler on each handler.
            var eventHandlersByType = new Dictionary <System.Type, List <BaseEventSystem.EventHandlerEntry> >(((BaseEventSystem)inputSystem).EventHandlersByType);

            foreach (var typeToEventHandlers in eventHandlersByType)
            {
                var handlerEntries = new List <BaseEventSystem.EventHandlerEntry>(typeToEventHandlers.Value);
                foreach (var handlerEntry in handlerEntries)
                {
                    unregisterHandler.MakeGenericMethod(typeToEventHandlers.Key)
                    .Invoke(baseEventSystem,
                            new object[] { handlerEntry.handler });
                }
            }

            // Check that input system is clean
            CollectionAssert.IsEmpty(((BaseEventSystem)inputSystem).EventListeners, "Input event system handler registry is not empty in the beginning of the test.");
            CollectionAssert.IsEmpty(((BaseEventSystem)inputSystem).EventHandlersByType, "Input event system handler registry is not empty in the beginning of the test.");

            yield return(null);
        }
        public IEnumerator TestObjectBasedEventRegistration()
        {
            // Need to remove cursors and other global event handlers
            yield return(PlayModeTestUtilities.SetupMrtkWithoutGlobalInputHandlers());

            BaseEventSystem inputSystem = (BaseEventSystem)CoreServices.InputSystem;

            var object1 = new GameObject("Object");

            // Second handler weirdly depends on the first one due to event registration working on the entire object
            var objectBasedListener  = object1.AddComponent <TestInputGlobalListenerObjectBased>();
            var handlerBasedListener = object1.AddComponent <TestInputGlobalListenerHandlerBasedSpeechHandler>();

            yield return(null);

            LogAssert.Expect(LogType.Error, new Regex("Detected simultaneous usage of IMixedRealityEventSystem.Register and IMixedRealityEventSystem.RegisterHandler"));

            // Event listener collection is filled for backward compatibility
            CollectionAssert.AreEquivalent(
                new List <GameObject> {
                objectBasedListener.gameObject
            },
                inputSystem.EventListeners,
                "Event listener for old event system API hasn't been registered correctly.");

            CollectionAssert.AreEquivalent(
                new List <System.Type> {
                typeof(IMixedRealitySpeechHandler), typeof(IMixedRealityBaseInputHandler)
            },
                inputSystem.EventHandlersByType.Keys,
                "Input event system doesn't contain expected event handler types.");

            CollectionAssert.AreEquivalent(
                new HandleList {
                new Handle(handlerBasedListener, true)
            },
                inputSystem.EventHandlersByType[typeof(IMixedRealitySpeechHandler)],
                "Input event system doesn't contain expected IMixedRealitySpeechHandler handlers.");

            CollectionAssert.AreEquivalent(
                new HandleList {
                new Handle(handlerBasedListener, true)
            },
                inputSystem.EventHandlersByType[typeof(IMixedRealityBaseInputHandler)],
                "Input event system doesn't contain expected IMixedRealityBaseInputHandler handlers.");

            // Make sure that disabling global listener doesn't remove the new API one.
            objectBasedListener.enabled = false;

            CollectionAssert.IsEmpty(inputSystem.EventListeners, "Event listener for old event system API shouldn't be registered");

            CollectionAssert.AreEquivalent(
                new List <System.Type> {
                typeof(IMixedRealitySpeechHandler), typeof(IMixedRealityBaseInputHandler)
            },
                inputSystem.EventHandlersByType.Keys,
                "Input event system doesn't contain expected event handler types.");

            CollectionAssert.AreEquivalent(
                new HandleList {
                new Handle(handlerBasedListener, false)
            },
                inputSystem.EventHandlersByType[typeof(IMixedRealitySpeechHandler)],
                "Input event system doesn't contain expected IMixedRealitySpeechHandler handlers.");

            CollectionAssert.AreEquivalent(
                new HandleList {
                new Handle(handlerBasedListener, false)
            },
                inputSystem.EventHandlersByType[typeof(IMixedRealityBaseInputHandler)],
                "Input event system doesn't contain expected IMixedRealityBaseInputHandler handlers.");

            handlerBasedListener.enabled = false;
            CollectionAssert.IsEmpty(inputSystem.EventHandlersByType, "Input event system contains unexpected event handlers.");

            Object.Destroy(object1);
            yield return(null);
        }
        public IEnumerator TestHandlerBasedEventRegistration()
        {
            // Need to remove cursors and other global event handlers
            yield return(PlayModeTestUtilities.SetupMrtkWithoutGlobalInputHandlers());

            BaseEventSystem inputSystem = (BaseEventSystem)CoreServices.InputSystem;

            var object1 = new GameObject("Object");

            // These 2 handlers are independent
            // 1st is Pointer + Speech
            // 2nd is Speech only
            var handlerBasedListener1 = object1.AddComponent <TestInputGlobalListenerHandlerBasedAllHandlers>();
            var handlerBasedListener2 = object1.AddComponent <TestInputGlobalListenerHandlerBasedSpeechHandler>();

            yield return(null);

            // No event listener registration in this test
            CollectionAssert.IsEmpty(inputSystem.EventListeners, "Event listener for old event system API shouldn't be registered");

            CollectionAssert.AreEquivalent(
                new List <System.Type> {
                typeof(IMixedRealityPointerHandler), typeof(IMixedRealitySpeechHandler), typeof(IMixedRealityBaseInputHandler)
            },
                inputSystem.EventHandlersByType.Keys,
                "Input event system doesn't contain expected event handler types.");

            CollectionAssert.AreEquivalent(
                new HandleList {
                new Handle(handlerBasedListener1)
            },
                inputSystem.EventHandlersByType[typeof(IMixedRealityPointerHandler)],
                "Input event system doesn't contain expected IMixedRealityPointerHandler handlers.");

            CollectionAssert.AreEquivalent(
                new HandleList {
                new Handle(handlerBasedListener1), new Handle(handlerBasedListener2)
            },
                inputSystem.EventHandlersByType[typeof(IMixedRealitySpeechHandler)],
                "Input event system doesn't contain expected IMixedRealitySpeechHandler handlers.");

            CollectionAssert.AreEquivalent(
                new HandleList {
                new Handle(handlerBasedListener1), new Handle(handlerBasedListener2)
            },
                inputSystem.EventHandlersByType[typeof(IMixedRealityBaseInputHandler)],
                "Input event system doesn't contain expected IMixedRealityBaseInputHandler handlers.");

            // Disabling one component doesn't influence another one.
            handlerBasedListener1.enabled = false;

            CollectionAssert.AreEquivalent(
                new List <System.Type> {
                typeof(IMixedRealitySpeechHandler), typeof(IMixedRealityBaseInputHandler)
            },
                inputSystem.EventHandlersByType.Keys,
                "Input event system doesn't contain expected event handler types.");

            CollectionAssert.AreEquivalent(
                new HandleList {
                new Handle(handlerBasedListener2)
            },
                inputSystem.EventHandlersByType[typeof(IMixedRealitySpeechHandler)],
                "Input event system doesn't contain expected IMixedRealitySpeechHandler handlers.");

            CollectionAssert.AreEquivalent(
                new HandleList {
                new Handle(handlerBasedListener2)
            },
                inputSystem.EventHandlersByType[typeof(IMixedRealityBaseInputHandler)],
                "Input event system doesn't contain expected IMixedRealityBaseInputHandler handlers.");

            Object.Destroy(object1);
            yield return(null);
        }