暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

InputModuleTests.cs 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. using System.Collections;
  2. using NUnit.Framework;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. using UnityEngine.TestTools;
  6. using UnityEngine.UI;
  7. [UnityPlatform()]
  8. public class InputModuleTests
  9. {
  10. EventSystem m_EventSystem;
  11. FakeBaseInput m_FakeBaseInput;
  12. StandaloneInputModule m_StandaloneInputModule;
  13. Canvas m_Canvas;
  14. Image m_Image;
  15. Image m_NestedImage;
  16. [SetUp]
  17. public void TestSetup()
  18. {
  19. // Camera | Canvas (Image) | Event System
  20. m_Canvas = new GameObject("Canvas").AddComponent<Canvas>();
  21. m_Canvas.renderMode = RenderMode.ScreenSpaceOverlay;
  22. m_Canvas.gameObject.AddComponent<GraphicRaycaster>();
  23. m_Image = new GameObject("Image").AddComponent<Image>();
  24. m_Image.gameObject.transform.SetParent(m_Canvas.transform);
  25. RectTransform imageRectTransform = m_Image.GetComponent<RectTransform>();
  26. imageRectTransform.sizeDelta = new Vector2(400f, 400f);
  27. imageRectTransform.localPosition = Vector3.zero;
  28. m_NestedImage = new GameObject("NestedImage").AddComponent<Image>();
  29. m_NestedImage.gameObject.transform.SetParent(m_Image.transform);
  30. RectTransform nestedImageRectTransform = m_NestedImage.GetComponent<RectTransform>();
  31. nestedImageRectTransform.sizeDelta = new Vector2(200f, 200f);
  32. nestedImageRectTransform.localPosition = Vector3.zero;
  33. GameObject go = new GameObject("Event System");
  34. m_EventSystem = go.AddComponent<EventSystem>();
  35. m_EventSystem.pixelDragThreshold = 1;
  36. m_StandaloneInputModule = go.AddComponent<StandaloneInputModule>();
  37. m_FakeBaseInput = go.AddComponent<FakeBaseInput>();
  38. // Override input with FakeBaseInput so we can send fake mouse/keyboards button presses and touches
  39. m_StandaloneInputModule.inputOverride = m_FakeBaseInput;
  40. Cursor.lockState = CursorLockMode.None;
  41. }
  42. [UnityTest]
  43. public IEnumerator DragCallbacksDoGetCalled()
  44. {
  45. // While left mouse button is pressed and the mouse is moving, OnBeginDrag and OnDrag callbacks should be called
  46. // Then when the left mouse button is released, OnEndDrag callback should be called
  47. // Add script to EventSystem to update the mouse position
  48. m_EventSystem.gameObject.AddComponent<MouseUpdate>();
  49. // Add script to Image which implements OnBeginDrag, OnDrag & OnEndDrag callbacks
  50. DragCallbackCheck callbackCheck = m_Image.gameObject.AddComponent<DragCallbackCheck>();
  51. // Setting required input.mousePresent to fake mouse presence
  52. m_FakeBaseInput.MousePresent = true;
  53. var canvasRT = m_Canvas.gameObject.transform as RectTransform;
  54. m_FakeBaseInput.MousePosition = new Vector2(Screen.width / 2, Screen.height / 2);
  55. yield return null;
  56. // Left mouse button down simulation
  57. m_FakeBaseInput.MouseButtonDown[0] = true;
  58. yield return null;
  59. // Left mouse button down flag needs to reset in the next frame
  60. m_FakeBaseInput.MouseButtonDown[0] = false;
  61. yield return null;
  62. // Left mouse button up simulation
  63. m_FakeBaseInput.MouseButtonUp[0] = true;
  64. yield return null;
  65. // Left mouse button up flag needs to reset in the next frame
  66. m_FakeBaseInput.MouseButtonUp[0] = false;
  67. yield return null;
  68. Assert.IsTrue(callbackCheck.onBeginDragCalled, "OnBeginDrag not called");
  69. Assert.IsTrue(callbackCheck.onDragCalled, "OnDragCalled not called");
  70. Assert.IsTrue(callbackCheck.onEndDragCalled, "OnEndDragCalled not called");
  71. Assert.IsTrue(callbackCheck.onDropCalled, "OnDrop not called");
  72. }
  73. [UnityTest]
  74. public IEnumerator MouseOutsideMaskRectTransform_WhileInsidePaddedArea_PerformsClick()
  75. {
  76. var mask = new GameObject("Panel").AddComponent<RectMask2D>();
  77. mask.gameObject.transform.SetParent(m_Canvas.transform);
  78. RectTransform panelRectTransform = mask.GetComponent<RectTransform>();
  79. panelRectTransform.sizeDelta = new Vector2(100, 100f);
  80. panelRectTransform.localPosition = Vector3.zero;
  81. m_Image.gameObject.transform.SetParent(mask.transform, true);
  82. mask.padding = new Vector4(-30, -30, -30, -30);
  83. PointerClickCallbackCheck callbackCheck = m_Image.gameObject.AddComponent<PointerClickCallbackCheck>();
  84. var canvasRT = m_Canvas.gameObject.transform as RectTransform;
  85. var screenMiddle = new Vector2(Screen.width / 2, Screen.height / 2);
  86. m_FakeBaseInput.MousePresent = true;
  87. m_FakeBaseInput.MousePosition = screenMiddle;
  88. yield return null;
  89. // Click the center of the screen should hit the middle of the image.
  90. m_FakeBaseInput.MouseButtonDown[0] = true;
  91. yield return null;
  92. m_FakeBaseInput.MouseButtonDown[0] = false;
  93. yield return null;
  94. m_FakeBaseInput.MouseButtonUp[0] = true;
  95. yield return null;
  96. m_FakeBaseInput.MouseButtonUp[0] = false;
  97. yield return null;
  98. Assert.IsTrue(callbackCheck.pointerDown);
  99. //Reset the callbackcheck and click outside the mask but still in the image.
  100. callbackCheck.pointerDown = false;
  101. m_FakeBaseInput.MousePosition = new Vector2(screenMiddle.x - 60, screenMiddle.y);
  102. yield return null;
  103. m_FakeBaseInput.MouseButtonDown[0] = true;
  104. yield return null;
  105. m_FakeBaseInput.MouseButtonDown[0] = false;
  106. yield return null;
  107. m_FakeBaseInput.MouseButtonUp[0] = true;
  108. yield return null;
  109. m_FakeBaseInput.MouseButtonUp[0] = false;
  110. yield return null;
  111. Assert.IsTrue(callbackCheck.pointerDown);
  112. //Reset the callbackcheck and click outside the mask and outside in the image.
  113. callbackCheck.pointerDown = false;
  114. m_FakeBaseInput.MousePosition = new Vector2(screenMiddle.x - 100, screenMiddle.y);
  115. yield return null;
  116. m_FakeBaseInput.MouseButtonDown[0] = true;
  117. yield return null;
  118. m_FakeBaseInput.MouseButtonDown[0] = false;
  119. yield return null;
  120. m_FakeBaseInput.MouseButtonUp[0] = true;
  121. yield return null;
  122. m_FakeBaseInput.MouseButtonUp[0] = false;
  123. yield return null;
  124. Assert.IsFalse(callbackCheck.pointerDown);
  125. }
  126. [UnityTest]
  127. public IEnumerator PointerEnterChildShouldNotFullyExit_NotSendPointerEventToParent()
  128. {
  129. m_StandaloneInputModule.sendPointerHoverToParent = false;
  130. PointerExitCallbackCheck callbackCheck = m_Image.gameObject.AddComponent<PointerExitCallbackCheck>();
  131. m_NestedImage.gameObject.AddComponent<PointerExitCallbackCheck>();
  132. var screenMiddle = new Vector2(Screen.width / 2, Screen.height / 2);
  133. m_FakeBaseInput.MousePresent = true;
  134. m_FakeBaseInput.MousePosition = screenMiddle - new Vector2(150, 150);
  135. yield return null;
  136. m_FakeBaseInput.MousePosition = screenMiddle;
  137. yield return null;
  138. Assert.IsTrue(callbackCheck.pointerData.fullyExited == false);
  139. }
  140. [UnityTest]
  141. public IEnumerator PointerEnterChildShouldNotExit_SendPointerEventToParent()
  142. {
  143. m_StandaloneInputModule.sendPointerHoverToParent = true;
  144. PointerExitCallbackCheck callbackCheck = m_Image.gameObject.AddComponent<PointerExitCallbackCheck>();
  145. m_NestedImage.gameObject.AddComponent<PointerExitCallbackCheck>();
  146. var screenMiddle = new Vector2(Screen.width / 2, Screen.height / 2);
  147. m_FakeBaseInput.MousePresent = true;
  148. m_FakeBaseInput.MousePosition = screenMiddle - new Vector2(150, 150);
  149. yield return null;
  150. m_FakeBaseInput.MousePosition = screenMiddle;
  151. yield return null;
  152. Assert.IsTrue(callbackCheck.pointerData == null);
  153. }
  154. [UnityTest]
  155. public IEnumerator PointerEnterChildShouldNotReenter()
  156. {
  157. PointerEnterCallbackCheck callbackCheck = m_NestedImage.gameObject.AddComponent<PointerEnterCallbackCheck>();
  158. var screenMiddle = new Vector2(Screen.width / 2, Screen.height / 2);
  159. m_FakeBaseInput.MousePresent = true;
  160. m_FakeBaseInput.MousePosition = screenMiddle - new Vector2(150, 150);
  161. yield return null;
  162. m_FakeBaseInput.MousePosition = screenMiddle;
  163. yield return null;
  164. Assert.IsTrue(callbackCheck.pointerData.reentered == false);
  165. }
  166. [UnityTest]
  167. public IEnumerator PointerExitChildShouldReenter_NotSendPointerEventToParent()
  168. {
  169. m_StandaloneInputModule.sendPointerHoverToParent = false;
  170. PointerEnterCallbackCheck callbackCheck = m_Image.gameObject.AddComponent<PointerEnterCallbackCheck>();
  171. var screenMiddle = new Vector2(Screen.width / 2, Screen.height / 2);
  172. m_FakeBaseInput.MousePresent = true;
  173. m_FakeBaseInput.MousePosition = screenMiddle - new Vector2(150, 150);
  174. yield return null;
  175. m_FakeBaseInput.MousePosition = screenMiddle;
  176. yield return null;
  177. m_FakeBaseInput.MousePosition = screenMiddle - new Vector2(150, 150);
  178. yield return null;
  179. Assert.IsTrue(callbackCheck.pointerData.reentered == true);
  180. }
  181. [UnityTest]
  182. public IEnumerator PointerExitChildShouldNotSendEnter_SendPointerEventToParent()
  183. {
  184. m_StandaloneInputModule.sendPointerHoverToParent = true;
  185. m_NestedImage.gameObject.AddComponent<PointerEnterCallbackCheck>();
  186. var screenMiddle = new Vector2(Screen.width / 2, Screen.height / 2);
  187. m_FakeBaseInput.MousePresent = true;
  188. m_FakeBaseInput.MousePosition = screenMiddle;
  189. yield return null;
  190. PointerEnterCallbackCheck callbackCheck = m_Image.gameObject.AddComponent<PointerEnterCallbackCheck>();
  191. m_FakeBaseInput.MousePosition = screenMiddle - new Vector2(150, 150);
  192. yield return null;
  193. Assert.IsTrue(callbackCheck.pointerData == null);
  194. }
  195. [UnityTest]
  196. public IEnumerator PointerExitChildShouldFullyExit()
  197. {
  198. PointerExitCallbackCheck callbackCheck = m_NestedImage.gameObject.AddComponent<PointerExitCallbackCheck>();
  199. var screenMiddle = new Vector2(Screen.width / 2, Screen.height / 2);
  200. m_FakeBaseInput.MousePresent = true;
  201. m_FakeBaseInput.MousePosition = screenMiddle - new Vector2(150, 150);
  202. yield return null;
  203. m_FakeBaseInput.MousePosition = screenMiddle;
  204. yield return null;
  205. m_FakeBaseInput.MousePosition = screenMiddle - new Vector2(150, 150);
  206. yield return null;
  207. Assert.IsTrue(callbackCheck.pointerData.fullyExited == true);
  208. }
  209. [TearDown]
  210. public void TearDown()
  211. {
  212. GameObject.DestroyImmediate(m_EventSystem.gameObject);
  213. GameObject.DestroyImmediate(m_Canvas.gameObject);
  214. }
  215. }