diff --git a/Assets/Tests/InputSystem/Plugins/MockKeyboardWithUITests.cs b/Assets/Tests/InputSystem/Plugins/MockKeyboardWithUITests.cs new file mode 100644 index 0000000000..f72bf300e7 --- /dev/null +++ b/Assets/Tests/InputSystem/Plugins/MockKeyboardWithUITests.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections; +using NUnit.Framework; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.InputSystem; +using UnityEngine.InputSystem.UI; +using UnityEngine.TestTools; +using UnityEngine.UI; + +[Description("Check https://jira.unity3d.com/browse/ISXB-1561 for more details.")] +public class MockKeyboardWithUITests : InputTestFixture +{ + private Keyboard m_Keyboard; + private GameObject m_CanvasGo; + private GameObject m_EventSystemGo; + private GameObject m_ButtonGo; + private InputActionAsset m_InputActionAsset; + + // We only use this simple class as an adapter for a lambda closure that we need for assertion to work below. + public class CancellationHandler : MonoBehaviour, ICancelHandler + { + public Action trigger; + public void OnCancel(BaseEventData eventData) => trigger(); + } + + public override void Setup() + { + base.Setup(); + + // Add a mock keyboard + m_Keyboard = InputSystem.AddDevice(); + + // first creating the UI stuff + m_CanvasGo = new GameObject("canvas"); + m_ButtonGo = new GameObject("button", typeof(Button), typeof(CancellationHandler)); + m_ButtonGo.transform.SetParent(m_CanvasGo.transform, false); + + // Now creating the Input layer + m_EventSystemGo = new GameObject("eventSystem", typeof(EventSystem)); + EventSystem.current.SetSelectedGameObject(m_ButtonGo); + + var inputModule = m_EventSystemGo.AddComponent(); + + m_InputActionAsset = ScriptableObject.CreateInstance(); + var actionMap = new InputActionMap("UI"); + var submitAction = actionMap.AddAction("Submit", binding: "Keyboard/enter", type: InputActionType.Button); + var cancelAction = actionMap.AddAction("Cancel", binding: "Keyboard/escape", type: InputActionType.Button); + m_InputActionAsset.AddActionMap(actionMap); + actionMap.Enable(); + inputModule.actionsAsset = m_InputActionAsset; + inputModule.submit = InputActionReference.Create(submitAction); + inputModule.cancel = InputActionReference.Create(cancelAction); + } + + public override void TearDown() + { + GameObject.Destroy(m_EventSystemGo); + GameObject.Destroy(m_CanvasGo); + + GameObject.Destroy(m_InputActionAsset); + + InputSystem.RemoveDevice(m_Keyboard); + + base.TearDown(); + } + + private static bool[] FrameWaitingOptions = { true, false }; + + [UnityTest] + public IEnumerator MockKeyboard_PressEnter_TriggersButtonOnClick([ValueSource(nameof(FrameWaitingOptions))] bool waitFrame) + { + bool invokedListener = false; + + m_ButtonGo.GetComponent