Add test to prevent adding unserializable types to Config
This commit is contained in:
parent
286727eb44
commit
71cb9a8805
|
@ -0,0 +1,84 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
using BizHawk.Client.Common;
|
||||||
|
|
||||||
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
|
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
|
namespace BizHawk.Tests.Client.Common.config
|
||||||
|
{
|
||||||
|
[TestClass]
|
||||||
|
public sealed class SerializationStabilityTests
|
||||||
|
{
|
||||||
|
private static readonly IReadOnlySet<Type> KnownGoodFromStdlib = new HashSet<Type>
|
||||||
|
{
|
||||||
|
typeof(bool),
|
||||||
|
typeof(DateTime),
|
||||||
|
typeof(Dictionary<,>),
|
||||||
|
typeof(int),
|
||||||
|
typeof(JToken),
|
||||||
|
typeof(Nullable<>),
|
||||||
|
typeof(object),
|
||||||
|
typeof(float),
|
||||||
|
typeof(string),
|
||||||
|
};
|
||||||
|
|
||||||
|
private static readonly IReadOnlyDictionary<Type, string> KnownGoodFromBizHawk = new Dictionary<Type, string>
|
||||||
|
{
|
||||||
|
[typeof(AnalogBind)] = "TODO",
|
||||||
|
[typeof(BindingCollection)] = "TODO",
|
||||||
|
[typeof(CheatConfig)] = "TODO",
|
||||||
|
[typeof(FeedbackBind)] = "TODO",
|
||||||
|
[typeof(MessagePosition)] = "TODO",
|
||||||
|
[typeof(MovieConfig)] = "TODO",
|
||||||
|
[typeof(PathEntryCollection)] = "TODO",
|
||||||
|
[typeof(RecentFiles)] = "TODO",
|
||||||
|
[typeof(RewindConfig)] = "TODO",
|
||||||
|
[typeof(SaveStateConfig)] = "TODO",
|
||||||
|
[typeof(ToolDialogSettings)] = "TODO",
|
||||||
|
[typeof(ZoomFactors)] = "TODO",
|
||||||
|
};
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void AssertAllTypesKnownSerializable()
|
||||||
|
{
|
||||||
|
static void CheckMemberAndTypeParams(Type t, string groupDesc)
|
||||||
|
{
|
||||||
|
if (t.IsEnum) return;
|
||||||
|
if (t.IsConstructedGenericType)
|
||||||
|
{
|
||||||
|
CheckMemberAndTypeParams(t.GetGenericTypeDefinition(), groupDesc);
|
||||||
|
foreach (var typeParam in t.GenericTypeArguments) CheckMemberAndTypeParams(typeParam, groupDesc);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Assert.IsTrue(KnownGoodFromStdlib.Contains(t) || KnownGoodFromBizHawk.ContainsKey(t), $"type {t.FullName}, present in {groupDesc}, may not be serializable");
|
||||||
|
}
|
||||||
|
static void CheckAll<T>(string? groupDesc = null)
|
||||||
|
{
|
||||||
|
var t = typeof(T);
|
||||||
|
groupDesc ??= t.Name;
|
||||||
|
foreach (var mi in t.GetMembers(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
|
||||||
|
{
|
||||||
|
if (mi is PropertyInfo pi) CheckMemberAndTypeParams(pi.PropertyType, groupDesc);
|
||||||
|
else if (mi is FieldInfo fi) CheckMemberAndTypeParams(fi.FieldType, groupDesc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CheckAll<Config>();
|
||||||
|
}
|
||||||
|
|
||||||
|
#if false
|
||||||
|
[TestMethod]
|
||||||
|
public void TestRoundTripSerialization()
|
||||||
|
{
|
||||||
|
foreach (var kvp in KnownGoodFromBizHawk)
|
||||||
|
{
|
||||||
|
//TODO deserialize kvp.Value as an instance of the type kvp.Key, then reserialize it and compare that to kvp.Value
|
||||||
|
// should probably clean up the types in question first
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue