You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

254 lines
8.8 KiB

  1. /* Copyright 2010-2011 10gen Inc.
  2. *
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. using System;
  16. using System.Collections.Generic;
  17. using System.IO;
  18. using System.Linq;
  19. using System.Reflection;
  20. using System.Text;
  21. using NUnit.Framework;
  22. using MongoDB.Bson;
  23. using MongoDB.Bson.IO;
  24. using MongoDB.Bson.Serialization;
  25. using MongoDB.Bson.Serialization.Attributes;
  26. namespace MongoDB.BsonUnitTests.Serialization {
  27. [TestFixture]
  28. public class BsonClassMapTests {
  29. #pragma warning disable 169 // never used
  30. #pragma warning disable 649 // never assigned to
  31. private class A {
  32. private int fieldNotMapped;
  33. public readonly int FieldNotMapped2;
  34. public int FieldMapped;
  35. [BsonElement("FieldMappedByAttribute")]
  36. private int fieldMappedByAttribute;
  37. public int PropertyMapped { get; set; }
  38. public int PropertyMapped2 { get; private set; }
  39. public int PropertyMapped3 { private get; set; }
  40. private int PropertyNotMapped { get; set; }
  41. [BsonElement("PropertyMappedByAttribute")]
  42. private int PropertyMappedByAttribute { get; set; }
  43. }
  44. #pragma warning restore
  45. [Test]
  46. public void TestMappingPicksUpAllMembersWithAttributes() {
  47. var classMap = BsonClassMap.LookupClassMap(typeof(A));
  48. Assert.AreEqual(6, classMap.MemberMaps.Count());
  49. }
  50. }
  51. [TestFixture]
  52. public class BsonClassMapMapByNameTests {
  53. #pragma warning disable 169 // never used
  54. private class C {
  55. private string f;
  56. private string p { get; set; }
  57. }
  58. #pragma warning restore
  59. [Test]
  60. public void TestMapField() {
  61. var classMap = new BsonClassMap<C>(cm => cm.MapField("f"));
  62. var memberMap = classMap.GetMemberMap("f");
  63. Assert.IsNotNull(memberMap);
  64. Assert.AreEqual("f", memberMap.ElementName);
  65. Assert.AreEqual("f", memberMap.MemberName);
  66. }
  67. [Test]
  68. public void TestMapIdField() {
  69. var classMap = new BsonClassMap<C>(cm => cm.MapIdField("f"));
  70. var idMemberMap = classMap.IdMemberMap;
  71. Assert.IsNotNull(idMemberMap);
  72. Assert.AreEqual("_id", idMemberMap.ElementName);
  73. Assert.AreEqual("f", idMemberMap.MemberName);
  74. }
  75. [Test]
  76. public void TestMapIdMember() {
  77. var fieldInfo = typeof(C).GetField("f", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
  78. var classMap = new BsonClassMap<C>(cm => cm.MapIdMember(fieldInfo));
  79. var idMemberMap = classMap.IdMemberMap;
  80. Assert.IsNotNull(idMemberMap);
  81. Assert.AreEqual("_id", idMemberMap.ElementName);
  82. Assert.AreEqual("f", idMemberMap.MemberName);
  83. }
  84. [Test]
  85. public void TestMapIdProperty() {
  86. var classMap = new BsonClassMap<C>(cm => cm.MapIdProperty("p"));
  87. var idMemberMap = classMap.IdMemberMap;
  88. Assert.IsNotNull(idMemberMap);
  89. Assert.AreEqual("_id", idMemberMap.ElementName);
  90. Assert.AreEqual("p", idMemberMap.MemberName);
  91. }
  92. [Test]
  93. public void TestMapMember() {
  94. var fieldInfo = typeof(C).GetField("f", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
  95. var classMap = new BsonClassMap<C>(cm => cm.MapMember(fieldInfo));
  96. var memberMap = classMap.GetMemberMap("f");
  97. Assert.IsNotNull(memberMap);
  98. Assert.AreEqual("f", memberMap.ElementName);
  99. Assert.AreEqual("f", memberMap.MemberName);
  100. }
  101. [Test]
  102. public void TestMapProperty() {
  103. var classMap = new BsonClassMap<C>(cm => cm.MapProperty("p"));
  104. var memberMap = classMap.GetMemberMap("p");
  105. Assert.IsNotNull(memberMap);
  106. Assert.AreEqual("p", memberMap.ElementName);
  107. Assert.AreEqual("p", memberMap.MemberName);
  108. }
  109. }
  110. [TestFixture]
  111. public class BsonClassMapMapByLamdaTests {
  112. #pragma warning disable 649 // never assigned to
  113. private class C {
  114. public string F;
  115. public string P { get; set; }
  116. }
  117. #pragma warning restore
  118. [Test]
  119. public void TestMapField() {
  120. var classMap = new BsonClassMap<C>(cm => cm.MapField(c => c.F));
  121. var memberMap = classMap.GetMemberMap("F");
  122. Assert.IsNotNull(memberMap);
  123. Assert.AreEqual("F", memberMap.ElementName);
  124. Assert.AreEqual("F", memberMap.MemberName);
  125. }
  126. [Test]
  127. public void TestMapIdField() {
  128. var classMap = new BsonClassMap<C>(cm => cm.MapIdField(c => c.F));
  129. var idMemberMap = classMap.IdMemberMap;
  130. Assert.IsNotNull(idMemberMap);
  131. Assert.AreEqual("_id", idMemberMap.ElementName);
  132. Assert.AreEqual("F", idMemberMap.MemberName);
  133. }
  134. [Test]
  135. public void TestMapIdMember() {
  136. var classMap = new BsonClassMap<C>(cm => cm.MapIdMember(c => c.F));
  137. var idMemberMap = classMap.IdMemberMap;
  138. Assert.IsNotNull(idMemberMap);
  139. Assert.AreEqual("_id", idMemberMap.ElementName);
  140. Assert.AreEqual("F", idMemberMap.MemberName);
  141. }
  142. [Test]
  143. public void TestMapIdProperty() {
  144. var classMap = new BsonClassMap<C>(cm => cm.MapIdProperty(c => c.P));
  145. var idMemberMap = classMap.IdMemberMap;
  146. Assert.IsNotNull(idMemberMap);
  147. Assert.AreEqual("_id", idMemberMap.ElementName);
  148. Assert.AreEqual("P", idMemberMap.MemberName);
  149. }
  150. [Test]
  151. public void TestMapMember() {
  152. var classMap = new BsonClassMap<C>(cm => cm.MapMember(c => c.F));
  153. var memberMap = classMap.GetMemberMap("F");
  154. Assert.IsNotNull(memberMap);
  155. Assert.AreEqual("F", memberMap.ElementName);
  156. Assert.AreEqual("F", memberMap.MemberName);
  157. }
  158. [Test]
  159. public void TestMapProperty() {
  160. var classMap = new BsonClassMap<C>(cm => cm.MapProperty(c => c.P));
  161. var memberMap = classMap.GetMemberMap("P");
  162. Assert.IsNotNull(memberMap);
  163. Assert.AreEqual("P", memberMap.ElementName);
  164. Assert.AreEqual("P", memberMap.MemberName);
  165. }
  166. }
  167. [TestFixture]
  168. public class BsonClassMapUnmapTests {
  169. public class C {
  170. public ObjectId Id;
  171. public int X;
  172. public int FieldUnmappedByName;
  173. public int FieldUnmappedByLambda;
  174. public int PropertyUnmappedByName { get; set; }
  175. public int PropertyUnmappedByLambda { get; set; }
  176. }
  177. [Test]
  178. public void TestUnmap() {
  179. var classMap = new BsonClassMap<C>(cm => {
  180. cm.AutoMap();
  181. cm.SetIdMember(cm.GetMemberMap("Id"));
  182. cm.UnmapField("Id");
  183. cm.UnmapField("FieldUnmappedByName");
  184. cm.UnmapField(c => c.FieldUnmappedByLambda);
  185. cm.UnmapProperty("PropertyUnmappedByName");
  186. cm.UnmapProperty(c => c.PropertyUnmappedByLambda);
  187. });
  188. classMap.Freeze();
  189. Assert.IsNull(classMap.IdMemberMap);
  190. Assert.AreEqual(1, classMap.MemberMaps.Count());
  191. var memberMap = classMap.MemberMaps.Single();
  192. Assert.AreEqual("X", memberMap.MemberName);
  193. }
  194. }
  195. [TestFixture]
  196. public class BsonShouldSerializeTests {
  197. public class ClassA
  198. {
  199. public string LocalName { get; set; }
  200. public DateTime AsOfUtc { get; set; }
  201. public bool ShouldSerializeAsOfUtc()
  202. {
  203. return this.AsOfUtc != DateTime.MinValue;
  204. }
  205. }
  206. [Test]
  207. public void TestShouldSerializeSuccess() {
  208. var c = new ClassA();
  209. c.AsOfUtc = DateTime.MinValue;
  210. c.LocalName = "Saleem";
  211. var json = c.ToJson();
  212. var expected = "{ 'LocalName' : 'Saleem' }".Replace("'", "\"");
  213. Assert.AreEqual(expected, json);
  214. // Test to see if the value is serialized
  215. var date = new DateTime(2011, 4, 24, 0, 0, 0);
  216. date = DateTime.SpecifyKind(date, DateTimeKind.Utc);
  217. c.AsOfUtc = date;
  218. expected = "{ 'LocalName' : 'Saleem', 'AsOfUtc' : ISODate('2011-04-24T00:00:00Z') }".Replace("'", "\"");
  219. json = c.ToJson();
  220. Assert.AreEqual(expected, json);
  221. }
  222. }
  223. }