152 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			152 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | 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); | ||
|  |     } | ||
|  | } |