using UnityEngine; using UnityEngine.TestTools; using NUnit.Framework; using System.Collections; using UnityEngine.UI; [TestFixture] [Category("RegressionTest")] [Description("Case 723062")] public class SiblingOrderChangesLayout { GameObject m_CanvasGO; GameObject m_ParentGO; GameObject m_Child1GO; GameObject m_Child2GO; [SetUp] public void TestSetup() { m_CanvasGO = new GameObject("Canvas", typeof(Canvas)); m_ParentGO = new GameObject("ParentRenderer"); m_Child1GO = CreateTextObject("ChildRenderer1"); m_Child2GO = CreateTextObject("ChildRenderer2"); #if UNITY_EDITOR UnityEditor.EditorApplication.ExecuteMenuItem("Window/General/Game"); #endif } [UnityTest] public IEnumerator ReorderingSiblingChangesLayout() { m_ParentGO.transform.SetParent(m_CanvasGO.transform); m_Child1GO.transform.SetParent(m_ParentGO.transform); m_Child2GO.transform.SetParent(m_ParentGO.transform); m_ParentGO.AddComponent(); m_ParentGO.AddComponent(); m_ParentGO.AddComponent(); m_ParentGO.AddComponent(); yield return new WaitForEndOfFrame(); Vector2 child1Pos = m_Child1GO.GetComponent().anchoredPosition; Vector2 child2Pos = m_Child2GO.GetComponent().anchoredPosition; Assert.That(child1Pos, Is.Not.EqualTo(child2Pos)); Assert.That(m_Child1GO.GetComponent().hasMoved, Is.False, "CanvasRenderer.hasMoved should be false"); m_Child2GO.transform.SetAsFirstSibling(); Canvas.ForceUpdateCanvases(); Assert.That(m_Child1GO.GetComponent().hasMoved, Is.True, "CanvasRenderer.hasMoved should be true"); Vector2 newChild1Pos = m_Child1GO.GetComponent().anchoredPosition; Vector2 newChild2Pos = m_Child2GO.GetComponent().anchoredPosition; Assert.That(newChild1Pos, Is.EqualTo(child2Pos), "Child1 should have moved to Child2's position"); Assert.That(newChild2Pos, Is.EqualTo(child1Pos), "Child2 should have moved to Child1's position"); } [TearDown] public void TearDown() { GameObject.DestroyImmediate(m_CanvasGO); } // Factory method for creating UI text objects taken from the original bug repro scene: private GameObject CreateTextObject(string name) { GameObject outputTextGameObject = new GameObject("OutputContent", typeof(CanvasRenderer)); RectTransform outputTextTransform = outputTextGameObject.AddComponent(); outputTextTransform.pivot = new Vector2(0.5f, 0); outputTextTransform.anchorMin = Vector2.zero; outputTextTransform.anchorMax = new Vector2(1, 0); outputTextTransform.anchoredPosition = Vector2.zero; outputTextTransform.sizeDelta = Vector2.zero; Text outputText = outputTextGameObject.AddComponent(); outputText.text = "Hello World!"; outputTextGameObject.name = name; return outputTextGameObject; } }