暫無描述
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.

SerializationTests.cs 9.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. using System;
  2. using System.Collections.Generic;
  3. using NUnit.Framework;
  4. using UnityEngine;
  5. using UnityEditor.ShaderGraph;
  6. using UnityEditor.ShaderGraph.Serialization;
  7. namespace UnityEditor.Graphing.IntegrationTests
  8. {
  9. [TestFixture]
  10. public class SerializationTests
  11. {
  12. private class DummyJsonHolder : JsonObject
  13. {
  14. public List<JsonData<MaterialSlot>> testSlots = new List<JsonData<MaterialSlot>>();
  15. public DummyJsonHolder() : base()
  16. {
  17. }
  18. public DummyJsonHolder(List<MaterialSlot> materialSlots)
  19. {
  20. foreach (var slot in materialSlots)
  21. {
  22. testSlots.Add(slot);
  23. }
  24. }
  25. }
  26. interface ITestInterface
  27. { }
  28. [Serializable]
  29. class SimpleSerializeClass : ITestInterface
  30. {
  31. [SerializeField]
  32. public string stringValue;
  33. [SerializeField]
  34. public int intValue;
  35. [SerializeField]
  36. public float floatValue;
  37. [SerializeField]
  38. public int[] arrayValue;
  39. public static SimpleSerializeClass instance
  40. {
  41. get
  42. {
  43. return new SimpleSerializeClass
  44. {
  45. stringValue = "ABCD",
  46. intValue = 5,
  47. floatValue = 7.7f,
  48. arrayValue = new[] { 1, 2, 3, 4 }
  49. };
  50. }
  51. }
  52. public virtual void AssertAsReference()
  53. {
  54. var reference = instance;
  55. Assert.AreEqual(reference.stringValue, stringValue);
  56. Assert.AreEqual(reference.intValue, intValue);
  57. Assert.AreEqual(reference.floatValue, floatValue);
  58. Assert.AreEqual(reference.arrayValue.Length, arrayValue.Length);
  59. Assert.AreEqual(reference.arrayValue, arrayValue);
  60. }
  61. }
  62. [Serializable]
  63. class ChildClassA : SimpleSerializeClass
  64. {
  65. [SerializeField]
  66. public string childString;
  67. public new static ChildClassA instance
  68. {
  69. get
  70. {
  71. return new ChildClassA
  72. {
  73. stringValue = "qwee",
  74. intValue = 5,
  75. floatValue = 6f,
  76. arrayValue = new[] { 5, 6, 7, 8 },
  77. childString = "CHILD"
  78. };
  79. }
  80. }
  81. public override void AssertAsReference()
  82. {
  83. var reference = instance;
  84. Assert.AreEqual(reference.stringValue, stringValue);
  85. Assert.AreEqual(reference.intValue, intValue);
  86. Assert.AreEqual(reference.floatValue, floatValue);
  87. Assert.AreEqual(reference.arrayValue.Length, arrayValue.Length);
  88. Assert.AreEqual(reference.arrayValue, arrayValue);
  89. Assert.AreEqual(reference.childString, childString);
  90. }
  91. }
  92. [Serializable]
  93. class ChildClassB : SimpleSerializeClass
  94. {
  95. [SerializeField]
  96. public int childInt;
  97. public new static ChildClassB instance
  98. {
  99. get
  100. {
  101. return new ChildClassB
  102. {
  103. stringValue = "qwee",
  104. intValue = 5,
  105. floatValue = 6f,
  106. arrayValue = new[] { 5, 6, 7, 8 },
  107. childInt = 666
  108. };
  109. }
  110. }
  111. public override void AssertAsReference()
  112. {
  113. var reference = instance;
  114. Assert.AreEqual(reference.stringValue, stringValue);
  115. Assert.AreEqual(reference.intValue, intValue);
  116. Assert.AreEqual(reference.floatValue, floatValue);
  117. Assert.AreEqual(reference.arrayValue.Length, arrayValue.Length);
  118. Assert.AreEqual(reference.arrayValue, arrayValue);
  119. Assert.AreEqual(reference.childInt, childInt);
  120. }
  121. }
  122. [Serializable]
  123. class SerializationContainer
  124. {
  125. public List<SerializationHelper.JSONSerializedElement> serializedElements;
  126. }
  127. [Test]
  128. public void TestSerializationHelperCanSerializeThenDeserialize()
  129. {
  130. var toSerialize = new List<SimpleSerializeClass>()
  131. {
  132. SimpleSerializeClass.instance
  133. };
  134. var serialized = SerializationHelper.Serialize<SimpleSerializeClass>(toSerialize);
  135. Assert.AreEqual(1, serialized.Count);
  136. var loaded = SerializationHelper.Deserialize<SimpleSerializeClass>(serialized, GraphUtil.GetLegacyTypeRemapping());
  137. Assert.AreEqual(1, loaded.Count);
  138. Assert.IsInstanceOf<SimpleSerializeClass>(loaded[0]);
  139. loaded[0].AssertAsReference();
  140. }
  141. [Test]
  142. public void TestPolymorphicSerializationPreservesTypesViaBaseClass()
  143. {
  144. var toSerialize = new List<SimpleSerializeClass>()
  145. {
  146. SimpleSerializeClass.instance,
  147. ChildClassA.instance,
  148. ChildClassB.instance
  149. };
  150. var serialized = SerializationHelper.Serialize<SimpleSerializeClass>(toSerialize);
  151. Assert.AreEqual(3, serialized.Count);
  152. var loaded = SerializationHelper.Deserialize<SimpleSerializeClass>(serialized, GraphUtil.GetLegacyTypeRemapping());
  153. Assert.AreEqual(3, loaded.Count);
  154. Assert.IsInstanceOf<SimpleSerializeClass>(loaded[0]);
  155. Assert.IsInstanceOf<ChildClassA>(loaded[1]);
  156. Assert.IsInstanceOf<ChildClassB>(loaded[2]);
  157. loaded[0].AssertAsReference();
  158. loaded[1].AssertAsReference();
  159. loaded[2].AssertAsReference();
  160. }
  161. [Test]
  162. public void TestPolymorphicSerializationPreservesTypesViaInterface()
  163. {
  164. var toSerialize = new List<ITestInterface>()
  165. {
  166. SimpleSerializeClass.instance,
  167. ChildClassA.instance,
  168. ChildClassB.instance
  169. };
  170. var serialized = SerializationHelper.Serialize<ITestInterface>(toSerialize);
  171. Assert.AreEqual(3, serialized.Count);
  172. var loaded = SerializationHelper.Deserialize<SimpleSerializeClass>(serialized, GraphUtil.GetLegacyTypeRemapping());
  173. Assert.AreEqual(3, loaded.Count);
  174. Assert.IsInstanceOf<SimpleSerializeClass>(loaded[0]);
  175. Assert.IsInstanceOf<ChildClassA>(loaded[1]);
  176. Assert.IsInstanceOf<ChildClassB>(loaded[2]);
  177. loaded[0].AssertAsReference();
  178. loaded[1].AssertAsReference();
  179. loaded[2].AssertAsReference();
  180. }
  181. [Test]
  182. public void TestSerializationHelperElementCanSerialize()
  183. {
  184. var toSerialize = new List<SimpleSerializeClass>()
  185. {
  186. SimpleSerializeClass.instance
  187. };
  188. var serialized = SerializationHelper.Serialize<SimpleSerializeClass>(toSerialize);
  189. Assert.AreEqual(1, serialized.Count);
  190. var container = new SerializationContainer
  191. {
  192. serializedElements = serialized
  193. };
  194. var serializedContainer = JsonUtility.ToJson(container, true);
  195. var deserializedContainer = JsonUtility.FromJson<SerializationContainer>(serializedContainer);
  196. var loaded = SerializationHelper.Deserialize<SimpleSerializeClass>(deserializedContainer.serializedElements, GraphUtil.GetLegacyTypeRemapping());
  197. Assert.AreEqual(1, loaded.Count);
  198. Assert.IsInstanceOf<SimpleSerializeClass>(loaded[0]);
  199. loaded[0].AssertAsReference();
  200. }
  201. [Test]
  202. public void TestSerializableSlotCanSerialize()
  203. {
  204. var toSerialize = new List<MaterialSlot>()
  205. {
  206. new TestSlot(0, "InSlot", SlotType.Input),
  207. new TestSlot(1, "OutSlot", SlotType.Output),
  208. };
  209. DummyJsonHolder dummyJsonHolder = new DummyJsonHolder(toSerialize);
  210. var serialized = MultiJson.Serialize(dummyJsonHolder);
  211. DummyJsonHolder dummyJsonHolder1 = new DummyJsonHolder();
  212. MultiJson.Deserialize(dummyJsonHolder1, serialized);
  213. Assert.AreEqual(2, dummyJsonHolder1.testSlots.Count);
  214. var loaded = new List<MaterialSlot>(dummyJsonHolder1.testSlots.SelectValue());
  215. Assert.IsInstanceOf<MaterialSlot>(loaded[0]);
  216. Assert.IsInstanceOf<MaterialSlot>(loaded[1]);
  217. Assert.AreEqual(0, loaded[0].id);
  218. Assert.AreEqual("InSlot(4)", loaded[0].displayName);
  219. Assert.IsTrue(loaded[0].isInputSlot);
  220. Assert.AreEqual(1, loaded[1].id);
  221. Assert.AreEqual("OutSlot(4)", loaded[1].displayName);
  222. Assert.IsTrue(loaded[1].isOutputSlot);
  223. }
  224. }
  225. }