public IEnumerator TestPointerEventCallsForGlobalHandlers() { // We need Gaze Cursor in this test to use it as source to emit events. IMixedRealityInputSystem inputSystem = null; MixedRealityServiceRegistry.TryGetService(out inputSystem); var object1 = new GameObject("Object 1"); // Second handler depends on the first one as they sit on the same object var objectBasedListener = object1.AddComponent <TestInputGlobalListenerObjectBased>(); var handlerBasedListener = object1.AddComponent <TestInputGlobalListenerHandlerBasedSpeechHandler>(); var object2 = new GameObject("Object 2"); // These 2 handlers are independent // 1st is Pointer + Speech // 2nd is Speech only var handlerBasedListener1 = object2.AddComponent <TestInputGlobalListenerHandlerBasedAllHandlers>(); var handlerBasedListener2 = object2.AddComponent <TestInputGlobalListenerHandlerBasedSpeechHandler>(); yield return(null); LogAssert.Expect(LogType.Error, new Regex("Detected simultaneous usage of IMixedRealityEventSystem.Register and IMixedRealityEventSystem.RegisterHandler")); // Emit pointer event, which should be received by global handler, poor speech handler, which is on the same object as global, // and a handler listening to all events. inputSystem.RaisePointerClicked(inputSystem.GazeProvider.GazePointer, MixedRealityInputAction.None, 1); Assert.AreEqual(objectBasedListener.pointerClickedCount, 1, "Pointer clicked event is not received by old API handler."); Assert.Zero(objectBasedListener.pointerDownCount, "Pointer down event is received by old API handler."); Assert.Zero(objectBasedListener.pointerUpCount, "Pointer up event is received by old API handler."); Assert.Zero(objectBasedListener.pointerDraggedCount, "Pointer dragged event is received by old API handler."); Assert.Zero(objectBasedListener.speechCommandsReceived.Count(), "Speech event is received by old API handler."); // Wrong behavior, preserved for backward compatibility Assert.AreEqual(handlerBasedListener.pointerClickedCount, 1, "Pointer clicked event is not received by new API handler."); Assert.Zero(handlerBasedListener.pointerDownCount, "Pointer down event is received by new API handler."); Assert.Zero(handlerBasedListener.pointerUpCount, "Pointer up event is received by new API handler."); Assert.Zero(handlerBasedListener.pointerDraggedCount, "Pointer dragged event is received by new API handler."); Assert.Zero(handlerBasedListener.speechCommandsReceived.Count(), "Speech event is received by new API handler."); Assert.AreEqual(handlerBasedListener1.pointerClickedCount, 1, "Pointer clicked event is not received by all-handlers component."); Assert.Zero(handlerBasedListener1.pointerDownCount, "Pointer down event is received by all-handlers component."); Assert.Zero(handlerBasedListener1.pointerUpCount, "Pointer up event is received by all-handlers component."); Assert.Zero(handlerBasedListener1.pointerDraggedCount, "Pointer dragged event is received by all-handlers component."); Assert.Zero(handlerBasedListener1.speechCommandsReceived.Count(), "Speech event is received by all-handlers component."); // No pointer clicked event: Assert.Zero(handlerBasedListener2.pointerClickedCount, "Pointer clicked event is received by speech-handler component."); Assert.Zero(handlerBasedListener2.pointerDownCount, "Pointer down event is received by speech-handler component."); Assert.Zero(handlerBasedListener2.pointerUpCount, "Pointer up event is received by speech-handler component."); Assert.Zero(handlerBasedListener2.pointerDraggedCount, "Pointer dragged event is received by speech-handler component."); Assert.Zero(handlerBasedListener2.speechCommandsReceived.Count(), "Speech event is received by speech-handler component."); Object.Destroy(object1); Object.Destroy(object2); yield return(null); }