/SpanJson.Tests/SerializationTests.cs

https://github.com/Tornhoof/SpanJson · C# · 274 lines · 239 code · 35 blank · 0 comment · 0 complexity · e0bdd62a853586d5d3e76620e9a99c0c MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using SpanJson.Resolvers;
  4. using Xunit;
  5. namespace SpanJson.Tests
  6. {
  7. public class SerializationTests
  8. {
  9. public abstract class Human
  10. {
  11. public string Name { get; set; }
  12. public int Age { get; set; }
  13. }
  14. public class AnotherParent : Human
  15. {
  16. public List<Child> Children { get; set; }
  17. }
  18. public class Parent : Human
  19. {
  20. public List<Child> Children { get; set; }
  21. public Human Partner { get; set; }
  22. }
  23. public class Child : Human
  24. {
  25. }
  26. public class Son : Child
  27. {
  28. public bool SonSpecific { get; set; }
  29. }
  30. public class Daughter : Child
  31. {
  32. public bool DaughterSpecific { get; set; }
  33. }
  34. public class Node
  35. {
  36. public Guid Id { get; set; }
  37. public List<Node> Children { get; set; } = new List<Node>();
  38. }
  39. public class OneChinesePropertyName
  40. {
  41. public string 你好 { get; set; }
  42. }
  43. public class PartialChinesePropertyName
  44. {
  45. public string 你好 { get; set; }
  46. public string 你好你好 { get; set; }
  47. }
  48. [Fact]
  49. public void NoNameMatches()
  50. {
  51. var parent = new AnotherParent {Age = 30, Name = "Adam", Children = new List<Child> {new Child {Name = "Cain", Age = 5}}};
  52. var serializedWithCamelCase =
  53. JsonSerializer.Generic.Utf16.Serialize<AnotherParent, ExcludeNullsOriginalCaseResolver<char>>(parent);
  54. serializedWithCamelCase = serializedWithCamelCase.ToLowerInvariant();
  55. Assert.Contains("age", serializedWithCamelCase);
  56. var deserialized =
  57. JsonSerializer.Generic.Utf16.Deserialize<AnotherParent, ExcludeNullsOriginalCaseResolver<char>>(serializedWithCamelCase);
  58. Assert.NotNull(deserialized);
  59. Assert.Null(deserialized.Children);
  60. Assert.Equal(0, deserialized.Age);
  61. Assert.Null(deserialized.Name);
  62. }
  63. [Fact]
  64. public void Loops()
  65. {
  66. var node = new Node {Id = Guid.NewGuid()};
  67. node.Children.Add(node);
  68. var ex = Assert.Throws<InvalidOperationException>(() => JsonSerializer.Generic.Utf16.Serialize(node));
  69. Assert.Contains("Nesting Limit", ex.Message);
  70. }
  71. [Fact]
  72. public void SerializeDeserializeOneChinesePropertyNameUtf16()
  73. {
  74. var wpn = new OneChinesePropertyName {你好 = "Hello"};
  75. var serialized = JsonSerializer.Generic.Utf16.Serialize(wpn);
  76. Assert.NotNull(serialized);
  77. Assert.Contains("\"你好\":", serialized);
  78. var deserialized = JsonSerializer.Generic.Utf16.Deserialize<OneChinesePropertyName>(serialized);
  79. Assert.NotNull(deserialized);
  80. Assert.Equal(wpn.你好, deserialized.你好);
  81. }
  82. [Fact]
  83. public void SerializeDeserializeOneChinesePropertyNameUtf8()
  84. {
  85. var wpn = new OneChinesePropertyName {你好 = "Hello"};
  86. var serialized = JsonSerializer.Generic.Utf8.Serialize(wpn);
  87. Assert.NotNull(serialized);
  88. var deserialized = JsonSerializer.Generic.Utf8.Deserialize<OneChinesePropertyName>(serialized);
  89. Assert.NotNull(deserialized);
  90. Assert.Equal(wpn.你好, deserialized.你好);
  91. }
  92. [Fact]
  93. public void SerializeDeserializePartialChinesePropertyNameUtf16()
  94. {
  95. var wpn = new PartialChinesePropertyName {你好 = "Hello", 你好你好 = "World"};
  96. var serialized = JsonSerializer.Generic.Utf16.Serialize(wpn);
  97. Assert.NotNull(serialized);
  98. Assert.Contains("\"你好\":", serialized);
  99. var deserialized = JsonSerializer.Generic.Utf16.Deserialize<OneChinesePropertyName>(serialized);
  100. Assert.NotNull(deserialized);
  101. Assert.Equal(wpn.你好, deserialized.你好);
  102. }
  103. [Fact]
  104. public void SerializeDeserializePartialChinesePropertyNameUtf8()
  105. {
  106. var wpn = new PartialChinesePropertyName {你好 = "Hello", 你好你好 = "World"};
  107. var serialized = JsonSerializer.Generic.Utf8.Serialize(wpn);
  108. Assert.NotNull(serialized);
  109. var deserialized = JsonSerializer.Generic.Utf8.Deserialize<OneChinesePropertyName>(serialized);
  110. Assert.NotNull(deserialized);
  111. Assert.Equal(wpn.你好, deserialized.你好);
  112. }
  113. public class ObjectChildModel
  114. {
  115. public object Object { get; set; }
  116. }
  117. [Fact]
  118. public void SerializeDeserializeObjectChildModel()
  119. {
  120. var ocm = new ObjectChildModel {Object = new object()};
  121. var serialized = JsonSerializer.Generic.Utf16.Serialize(ocm);
  122. Assert.Contains("\"Object\":{}", serialized);
  123. Assert.NotNull(serialized);
  124. var deserialized = JsonSerializer.Generic.Utf16.Deserialize<ObjectChildModel>(serialized);
  125. Assert.NotNull(deserialized);
  126. Assert.NotNull(deserialized.Object);
  127. }
  128. [Fact]
  129. public void SerializePolymorphic()
  130. {
  131. var parent = new Parent
  132. {
  133. Age = 30,
  134. Name = "Adam",
  135. Children = new List<Child>
  136. {
  137. new Son {Name = "Cain", Age = 5, SonSpecific = true},
  138. new Daughter {Name = "Lilith", Age = 8, DaughterSpecific = true}
  139. },
  140. Partner = new Parent
  141. {
  142. Age = 30,
  143. Name = "Eve",
  144. Children = new List<Child>
  145. {
  146. new Son {Name = "Cain", Age = 5, SonSpecific = true},
  147. new Daughter {Name = "Lilith", Age = 8, DaughterSpecific = true}
  148. }
  149. }
  150. };
  151. var serialized = JsonSerializer.Generic.Utf16.Serialize(parent);
  152. Assert.Contains("\"Name\":\"Eve\"", serialized);
  153. Assert.Contains("\"SonSpecific\":true", serialized);
  154. Assert.Contains("\"DaughterSpecific\":true", serialized);
  155. }
  156. [Theory]
  157. [InlineData("칱칳칶칹칼캠츧")]
  158. [InlineData("칱칳칶칹칼캠츧\t칱칳칶칹칼캠츧")]
  159. [InlineData("\t칱칳칶칹칼캠츧\t칱칳칶칹칼캠츧\n")]
  160. [InlineData("😷Hello\t칱칳칶칹칼캠츧\t칱칳칶칹칼캠츧\nWorld😷")]
  161. [InlineData("칱칳칶칹칼캠츧😁칱칳칶칹칼캠츧")]
  162. [InlineData("Hello 😁 World")]
  163. [InlineData("😷Hello 😁 World😷")]
  164. public void SerializeDeserializeMultiCharStringUtf8(string input)
  165. {
  166. var serialized = JsonSerializer.Generic.Utf8.Serialize(input);
  167. var deserialized = JsonSerializer.Generic.Utf8.Deserialize<string>(serialized);
  168. Assert.Equal(input, deserialized);
  169. }
  170. [Theory]
  171. [InlineData("칱칳칶칹칼캠츧")]
  172. [InlineData("칱칳칶칹칼캠츧\t칱칳칶칹칼캠츧")]
  173. [InlineData("칱칳칶칹칼캠츧😁칱칳칶칹칼캠츧")]
  174. [InlineData("Hello 😁 World")]
  175. [InlineData("😷Hello 😁 World😷")]
  176. public void SerializeDeserializeMultiCharStringUtf16(string input)
  177. {
  178. var serialized = JsonSerializer.Generic.Utf16.Serialize(input);
  179. var deserialized = JsonSerializer.Generic.Utf16.Deserialize<string>(serialized);
  180. Assert.Equal(input, deserialized);
  181. }
  182. #pragma warning disable 649
  183. struct A
  184. {
  185. public string X;
  186. public ReadOnlySpan<char> SubX => X.Substring(2);
  187. }
  188. #pragma warning restore 649
  189. [Fact]
  190. public void SerializeDeserializeStructWithByRefProperty()
  191. {
  192. var result = JsonSerializer.Generic.Utf8.Deserialize<A>(System.Text.Encoding.UTF8.GetBytes(@"{""X"":""001"", ""SubX"":""2""}"));
  193. Assert.Equal("001", result.X);
  194. }
  195. public class ByRefTestObject
  196. {
  197. public Span<int> Property
  198. {
  199. get => default;
  200. set => throw new NotImplementedException();
  201. }
  202. public Span<int> this[int i]
  203. {
  204. get => default;
  205. set => throw new NotImplementedException();
  206. }
  207. public MyRefStruct Second
  208. {
  209. get => default;
  210. }
  211. public ref struct MyRefStruct
  212. {
  213. public MyRefStruct(string value)
  214. {
  215. Value = value;
  216. }
  217. public string Value { get; set; }
  218. }
  219. }
  220. [Fact]
  221. public void SerializeDeserializeByRefUtf16()
  222. {
  223. var byRef = new ByRefTestObject();
  224. var serialized = JsonSerializer.Generic.Utf16.Serialize(byRef);
  225. Assert.NotNull(serialized);
  226. var deserialized = JsonSerializer.Generic.Utf16.Deserialize<ByRefTestObject>(serialized);
  227. Assert.NotNull(deserialized);
  228. }
  229. [Fact]
  230. public void SerializeDeserializeByRefUtf8()
  231. {
  232. var byRef = new ByRefTestObject();
  233. var serialized = JsonSerializer.Generic.Utf8.Serialize(byRef);
  234. Assert.NotNull(serialized);
  235. var deserialized = JsonSerializer.Generic.Utf8.Deserialize<ByRefTestObject>(serialized);
  236. Assert.NotNull(deserialized);
  237. }
  238. }
  239. }