SerializationTests.cs 8.5 KB

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