Created
October 19, 2011 15:31
-
-
Save wahidshalaly/1298642 to your computer and use it in GitHub Desktop.
First, I thought, unluckily, I hit a bug on Json.NET while serializing enum but after testing the issue I found out that it seems something by design but I could not find it documented. So, here you are, tests I wrote to study the issue.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//#define UsingStringEnumConverter | |
using System; | |
#if UsingStringEnumConverter | |
using Newtonsoft.Json.Converters; | |
#endif | |
using NUnit.Framework; | |
namespace Newtonsoft.Json.Tests.Converters | |
{ | |
class ReadOnlyPropertiesIssue | |
{ | |
static class TestHelper | |
{ | |
public static void AssertCanSerialize<T>(T toSerialize, string expectedJson) | |
where T : ITestObject, IEquatable<T> | |
{ | |
#if UsingStringEnumConverter | |
string json = JsonConvert.SerializeObject(toSerialize, Formatting.Indented, new StringEnumConverter()); | |
#else | |
string json = JsonConvert.SerializeObject(toSerialize, Formatting.Indented); | |
#endif | |
Console.WriteLine("Expected: {0} \r\nActual: {1}", expectedJson, json); | |
Assert.AreEqual(expectedJson, json); | |
} | |
public static void AssertCanDeserialize<T>(string toDeserialize, T expectedObject) | |
where T : ITestObject, IEquatable<T> | |
{ | |
var obj = JsonConvert.DeserializeObject<T>(toDeserialize); | |
Console.WriteLine("Expected: [{0}, \"{1}\", \"{2}\"]", expectedObject.UserID, expectedObject.UserName, expectedObject.UserRole); | |
Console.WriteLine("Actual: [{0}, \"{1}\", \"{2}\"]", obj.UserID, obj.UserName, obj.UserRole); | |
Assert.IsTrue(expectedObject.Equals(obj)); | |
} | |
} | |
public enum UserRoles { Admin = 101, User = 102, Guest = 501 } | |
private const int USER_ID = 1001; | |
private const string USER_NAME = "Waheed Sayed"; | |
private const UserRoles USER_ROLE = UserRoles.Guest; | |
#if UsingStringEnumConverter | |
private const string USER_IN_JSON = @"{ | |
""UserID"": 1001, | |
""UserName"": ""Waheed Sayed"", | |
""UserRole"": ""Guest"" | |
}"; | |
#else | |
private const string USER_IN_JSON = @"{ | |
""UserID"": 1001, | |
""UserName"": ""Waheed Sayed"", | |
""UserRole"": 501 | |
}"; | |
#endif | |
#region Cases to be tested | |
public interface ITestObject | |
{ | |
int UserID { get; } | |
string UserName { get; } | |
UserRoles UserRole { get; } | |
} | |
public class ReadWritePropsAndNoDefaultCtor : ITestObject, IEquatable<ReadWritePropsAndNoDefaultCtor> | |
{ | |
public int UserID { get; set; } | |
public string UserName { get; set; } | |
public UserRoles UserRole { get; set; } | |
public ReadWritePropsAndNoDefaultCtor(int id, string name, UserRoles role) | |
{ | |
UserID = id; | |
UserName = name; | |
UserRole = role; | |
} | |
public bool Equals(ReadWritePropsAndNoDefaultCtor that) | |
{ | |
return UserID == that.UserID && UserName == that.UserName && UserRole == that.UserRole; | |
} | |
} | |
public class ReadWritePropsAndDefaultCtor : ITestObject, IEquatable<ReadWritePropsAndDefaultCtor> | |
{ | |
public int UserID { get; set; } | |
public string UserName { get; set; } | |
public UserRoles UserRole { get; set; } | |
public ReadWritePropsAndDefaultCtor() { } | |
public ReadWritePropsAndDefaultCtor(int id, string name, UserRoles role) | |
{ | |
UserID = id; | |
UserName = name; | |
UserRole = role; | |
} | |
public bool Equals(ReadWritePropsAndDefaultCtor that) | |
{ | |
return UserID == that.UserID && UserName == that.UserName && UserRole == that.UserRole; | |
} | |
} | |
public class ReadOnlyPropsAndNoDefaultCtor : ITestObject, IEquatable<ReadOnlyPropsAndNoDefaultCtor> | |
{ | |
[JsonProperty] | |
public int UserID { get; private set; } | |
[JsonProperty] | |
public string UserName { get; private set; } | |
[JsonProperty] | |
public UserRoles UserRole { get; private set; } | |
public ReadOnlyPropsAndNoDefaultCtor(int id, string name, UserRoles role) | |
{ | |
UserID = id; | |
UserName = name; | |
UserRole = role; | |
} | |
public bool Equals(ReadOnlyPropsAndNoDefaultCtor that) | |
{ | |
return UserID == that.UserID && UserName == that.UserName && UserRole == that.UserRole; | |
} | |
} | |
public class ReadOnlyPropsAndDefaultCtor : ITestObject, IEquatable<ReadOnlyPropsAndDefaultCtor> | |
{ | |
[JsonProperty] | |
public int UserID { get; private set; } | |
[JsonProperty] | |
public string UserName { get; private set; } | |
[JsonProperty] | |
public UserRoles UserRole { get; private set; } | |
public ReadOnlyPropsAndDefaultCtor() { } | |
public ReadOnlyPropsAndDefaultCtor(int id, string name, UserRoles role) | |
{ | |
UserID = id; | |
UserName = name; | |
UserRole = role; | |
} | |
public bool Equals(ReadOnlyPropsAndDefaultCtor that) | |
{ | |
return UserID == that.UserID && UserName == that.UserName && UserRole == that.UserRole; | |
} | |
} | |
public class ReadOnlyPropsWithBackingFieldsAndNoDefaultCtor : ITestObject, IEquatable<ReadOnlyPropsWithBackingFieldsAndNoDefaultCtor> | |
{ | |
[JsonProperty("UserID")] | |
private readonly int userID; | |
[JsonProperty("UserName")] | |
private readonly string userName; | |
[JsonProperty("UserRole")] | |
private readonly UserRoles userRole; | |
[JsonIgnore] | |
public int UserID | |
{ | |
get { return userID; } | |
} | |
[JsonIgnore] | |
public string UserName | |
{ | |
get { return userName; } | |
} | |
[JsonIgnore] | |
public UserRoles UserRole | |
{ | |
get { return userRole; } | |
} | |
public ReadOnlyPropsWithBackingFieldsAndNoDefaultCtor(int id, string name, UserRoles role) | |
{ | |
userID = id; | |
userName = name; | |
userRole = role; | |
} | |
public bool Equals(ReadOnlyPropsWithBackingFieldsAndNoDefaultCtor that) | |
{ | |
return UserID == that.UserID && UserName == that.UserName && UserRole == that.UserRole; | |
} | |
} | |
#endregion | |
#region Case 1 | |
[Test] | |
public void SerializeReadWritePropsAndNoDefaultCtor() | |
{ | |
var obj = new ReadWritePropsAndNoDefaultCtor(USER_ID, USER_NAME, USER_ROLE); | |
TestHelper.AssertCanSerialize(obj, USER_IN_JSON); | |
} | |
[Test] | |
public void DeserializeReadWritePropsAndNoDefaultCtor() | |
{ | |
var obj = new ReadWritePropsAndNoDefaultCtor(USER_ID, USER_NAME, USER_ROLE); | |
TestHelper.AssertCanDeserialize(USER_IN_JSON, obj); | |
} | |
#endregion | |
#region Case 2 | |
[Test] | |
public void SerializeReadWritePropsAndDefaultCtor() | |
{ | |
var obj = new ReadWritePropsAndDefaultCtor(USER_ID, USER_NAME, USER_ROLE); | |
TestHelper.AssertCanSerialize(obj, USER_IN_JSON); | |
} | |
[Test] | |
public void DeserializeReadWritePropsAndDefaultCtor() | |
{ | |
var obj = new ReadWritePropsAndDefaultCtor(USER_ID, USER_NAME, USER_ROLE); | |
TestHelper.AssertCanDeserialize(USER_IN_JSON, obj); | |
} | |
#endregion | |
#region Case 3 | |
[Test] | |
public void SerializeReadOnlyPropsAndNoDefaultCtor() | |
{ | |
var obj = new ReadOnlyPropsAndNoDefaultCtor(USER_ID, USER_NAME, USER_ROLE); | |
TestHelper.AssertCanSerialize(obj, USER_IN_JSON); | |
} | |
[Test] | |
public void DeserializeReadOnlyPropsAndNoDefaultCtor() | |
{ | |
var obj = new ReadOnlyPropsAndNoDefaultCtor(USER_ID, USER_NAME, USER_ROLE); | |
TestHelper.AssertCanDeserialize(USER_IN_JSON, obj); | |
} | |
#endregion | |
#region Case 4 | |
[Test] | |
public void SerializeReadOnlyPropsAndDefaultCtor() | |
{ | |
var obj = new ReadOnlyPropsAndDefaultCtor(USER_ID, USER_NAME, USER_ROLE); | |
TestHelper.AssertCanSerialize(obj, USER_IN_JSON); | |
} | |
[Test] | |
public void DeserializeReadOnlyPropsAndDefaultCtor() | |
{ | |
var obj = new ReadOnlyPropsAndDefaultCtor(USER_ID, USER_NAME, USER_ROLE); | |
TestHelper.AssertCanDeserialize(USER_IN_JSON, obj); | |
} | |
#endregion | |
#region Case 5 | |
[Test] | |
public void SerializeReadOnlyPropsWithBackingFieldsAndNoDefaultCtor() | |
{ | |
var obj = new ReadOnlyPropsWithBackingFieldsAndNoDefaultCtor(USER_ID, USER_NAME, USER_ROLE); | |
TestHelper.AssertCanSerialize(obj, USER_IN_JSON); | |
} | |
[Test] | |
public void DeserializeReadOnlyPropsWithBackingFieldsAndNoDefaultCtor() | |
{ | |
var obj = new ReadOnlyPropsWithBackingFieldsAndNoDefaultCtor(USER_ID, USER_NAME, USER_ROLE); | |
TestHelper.AssertCanDeserialize(USER_IN_JSON, obj); | |
} | |
#endregion | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment