您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

242 行
8.5 KiB

using System;
using System.Collections.Generic;
using NUnit.Framework;
using UnityEngine;
using UnityEditor.ShaderGraph;
namespace UnityEditor.Graphing.IntegrationTests
{
[TestFixture]
public class SerializationTests
{
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, 0),
new TestSlot(1, "OutSlot", SlotType.Output, 5),
};
var serialized = SerializationHelper.Serialize<MaterialSlot>(toSerialize);
var loaded = SerializationHelper.Deserialize<MaterialSlot>(serialized, GraphUtil.GetLegacyTypeRemapping());
Assert.AreEqual(2, loaded.Count);
Assert.IsInstanceOf<MaterialSlot>(loaded[0]);
Assert.IsInstanceOf<MaterialSlot>(loaded[1]);
Assert.AreEqual(0, loaded[0].id);
Assert.AreEqual("InSlot", loaded[0].displayName);
Assert.IsTrue(loaded[0].isInputSlot);
Assert.AreEqual(0, loaded[0].priority);
Assert.AreEqual(1, loaded[1].id);
Assert.AreEqual("OutSlot", loaded[1].displayName);
Assert.IsTrue(loaded[1].isOutputSlot);
Assert.AreEqual(5, loaded[1].priority);
}
}
}