246 lines
7.9 KiB
C#
246 lines
7.9 KiB
C#
#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<T>(IEnumerable<T> values, string json, Action<JsonFormatter, T> 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<int> { 1 }, "[1]", (f, x) => f.Value(x));
|
|
//SerializeValue(new object[] { null, 1, "a" }, "[null,1,\"a\"]");
|
|
|
|
// SerializeValue(new Dictionary<string, object> { }, "{}");
|
|
// SerializeValue(new Dictionary<string, object> { { "a", 1 } }, "{\"a\":1}");
|
|
// SerializeValue(new Dictionary<string, object> { { "a",
|
|
// new Dictionary<string, object>{
|
|
// } } }, "{\"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>(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<int> { 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<DictionaryValue>
|
|
{
|
|
public Dictionary<string, object> Dict = new Dictionary<string, object>();
|
|
|
|
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<string, object> { }, "{}");
|
|
// DeserializeValue(new Dictionary<string, object> { { "a", 1 } }, "{\"a\":1}");
|
|
// DeserializeValue(new Dictionary<string, object> { { "a",
|
|
// new Dictionary<string, object>{
|
|
// } } }, "{\"a\":{}}");
|
|
|
|
// // fix dictionary member deserialization
|
|
// DeserializeValue(new DictionaryValue(), "{\"Dict\": {}}");
|
|
// }
|
|
#endregion
|
|
}
|
|
}
|