You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
5.3 KiB
151 lines
5.3 KiB
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); |
|
} |
|
}
|
|
|