115 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			115 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 
								 | 
							
								using System;
							 | 
						||
| 
								 | 
							
								using System.Linq;
							 | 
						||
| 
								 | 
							
								using NUnit.Framework;
							 | 
						||
| 
								 | 
							
								using UnityEngine;
							 | 
						||
| 
								 | 
							
								using UnityEngine.EventSystems;
							 | 
						||
| 
								 | 
							
								using UnityEngine.TestTools;
							 | 
						||
| 
								 | 
							
								using System.Collections;
							 | 
						||
| 
								 | 
							
								using System.IO;
							 | 
						||
| 
								 | 
							
								using UnityEditor;
							 | 
						||
| 
								 | 
							
								using UnityEngine.UI;
							 | 
						||
| 
								 | 
							
								using System.Reflection;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace InputfieldTests
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    public class DesktopInputFieldTests : BaseInputFieldTests, IPrebuildSetup
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        protected const string kPrefabPath = "Assets/Resources/DesktopInputFieldPrefab.prefab";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public void Setup()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								#if UNITY_EDITOR
							 | 
						||
| 
								 | 
							
								            CreateInputFieldAsset(kPrefabPath);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [SetUp]
							 | 
						||
| 
								 | 
							
								        public virtual void TestSetup()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            m_PrefabRoot = UnityEngine.Object.Instantiate(Resources.Load("DesktopInputFieldPrefab")) as GameObject;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            FieldInfo inputModule = typeof(EventSystem).GetField("m_CurrentInputModule", BindingFlags.NonPublic | BindingFlags.Instance);
							 | 
						||
| 
								 | 
							
								            inputModule.SetValue(m_PrefabRoot.GetComponentInChildren<EventSystem>(), m_PrefabRoot.GetComponentInChildren<FakeInputModule>());
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [TearDown]
							 | 
						||
| 
								 | 
							
								        public virtual void TearDown()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            GUIUtility.systemCopyBuffer = null;
							 | 
						||
| 
								 | 
							
								            FontUpdateTracker.UntrackText(m_PrefabRoot.GetComponentInChildren<Text>());
							 | 
						||
| 
								 | 
							
								            GameObject.DestroyImmediate(m_PrefabRoot);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [OneTimeTearDown]
							 | 
						||
| 
								 | 
							
								        public void OnetimeTearDown()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								#if UNITY_EDITOR
							 | 
						||
| 
								 | 
							
								            AssetDatabase.DeleteAsset(kPrefabPath);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [UnityTest]
							 | 
						||
| 
								 | 
							
								        [UnityPlatform(exclude = new[] { RuntimePlatform.Switch })] // Currently InputField.ActivateInputFieldInternal calls Switch SoftwareKeyboard screen ; without user input or a command to close the SoftwareKeyboard this blocks the tests suite
							 | 
						||
| 
								 | 
							
								        public IEnumerator FocusOnPointerClickWithLeftButton()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            InputField inputField = m_PrefabRoot.GetComponentInChildren<InputField>();
							 | 
						||
| 
								 | 
							
								            PointerEventData data = new PointerEventData(m_PrefabRoot.GetComponentInChildren<EventSystem>());
							 | 
						||
| 
								 | 
							
								            data.button = PointerEventData.InputButton.Left;
							 | 
						||
| 
								 | 
							
								            inputField.OnPointerClick(data);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            MethodInfo lateUpdate = typeof(InputField).GetMethod("LateUpdate", BindingFlags.NonPublic | BindingFlags.Instance);
							 | 
						||
| 
								 | 
							
								            lateUpdate.Invoke(inputField, null);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if UNITY_GAMECORE && !UNITY_EDITOR
							 | 
						||
| 
								 | 
							
								            if (TouchScreenKeyboard.isSupported)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                // On Xbox, the onScreenKeyboard is going to constrain the application and make it go out of focus. 
							 | 
						||
| 
								 | 
							
								                // We need to wait for the application to go out of focus before we can close the onScreenKeyboard.
							 | 
						||
| 
								 | 
							
								                while (Application.isFocused)
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    yield return null;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            Assert.IsTrue(inputField.isFocused);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if UNITY_GAMECORE && !UNITY_EDITOR
							 | 
						||
| 
								 | 
							
								            // On Xbox, we then need to close onScreenKeyboard and wait for the application to be focused again.
							 | 
						||
| 
								 | 
							
								            // If this is not done, it could have an impact on subsequent tests that require the application to be focused in order to function correctly.
							 | 
						||
| 
								 | 
							
								            if (!TouchScreenKeyboard.isSupported || !TouchScreenKeyboard.visible)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                yield break;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            while (!Application.isFocused)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                if (inputField.touchScreenKeyboard != null)
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    inputField.touchScreenKeyboard.active = false;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                yield return null;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								            yield break;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [UnityTest]
							 | 
						||
| 
								 | 
							
								        public IEnumerator DoesNotFocusOnPointerClickWithRightOrMiddleButton()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            InputField inputField = m_PrefabRoot.GetComponentInChildren<InputField>();
							 | 
						||
| 
								 | 
							
								            PointerEventData data = new PointerEventData(m_PrefabRoot.GetComponentInChildren<EventSystem>());
							 | 
						||
| 
								 | 
							
								            data.button = PointerEventData.InputButton.Middle;
							 | 
						||
| 
								 | 
							
								            inputField.OnPointerClick(data);
							 | 
						||
| 
								 | 
							
								            yield return null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            data.button = PointerEventData.InputButton.Right;
							 | 
						||
| 
								 | 
							
								            inputField.OnPointerClick(data);
							 | 
						||
| 
								 | 
							
								            yield return null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            Assert.IsFalse(inputField.isFocused);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |