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.
261 lines
9.1 KiB
261 lines
9.1 KiB
using System; |
|
using System.Collections.Generic; |
|
using NUnit.Framework; |
|
using UnityEngine; |
|
using UnityEditor.ShaderGraph; |
|
using UnityEditor.ShaderGraph.Serialization; |
|
|
|
namespace UnityEditor.Graphing.IntegrationTests |
|
{ |
|
[TestFixture] |
|
public class SerializationTests |
|
{ |
|
private class DummyJsonHolder : JsonObject |
|
{ |
|
public List<JsonData<MaterialSlot>> testSlots = new List<JsonData<MaterialSlot>>(); |
|
|
|
public DummyJsonHolder() : base() |
|
{ |
|
} |
|
|
|
public DummyJsonHolder(List<MaterialSlot> materialSlots) |
|
{ |
|
foreach (var slot in materialSlots) |
|
{ |
|
testSlots.Add(slot); |
|
} |
|
} |
|
} |
|
interface ITestInterface |
|
{ } |
|
|
|
[Serializable] |
|
class SimpleSerializeClass : ITestInterface |
|
{ |
|
[SerializeField] |
|
public string stringValue; |
|
|
|
[SerializeField] |
|
public int intValue; |
|
|
|
[SerializeField] |
|
public float floatValue; |
|
|
|
[SerializeField] |
|
public int[] arrayValue; |
|
|
|
public static SimpleSerializeClass instance |
|
{ |
|
get |
|
{ |
|
return new SimpleSerializeClass |
|
{ |
|
stringValue = "ABCD", |
|
intValue = 5, |
|
floatValue = 7.7f, |
|
arrayValue = new[] { 1, 2, 3, 4 } |
|
}; |
|
} |
|
} |
|
|
|
public virtual void AssertAsReference() |
|
{ |
|
var reference = instance; |
|
Assert.AreEqual(reference.stringValue, stringValue); |
|
Assert.AreEqual(reference.intValue, intValue); |
|
Assert.AreEqual(reference.floatValue, floatValue); |
|
Assert.AreEqual(reference.arrayValue.Length, arrayValue.Length); |
|
Assert.AreEqual(reference.arrayValue, arrayValue); |
|
} |
|
} |
|
|
|
[Serializable] |
|
class ChildClassA : SimpleSerializeClass |
|
{ |
|
[SerializeField] |
|
public string childString; |
|
|
|
public new static ChildClassA instance |
|
{ |
|
get |
|
{ |
|
return new ChildClassA |
|
{ |
|
stringValue = "qwee", |
|
intValue = 5, |
|
floatValue = 6f, |
|
arrayValue = new[] { 5, 6, 7, 8 }, |
|
childString = "CHILD" |
|
}; |
|
} |
|
} |
|
|
|
public override void AssertAsReference() |
|
{ |
|
var reference = instance; |
|
Assert.AreEqual(reference.stringValue, stringValue); |
|
Assert.AreEqual(reference.intValue, intValue); |
|
Assert.AreEqual(reference.floatValue, floatValue); |
|
Assert.AreEqual(reference.arrayValue.Length, arrayValue.Length); |
|
Assert.AreEqual(reference.arrayValue, arrayValue); |
|
Assert.AreEqual(reference.childString, childString); |
|
} |
|
} |
|
|
|
[Serializable] |
|
class ChildClassB : SimpleSerializeClass |
|
{ |
|
[SerializeField] |
|
public int childInt; |
|
|
|
public new static ChildClassB instance |
|
{ |
|
get |
|
{ |
|
return new ChildClassB |
|
{ |
|
stringValue = "qwee", |
|
intValue = 5, |
|
floatValue = 6f, |
|
arrayValue = new[] { 5, 6, 7, 8 }, |
|
childInt = 666 |
|
}; |
|
} |
|
} |
|
|
|
public override void AssertAsReference() |
|
{ |
|
var reference = instance; |
|
Assert.AreEqual(reference.stringValue, stringValue); |
|
Assert.AreEqual(reference.intValue, intValue); |
|
Assert.AreEqual(reference.floatValue, floatValue); |
|
Assert.AreEqual(reference.arrayValue.Length, arrayValue.Length); |
|
Assert.AreEqual(reference.arrayValue, arrayValue); |
|
Assert.AreEqual(reference.childInt, childInt); |
|
} |
|
} |
|
|
|
[Serializable] |
|
class SerializationContainer |
|
{ |
|
public List<SerializationHelper.JSONSerializedElement> serializedElements; |
|
} |
|
|
|
[Test] |
|
public void TestSerializationHelperCanSerializeThenDeserialize() |
|
{ |
|
var toSerialize = new List<SimpleSerializeClass>() |
|
{ |
|
SimpleSerializeClass.instance |
|
}; |
|
|
|
var serialized = SerializationHelper.Serialize<SimpleSerializeClass>(toSerialize); |
|
Assert.AreEqual(1, serialized.Count); |
|
|
|
var loaded = SerializationHelper.Deserialize<SimpleSerializeClass>(serialized, GraphUtil.GetLegacyTypeRemapping()); |
|
Assert.AreEqual(1, loaded.Count); |
|
Assert.IsInstanceOf<SimpleSerializeClass>(loaded[0]); |
|
loaded[0].AssertAsReference(); |
|
} |
|
|
|
[Test] |
|
public void TestPolymorphicSerializationPreservesTypesViaBaseClass() |
|
{ |
|
var toSerialize = new List<SimpleSerializeClass>() |
|
{ |
|
SimpleSerializeClass.instance, |
|
ChildClassA.instance, |
|
ChildClassB.instance |
|
}; |
|
|
|
var serialized = SerializationHelper.Serialize<SimpleSerializeClass>(toSerialize); |
|
Assert.AreEqual(3, serialized.Count); |
|
|
|
var loaded = SerializationHelper.Deserialize<SimpleSerializeClass>(serialized, GraphUtil.GetLegacyTypeRemapping()); |
|
Assert.AreEqual(3, loaded.Count); |
|
Assert.IsInstanceOf<SimpleSerializeClass>(loaded[0]); |
|
Assert.IsInstanceOf<ChildClassA>(loaded[1]); |
|
Assert.IsInstanceOf<ChildClassB>(loaded[2]); |
|
loaded[0].AssertAsReference(); |
|
loaded[1].AssertAsReference(); |
|
loaded[2].AssertAsReference(); |
|
} |
|
|
|
[Test] |
|
public void TestPolymorphicSerializationPreservesTypesViaInterface() |
|
{ |
|
var toSerialize = new List<ITestInterface>() |
|
{ |
|
SimpleSerializeClass.instance, |
|
ChildClassA.instance, |
|
ChildClassB.instance |
|
}; |
|
|
|
var serialized = SerializationHelper.Serialize<ITestInterface>(toSerialize); |
|
Assert.AreEqual(3, serialized.Count); |
|
|
|
var loaded = SerializationHelper.Deserialize<SimpleSerializeClass>(serialized, GraphUtil.GetLegacyTypeRemapping()); |
|
Assert.AreEqual(3, loaded.Count); |
|
Assert.IsInstanceOf<SimpleSerializeClass>(loaded[0]); |
|
Assert.IsInstanceOf<ChildClassA>(loaded[1]); |
|
Assert.IsInstanceOf<ChildClassB>(loaded[2]); |
|
loaded[0].AssertAsReference(); |
|
loaded[1].AssertAsReference(); |
|
loaded[2].AssertAsReference(); |
|
} |
|
|
|
[Test] |
|
public void TestSerializationHelperElementCanSerialize() |
|
{ |
|
var toSerialize = new List<SimpleSerializeClass>() |
|
{ |
|
SimpleSerializeClass.instance |
|
}; |
|
|
|
var serialized = SerializationHelper.Serialize<SimpleSerializeClass>(toSerialize); |
|
Assert.AreEqual(1, serialized.Count); |
|
|
|
var container = new SerializationContainer |
|
{ |
|
serializedElements = serialized |
|
}; |
|
|
|
var serializedContainer = JsonUtility.ToJson(container, true); |
|
|
|
var deserializedContainer = JsonUtility.FromJson<SerializationContainer>(serializedContainer); |
|
var loaded = SerializationHelper.Deserialize<SimpleSerializeClass>(deserializedContainer.serializedElements, GraphUtil.GetLegacyTypeRemapping()); |
|
Assert.AreEqual(1, loaded.Count); |
|
Assert.IsInstanceOf<SimpleSerializeClass>(loaded[0]); |
|
loaded[0].AssertAsReference(); |
|
} |
|
|
|
[Test] |
|
public void TestSerializableSlotCanSerialize() |
|
{ |
|
var toSerialize = new List<MaterialSlot>() |
|
{ |
|
new TestSlot(0, "InSlot", SlotType.Input), |
|
new TestSlot(1, "OutSlot", SlotType.Output), |
|
}; |
|
|
|
DummyJsonHolder dummyJsonHolder = new DummyJsonHolder(toSerialize); |
|
|
|
var serialized = MultiJson.Serialize(dummyJsonHolder); |
|
DummyJsonHolder dummyJsonHolder1 = new DummyJsonHolder(); |
|
MultiJson.Deserialize(dummyJsonHolder1, serialized); |
|
Assert.AreEqual(2, dummyJsonHolder1.testSlots.Count); |
|
var loaded = new List<MaterialSlot>(dummyJsonHolder1.testSlots.SelectValue()); |
|
|
|
Assert.IsInstanceOf<MaterialSlot>(loaded[0]); |
|
Assert.IsInstanceOf<MaterialSlot>(loaded[1]); |
|
|
|
Assert.AreEqual(0, loaded[0].id); |
|
Assert.AreEqual("InSlot(4)", loaded[0].displayName); |
|
Assert.IsTrue(loaded[0].isInputSlot); |
|
|
|
Assert.AreEqual(1, loaded[1].id); |
|
Assert.AreEqual("OutSlot(4)", loaded[1].displayName); |
|
Assert.IsTrue(loaded[1].isOutputSlot); |
|
} |
|
} |
|
}
|
|
|