PageRenderTime 43ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/tags/Libs_1.7/CodeTitans.UnitTests/JSon/JSonAutoSerialization.cs

#
C# | 365 lines | 270 code | 74 blank | 21 comment | 9 complexity | 61116f387cec3c7a617928e81df5cf7e MD5 | raw file
  1. #region License
  2. /*
  3. Copyright (c) 2010, Paweł Hofman (CodeTitans)
  4. All Rights Reserved.
  5. Licensed under the Apache License version 2.0.
  6. For more information please visit:
  7. http://codetitans.codeplex.com/license
  8. or
  9. http://www.apache.org/licenses/
  10. For latest source code, documentation, samples
  11. and more information please visit:
  12. http://codetitans.codeplex.com/
  13. */
  14. #endregion
  15. using System;
  16. using System.Text;
  17. using System.Collections.Generic;
  18. using CodeTitans.JSon;
  19. #if NUNIT
  20. using NUnit.Framework;
  21. using TestClassAttribute=NUnit.Framework.TestFixtureAttribute;
  22. using TestMethodAttribute=NUnit.Framework.TestAttribute;
  23. using TestInitializeAttribute=NUnit.Framework.SetUpAttribute;
  24. using TestCleanupAttribute=NUnit.Framework.TearDownAttribute;
  25. #else
  26. using Microsoft.VisualStudio.TestTools.UnitTesting;
  27. #endif
  28. namespace CodeTitans.UnitTests.JSon
  29. {
  30. /// <summary>
  31. /// Summary description for JSonAutoSerialization
  32. /// </summary>
  33. [TestClass]
  34. public class JSonAutoSerialization
  35. {
  36. class JSonSampleClass : IJSonSerializable, IEquatable<JSonSampleClass>
  37. {
  38. public JSonSampleClass()
  39. {
  40. ID = Guid.NewGuid();
  41. }
  42. public JSonSampleClass(string name, int age, double salary)
  43. {
  44. ID = Guid.NewGuid();
  45. Name = name;
  46. Age = age;
  47. Salary = salary;
  48. }
  49. #region Properties
  50. public Guid ID
  51. { get; private set; }
  52. public string Name
  53. { get; private set; }
  54. public int Age
  55. { get; private set; }
  56. public double Salary
  57. { get; private set; }
  58. #endregion
  59. #region IJSonWritable Members
  60. public void Write(IJSonWriter output)
  61. {
  62. output.WriteObjectBegin();
  63. output.WriteMember("ID", ID);
  64. output.WriteMember("Name", Name);
  65. output.WriteMember("Age", Age);
  66. output.WriteMember("Salary", Salary);
  67. output.WriteObjectEnd();
  68. }
  69. #endregion
  70. #region IJSonReadable Members
  71. public void Read(IJSonObject input)
  72. {
  73. ID = input["ID"].GuidValue;
  74. Name = input["Name"].StringValue;
  75. Age = input["Age"].Int32Value;
  76. Salary = input["Salary"].DoubleValue;
  77. }
  78. #endregion
  79. public override bool Equals(object obj)
  80. {
  81. return base.Equals(obj as JSonSampleClass);
  82. }
  83. public override int GetHashCode()
  84. {
  85. return ID.GetHashCode();
  86. }
  87. #region IEquatable<JSonSampleClass> Members
  88. public bool Equals(JSonSampleClass other)
  89. {
  90. if (other != null)
  91. {
  92. return other.ID == ID && other.Name == Name && other.Age == Age && other.Salary == Salary;
  93. }
  94. return false;
  95. }
  96. #endregion
  97. }
  98. private JSonReader reader;
  99. private JSonWriter writer;
  100. [TestInitialize]
  101. public void TestInit()
  102. {
  103. reader = new JSonReader();
  104. writer = new JSonWriter(true);
  105. }
  106. [TestCleanup]
  107. public void TestClean()
  108. {
  109. Console.WriteLine("Serialized JSON object:");
  110. Console.WriteLine(writer.ToString());
  111. writer.Close();
  112. }
  113. [TestMethod]
  114. public void TestSerializeAndDeserialize()
  115. {
  116. JSonSampleClass o1 = new JSonSampleClass("Paweł", 30, 1001.1);
  117. JSonSampleClass d1 = new JSonSampleClass();
  118. Assert.AreNotEqual(o1, d1, "Can't be equal!");
  119. writer.Write(o1);
  120. var result = reader.ReadAsJSonObject(writer.ToString());
  121. d1.Read(result);
  122. Assert.IsTrue(o1.Equals(d1), "Object is not deserialized correctly!");
  123. }
  124. [TestMethod]
  125. public void TestSerializeArrayWithString()
  126. {
  127. string text = "Jakiś tekst!\r\n Paweł";
  128. writer.WriteArrayBegin();
  129. writer.WriteValue(text);
  130. writer.WriteArrayEnd();
  131. Assert.AreEqual(writer.ToString(), "[\r\n \"Jakiś tekst!\\r\\n Paweł\"\r\n]", "Text is deserialized incorrectly!");
  132. var result = reader.Read(writer.ToString()) as object[];
  133. Assert.AreEqual(text, result[0], "Text after deserialization are not equal!");
  134. }
  135. [JSonSerializable(AllowAllFields=true, IgnoreStatic=false)]
  136. class SampleAttributedClass
  137. {
  138. [JSonMember("name", "Unknown")]
  139. private string _name;
  140. [JSonMember("age", 18)]
  141. private int _age;
  142. [JSonMember("address", "default", SkipWhenNull=true)]
  143. private string _address;
  144. [JSonMember("CurrentTime")]
  145. private DateTime _dt = DateTime.Now;
  146. private Guid testField;
  147. public const string Text = "Some Const Text, that is not supposed to be serialized!";
  148. public static bool StaticSampleField = false;
  149. public SampleAttributedClass()
  150. {
  151. }
  152. public SampleAttributedClass(string name, int age)
  153. {
  154. testField = Guid.NewGuid();
  155. _name = name;
  156. _age = age;
  157. }
  158. public string Name
  159. {
  160. get { return _name; }
  161. }
  162. public int Age
  163. {
  164. get { return _age; }
  165. }
  166. public string Address
  167. {
  168. get { return _address; }
  169. set { _address = value; }
  170. }
  171. }
  172. [JSonSerializable]
  173. class WrapperClass
  174. {
  175. static int _id = 0;
  176. public WrapperClass(object value, object data)
  177. {
  178. Value = value;
  179. Data = data;
  180. ++_id;
  181. ID = _id;
  182. }
  183. [JSonMember("id")]
  184. public int ID
  185. { get; private set; }
  186. [JSonMember("value")]
  187. public object Value
  188. { get; private set; }
  189. [JSonMember("data", SkipWhenNull=true)]
  190. public object Data
  191. { get; private set; }
  192. }
  193. [TestMethod]
  194. public void TestSerializeViaAttributes()
  195. {
  196. SampleAttributedClass o1 = new SampleAttributedClass("Paweł", 20);
  197. writer.Write(o1);
  198. var result = writer.ToString();
  199. Assert.IsNotNull(result, "Expected some serialized data");
  200. Assert.IsFalse(result.Contains(SampleAttributedClass.Text), "Unexpected 'const' field in serialized output");
  201. Assert.IsTrue(result.Contains("StaticSampleField"), "Expected static field in output");
  202. }
  203. [TestMethod]
  204. public void TestSerializeAndDeserializeViaSimpleAttributes()
  205. {
  206. SampleAttributedClass o1 = new SampleAttributedClass("Paweł", 20);
  207. writer.Write(o1);
  208. var result = writer.ToString();
  209. Assert.IsNotNull(result, "Expected some serialized data");
  210. Assert.IsFalse(result.Contains(SampleAttributedClass.Text), "Unexpected 'const' field in serialized output");
  211. Assert.IsTrue(result.Contains("StaticSampleField"), "Expected static field in output");
  212. SampleAttributedClass.StaticSampleField = true;
  213. var o2 = reader.ReadAsJSonObject(result).ToObjectValue<SampleAttributedClass>();
  214. Assert.IsNotNull(o2, "Correct value expected");
  215. Assert.AreEqual(o2.Name, o1.Name, "Name is not equal expected value");
  216. Assert.AreEqual(o2.Age, o1.Age, "Age is not equal expected value");
  217. Assert.AreEqual(o2.Address, "default", "Address should be equal to default value");
  218. // try to load array of elements:
  219. var o3 = reader.ReadAsJSonObject("[" + result + "]").ToObjectValue<IList<SampleAttributedClass>>();
  220. Assert.IsNotNull(o3, "Expected data to be read");
  221. o2 = o3[0];
  222. Assert.IsNotNull(o2, "Correct value expected");
  223. Assert.AreEqual(o2.Name, o1.Name, "Name is not equal expected value");
  224. Assert.AreEqual(o2.Age, o1.Age, "Age is not equal expected value");
  225. Assert.AreEqual(o2.Address, "default", "Address should be equal to default value");
  226. }
  227. [TestMethod]
  228. [ExpectedException(typeof(JSonMemberMissingException))]
  229. public void TestMissingMember()
  230. {
  231. var result = reader.ReadAsJSonObject("{ \"Name\": \"Jan\" }").ToObjectValue<SampleAttributedClass>();
  232. Assert.IsNotNull(result);
  233. }
  234. [TestMethod]
  235. public void TestHierarchicalAutoSerialization()
  236. {
  237. var o1 = new WrapperClass(new WrapperClass(new string[] { "request", "response", "event" }, new WrapperClass(new WrapperClass(new Guid[] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() }, null), null)), null);
  238. writer.Write(o1);
  239. var result = writer.ToString();
  240. Assert.IsNotNull(result, "Expected serialized object");
  241. Assert.IsFalse(result.Contains("null"), "Unexpected token found");
  242. }
  243. [JSonSerializable(AllowAllFields = true)]
  244. class ArrayContainingClass
  245. {
  246. [JSonMember("data1", null, SkipWhenNull = true)]
  247. private Array _data1;
  248. [JSonMember("data2", null, SkipWhenNull = true)]
  249. private Array _data2;
  250. public ArrayContainingClass()
  251. {
  252. }
  253. public ArrayContainingClass(Array keys, Array urls)
  254. {
  255. _data1 = keys;
  256. _data2 = urls;
  257. }
  258. public Array Data1
  259. {
  260. get { return _data1; }
  261. }
  262. public Array Data2
  263. {
  264. get { return _data2; }
  265. }
  266. }
  267. [TestMethod]
  268. public void TestReadWriteAbstractArrays()
  269. {
  270. JSonWriter writer = new JSonWriter();
  271. string[] data1 = { "123456", "78910" };
  272. string[] data2 = { "A", "B", "C" };
  273. var container = new ArrayContainingClass(data1, data2);
  274. writer.Write(container);
  275. Console.WriteLine("JSON:");
  276. Console.WriteLine(writer.ToString());
  277. var reader = new JSonReader();
  278. var readContainer = reader.ReadAsJSonObject(writer.ToString()).ToObjectValue<ArrayContainingClass>();
  279. Assert.IsNotNull(readContainer);
  280. Assert.IsNotNull(readContainer.Data1);
  281. Assert.IsNotNull(readContainer.Data2);
  282. Assert.AreEqual(2, readContainer.Data1.Length);
  283. Assert.AreEqual(3, readContainer.Data2.Length);
  284. }
  285. }
  286. }