123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- using NUnit.Framework;
- using UnityEditor;
- using UnityEngine;
- using UnityEngine.Rendering;
- using UnityEngine.TestTools;
- using UnityEngine.UI;
-
- namespace Graphics
- {
- class MaskTests : IPrebuildSetup
- {
- GameObject m_PrefabRoot;
- const string kPrefabPath = "Assets/Resources/MaskTestsPrefab.prefab";
-
- Mask m_mask;
-
- public void Setup()
- {
- #if UNITY_EDITOR
- var rootGO = new GameObject("rootGo");
- GameObject canvasGO = new GameObject("Canvas", typeof(RectTransform), typeof(Canvas));
- canvasGO.transform.SetParent(rootGO.transform);
-
- var canvas = canvasGO.GetComponent<Canvas>();
- canvas.referencePixelsPerUnit = 100;
-
- var gameObject = new GameObject("Mask", typeof(RectTransform), typeof(Mask), typeof(Image));
- gameObject.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("MaskTestsPrefab")) as GameObject;
- m_mask = m_PrefabRoot.GetComponentInChildren<Mask>();
- }
-
- [TearDown]
- public void TearDown()
- {
- m_mask = null;
- Object.DestroyImmediate(m_PrefabRoot);
- }
-
- [OneTimeTearDown]
- public void OneTimeTearDown()
- {
- #if UNITY_EDITOR
- AssetDatabase.DeleteAsset(kPrefabPath);
- #endif
- }
-
- [UnityTest]
- public IEnumerator GetModifiedMaterialReturnsOriginalMaterialWhenNoGraphicComponentIsAttached()
- {
- Object.DestroyImmediate(m_mask.gameObject.GetComponent<Image>());
- yield return null;
- Material material = new Material(Graphic.defaultGraphicMaterial);
- Material modifiedMaterial = m_mask.GetModifiedMaterial(material);
- Assert.AreEqual(material, modifiedMaterial);
- }
-
- private Dictionary<string, GameObject> CreateMaskHierarchy(string suffix, int hierarchyDepth, out GameObject root)
- {
- var nameToObjectMapping = new Dictionary<string, GameObject>();
-
- root = new GameObject("root", typeof(RectTransform), typeof(Canvas));
- nameToObjectMapping["root"] = root;
-
- GameObject current = root;
-
- for (int i = 0; i < hierarchyDepth; i++)
- {
- string name = suffix + (i + 1);
- var gameObject = new GameObject(name, typeof(RectTransform), typeof(Mask), typeof(Image));
- gameObject.transform.SetParent(current.transform);
- nameToObjectMapping[name] = gameObject;
- current = gameObject;
- }
-
- return nameToObjectMapping;
- }
-
- [Test]
- public void GetModifiedMaterialReturnsOriginalMaterialWhenDepthIsEightOrMore()
- {
- GameObject root;
- var objectsMap = CreateMaskHierarchy("subMask", 9, out root);
- Mask mask = objectsMap["subMask" + 9].GetComponent<Mask>();
- Material material = new Material(Graphic.defaultGraphicMaterial);
- Material modifiedMaterial = mask.GetModifiedMaterial(material);
- Assert.AreEqual(material, modifiedMaterial);
- GameObject.DestroyImmediate(root);
- }
-
- [Test]
- public void GetModifiedMaterialReturnsDesiredMaterialWithSingleMask()
- {
- Material material = new Material(Graphic.defaultGraphicMaterial);
- Material modifiedMaterial = m_mask.GetModifiedMaterial(material);
-
- Assert.AreNotEqual(material, modifiedMaterial);
- Assert.AreEqual(1, modifiedMaterial.GetInt("_Stencil"));
- Assert.AreEqual(StencilOp.Replace, (StencilOp)modifiedMaterial.GetInt("_StencilOp"));
- Assert.AreEqual(CompareFunction.Always, (CompareFunction)modifiedMaterial.GetInt("_StencilComp"));
- Assert.AreEqual(255, modifiedMaterial.GetInt("_StencilReadMask"));
- Assert.AreEqual(255, modifiedMaterial.GetInt("_StencilWriteMask"));
- Assert.AreEqual(ColorWriteMask.All, (ColorWriteMask)modifiedMaterial.GetInt("_ColorMask"));
- Assert.AreEqual(1, modifiedMaterial.GetInt("_UseUIAlphaClip"));
-
- Assert.IsTrue(modifiedMaterial.IsKeywordEnabled("UNITY_UI_ALPHACLIP"));
- }
-
- [Test]
- public void GetModifiedMaterialReturnsDesiredMaterialWithMultipleMasks()
- {
- for (int i = 2; i < 8; i++)
- {
- GameObject root;
- var objectsMap = CreateMaskHierarchy("subMask", i, out root);
- Mask mask = objectsMap["subMask" + i].GetComponent<Mask>();
-
- int stencilDepth = MaskUtilities.GetStencilDepth(mask.transform, objectsMap["root"].transform);
-
- int desiredStencilBit = 1 << stencilDepth;
- Material material = new Material(Graphic.defaultGraphicMaterial);
- Material modifiedMaterial = mask.GetModifiedMaterial(material);
- int stencil = modifiedMaterial.GetInt("_Stencil");
-
- Assert.AreNotEqual(material, modifiedMaterial);
- Assert.AreEqual(desiredStencilBit | (desiredStencilBit - 1), stencil);
- Assert.AreEqual(StencilOp.Replace, (StencilOp)modifiedMaterial.GetInt("_StencilOp"));
- Assert.AreEqual(CompareFunction.Equal, (CompareFunction)modifiedMaterial.GetInt("_StencilComp"));
- Assert.AreEqual(desiredStencilBit - 1, modifiedMaterial.GetInt("_StencilReadMask"));
- Assert.AreEqual(desiredStencilBit | (desiredStencilBit - 1), modifiedMaterial.GetInt("_StencilWriteMask"));
- Assert.AreEqual(ColorWriteMask.All, (ColorWriteMask)modifiedMaterial.GetInt("_ColorMask"));
- Assert.AreEqual(1, modifiedMaterial.GetInt("_UseUIAlphaClip"));
- Assert.IsTrue(modifiedMaterial.IsKeywordEnabled("UNITY_UI_ALPHACLIP"));
-
- GameObject.DestroyImmediate(root);
- }
- }
-
- [Test]
- public void GraphicComponentWithMaskIsMarkedAsIsMaskingGraphicWhenEnabled()
- {
- var graphic = m_PrefabRoot.GetComponentInChildren<Image>();
- Assert.AreEqual(true, graphic.isMaskingGraphic);
- m_mask.enabled = false;
- Assert.AreEqual(false, graphic.isMaskingGraphic);
- }
- }
- }
|