A game about forced loneliness, made by TACStudios
1using UnityEngine;
2using UnityEngine.TestTools;
3using NUnit.Framework;
4using System.Collections;
5using UnityEngine.UI;
6using System.Reflection;
7
8public class ImageTests
9{
10 private const int Width = 32;
11 private const int Height = 32;
12
13 GameObject m_CanvasGO;
14 TestableImage m_Image;
15 private Texture2D m_defaultTexture;
16
17 private bool m_dirtyLayout;
18 private bool m_dirtyMaterial;
19
20 [SetUp]
21 public void SetUp()
22 {
23 m_CanvasGO = new GameObject("Canvas", typeof(Canvas));
24 GameObject imageObject = new GameObject("Image", typeof(TestableImage));
25 imageObject.transform.SetParent(m_CanvasGO.transform);
26 m_Image = imageObject.GetComponent<TestableImage>();
27 m_Image.RegisterDirtyLayoutCallback(() => m_dirtyLayout = true);
28 m_Image.RegisterDirtyMaterialCallback(() => m_dirtyMaterial = true);
29
30 m_defaultTexture = new Texture2D(Width, Height);
31 Color[] colors = new Color[Width * Height];
32 for (int i = 0; i < Width * Height; i++)
33 colors[i] = Color.magenta;
34 m_defaultTexture.Apply();
35 }
36
37 [Test]
38 public void TightMeshSpritePopulatedVertexHelperProperly()
39 {
40 Texture2D texture = new Texture2D(64, 64);
41 m_Image.sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0, 0));
42 m_Image.type = Image.Type.Simple;
43 m_Image.useSpriteMesh = true;
44
45 VertexHelper vh = new VertexHelper();
46
47 m_Image.GenerateImageData(vh);
48
49 Assert.AreEqual(vh.currentVertCount, m_Image.sprite.vertices.Length);
50 Assert.AreEqual(vh.currentIndexCount, m_Image.sprite.triangles.Length);
51 }
52
53 [UnityTest]
54 public IEnumerator CanvasCustomRefPixPerUnitToggleWillUpdateImageMesh()
55 {
56 var canvas = m_CanvasGO.GetComponent<Canvas>();
57 var canvasScaler = m_CanvasGO.AddComponent<CanvasScaler>();
58
59 canvasScaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;
60 m_Image.transform.SetParent(m_CanvasGO.transform);
61 m_Image.type = Image.Type.Sliced;
62 var texture = new Texture2D(120, 120);
63 m_Image.sprite = Sprite.Create(texture, new Rect(0, 0, 120, 120), new Vector2(0.5f, 0.5f), 100, 1, SpriteMeshType.Tight, new Vector4(30, 30, 30, 30), true);
64 m_Image.fillCenter = true;
65
66
67 canvasScaler.referencePixelsPerUnit = 200;
68 yield return null; // skip frame to update canvas properly
69 //setup done
70
71 canvas.enabled = false;
72
73 yield return null;
74
75 canvas.enabled = true;
76 m_Image.isOnPopulateMeshCalled = false;
77
78 yield return null;
79
80 Assert.IsTrue(m_Image.isOnPopulateMeshCalled);
81 }
82
83 [UnityTest]
84 public IEnumerator Sprite_Layout()
85 {
86 m_Image.sprite = Sprite.Create(m_defaultTexture, new Rect(0, 0, Width, Height), Vector2.zero);
87 yield return null;
88
89 m_Image.isGeometryUpdated = false;
90 m_dirtyLayout = false;
91
92 var Texture = new Texture2D(Width * 2, Height * 2);
93 m_Image.sprite = Sprite.Create(Texture, new Rect(0, 0, Width, Height), Vector2.zero);
94 yield return new WaitUntil(() => m_Image.isGeometryUpdated);
95
96 // validate that layout change rebuil is not called
97 Assert.IsFalse(m_dirtyLayout);
98
99 m_Image.isGeometryUpdated = false;
100 m_dirtyLayout = false;
101 m_Image.sprite = Sprite.Create(Texture, new Rect(0, 0, Width / 2, Height / 2), Vector2.zero);
102 yield return new WaitUntil(() => m_Image.isGeometryUpdated);
103
104 // validate that layout change rebuil is called
105 Assert.IsTrue(m_dirtyLayout);
106 }
107
108 [UnityTest]
109 public IEnumerator Sprite_Material()
110 {
111 m_Image.sprite = Sprite.Create(m_defaultTexture, new Rect(0, 0, Width, Height), Vector2.zero);
112 yield return null;
113
114 m_Image.isGeometryUpdated = false;
115 m_dirtyMaterial = false;
116 m_Image.sprite = Sprite.Create(m_defaultTexture, new Rect(0, 0, Width / 2, Height / 2), Vector2.zero);
117 yield return new WaitUntil(() => m_Image.isGeometryUpdated);
118
119 // validate that material change rebuild is not called
120 Assert.IsFalse(m_dirtyMaterial);
121
122 m_Image.isGeometryUpdated = false;
123 m_dirtyMaterial = false;
124 var Texture = new Texture2D(Width * 2, Height * 2);
125 m_Image.sprite = Sprite.Create(Texture, new Rect(0, 0, Width / 2, Height / 2), Vector2.zero);
126 yield return new WaitUntil(() => m_Image.isGeometryUpdated);
127
128 // validate that layout change rebuil is called
129 Assert.IsTrue(m_dirtyMaterial);
130 }
131
132 [TearDown]
133 public void TearDown()
134 {
135 GameObject.DestroyImmediate(m_CanvasGO);
136 GameObject.DestroyImmediate(m_defaultTexture);
137 }
138}