PageRenderTime 53ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 1ms

/src/FluentNHibernate.Testing/Testing/PersistenceSpecificationTester.cs

http://github.com/jagregory/fluent-nhibernate
C# | 266 lines | 222 code | 42 blank | 2 comment | 9 complexity | 5b0635075fa67ec016afc7efe2cf18e1 MD5 | raw file
Possible License(s): BSD-3-Clause, CC-BY-SA-3.0, Apache-2.0
  1. using System;
  2. using System.Collections.Generic;
  3. using FakeItEasy;
  4. using NUnit.Framework;
  5. using NHibernate;
  6. using System.Collections;
  7. using System.Drawing;
  8. namespace FluentNHibernate.Testing.Testing
  9. {
  10. [TestFixture]
  11. public class PersistenceSpecificationTester
  12. {
  13. public class Cat
  14. {
  15. public long Id { get; set; }
  16. public string Name { get; set; }
  17. public Kitten FirstKitten { get; set; }
  18. public IList<Kitten> AllKittens { get; set; }
  19. public Bitmap Picture { get; set; }
  20. public Cat()
  21. {
  22. AllKittens = new List<Kitten>();
  23. }
  24. public IEnumerable<Kitten> EnumerableOfKittens { get { return AllKittens; } }
  25. public void AddKitten(Kitten kitten)
  26. {
  27. AllKittens.Add(kitten);
  28. }
  29. }
  30. public class Kitten
  31. {
  32. public long Id { get; set; }
  33. public string Name { get; set; }
  34. }
  35. public class TestComparer : IEqualityComparer
  36. {
  37. bool IEqualityComparer.Equals(object x, object y)
  38. {
  39. if (x is Cat && y is Cat)
  40. return ((Cat)x).Id == ((Cat)y).Id;
  41. if (x is Kitten && y is Kitten)
  42. return ((Kitten)x).Id == ((Kitten)y).Id;
  43. return false;
  44. }
  45. public int GetHashCode(object obj)
  46. {
  47. if (obj is Cat)
  48. return (int)((Cat)obj).Id;
  49. if (obj is Kitten)
  50. return (int)((Kitten)obj).Id;
  51. return 0;
  52. }
  53. }
  54. public class DummyBitmapComparer : IEqualityComparer
  55. {
  56. bool IEqualityComparer.Equals(object x, object y)
  57. {
  58. return x is Bitmap && y is Bitmap;
  59. }
  60. public int GetHashCode(object obj)
  61. {
  62. return obj.GetHashCode();
  63. }
  64. }
  65. private PersistenceSpecification<Cat> spec;
  66. private ISession session;
  67. private ITransaction transaction;
  68. private Cat cat;
  69. private Cat identicalCat;
  70. private ISessionSource sessionSource;
  71. [SetUp]
  72. public void Setup()
  73. {
  74. var firstKitten = new Kitten { Id = 1, Name = "Kitten" };
  75. cat = new Cat
  76. {
  77. Id = 100,
  78. Name = "Cat",
  79. FirstKitten = firstKitten,
  80. Picture = new Bitmap(5, 5),
  81. AllKittens = new List<Kitten>
  82. {
  83. firstKitten,
  84. new Kitten {Id = 2, Name = "Kitten2"},
  85. }
  86. };
  87. firstKitten = new Kitten { Id = 1, Name = "IdenticalKitten" };
  88. identicalCat = new Cat
  89. {
  90. Id = 100,
  91. Name = "IdenticalCat",
  92. FirstKitten = firstKitten,
  93. Picture = new Bitmap(5, 5),
  94. AllKittens = new List<Kitten>
  95. {
  96. firstKitten,
  97. new Kitten {Id = 2, Name = "IdenticalKitten2"},
  98. }
  99. };
  100. transaction = A.Fake<ITransaction>();
  101. session = A.Fake<ISession>();
  102. A.CallTo(() => session.BeginTransaction()).Returns(transaction);
  103. A.CallTo(() => session.Get<Cat>(null)).WithAnyArguments().Returns(identicalCat);
  104. A.CallTo(() => session.GetIdentifier(cat)).Returns(cat.Id);
  105. sessionSource = A.Fake<ISessionSource>();
  106. A.CallTo(() => sessionSource.CreateSession()).Returns(session);
  107. spec = new PersistenceSpecification<Cat>(sessionSource, new TestComparer());
  108. }
  109. [Test]
  110. public void Comparing_two_properties_should_use_the_specified_IEqualityComparer()
  111. {
  112. spec.CheckProperty(x => x.FirstKitten, cat.FirstKitten).VerifyTheMappings();
  113. }
  114. [Test]
  115. public void Comparing_objects_in_two_lists_should_use_the_specified_IEqualityComparer()
  116. {
  117. spec.CheckList(x => x.AllKittens, cat.AllKittens).VerifyTheMappings();
  118. }
  119. [Test]
  120. public void should_not_be_equal_without_the_equality_comparer()
  121. {
  122. spec = new PersistenceSpecification<Cat>(sessionSource);
  123. typeof(ApplicationException).ShouldBeThrownBy(() =>
  124. spec.CheckList(x => x.AllKittens, cat.AllKittens).VerifyTheMappings());
  125. }
  126. [Test]
  127. public void Comparing_objects_in_two_lists_should_use_the_specified_comparisons()
  128. {
  129. spec.CheckList(x => x.AllKittens, cat.AllKittens, kitten => kitten.Id).VerifyTheMappings();
  130. // Should fail because the names don't match.
  131. Assert.Throws<ApplicationException>(() => spec.CheckList(x => x.AllKittens, cat.AllKittens, kitten => kitten.Id, kitten => kitten.Name)
  132. .VerifyTheMappings());
  133. }
  134. [Test]
  135. public void Can_test_enumerable()
  136. {
  137. var kittens = new[] {new Kitten {Id = 3, Name = "kitten3"}, new Kitten {Id = 4, Name = "kitten4"}};
  138. #pragma warning disable 618,612
  139. spec.CheckEnumerable(x => x.EnumerableOfKittens, (cat, kitten) => cat.AddKitten(kitten), kittens);
  140. #pragma warning restore 618,612
  141. typeof(ApplicationException).ShouldBeThrownBy(() => spec.VerifyTheMappings());
  142. }
  143. [Test]
  144. public void Comparing_two_properties_should_use_the_specified_property_IEqualityComparer()
  145. {
  146. spec.CheckProperty(x => x.Picture, cat.Picture, new DummyBitmapComparer()).VerifyTheMappings();
  147. }
  148. [Test]
  149. public void VerifyTheMappings_returns_instance()
  150. {
  151. var cat = spec.CheckProperty(x => x.FirstKitten, this.cat.FirstKitten).VerifyTheMappings();
  152. cat.ShouldNotBeNull();
  153. }
  154. [Test]
  155. public void Comparing_reference_should_use_the_specified_property_comparisons()
  156. {
  157. spec.CheckReference(x => x.FirstKitten, cat.FirstKitten, x => x.Id).VerifyTheMappings();
  158. // Should fail because the names don't match.
  159. Assert.Throws<ApplicationException>(() => spec.CheckReference(x => x.FirstKitten, cat.FirstKitten, x => x.Id, x => x.Name)
  160. .VerifyTheMappings());
  161. }
  162. }
  163. [TestFixture]
  164. public class PersistenceSpecificationConstructorTests
  165. {
  166. private ISessionSource sessionSource;
  167. [SetUp]
  168. public void Setup()
  169. {
  170. var transaction = A.Fake<ITransaction>();
  171. var session = A.Fake<ISession>();
  172. A.CallTo(() => session.BeginTransaction()).Returns(transaction);
  173. sessionSource = A.Fake<ISessionSource>();
  174. A.CallTo(() => sessionSource.CreateSession()).Returns(session);
  175. }
  176. [Test]
  177. public void Should_accept_classes_with_public_parameterless_constructor()
  178. {
  179. var _spec = new PersistenceSpecification<PublicConstructorClass>(sessionSource);
  180. _spec.VerifyTheMappings();
  181. }
  182. [Test]
  183. public void Should_accept_classes_with_private_parameterless_constructor()
  184. {
  185. var _spec = new PersistenceSpecification<PrivateConstructorClass>(sessionSource);
  186. _spec.VerifyTheMappings();
  187. }
  188. [Test]
  189. public void Should_accept_classes_with_protected_parameterless_constructor()
  190. {
  191. var _spec = new PersistenceSpecification<ProtectedConstructorClass>(sessionSource);
  192. _spec.VerifyTheMappings();
  193. }
  194. [Test]
  195. public void Should_reject_classes_without_a_parameterless_constructor()
  196. {
  197. var _spec = new PersistenceSpecification<NoParameterlessConstructorClass>(sessionSource);
  198. typeof(MissingConstructorException).ShouldBeThrownBy(() =>
  199. _spec.VerifyTheMappings());
  200. }
  201. [Test]
  202. public void Should_accept_instances_regardless_of_constructor()
  203. {
  204. var _spec = new PersistenceSpecification<NoParameterlessConstructorClass>(sessionSource);
  205. _spec.VerifyTheMappings(new NoParameterlessConstructorClass(123));
  206. }
  207. public class PublicConstructorClass
  208. {
  209. public PublicConstructorClass() { }
  210. }
  211. public class ProtectedConstructorClass
  212. {
  213. protected ProtectedConstructorClass() { }
  214. }
  215. public class PrivateConstructorClass
  216. {
  217. private PrivateConstructorClass() { }
  218. }
  219. public class NoParameterlessConstructorClass
  220. {
  221. public NoParameterlessConstructorClass(int someParameter) { }
  222. }
  223. }
  224. }