You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
5.3 KiB
C#
152 lines
5.3 KiB
C#
1 year ago
|
using System.Collections;
|
||
|
using System.IO;
|
||
|
using NUnit.Framework;
|
||
|
using UnityEditor;
|
||
|
using UnityEngine.EventSystems;
|
||
|
using UnityEngine.TestTools;
|
||
|
using UnityEngine.UI;
|
||
|
using UnityEngine;
|
||
|
|
||
|
public class ButtonTests : IPrebuildSetup
|
||
|
{
|
||
|
GameObject m_PrefabRoot;
|
||
|
const string kPrefabPath = "Assets/Resources/ButtonPrefab.prefab";
|
||
|
|
||
|
public void Setup()
|
||
|
{
|
||
|
#if UNITY_EDITOR
|
||
|
var rootGO = new GameObject("rootGo");
|
||
|
var canvasGO = new GameObject("Canvas", typeof(Canvas));
|
||
|
canvasGO.transform.SetParent(rootGO.transform);
|
||
|
var canvas = canvasGO.GetComponent<Canvas>();
|
||
|
canvas.referencePixelsPerUnit = 100;
|
||
|
GameObject eventSystemGO = new GameObject("EventSystem", typeof(EventSystem));
|
||
|
eventSystemGO.transform.SetParent(rootGO.transform);
|
||
|
GameObject TestButtonGO = new GameObject("TestButton", typeof(RectTransform), typeof(TestButton));
|
||
|
TestButtonGO.transform.SetParent(canvasGO.transform);
|
||
|
|
||
|
if (!Directory.Exists("Assets/Resources/"))
|
||
|
Directory.CreateDirectory("Assets/Resources/");
|
||
|
|
||
|
PrefabUtility.SaveAsPrefabAsset(rootGO, kPrefabPath);
|
||
|
GameObject.DestroyImmediate(rootGO);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
[SetUp]
|
||
|
public void TestSetup()
|
||
|
{
|
||
|
m_PrefabRoot = Object.Instantiate(Resources.Load("ButtonPrefab")) as GameObject;
|
||
|
}
|
||
|
|
||
|
[TearDown]
|
||
|
public void TearDown()
|
||
|
{
|
||
|
GameObject.DestroyImmediate(m_PrefabRoot);
|
||
|
}
|
||
|
|
||
|
[OneTimeTearDown]
|
||
|
public void OneTimeTearDown()
|
||
|
{
|
||
|
#if UNITY_EDITOR
|
||
|
AssetDatabase.DeleteAsset(kPrefabPath);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void PressShouldCallClickHandler()
|
||
|
{
|
||
|
Button button = m_PrefabRoot.GetComponentInChildren<Button>();
|
||
|
bool called = false;
|
||
|
button.onClick.AddListener(() => { called = true; });
|
||
|
button.OnPointerClick(new PointerEventData(m_PrefabRoot.GetComponentInChildren<EventSystem>()) { button = PointerEventData.InputButton.Left });
|
||
|
Assert.True(called);
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void PressInactiveShouldNotCallClickHandler()
|
||
|
{
|
||
|
Button button = m_PrefabRoot.GetComponentInChildren<Button>();
|
||
|
bool called = false;
|
||
|
button.enabled = false;
|
||
|
button.onClick.AddListener(() => { called = true; });
|
||
|
button.OnPointerClick(new PointerEventData(m_PrefabRoot.GetComponentInChildren<EventSystem>()) { button = PointerEventData.InputButton.Left });
|
||
|
Assert.False(called);
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void PressNotInteractableShouldNotCallClickHandler()
|
||
|
{
|
||
|
Button button = m_PrefabRoot.GetComponentInChildren<Button>();
|
||
|
bool called = false;
|
||
|
button.interactable = false;
|
||
|
button.onClick.AddListener(() => { called = true; });
|
||
|
button.OnPointerClick(new PointerEventData(m_PrefabRoot.GetComponentInChildren<EventSystem>()) { button = PointerEventData.InputButton.Left });
|
||
|
Assert.False(called);
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void SelectShouldHoldThePreviousStateAfterDisablingAndEnabling()
|
||
|
{
|
||
|
TestButton button = m_PrefabRoot.GetComponentInChildren<TestButton>();
|
||
|
button.onClick.AddListener(() => {
|
||
|
button.Select();
|
||
|
button.enabled = false;
|
||
|
});
|
||
|
button.OnPointerClick(new PointerEventData(m_PrefabRoot.GetComponentInChildren<EventSystem>()) { button = PointerEventData.InputButton.Left });
|
||
|
Assert.False(button.enabled, "Expected button to not be enabled");
|
||
|
button.enabled = true;
|
||
|
Assert.True(button.isStateSelected, "Expected selected state to be true");
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void SubmitShouldCallClickHandler()
|
||
|
{
|
||
|
Button button = m_PrefabRoot.GetComponentInChildren<Button>();
|
||
|
bool called = false;
|
||
|
button.onClick.AddListener(() => { called = true; });
|
||
|
button.OnSubmit(null);
|
||
|
Assert.True(called);
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void SubmitInactiveShouldNotCallClickHandler()
|
||
|
{
|
||
|
Button button = m_PrefabRoot.GetComponentInChildren<Button>();
|
||
|
bool called = false;
|
||
|
button.enabled = false;
|
||
|
button.onClick.AddListener(() => { called = true; });
|
||
|
button.OnSubmit(new PointerEventData(m_PrefabRoot.GetComponentInChildren<EventSystem>()) { button = PointerEventData.InputButton.Left });
|
||
|
Assert.False(called);
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void SubmitNotInteractableShouldNotCallClickHandler()
|
||
|
{
|
||
|
Button button = m_PrefabRoot.GetComponentInChildren<Button>();
|
||
|
bool called = false;
|
||
|
button.interactable = false;
|
||
|
button.onClick.AddListener(() => { called = true; });
|
||
|
button.OnSubmit(new PointerEventData(m_PrefabRoot.GetComponentInChildren<EventSystem>()) { button = PointerEventData.InputButton.Left });
|
||
|
Assert.False(called);
|
||
|
}
|
||
|
|
||
|
[UnityTest]
|
||
|
public IEnumerator SubmitShouldTransitionToPressedStateAndBackToNormal()
|
||
|
{
|
||
|
TestButton button = m_PrefabRoot.GetComponentInChildren<TestButton>();
|
||
|
Assert.True(button.IsTransitionToNormal(0));
|
||
|
|
||
|
button.OnSubmit(null);
|
||
|
Assert.True(button.isStateNormal);
|
||
|
Assert.True(button.IsTransitionToPressed(1));
|
||
|
yield return new WaitWhile(() => button.StateTransitionCount == 2);
|
||
|
|
||
|
// 3rd transition back to normal should have started
|
||
|
Assert.True(button.IsTransitionToNormal(2));
|
||
|
yield return null;
|
||
|
|
||
|
Assert.True(button.isStateNormal);
|
||
|
}
|
||
|
}
|