123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- using System.Collections;
- using NUnit.Framework;
- using UnityEngine;
- using UnityEngine.EventSystems;
- using UnityEngine.TestTools;
- using UnityEngine.UI;
-
- [UnityPlatform()]
- public class InputModuleTests
- {
- EventSystem m_EventSystem;
- FakeBaseInput m_FakeBaseInput;
- StandaloneInputModule m_StandaloneInputModule;
- Canvas m_Canvas;
- Image m_Image;
- Image m_NestedImage;
-
- [SetUp]
- public void TestSetup()
- {
- // Camera | Canvas (Image) | Event System
-
- m_Canvas = new GameObject("Canvas").AddComponent<Canvas>();
- m_Canvas.renderMode = RenderMode.ScreenSpaceOverlay;
- m_Canvas.gameObject.AddComponent<GraphicRaycaster>();
-
- m_Image = new GameObject("Image").AddComponent<Image>();
- m_Image.gameObject.transform.SetParent(m_Canvas.transform);
- RectTransform imageRectTransform = m_Image.GetComponent<RectTransform>();
- imageRectTransform.sizeDelta = new Vector2(400f, 400f);
- imageRectTransform.localPosition = Vector3.zero;
-
- m_NestedImage = new GameObject("NestedImage").AddComponent<Image>();
- m_NestedImage.gameObject.transform.SetParent(m_Image.transform);
- RectTransform nestedImageRectTransform = m_NestedImage.GetComponent<RectTransform>();
- nestedImageRectTransform.sizeDelta = new Vector2(200f, 200f);
- nestedImageRectTransform.localPosition = Vector3.zero;
-
- GameObject go = new GameObject("Event System");
- m_EventSystem = go.AddComponent<EventSystem>();
- m_EventSystem.pixelDragThreshold = 1;
-
- m_StandaloneInputModule = go.AddComponent<StandaloneInputModule>();
- m_FakeBaseInput = go.AddComponent<FakeBaseInput>();
-
- // Override input with FakeBaseInput so we can send fake mouse/keyboards button presses and touches
- m_StandaloneInputModule.inputOverride = m_FakeBaseInput;
-
- Cursor.lockState = CursorLockMode.None;
- }
-
- [UnityTest]
- public IEnumerator DragCallbacksDoGetCalled()
- {
- // While left mouse button is pressed and the mouse is moving, OnBeginDrag and OnDrag callbacks should be called
- // Then when the left mouse button is released, OnEndDrag callback should be called
-
- // Add script to EventSystem to update the mouse position
- m_EventSystem.gameObject.AddComponent<MouseUpdate>();
-
- // Add script to Image which implements OnBeginDrag, OnDrag & OnEndDrag callbacks
- DragCallbackCheck callbackCheck = m_Image.gameObject.AddComponent<DragCallbackCheck>();
-
- // Setting required input.mousePresent to fake mouse presence
- m_FakeBaseInput.MousePresent = true;
-
- var canvasRT = m_Canvas.gameObject.transform as RectTransform;
- m_FakeBaseInput.MousePosition = new Vector2(Screen.width / 2, Screen.height / 2);
-
- yield return null;
-
- // Left mouse button down simulation
- m_FakeBaseInput.MouseButtonDown[0] = true;
-
- yield return null;
-
- // Left mouse button down flag needs to reset in the next frame
- m_FakeBaseInput.MouseButtonDown[0] = false;
-
- yield return null;
-
- // Left mouse button up simulation
- m_FakeBaseInput.MouseButtonUp[0] = true;
-
- yield return null;
-
- // Left mouse button up flag needs to reset in the next frame
- m_FakeBaseInput.MouseButtonUp[0] = false;
-
- yield return null;
-
- Assert.IsTrue(callbackCheck.onBeginDragCalled, "OnBeginDrag not called");
- Assert.IsTrue(callbackCheck.onDragCalled, "OnDragCalled not called");
- Assert.IsTrue(callbackCheck.onEndDragCalled, "OnEndDragCalled not called");
- Assert.IsTrue(callbackCheck.onDropCalled, "OnDrop not called");
- }
-
- [UnityTest]
- public IEnumerator MouseOutsideMaskRectTransform_WhileInsidePaddedArea_PerformsClick()
- {
- var mask = new GameObject("Panel").AddComponent<RectMask2D>();
- mask.gameObject.transform.SetParent(m_Canvas.transform);
- RectTransform panelRectTransform = mask.GetComponent<RectTransform>();
- panelRectTransform.sizeDelta = new Vector2(100, 100f);
- panelRectTransform.localPosition = Vector3.zero;
-
- m_Image.gameObject.transform.SetParent(mask.transform, true);
- mask.padding = new Vector4(-30, -30, -30, -30);
-
-
- PointerClickCallbackCheck callbackCheck = m_Image.gameObject.AddComponent<PointerClickCallbackCheck>();
-
- var canvasRT = m_Canvas.gameObject.transform as RectTransform;
- var screenMiddle = new Vector2(Screen.width / 2, Screen.height / 2);
- m_FakeBaseInput.MousePresent = true;
- m_FakeBaseInput.MousePosition = screenMiddle;
-
- yield return null;
- // Click the center of the screen should hit the middle of the image.
- m_FakeBaseInput.MouseButtonDown[0] = true;
- yield return null;
- m_FakeBaseInput.MouseButtonDown[0] = false;
- yield return null;
- m_FakeBaseInput.MouseButtonUp[0] = true;
- yield return null;
- m_FakeBaseInput.MouseButtonUp[0] = false;
- yield return null;
- Assert.IsTrue(callbackCheck.pointerDown);
-
- //Reset the callbackcheck and click outside the mask but still in the image.
- callbackCheck.pointerDown = false;
- m_FakeBaseInput.MousePosition = new Vector2(screenMiddle.x - 60, screenMiddle.y);
- yield return null;
- m_FakeBaseInput.MouseButtonDown[0] = true;
- yield return null;
- m_FakeBaseInput.MouseButtonDown[0] = false;
- yield return null;
- m_FakeBaseInput.MouseButtonUp[0] = true;
- yield return null;
- m_FakeBaseInput.MouseButtonUp[0] = false;
- yield return null;
- Assert.IsTrue(callbackCheck.pointerDown);
-
- //Reset the callbackcheck and click outside the mask and outside in the image.
- callbackCheck.pointerDown = false;
- m_FakeBaseInput.MousePosition = new Vector2(screenMiddle.x - 100, screenMiddle.y);
- yield return null;
- m_FakeBaseInput.MouseButtonDown[0] = true;
- yield return null;
- m_FakeBaseInput.MouseButtonDown[0] = false;
- yield return null;
- m_FakeBaseInput.MouseButtonUp[0] = true;
- yield return null;
- m_FakeBaseInput.MouseButtonUp[0] = false;
- yield return null;
- Assert.IsFalse(callbackCheck.pointerDown);
- }
-
- [UnityTest]
- public IEnumerator PointerEnterChildShouldNotFullyExit_NotSendPointerEventToParent()
- {
- m_StandaloneInputModule.sendPointerHoverToParent = false;
- PointerExitCallbackCheck callbackCheck = m_Image.gameObject.AddComponent<PointerExitCallbackCheck>();
- m_NestedImage.gameObject.AddComponent<PointerExitCallbackCheck>();
- var screenMiddle = new Vector2(Screen.width / 2, Screen.height / 2);
-
- m_FakeBaseInput.MousePresent = true;
- m_FakeBaseInput.MousePosition = screenMiddle - new Vector2(150, 150);
- yield return null;
- m_FakeBaseInput.MousePosition = screenMiddle;
- yield return null;
- Assert.IsTrue(callbackCheck.pointerData.fullyExited == false);
- }
-
- [UnityTest]
- public IEnumerator PointerEnterChildShouldNotExit_SendPointerEventToParent()
- {
- m_StandaloneInputModule.sendPointerHoverToParent = true;
- PointerExitCallbackCheck callbackCheck = m_Image.gameObject.AddComponent<PointerExitCallbackCheck>();
- m_NestedImage.gameObject.AddComponent<PointerExitCallbackCheck>();
- var screenMiddle = new Vector2(Screen.width / 2, Screen.height / 2);
-
- m_FakeBaseInput.MousePresent = true;
- m_FakeBaseInput.MousePosition = screenMiddle - new Vector2(150, 150);
- yield return null;
- m_FakeBaseInput.MousePosition = screenMiddle;
- yield return null;
- Assert.IsTrue(callbackCheck.pointerData == null);
- }
-
- [UnityTest]
- public IEnumerator PointerEnterChildShouldNotReenter()
- {
- PointerEnterCallbackCheck callbackCheck = m_NestedImage.gameObject.AddComponent<PointerEnterCallbackCheck>();
- var screenMiddle = new Vector2(Screen.width / 2, Screen.height / 2);
-
- m_FakeBaseInput.MousePresent = true;
- m_FakeBaseInput.MousePosition = screenMiddle - new Vector2(150, 150);
- yield return null;
- m_FakeBaseInput.MousePosition = screenMiddle;
- yield return null;
- Assert.IsTrue(callbackCheck.pointerData.reentered == false);
- }
-
- [UnityTest]
- public IEnumerator PointerExitChildShouldReenter_NotSendPointerEventToParent()
- {
- m_StandaloneInputModule.sendPointerHoverToParent = false;
- PointerEnterCallbackCheck callbackCheck = m_Image.gameObject.AddComponent<PointerEnterCallbackCheck>();
- var screenMiddle = new Vector2(Screen.width / 2, Screen.height / 2);
-
- m_FakeBaseInput.MousePresent = true;
- m_FakeBaseInput.MousePosition = screenMiddle - new Vector2(150, 150);
- yield return null;
- m_FakeBaseInput.MousePosition = screenMiddle;
- yield return null;
- m_FakeBaseInput.MousePosition = screenMiddle - new Vector2(150, 150);
- yield return null;
- Assert.IsTrue(callbackCheck.pointerData.reentered == true);
- }
-
- [UnityTest]
- public IEnumerator PointerExitChildShouldNotSendEnter_SendPointerEventToParent()
- {
- m_StandaloneInputModule.sendPointerHoverToParent = true;
- m_NestedImage.gameObject.AddComponent<PointerEnterCallbackCheck>();
- var screenMiddle = new Vector2(Screen.width / 2, Screen.height / 2);
-
- m_FakeBaseInput.MousePresent = true;
- m_FakeBaseInput.MousePosition = screenMiddle;
- yield return null;
- PointerEnterCallbackCheck callbackCheck = m_Image.gameObject.AddComponent<PointerEnterCallbackCheck>();
- m_FakeBaseInput.MousePosition = screenMiddle - new Vector2(150, 150);
- yield return null;
- Assert.IsTrue(callbackCheck.pointerData == null);
- }
-
- [UnityTest]
- public IEnumerator PointerExitChildShouldFullyExit()
- {
- PointerExitCallbackCheck callbackCheck = m_NestedImage.gameObject.AddComponent<PointerExitCallbackCheck>();
- var screenMiddle = new Vector2(Screen.width / 2, Screen.height / 2);
-
- m_FakeBaseInput.MousePresent = true;
- m_FakeBaseInput.MousePosition = screenMiddle - new Vector2(150, 150);
- yield return null;
- m_FakeBaseInput.MousePosition = screenMiddle;
- yield return null;
- m_FakeBaseInput.MousePosition = screenMiddle - new Vector2(150, 150);
- yield return null;
- Assert.IsTrue(callbackCheck.pointerData.fullyExited == true);
- }
-
- [TearDown]
- public void TearDown()
- {
- GameObject.DestroyImmediate(m_EventSystem.gameObject);
- GameObject.DestroyImmediate(m_Canvas.gameObject);
- }
- }
|