TestsReflection.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using PetaTest;
  6. using PetaJson;
  7. namespace TestCases
  8. {
  9. class ModelNotDecorated
  10. {
  11. public string Field1;
  12. public string Field2;
  13. public string Prop1 { get; set; }
  14. public string Prop2 { get; set; }
  15. }
  16. class ModelInclude
  17. {
  18. [Json] public string Field1;
  19. public string Field2;
  20. [Json] public string Prop1 { get; set; }
  21. public string Prop2 { get; set; }
  22. }
  23. class ModelExclude
  24. {
  25. public string Field1;
  26. public string Field2;
  27. public string Prop1 { get; set; }
  28. public string Prop2 { get; set; }
  29. [JsonExclude]
  30. public string Field3;
  31. [JsonExclude]
  32. public string Prop3 { get; set; }
  33. }
  34. class ModelRenamedMembers
  35. {
  36. [Json("Field1")] public string Field1;
  37. public string Field2;
  38. [Json("Prop1")] public string Prop1 { get; set; }
  39. public string Prop2 { get; set; }
  40. }
  41. [Json]
  42. class InstanceObject
  43. {
  44. public int IntVal1;
  45. [JsonExclude] public int IntVal2;
  46. }
  47. [Json]
  48. class ModelKeepInstance
  49. {
  50. [Json(KeepInstance=true)]
  51. public InstanceObject InstObj;
  52. }
  53. [Json]
  54. struct ModelStruct
  55. {
  56. public int IntField;
  57. public int IntProp { get; set; }
  58. }
  59. [TestFixture]
  60. public class TestsReflection
  61. {
  62. [Test]
  63. public void ExcludeAttribute()
  64. {
  65. var m = new ModelExclude()
  66. {
  67. Field1 = "f1",
  68. Field2 = "f2",
  69. Field3 = "f3",
  70. Prop1 = "p1",
  71. Prop2 = "p2",
  72. Prop3 = "p3",
  73. };
  74. var json = Json.Format(m);
  75. Assert.Contains(json, "field1");
  76. Assert.Contains(json, "field2");
  77. Assert.DoesNotContain(json, "field3");
  78. Assert.Contains(json, "prop1");
  79. Assert.Contains(json, "prop2");
  80. Assert.DoesNotContain(json, "prop3");
  81. }
  82. [Test]
  83. public void NonDecorated()
  84. {
  85. var m = new ModelNotDecorated()
  86. {
  87. Field1 = "f1",
  88. Field2 = "f2",
  89. Prop1 = "p1",
  90. Prop2 = "p2",
  91. };
  92. var json = Json.Format(m);
  93. Assert.Contains(json, "field1");
  94. Assert.Contains(json, "field2");
  95. Assert.Contains(json, "prop1");
  96. Assert.Contains(json, "prop2");
  97. }
  98. [Test]
  99. public void Include()
  100. {
  101. var m = new ModelInclude()
  102. {
  103. Field1 = "f1",
  104. Field2 = "f2",
  105. Prop1 = "p1",
  106. Prop2 = "p2",
  107. };
  108. var json = Json.Format(m);
  109. Assert.Contains(json, "field1");
  110. Assert.DoesNotContain(json, "field2");
  111. Assert.Contains(json, "prop1");
  112. Assert.DoesNotContain(json, "prop2");
  113. }
  114. [Test]
  115. public void RenamedMembers()
  116. {
  117. var m = new ModelRenamedMembers()
  118. {
  119. Field1 = "f1",
  120. Field2 = "f2",
  121. Prop1 = "p1",
  122. Prop2 = "p2",
  123. };
  124. var json = Json.Format(m);
  125. Assert.Contains(json, "Field1");
  126. Assert.DoesNotContain(json, "field2");
  127. Assert.Contains(json, "Prop1");
  128. Assert.DoesNotContain(json, "prop2");
  129. }
  130. [Test]
  131. public void KeepInstanceTest1()
  132. {
  133. // Create model and save it
  134. var ki = new ModelKeepInstance();
  135. ki.InstObj = new InstanceObject();
  136. ki.InstObj.IntVal1 = 1;
  137. ki.InstObj.IntVal2 = 2;
  138. var json = Json.Format(ki);
  139. // Update the kept instance object
  140. ki.InstObj.IntVal1 = 11;
  141. ki.InstObj.IntVal2 = 12;
  142. // Reload
  143. var oldInst = ki.InstObj;
  144. Json.ParseInto(json, ki);
  145. // Check object instance kept
  146. Assert.AreSame(oldInst, ki.InstObj);
  147. // Check json properties updated, others not
  148. Assert.AreEqual(ki.InstObj.IntVal1, 1);
  149. Assert.AreEqual(ki.InstObj.IntVal2, 12);
  150. }
  151. [Test]
  152. public void KeepInstanceTest2()
  153. {
  154. // Create model and save it
  155. var ki = new ModelKeepInstance();
  156. ki.InstObj = new InstanceObject();
  157. ki.InstObj.IntVal1 = 1;
  158. ki.InstObj.IntVal2 = 2;
  159. var json = Json.Format(ki);
  160. // Update the kept instance object
  161. ki.InstObj = null;
  162. // Reload
  163. Json.ParseInto(json, ki);
  164. // Check object instance kept
  165. Assert.IsNotNull(ki.InstObj);
  166. // Check json properties updated, others not
  167. Assert.AreEqual(ki.InstObj.IntVal1, 1);
  168. Assert.AreEqual(ki.InstObj.IntVal2, 0);
  169. }
  170. [Test]
  171. public void StructTest()
  172. {
  173. var o = new ModelStruct();
  174. o.IntField = 23;
  175. o.IntProp = 24;
  176. var json = Json.Format(o);
  177. Assert.Contains(json, "23");
  178. Assert.Contains(json, "24");
  179. var o2 = Json.Parse<ModelStruct>(json);
  180. Assert.AreEqual(o2.IntField, 23);
  181. Assert.AreEqual(o2.IntProp, 24);
  182. // Test parseInto on a value type not supported
  183. var o3 = new ModelStruct();
  184. Assert.Throws<InvalidOperationException>(() => Json.ParseInto(json, o3));
  185. }
  186. }
  187. }