Rasagar/Library/PackageCache/com.unity.ugui/Tests/Runtime/UGUI/InputField/DesktopInputFieldTests.cs

115 lines
4.1 KiB
C#
Raw Normal View History

2024-08-26 13:07:20 -07:00
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);
}
}
}