fix bug in JSONMapper triggered by serializing enums based on smaller types then int (e.g. ushort)

- added testcase for enum serialization
master
Harald Wolff 2020-12-12 20:16:54 +01:00
parent 1c48245b90
commit 6160ea5065
2 changed files with 69 additions and 2 deletions

View File

@ -1,9 +1,31 @@
using System;
using ln.json.mapping;
using NUnit.Framework;
namespace ln.json.tests
{
public class JSONTests
{
enum testEnum1 { A, B, C, D, E, F }
enum testEnum2 : ushort {
NONE = 0,
A = 1,
B = 2,
C = 4,
D = 5,
E = 6
}
[Flags]
enum testEnum3 : ushort {
NONE = 0,
A = 1,
B = 2,
C = 4,
D = 5,
E = 6
}
[SetUp]
public void Setup()
{
@ -42,5 +64,48 @@ namespace ln.json.tests
JSONParser.Parse("{\t}");
}
[Test]
public void TestEnumMappings()
{
TestEnumSerialization(testEnum1.A);
TestEnumSerialization(testEnum1.B);
TestEnumSerialization(testEnum1.C);
TestEnumSerialization(testEnum1.D);
TestEnumSerialization(testEnum1.E);
TestEnumSerialization(testEnum1.F);
TestEnumSerialization(testEnum2.NONE);
TestEnumSerialization(testEnum2.A);
TestEnumSerialization(testEnum2.B);
TestEnumSerialization(testEnum2.C);
TestEnumSerialization(testEnum2.D);
TestEnumSerialization(testEnum2.E);
TestEnumSerialization(testEnum3.NONE);
TestEnumSerialization(testEnum3.A);
TestEnumSerialization(testEnum3.B);
TestEnumSerialization(testEnum3.C);
TestEnumSerialization(testEnum3.D);
TestEnumSerialization(testEnum3.E);
}
bool TestEnumSerialization(object enumValue)
{
Type enumType = enumValue.GetType();
Assert.IsTrue(JSONMapper.DefaultMapper.Serialize(enumValue, out JSONValue jsonEnum));
JSONMapper.DefaultMapper.Deserialize(jsonEnum, enumType, out object enunValueDeserialized);
Assert.AreEqual(enumType, enunValueDeserialized.GetType());
Assert.AreEqual(enumValue, enunValueDeserialized);
return true;
}
}
}

View File

@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
namespace ln.json.mapping
{
@ -157,7 +156,10 @@ namespace ln.json.mapping
{
if (type.GetCustomAttribute<FlagsAttribute>() != null)
{
json = new JSONNumber((int)o);
Type enumBaseType = type.GetEnumUnderlyingType();
o = Convert.ChangeType(o, enumBaseType);
ConstructorInfo constructor = typeof(JSONNumber).GetConstructor(new Type[]{ enumBaseType });
json = (JSONNumber)constructor.Invoke(new object[]{ o });
}
else
{