#pragma warning disable 0649 using System; using System.Linq; using NUnit.Framework; using System.Collections.Generic; using UniGLTF; namespace UniJSON { public class JsonSerializerTests { struct Point { public float X; public float Y; public float[] Vector; public override string ToString() { return string.Format("{{X={0}, Y={1}, {2}}}", X, Y, Vector); } } enum HogeFuga { Hoge, Fuga, } struct EnumTest { public HogeFuga EnumDefault; [JsonSchema(EnumSerializationType = EnumSerializationType.AsInt)] public HogeFuga EnumAsInt; [JsonSchema(EnumSerializationType = EnumSerializationType.AsString)] public HogeFuga EnumAsString; [JsonSchema(EnumSerializationType = EnumSerializationType.AsLowerString)] public HogeFuga EnumAsLowerString; } #region Serializer static void SerializeValue(float value, string json) { var b = new BytesStore(); var f = new JsonFormatter(b); f.Value(value); Assert.AreEqual(json, new Utf8String(b.Bytes).ToString()); } static void SerializeValue(double value, string json) { var b = new BytesStore(); var f = new JsonFormatter(b); f.Value(value); Assert.AreEqual(json, new Utf8String(b.Bytes).ToString()); } static void SerializeValue(bool value, string json) { var b = new BytesStore(); var f = new JsonFormatter(b); f.Value(value); Assert.AreEqual(json, new Utf8String(b.Bytes).ToString()); } static void SerializeValue(string value, string json) { var b = new BytesStore(); var f = new JsonFormatter(b); f.Value(value); Assert.AreEqual(json, new Utf8String(b.Bytes).ToString()); } static void SerializeList(IEnumerable values, string json, Action seri) { var b = new BytesStore(); var f = new JsonFormatter(b); f.BeginList(); foreach (var value in values) { seri(f, value); } f.EndList(); Assert.AreEqual(json, new Utf8String(b.Bytes).ToString()); } [Test] public void JsonSerializerTest() { SerializeValue(1, "1"); SerializeValue(1.1f, "1.1"); SerializeValue(1.2, "1.2"); SerializeValue(Double.NaN, "NaN"); SerializeValue(Double.PositiveInfinity, "Infinity"); SerializeValue(Double.NegativeInfinity, "-Infinity"); SerializeValue(true, "true"); SerializeValue(false, "false"); SerializeValue("ascii", "\"ascii\""); SerializeList(new[] { 1 }, "[1]", (f, x) => f.Value(x)); SerializeList(new[] { 1.1f }, "[1.1]", (f, x) => f.Value(x)); SerializeList(new[] { 1.2 }, "[1.2]", (f, x) => f.Value(x)); SerializeList(new[] { true, false }, "[true,false]", (f, x) => f.Value(x)); SerializeList(new[] { "ascii" }, "[\"ascii\"]", (f, x) => f.Value(x)); SerializeList(new List { 1 }, "[1]", (f, x) => f.Value(x)); //SerializeValue(new object[] { null, 1, "a" }, "[null,1,\"a\"]"); // SerializeValue(new Dictionary { }, "{}"); // SerializeValue(new Dictionary { { "a", 1 } }, "{\"a\":1}"); // SerializeValue(new Dictionary { { "a", // new Dictionary{ // } } }, "{\"a\":{}}"); // SerializeValue(new Point { X = 1 }, "{\"X\":1,\"Y\":0}"); // SerializeValue(HogeFuga.Fuga, "1"); // SerializeValue(new EnumTest(), "{\"EnumDefault\":0,\"EnumAsInt\":0,\"EnumAsString\":\"Hoge\",\"EnumAsLowerString\":\"hoge\"}"); // SerializeValue((object)new Point { X = 1 }, "{\"X\":1,\"Y\":0}"); } [Test] public void KeyValue() { var p = new Point { X = 1, Vector = new float[] { 1, 2, 3 } }; var f = new JsonFormatter(); f.BeginMap(); f.Key(nameof(p.Vector)); f.BeginList(); f.Value(p.Vector[0]); f.Value(p.Vector[1]); f.Value(p.Vector[2]); f.EndList(); f.EndMap(); var json = JsonParser.Parse(new Utf8String(f.GetStoreBytes())); Assert.AreEqual(1, json.GetObjectCount()); Assert.AreEqual(1, json["Vector"][0].GetInt32()); } #endregion #region Deserialize // static void DeserializeValue(T value, string json) // { // var parsed = JsonParser.Parse(json); // var t = default(T); // parsed.Deserialize(ref t); // Assert.AreEqual(value, t); // } // [Test] // public void JsonDeserializerTest() // { // DeserializeValue(1, "1"); // DeserializeValue(1.1f, "1.1"); // DeserializeValue(1.2, "1.2"); // DeserializeValue(true, "true"); // DeserializeValue(false, "false"); // DeserializeValue("ascii", "\"ascii\""); // DeserializeValue(new[] { 1 }, "[1]"); // DeserializeValue(new[] { 1.1f }, "[1.1]"); // DeserializeValue(new[] { 1.2 }, "[1.2]"); // DeserializeValue(new[] { true, false }, "[true,false]"); // DeserializeValue(new[] { "ascii" }, "[\"ascii\"]"); // DeserializeValue(new List { 1 }, "[1]"); // //DeserializeValue(new object[] { null, 1, "a" }, "[null,1,\"a\"]"); // DeserializeValue(new Point { X = 1 }, "{\"X\":1,\"Y\":0}"); // DeserializeValue(HogeFuga.Fuga, "1"); // DeserializeValue(new EnumTest(), "{\"EnumDefault\":0,\"EnumAsInt\":0,\"EnumAsString\":\"Hoge\",\"EnumAsLowerString\":\"hoge\"}"); // } class DictionaryValue : IEquatable { public Dictionary Dict = new Dictionary(); public override int GetHashCode() { return base.GetHashCode(); } public override bool Equals(object obj) { var rhs = obj as DictionaryValue; if (rhs != null) { return Equals(rhs); } else { return base.Equals(obj); } } public bool Equals(DictionaryValue other) { if (Dict == null && other.Dict == null) { return true; } else if (Dict == null || other.Dict == null) { return false; } else { return Dict.OrderBy(x => x.Key).SequenceEqual(other.Dict.OrderBy(x => x.Key)); } } } // [Test] // public void JsonDictionaryDeserializerTest() // { // DeserializeValue(new Dictionary { }, "{}"); // DeserializeValue(new Dictionary { { "a", 1 } }, "{\"a\":1}"); // DeserializeValue(new Dictionary { { "a", // new Dictionary{ // } } }, "{\"a\":{}}"); // // fix dictionary member deserialization // DeserializeValue(new DictionaryValue(), "{\"Dict\": {}}"); // } #endregion } }