using NUnit.Framework; using UnityEngine.EventSystems; using UnityEngine; using UnityEngine.UI; using UnityEngine.TestTools; using System.IO; using UnityEditor; class GridLayoutGroupTests : IPrebuildSetup { const string kPrefabPath = "Assets/Resources/GridLayoutGroupTests.prefab"; private GameObject m_PrefabRoot; private GridLayoutGroup m_LayoutGroup; public void Setup() { #if UNITY_EDITOR var rootGO = new GameObject("rootGo"); var canvasGO = new GameObject("Canvas"); canvasGO.transform.SetParent(rootGO.transform); Canvas canvas = canvasGO.AddComponent(); canvas.referencePixelsPerUnit = 100; var groupGO = new GameObject("Group", typeof(RectTransform), typeof(GridLayoutGroup)); groupGO.transform.SetParent(canvas.transform); var rectTransform = groupGO.GetComponent(); rectTransform.sizeDelta = new Vector2(400, 500); rectTransform.anchoredPosition = new Vector2(0, 0); rectTransform.pivot = new Vector2(0, 0); var layoutGroup = groupGO.GetComponent(); layoutGroup.spacing = new Vector2(10, 0); layoutGroup.startCorner = GridLayoutGroup.Corner.UpperLeft; layoutGroup.cellSize = new Vector2(90, 50); layoutGroup.constraint = GridLayoutGroup.Constraint.Flexible; layoutGroup.startAxis = GridLayoutGroup.Axis.Horizontal; layoutGroup.childAlignment = TextAnchor.UpperLeft; layoutGroup.enabled = false; layoutGroup.enabled = true; var el1 = new GameObject("Element1"); el1.transform.SetParent(rectTransform); var element1 = el1.AddComponent(); (el1.transform as RectTransform).pivot = Vector2.zero; element1.minWidth = 5; element1.minHeight = 10; element1.preferredWidth = 100; element1.preferredHeight = 50; element1.flexibleWidth = 0; element1.flexibleHeight = 0; element1.enabled = true; var el2 = new GameObject("Element2"); el2.transform.SetParent(rectTransform); var element2 = el2.AddComponent(); (el2.transform as RectTransform).pivot = Vector2.zero; element2.minWidth = 10; element2.minHeight = 5; element2.preferredWidth = -1; element2.preferredHeight = -1; element2.flexibleWidth = 0; element2.flexibleHeight = 0; element2.enabled = true; var el3 = new GameObject("Element3"); el3.transform.SetParent(rectTransform); var element3 = el3.AddComponent(); (el3.transform as RectTransform).pivot = Vector2.zero; element3.minWidth = 60; element3.minHeight = 25; element3.preferredWidth = 120; element3.preferredHeight = 40; element3.flexibleWidth = 1; element3.flexibleHeight = 1; element3.enabled = true; var el4 = new GameObject("Element4"); el4.transform.SetParent(rectTransform); var element4 = el4.AddComponent(); (el4.transform as RectTransform).pivot = Vector2.zero; element4.minWidth = 60; element4.minHeight = 25; element4.preferredWidth = 120; element4.preferredHeight = 40; element4.flexibleWidth = 1; element4.flexibleHeight = 1; element4.enabled = true; var el5 = new GameObject("Element5"); el5.transform.SetParent(rectTransform); var element5 = el5.AddComponent(); (el5.transform as RectTransform).pivot = Vector2.zero; element5.minWidth = 60; element5.minHeight = 25; element5.preferredWidth = 120; element5.preferredHeight = 40; element5.flexibleWidth = 1; element5.flexibleHeight = 1; element5.enabled = true; var el6 = new GameObject("Element6"); el6.transform.SetParent(rectTransform); var element6 = el6.AddComponent(); (el6.transform as RectTransform).pivot = Vector2.zero; element6.minWidth = 60; element6.minHeight = 25; element6.preferredWidth = 120; element6.preferredHeight = 40; element6.flexibleWidth = 1; element6.flexibleHeight = 1; element6.enabled = true; var el7 = new GameObject("Element7"); el7.transform.SetParent(rectTransform); var element7 = el7.AddComponent(); (el7.transform as RectTransform).pivot = Vector2.zero; element7.minWidth = 60; element7.minHeight = 25; element7.preferredWidth = 120; element7.preferredHeight = 40; element7.flexibleWidth = 1; element7.flexibleHeight = 1; element7.enabled = true; var el8 = new GameObject("Element8"); el8.transform.SetParent(rectTransform); var element8 = el8.AddComponent(); (el8.transform as RectTransform).pivot = Vector2.zero; element8.minWidth = 60; element8.minHeight = 25; element8.preferredWidth = 120; element8.preferredHeight = 40; element8.flexibleWidth = 1; element8.flexibleHeight = 1; element8.enabled = true; var el9 = new GameObject("Element9"); el9.transform.SetParent(rectTransform); var element9 = el9.AddComponent(); (el9.transform as RectTransform).pivot = Vector2.zero; element9.minWidth = 500; element9.minHeight = 300; element9.preferredWidth = 1000; element9.preferredHeight = 600; element9.flexibleWidth = 1; element9.flexibleHeight = 1; element9.enabled = true; element9.ignoreLayout = true; if (!Directory.Exists("Assets/Resources/")) Directory.CreateDirectory("Assets/Resources/"); PrefabUtility.SaveAsPrefabAsset(rootGO, kPrefabPath); GameObject.DestroyImmediate(rootGO); #endif } [SetUp] public void TestSetup() { m_PrefabRoot = GameObject.Instantiate(Resources.Load("GridLayoutGroupTests")) as GameObject; m_LayoutGroup = m_PrefabRoot.GetComponentInChildren(); } [TearDown] public void TearDown() { GameObject.DestroyImmediate(m_PrefabRoot); m_LayoutGroup = null; } [OneTimeTearDown] public void OneTimeTearDown() { #if UNITY_EDITOR AssetDatabase.DeleteAsset(kPrefabPath); #endif } [Test] public void TestFlexibleCalculateLayout() { m_LayoutGroup.constraint = GridLayoutGroup.Constraint.Flexible; Assert.AreEqual(GridLayoutGroup.Constraint.Flexible, m_LayoutGroup.constraint); LayoutRebuilder.ForceRebuildLayoutImmediate(m_LayoutGroup.GetComponent()); Assert.AreEqual(90, m_LayoutGroup.minWidth, "Expected layout group min width to match but it did not"); Assert.AreEqual(100, m_LayoutGroup.minHeight, "Expected layout group min height to match but it did not"); Assert.AreEqual(290, m_LayoutGroup.preferredWidth, "Expected layout group preferred width to match but it did not"); Assert.AreEqual(100, m_LayoutGroup.preferredHeight, "Expected layout group preferred height to match but it did not"); Assert.AreEqual(-1, m_LayoutGroup.flexibleWidth, "Expected layout group flexiblle width to match but it did not"); Assert.AreEqual(-1, m_LayoutGroup.flexibleHeight, "Expected layout group flexiblle height to match but it did not"); Vector2[] expectedPositions = { new Vector2(0, -50), new Vector2(100, -50), new Vector2(200, -50), new Vector2(300, -50), new Vector2(0, -100), new Vector2(100, -100), new Vector2(200, -100), new Vector2(300, -100), }; Vector2 expectedSize = new Vector2(90, 50); for (int i = 0; i < expectedPositions.Length; ++i) { var element = m_LayoutGroup.transform.Find("Element" + (i + 1)); var rectTransform = element.GetComponent(); Assert.AreEqual(expectedPositions[i], rectTransform.anchoredPosition, $"Expected Element { i + 1 } position to match but it did not"); Assert.AreEqual(expectedSize, rectTransform.sizeDelta, $"Expected Element { i + 1 } size to match but it did not"); } } [Test] public void TestHorizontallyContrainedCalculateLayoutHorizontal() { m_LayoutGroup.constraint = GridLayoutGroup.Constraint.FixedColumnCount; m_LayoutGroup.constraintCount = 2; Assert.AreEqual(GridLayoutGroup.Constraint.FixedColumnCount, m_LayoutGroup.constraint, "Expected layout group constraint mode to match but it did not"); Assert.AreEqual(2, m_LayoutGroup.constraintCount, "Expected layout group constraint count mode to match but it did not"); LayoutRebuilder.ForceRebuildLayoutImmediate(m_LayoutGroup.GetComponent()); Assert.AreEqual(190, m_LayoutGroup.minWidth, "Expected layout group min width to match but it did not"); Assert.AreEqual(200, m_LayoutGroup.minHeight, "Expected layout group min height to match but it did not"); Assert.AreEqual(190, m_LayoutGroup.preferredWidth, "Expected layout group preferred width to match but it did not"); Assert.AreEqual(200, m_LayoutGroup.preferredHeight, "Expected layout group preferred height to match but it did not"); Assert.AreEqual(-1, m_LayoutGroup.flexibleWidth, "Expected layout group flexiblle width to match but it did not"); Assert.AreEqual(-1, m_LayoutGroup.flexibleHeight, "Expected layout group flexiblle height to match but it did not"); Vector2[] expectedPositions = { new Vector2(0, -50), new Vector2(100, -50), new Vector2(0, -100), new Vector2(100, -100), new Vector2(0, -150), new Vector2(100, -150), new Vector2(0, -200), new Vector2(100, -200), }; Vector2 expectedSize = new Vector2(90, 50); for (int i = 0; i < expectedPositions.Length; ++i) { var element = m_LayoutGroup.transform.Find("Element" + (i + 1)); var rectTransform = element.GetComponent(); Assert.AreEqual(expectedPositions[i], rectTransform.anchoredPosition, $"Expected Element { i + 1 } position to match but it did not"); Assert.AreEqual(expectedSize, rectTransform.sizeDelta, $"Expected Element { i + 1 } size to match but it did not"); } } [Test] public void TestVerticallyContrainedCalculateLayoutHorizontal() { m_LayoutGroup.constraint = GridLayoutGroup.Constraint.FixedRowCount; m_LayoutGroup.constraintCount = 2; Assert.AreEqual(GridLayoutGroup.Constraint.FixedRowCount, m_LayoutGroup.constraint, "Expected layout group constraint mode to match but it did not"); Assert.AreEqual(2, m_LayoutGroup.constraintCount, "Expected layout group constraint count mode to match but it did not"); LayoutRebuilder.ForceRebuildLayoutImmediate(m_LayoutGroup.GetComponent()); Assert.AreEqual(390, m_LayoutGroup.minWidth, "Expected layout group min width to match but it did not"); Assert.AreEqual(100, m_LayoutGroup.minHeight, "Expected layout group min height to match but it did not"); Assert.AreEqual(390, m_LayoutGroup.preferredWidth, "Expected layout group preferred width to match but it did not"); Assert.AreEqual(100, m_LayoutGroup.preferredHeight, "Expected layout group preferred height to match but it did not"); Assert.AreEqual(-1, m_LayoutGroup.flexibleWidth, "Expected layout group flexiblle width to match but it did not"); Assert.AreEqual(-1, m_LayoutGroup.flexibleHeight, "Expected layout group flexiblle height to match but it did not"); Vector2[] expectedPositions = { new Vector2(0, -50), new Vector2(100, -50), new Vector2(200, -50), new Vector2(300, -50), new Vector2(0, -100), new Vector2(100, -100), new Vector2(200, -100), new Vector2(300, -100), }; Vector2 expectedSize = new Vector2(90, 50); for (int i = 0; i < expectedPositions.Length; ++i) { var element = m_LayoutGroup.transform.Find("Element" + (i + 1)); var rectTransform = element.GetComponent(); Assert.AreEqual(expectedPositions[i], rectTransform.anchoredPosition, $"Expected Element { i + 1 } position to match but it did not"); Assert.AreEqual(expectedSize, rectTransform.sizeDelta, $"Expected Element { i + 1 } size to match but it did not"); } } [Test] public void TestHorizontallyContrainedCalculateLayoutVertical() { m_LayoutGroup.constraint = GridLayoutGroup.Constraint.FixedColumnCount; m_LayoutGroup.constraintCount = 2; m_LayoutGroup.startAxis = GridLayoutGroup.Axis.Vertical; Assert.AreEqual(GridLayoutGroup.Constraint.FixedColumnCount, m_LayoutGroup.constraint, "Expected layout group constraint mode to match but it did not"); Assert.AreEqual(2, m_LayoutGroup.constraintCount, "Expected layout group constraint count mode to match but it did not"); LayoutRebuilder.ForceRebuildLayoutImmediate(m_LayoutGroup.GetComponent()); Assert.AreEqual(190, m_LayoutGroup.minWidth, "Expected layout group min width to match but it did not"); Assert.AreEqual(200, m_LayoutGroup.minHeight, "Expected layout group min height to match but it did not"); Assert.AreEqual(190, m_LayoutGroup.preferredWidth, "Expected layout group preferred width to match but it did not"); Assert.AreEqual(200, m_LayoutGroup.preferredHeight, "Expected layout group preferred height to match but it did not"); Assert.AreEqual(-1, m_LayoutGroup.flexibleWidth, "Expected layout group flexiblle width to match but it did not"); Assert.AreEqual(-1, m_LayoutGroup.flexibleHeight, "Expected layout group flexiblle height to match but it did not"); Vector2[] expectedPositions = { new Vector2(0, -50), new Vector2(0, -100), new Vector2(0, -150), new Vector2(0, -200), new Vector2(100, -50), new Vector2(100, -100), new Vector2(100, -150), new Vector2(100, -200), }; Vector2 expectedSize = new Vector2(90, 50); for (int i = 0; i < expectedPositions.Length; ++i) { var element = m_LayoutGroup.transform.Find("Element" + (i + 1)); var rectTransform = element.GetComponent(); Assert.AreEqual(expectedPositions[i], rectTransform.anchoredPosition, $"Expected Element { i + 1 } position to match but it did not"); Assert.AreEqual(expectedSize, rectTransform.sizeDelta, $"Expected Element { i + 1 } size to match but it did not"); } } [Test] public void TestVerticallyContrainedCalculateLayoutVertical() { m_LayoutGroup.constraint = GridLayoutGroup.Constraint.FixedRowCount; m_LayoutGroup.constraintCount = 2; m_LayoutGroup.startAxis = GridLayoutGroup.Axis.Vertical; m_LayoutGroup.startCorner = GridLayoutGroup.Corner.LowerRight; Assert.AreEqual(GridLayoutGroup.Constraint.FixedRowCount, m_LayoutGroup.constraint, "Expected layout group constraint mode to match but it did not"); Assert.AreEqual(2, m_LayoutGroup.constraintCount, "Expected layout group constraint count mode to match but it did not"); m_LayoutGroup.CalculateLayoutInputHorizontal(); m_LayoutGroup.SetLayoutHorizontal(); m_LayoutGroup.CalculateLayoutInputVertical(); m_LayoutGroup.SetLayoutVertical(); Assert.AreEqual(390, m_LayoutGroup.minWidth, "Expected layout group min width to match but it did not"); Assert.AreEqual(100, m_LayoutGroup.minHeight, "Expected layout group min height to match but it did not"); Assert.AreEqual(390, m_LayoutGroup.preferredWidth, "Expected layout group preferred width to match but it did not"); Assert.AreEqual(100, m_LayoutGroup.preferredHeight, "Expected layout group preferred height to match but it did not"); Assert.AreEqual(-1, m_LayoutGroup.flexibleWidth, "Expected layout group flexiblle width to match but it did not"); Assert.AreEqual(-1, m_LayoutGroup.flexibleHeight, "Expected layout group flexiblle height to match but it did not"); Vector2[] expectedPositions = { new Vector2(300, -100), new Vector2(300, -50), new Vector2(200, -100), new Vector2(200, -50), new Vector2(100, -100), new Vector2(100, -50), new Vector2(0, -100), new Vector2(0, -50), }; Vector2 expectedSize = new Vector2(90, 50); for (int i = 0; i < expectedPositions.Length; ++i) { var element = m_LayoutGroup.transform.Find("Element" + (i + 1)); var rectTransform = element.GetComponent(); Assert.AreEqual(expectedPositions[i], rectTransform.anchoredPosition, $"Expected Element { i + 1 } position to match but it did not"); Assert.AreEqual(expectedSize, rectTransform.sizeDelta, $"Expected Element { i + 1 } size to match but it did not"); } } [Test] public void TestHorizontallyContrainedCalculateLayoutHorizontal_WithChildrenToMove() { m_LayoutGroup.constraint = GridLayoutGroup.Constraint.FixedRowCount; m_LayoutGroup.constraintCount = 5; m_LayoutGroup.startAxis = GridLayoutGroup.Axis.Horizontal; m_LayoutGroup.startCorner = GridLayoutGroup.Corner.UpperLeft; Assert.AreEqual(GridLayoutGroup.Constraint.FixedRowCount, m_LayoutGroup.constraint, "Expected layout group constraint mode to match but it did not"); Assert.AreEqual(5, m_LayoutGroup.constraintCount, "Expected layout group constraint count mode to match but it did not"); m_LayoutGroup.CalculateLayoutInputHorizontal(); m_LayoutGroup.SetLayoutHorizontal(); m_LayoutGroup.CalculateLayoutInputVertical(); m_LayoutGroup.SetLayoutVertical(); Assert.AreEqual(190, m_LayoutGroup.minWidth, "Expected layout group min width to match but it did not"); Assert.AreEqual(250, m_LayoutGroup.minHeight, "Expected layout group min height to match but it did not"); Assert.AreEqual(190, m_LayoutGroup.preferredWidth, "Expected layout group preferred width to match but it did not"); Assert.AreEqual(250, m_LayoutGroup.preferredHeight, "Expected layout group preferred height to match but it did not"); Assert.AreEqual(-1, m_LayoutGroup.flexibleWidth, "Expected layout group flexiblle width to match but it did not"); Assert.AreEqual(-1, m_LayoutGroup.flexibleHeight, "Expected layout group flexiblle height to match but it did not"); Vector2[] expectedPositions = { new Vector2(0, -50), new Vector2(100, -50), new Vector2(0, -100), new Vector2(100, -100), new Vector2(0, -150), new Vector2(100, -150), new Vector2(0, -200), new Vector2(0, -250) }; Vector2 expectedSize = new Vector2(90, 50); for (int i = 0; i < expectedPositions.Length; ++i) { var element = m_LayoutGroup.transform.Find("Element" + (i + 1)); var rectTransform = element.GetComponent(); Assert.AreEqual(expectedPositions[i], rectTransform.anchoredPosition, $"Expected Element { i + 1 } position to match but it did not"); Assert.AreEqual(expectedSize, rectTransform.sizeDelta, $"Expected Element { i + 1 } size to match but it did not"); } } [Test] public void TestVerticallyContrainedCalculateLayoutVertical_WithChildrenToMove() { m_LayoutGroup.constraint = GridLayoutGroup.Constraint.FixedColumnCount; m_LayoutGroup.constraintCount = 5; m_LayoutGroup.startAxis = GridLayoutGroup.Axis.Vertical; m_LayoutGroup.startCorner = GridLayoutGroup.Corner.UpperLeft; Assert.AreEqual(GridLayoutGroup.Constraint.FixedColumnCount, m_LayoutGroup.constraint, "Expected layout group constraint mode to match but it did not"); Assert.AreEqual(5, m_LayoutGroup.constraintCount, "Expected layout group constraint count mode to match but it did not"); m_LayoutGroup.CalculateLayoutInputHorizontal(); m_LayoutGroup.SetLayoutHorizontal(); m_LayoutGroup.CalculateLayoutInputVertical(); m_LayoutGroup.SetLayoutVertical(); Assert.AreEqual(490, m_LayoutGroup.minWidth, "Expected layout group min width to match but it did not"); Assert.AreEqual(100, m_LayoutGroup.minHeight, "Expected layout group min height to match but it did not"); Assert.AreEqual(490, m_LayoutGroup.preferredWidth, "Expected layout group preferred width to match but it did not"); Assert.AreEqual(100, m_LayoutGroup.preferredHeight, "Expected layout group preferred height to match but it did not"); Assert.AreEqual(-1, m_LayoutGroup.flexibleWidth, "Expected layout group flexiblle width to match but it did not"); Assert.AreEqual(-1, m_LayoutGroup.flexibleHeight, "Expected layout group flexiblle height to match but it did not"); Vector2[] expectedPositions = { new Vector2(0, -50), new Vector2(0, -100), new Vector2(100, -50), new Vector2(100, -100), new Vector2(200, -50), new Vector2(200, -100), new Vector2(300, -50), new Vector2(400, -50) }; Vector2 expectedSize = new Vector2(90, 50); for (int i = 0; i < expectedPositions.Length; ++i) { var element = m_LayoutGroup.transform.Find("Element" + (i + 1)); var rectTransform = element.GetComponent(); Assert.AreEqual(expectedPositions[i], rectTransform.anchoredPosition, $"Expected Element { i + 1 } position to match but it did not"); Assert.AreEqual(expectedSize, rectTransform.sizeDelta, $"Expected Element { i + 1 } size to match but it did not"); } } }