A game about forced loneliness, made by TACStudios
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using NUnit.Framework;
5using UnityEngine;
6using UnityEditor.Graphing;
7using UnityEditor.ShaderGraph.Internal;
8
9namespace UnityEditor.ShaderGraph.UnitTests
10{
11 [TestFixture]
12 class MaterialNodeTests
13 {
14 private GraphData m_Graph;
15 private TestNode m_NodeA;
16
17 class TestNode : AbstractMaterialNode
18 {
19 public const int V1Out = 0;
20 public const int V1In = 1;
21
22 public TestNode()
23 {
24 AddSlot(new Vector1MaterialSlot(V1Out, "V1Out", "V1Out", SlotType.Output, 0));
25 AddSlot(new Vector1MaterialSlot(V1In, "V1In", "V1In", SlotType.Input, 0));
26 }
27 }
28
29 class NotAMaterialSlot : MaterialSlot
30 {
31 public override void AddDefaultProperty(PropertyCollector properties, GenerationMode generationMode)
32 {
33 throw new NotImplementedException();
34 }
35
36 public override void CopyValuesFrom(MaterialSlot foundSlot)
37 {
38 throw new NotImplementedException();
39 }
40
41 public override void CopyDefaultValue(MaterialSlot other)
42 {
43 }
44
45 public override SlotValueType valueType { get; }
46 public override ConcreteSlotValueType concreteValueType { get; }
47 public override bool isDefaultValue { get; }
48 }
49
50 [OneTimeSetUp]
51 public void RunBeforeAnyTests()
52 {
53 Debug.unityLogger.logHandler = new ConsoleLogHandler();
54 }
55
56 [SetUp]
57 public void TestSetUp()
58 {
59 m_Graph = new GraphData();
60 m_NodeA = new TestNode();
61 m_Graph.AddNode(m_NodeA);
62 m_NodeA.SetOverrideActiveState(AbstractMaterialNode.ActiveState.ExplicitActive);
63 }
64
65 [Test]
66 public void GetVariableNameForSlotThrowsWhenInvalid()
67 {
68 Assert.Throws<ArgumentException>(() => m_NodeA.GetVariableNameForSlot(666));
69 }
70
71 [Test]
72 public void ReplacingMaterialSlotPreservesTheOldCurrentValue()
73 {
74 m_NodeA.AddSlot(new Vector1MaterialSlot(TestNode.V1In, "V1In", "V1In", SlotType.Input, 1));
75 Assert.AreEqual(2, m_NodeA.GetSlots<MaterialSlot>().Count());
76 Assert.AreEqual(1, m_NodeA.GetInputSlots<MaterialSlot>().Count());
77
78 var slot = m_NodeA.GetInputSlots<Vector1MaterialSlot>().FirstOrDefault();
79 Assert.AreEqual(1, slot.defaultValue);
80 Assert.AreEqual(0, slot.value);
81 }
82
83 [Test]
84 public void CanConvertConcreteSlotValueTypeToOutputChunkProperly()
85 {
86 Assert.AreEqual("float", ConcreteSlotValueType.Vector1.ToShaderString(ConcretePrecision.Single));
87 Assert.AreEqual("float", ConcreteSlotValueType.Boolean.ToShaderString(ConcretePrecision.Single));
88 Assert.AreEqual("float2", ConcreteSlotValueType.Vector2.ToShaderString(ConcretePrecision.Single));
89 Assert.AreEqual("float3", ConcreteSlotValueType.Vector3.ToShaderString(ConcretePrecision.Single));
90 Assert.AreEqual("float4", ConcreteSlotValueType.Vector4.ToShaderString(ConcretePrecision.Single));
91 Assert.AreEqual("UnityTexture2D", ConcreteSlotValueType.Texture2D.ToShaderString(ConcretePrecision.Single));
92 Assert.AreEqual("float2x2", ConcreteSlotValueType.Matrix2.ToShaderString(ConcretePrecision.Single));
93 Assert.AreEqual("float3x3", ConcreteSlotValueType.Matrix3.ToShaderString(ConcretePrecision.Single));
94 Assert.AreEqual("float4x4", ConcreteSlotValueType.Matrix4.ToShaderString(ConcretePrecision.Single));
95 Assert.AreEqual("UnitySamplerState", ConcreteSlotValueType.SamplerState.ToShaderString(ConcretePrecision.Single));
96 Assert.AreEqual("UnityTextureCube", ConcreteSlotValueType.Cubemap.ToShaderString(ConcretePrecision.Single));
97 }
98
99 [Test]
100 public void CanGetDefaultInputsFromNodeAsPreviewProperties()
101 {
102 var properties = new List<PreviewProperty>();
103 m_NodeA.CollectPreviewMaterialProperties(properties);
104 var slot = m_NodeA.GetInputSlots<Vector1MaterialSlot>().FirstOrDefault();
105
106 Assert.AreEqual(1, properties.Count);
107 var pp = properties.FirstOrDefault();
108
109 Assert.AreEqual(m_NodeA.GetVariableNameForSlot(slot.id), pp.name);
110 Assert.AreEqual(PropertyType.Float, pp.propType);
111 Assert.AreEqual(slot.value, pp.floatValue);
112 }
113
114 [Test]
115 public void CanGetDefaultSlotValueWhenNoEdgesConnected()
116 {
117 string expected = string.Format("{0}", m_NodeA.GetVariableNameForSlot(TestNode.V1In));
118
119 var slot = m_NodeA.GetInputSlots<MaterialSlot>().FirstOrDefault();
120 var result = m_NodeA.GetSlotValue(slot.id, GenerationMode.Preview);
121 Assert.AreEqual(expected, result);
122 }
123
124 /* [Test]
125 public void NodeGenerateCorrectPreviewPropertyUsages()
126 {
127 string expected = string.Format("{0} {1};{2}", AbstractMaterialNode.OutputPrecision.@fixed, m_NodeA.GetVariableNameForSlot(TestNode.V1In), Environment.NewLine);
128 var visitor = new ShaderGenerator();
129 m_NodeA.precision = AbstractMaterialNode.OutputPrecision.@fixed;
130 m_NodeA.GeneratePropertyUsages(visitor, GenerationMode.Preview);
131 Assert.AreEqual(expected, visitor.GetShaderString(0));
132
133 expected = string.Format("{0} {1};{2}", AbstractMaterialNode.OutputPrecision.@float, m_NodeA.GetVariableNameForSlot(TestNode.V1In), Environment.NewLine);
134 visitor = new ShaderGenerator();
135 m_NodeA.precision = AbstractMaterialNode.OutputPrecision.@float;
136 m_NodeA.GeneratePropertyUsages(visitor, GenerationMode.Preview);
137 Assert.AreEqual(expected, visitor.GetShaderString(0));
138
139 expected = string.Format("{0} {1};{2}", AbstractMaterialNode.OutputPrecision.half, m_NodeA.GetVariableNameForSlot(TestNode.V1In), Environment.NewLine);
140 visitor = new ShaderGenerator();
141 m_NodeA.precision = AbstractMaterialNode.OutputPrecision.half;
142 m_NodeA.GeneratePropertyUsages(visitor, GenerationMode.Preview);
143 Assert.AreEqual(expected, visitor.GetShaderString(0));
144 }*/
145 }
146}