You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
6.5 KiB
163 lines
6.5 KiB
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); |
|
} |
|
} |
|
}
|
|
|