261 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			261 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 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);
 | |
|     }
 | |
| }
 |