JsonParser: Casts arrays to better tailored lists, instead of List<object>.

This commit is contained in:
2020-09-06 23:11:47 +02:00
parent 8382f7f9ea
commit d3c6e34350
2 changed files with 151 additions and 9 deletions

View File

@@ -1,10 +1,124 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace VAR.Json.Tests
{
[TestClass()]
public class JsonParser_Tests
{
#region Parse
public class SwallowObject
{
public string Text { get; set; }
public int Number { get; set; }
}
[TestMethod()]
public void Parse__SwallowObject()
{
JsonParser parser = new JsonParser();
parser.KnownTypes.Add(typeof(SwallowObject));
SwallowObject result = parser.Parse(@"{""Text"": ""AAAA"", ""Number"": 42}") as SwallowObject;
Assert.AreEqual(false, parser.Tainted);
Assert.AreEqual("AAAA", result.Text);
Assert.AreEqual(42, result.Number);
}
public class DeeperObject_L1
{
public string Name { get; set; }
public SwallowObject Object { get; set; }
}
[TestMethod()]
public void Parse__DeeperObject_L1()
{
JsonParser parser = new JsonParser();
parser.KnownTypes.Add(typeof(SwallowObject));
parser.KnownTypes.Add(typeof(DeeperObject_L1));
DeeperObject_L1 result = parser.Parse(@"{""Name"": ""Thing"", ""Object"": {""Text"": ""AAAA"", ""Number"": 42}}") as DeeperObject_L1;
Assert.AreEqual(false, parser.Tainted);
Assert.AreEqual("Thing", result.Name);
Assert.AreEqual("AAAA", result.Object.Text);
Assert.AreEqual(42, result.Object.Number);
}
public class DeeperObject_L2
{
public int Count { get; set; }
public DeeperObject_L1 Object { get; set; }
}
[TestMethod()]
public void Parse__DeeperObject_L2()
{
JsonParser parser = new JsonParser();
parser.KnownTypes.Add(typeof(SwallowObject));
parser.KnownTypes.Add(typeof(DeeperObject_L1));
parser.KnownTypes.Add(typeof(DeeperObject_L2));
DeeperObject_L2 result = parser.Parse(@"{""Count"": 1, ""Object"": {""Name"": ""Thing"", ""Object"": {""Text"": ""AAAA"", ""Number"": 42}}}") as DeeperObject_L2;
Assert.AreEqual(false, parser.Tainted);
Assert.AreEqual(1, result.Count);
Assert.AreEqual("Thing", result.Object.Name);
Assert.AreEqual("AAAA", result.Object.Object.Text);
Assert.AreEqual(42, result.Object.Object.Number);
}
[TestMethod()]
public void Parse__SwallowObjectArray()
{
JsonParser parser = new JsonParser();
parser.KnownTypes.Add(typeof(SwallowObject));
List<SwallowObject> result = parser.Parse(@"[{""Text"": ""AAAA"", ""Number"": 42}]") as List<SwallowObject>;
Assert.AreEqual(false, parser.Tainted);
Assert.AreEqual(1, result.Count);
Assert.AreEqual("AAAA", result[0].Text);
Assert.AreEqual(42, result[0].Number);
}
public class DeeperObjectArray_L1
{
public int Count { get; set; }
public List<SwallowObject> Array { get; set; }
}
[TestMethod()]
public void Parse__DeeperObjectArray_L1()
{
JsonParser parser = new JsonParser();
parser.KnownTypes.Add(typeof(SwallowObject));
parser.KnownTypes.Add(typeof(DeeperObjectArray_L1));
DeeperObjectArray_L1 result = parser.Parse(@"{""Count"": 1, ""Array"": [{""Text"": ""AAAA"", ""Number"": 42}]}") as DeeperObjectArray_L1;
Assert.AreEqual(false, parser.Tainted);
Assert.AreEqual(1, result.Count);
Assert.AreEqual("AAAA", result.Array[0].Text);
Assert.AreEqual(42, result.Array[0].Number);
}
public class DeeperObjectArray_L2
{
public string Name { get; set; }
public List<DeeperObjectArray_L1> Objects { get; set; }
}
[TestMethod()]
public void Parse__DeeperObjectArray_L2()
{
JsonParser parser = new JsonParser();
parser.KnownTypes.Add(typeof(SwallowObject));
parser.KnownTypes.Add(typeof(DeeperObjectArray_L1));
parser.KnownTypes.Add(typeof(DeeperObjectArray_L2));
DeeperObjectArray_L2 result = parser.Parse(@"{""Name"": ""Thing"", ""Objects"": [{""Count"": 1, ""Array"": [{""Text"": ""AAAA"", ""Number"": 42}]}]}") as DeeperObjectArray_L2;
Assert.AreEqual(false, parser.Tainted);
Assert.AreEqual("Thing", result.Name);
Assert.AreEqual(1, result.Objects[0].Count);
Assert.AreEqual("AAAA", result.Objects[0].Array[0].Text);
Assert.AreEqual(42, result.Objects[0].Array[0].Number);
}
#endregion Parse
#region Validity tests
[TestMethod()]