PageRenderTime 43ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/v3/src/MbUnit/MbUnit.Tests/Framework/ContractVerifiers/EqualityContractTest.cs

http://mb-unit.googlecode.com/
C# | 332 lines | 279 code | 39 blank | 14 comment | 23 complexity | 00ba7f889d20ce43bf4e220bdcb214ab MD5 | raw file
Possible License(s): BSD-3-Clause, Apache-2.0, 0BSD, IPL-1.0, LGPL-2.1, MIT, CC-BY-SA-3.0, GPL-2.0, CPL-1.0, GPL-3.0
  1. // Copyright 2005-2010 Gallio Project - http://www.gallio.org/
  2. // Portions Copyright 2000-2004 Jonathan de Halleux
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. //
  8. // http://www.apache.org/licenses/LICENSE-2.0
  9. //
  10. // Unless required by applicable law or agreed to in writing, software
  11. // distributed under the License is distributed on an "AS IS" BASIS,
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. // See the License for the specific language governing permissions and
  14. // limitations under the License.
  15. using System;
  16. using System.Collections.Generic;
  17. using System.Linq;
  18. using System.Text;
  19. using Gallio.Common;
  20. using Gallio.Framework;
  21. using MbUnit.Framework;
  22. using MbUnit.Framework.ContractVerifiers;
  23. using Gallio.Tests;
  24. using Gallio.Model;
  25. using System.Reflection;
  26. namespace MbUnit.Tests.Framework.ContractVerifiers
  27. {
  28. [TestFixture]
  29. [TestsOn(typeof(EqualityContract<>))]
  30. [RunSample(typeof(FullContractOnSimpleSample))]
  31. [RunSample(typeof(PartialContractOnSimpleSample))]
  32. [RunSample(typeof(StaticPartialContractOnSimpleSample))]
  33. [RunSample(typeof(FullContractOnInterfaceSample))]
  34. [RunSample(typeof(FullContractOnSampleWithEqualityInheritance))]
  35. [RunSample(typeof(PartialContractOnSampleWithMultipleUnrelatedEqualitable))]
  36. public class EqualityContractTest : AbstractContractTest
  37. {
  38. [Test]
  39. [Row(typeof(FullContractOnSimpleSample), "ObjectEquals", TestStatus.Passed)]
  40. [Row(typeof(FullContractOnSimpleSample), "HashCode", TestStatus.Passed)]
  41. [Row(typeof(FullContractOnSimpleSample), "EquatableEquals", TestStatus.Passed)]
  42. [Row(typeof(FullContractOnSimpleSample), "OperatorEquals", TestStatus.Passed)]
  43. [Row(typeof(FullContractOnSimpleSample), "OperatorNotEquals", TestStatus.Passed)]
  44. [Row(typeof(PartialContractOnSimpleSample), "ObjectEquals", TestStatus.Passed)]
  45. [Row(typeof(PartialContractOnSimpleSample), "HashCode", TestStatus.Passed)]
  46. [Row(typeof(PartialContractOnSimpleSample), "EquatableEquals", TestStatus.Passed)]
  47. [Row(typeof(PartialContractOnSimpleSample), "OperatorEquals", TestStatus.Inconclusive)]
  48. [Row(typeof(PartialContractOnSimpleSample), "OperatorNotEquals", TestStatus.Inconclusive)]
  49. [Row(typeof(StaticPartialContractOnSimpleSample), "ObjectEquals", TestStatus.Passed)]
  50. [Row(typeof(StaticPartialContractOnSimpleSample), "HashCode", TestStatus.Passed)]
  51. [Row(typeof(StaticPartialContractOnSimpleSample), "EquatableEquals", TestStatus.Passed)]
  52. [Row(typeof(StaticPartialContractOnSimpleSample), "OperatorEquals", TestStatus.Inconclusive)]
  53. [Row(typeof(StaticPartialContractOnSimpleSample), "OperatorNotEquals", TestStatus.Inconclusive)]
  54. [Row(typeof(FullContractOnInterfaceSample), "ObjectEquals", TestStatus.Passed)]
  55. [Row(typeof(FullContractOnInterfaceSample), "HashCode", TestStatus.Passed)]
  56. [Row(typeof(FullContractOnInterfaceSample), "EquatableEquals_ISampleEquatable", TestStatus.Passed)]
  57. [Row(typeof(FullContractOnInterfaceSample), "EquatableEquals_SampleParentEquatable", TestStatus.Passed)]
  58. [Row(typeof(FullContractOnInterfaceSample), "OperatorEquals", TestStatus.Passed)]
  59. [Row(typeof(FullContractOnInterfaceSample), "OperatorNotEquals", TestStatus.Passed)]
  60. [Row(typeof(FullContractOnSampleWithEqualityInheritance), "ObjectEquals", TestStatus.Passed)]
  61. [Row(typeof(FullContractOnSampleWithEqualityInheritance), "HashCode", TestStatus.Passed)]
  62. [Row(typeof(FullContractOnSampleWithEqualityInheritance), "EquatableEquals_ISampleEquatable", TestStatus.Passed)]
  63. [Row(typeof(FullContractOnSampleWithEqualityInheritance), "EquatableEquals_SampleParentEquatable", TestStatus.Passed)]
  64. [Row(typeof(FullContractOnSampleWithEqualityInheritance), "EquatableEquals_SampleChildEquatable", TestStatus.Passed)]
  65. [Row(typeof(FullContractOnSampleWithEqualityInheritance), "OperatorEquals", TestStatus.Passed)]
  66. [Row(typeof(FullContractOnSampleWithEqualityInheritance), "OperatorNotEquals", TestStatus.Passed)]
  67. [Row(typeof(PartialContractOnSampleWithMultipleUnrelatedEqualitable), "ObjectEquals", TestStatus.Passed)]
  68. [Row(typeof(PartialContractOnSampleWithMultipleUnrelatedEqualitable), "HashCode", TestStatus.Passed)]
  69. [Row(typeof(PartialContractOnSampleWithMultipleUnrelatedEqualitable), "EquatableEquals_String", TestStatus.Passed)]
  70. [Row(typeof(PartialContractOnSampleWithMultipleUnrelatedEqualitable), "EquatableEquals_Int32", TestStatus.Passed)]
  71. [Row(typeof(PartialContractOnSampleWithMultipleUnrelatedEqualitable), "EquatableEquals_SampleWithMultipleUnrelatedEquatable", TestStatus.Passed)]
  72. [Row(typeof(PartialContractOnSampleWithMultipleUnrelatedEqualitable), "OperatorEquals", TestStatus.Inconclusive)]
  73. [Row(typeof(PartialContractOnSampleWithMultipleUnrelatedEqualitable), "OperatorNotEquals", TestStatus.Inconclusive)]
  74. public void VerifySampleEqualityContract(Type fixtureType, string testMethodName, TestStatus expectedTestStatus)
  75. {
  76. VerifySampleContract("EqualityTests", fixtureType, testMethodName, expectedTestStatus);
  77. }
  78. [TestFixture, Explicit("Sample")]
  79. private class FullContractOnSimpleSample
  80. {
  81. [VerifyContract]
  82. public readonly IContract EqualityTests = new EqualityContract<SampleSimpleEquatable>
  83. {
  84. ImplementsOperatorOverloads = true,
  85. EquivalenceClasses =
  86. {
  87. { new SampleSimpleEquatable(123) },
  88. { new SampleSimpleEquatable(456) },
  89. { new SampleSimpleEquatable(789) }
  90. }
  91. };
  92. }
  93. [TestFixture, Explicit("Sample")]
  94. private class PartialContractOnSimpleSample
  95. {
  96. [VerifyContract]
  97. public readonly IContract EqualityTests = new EqualityContract<SampleSimpleEquatable>
  98. {
  99. ImplementsOperatorOverloads = false,
  100. EquivalenceClasses =
  101. {
  102. { new SampleSimpleEquatable(123) },
  103. { new SampleSimpleEquatable(456) },
  104. { new SampleSimpleEquatable(789) }
  105. }
  106. };
  107. }
  108. [TestFixture, Explicit("Sample")]
  109. private class StaticPartialContractOnSimpleSample
  110. {
  111. [VerifyContract]
  112. public readonly static IContract EqualityTests = new EqualityContract<SampleSimpleEquatable>
  113. {
  114. ImplementsOperatorOverloads = false,
  115. EquivalenceClasses =
  116. {
  117. { new SampleSimpleEquatable(123) },
  118. { new SampleSimpleEquatable(456) },
  119. { new SampleSimpleEquatable(789) }
  120. }
  121. };
  122. }
  123. [TestFixture, Explicit("Sample")]
  124. private class FullContractOnInterfaceSample
  125. {
  126. [VerifyContract]
  127. public readonly static IContract EqualityTests = new EqualityContract<ISampleEquatable>
  128. {
  129. ImplementsOperatorOverloads = true,
  130. EquivalenceClasses =
  131. {
  132. { new SampleParentEquatable(123) },
  133. { new SampleParentEquatable(456) },
  134. { new SampleParentEquatable(789) }
  135. }
  136. };
  137. }
  138. [TestFixture, Explicit("Sample")]
  139. private class FullContractOnSampleWithEqualityInheritance
  140. {
  141. [VerifyContract]
  142. public readonly static IContract EqualityTests = new EqualityContract<SampleParentEquatable>
  143. {
  144. ImplementsOperatorOverloads = true,
  145. EquivalenceClasses =
  146. {
  147. { new SampleParentEquatable(123), new SampleChildEquatable(123) },
  148. { new SampleChildEquatable(456) },
  149. { new SampleParentEquatable(789) }
  150. }
  151. };
  152. }
  153. [TestFixture, Explicit("Sample")]
  154. private class PartialContractOnSampleWithMultipleUnrelatedEqualitable
  155. {
  156. [VerifyContract]
  157. public readonly static IContract EqualityTests = new EqualityContract<SampleWithMultipleUnrelatedEquatable>
  158. {
  159. ImplementsOperatorOverloads = false,
  160. EquivalenceClasses =
  161. {
  162. { new SampleWithMultipleUnrelatedEquatable("123"), new SampleWithMultipleUnrelatedEquatable(" 123 "), 123, "123", " 123 " },
  163. { new SampleWithMultipleUnrelatedEquatable("456"), new SampleWithMultipleUnrelatedEquatable(" 456 "), 456, "456", " 456 " },
  164. { new SampleWithMultipleUnrelatedEquatable("789"), new SampleWithMultipleUnrelatedEquatable(" 789 "), 789, "789", " 789 " },
  165. }
  166. };
  167. }
  168. #region Samples
  169. private class SampleSimpleEquatable : IEquatable<SampleSimpleEquatable>
  170. {
  171. private readonly int value;
  172. public int Value
  173. {
  174. get { return value; }
  175. }
  176. public SampleSimpleEquatable(int value)
  177. {
  178. this.value = value;
  179. }
  180. public override int GetHashCode()
  181. {
  182. return value.GetHashCode();
  183. }
  184. public override bool Equals(object other)
  185. {
  186. return Equals(other as SampleSimpleEquatable);
  187. }
  188. public bool Equals(SampleSimpleEquatable other)
  189. {
  190. return (other != null) && (value == other.value);
  191. }
  192. public static bool operator ==(SampleSimpleEquatable left, SampleSimpleEquatable right)
  193. {
  194. return (ReferenceEquals(null, left) && ReferenceEquals(null, right))
  195. || (!ReferenceEquals(null, left) && left.Equals(right));
  196. }
  197. public static bool operator !=(SampleSimpleEquatable left, SampleSimpleEquatable right)
  198. {
  199. return !(left == right);
  200. }
  201. }
  202. private interface ISampleEquatable : IEquatable<ISampleEquatable>
  203. {
  204. }
  205. private class SampleParentEquatable : ISampleEquatable, IEquatable<SampleParentEquatable>
  206. {
  207. private readonly int value;
  208. public int Value
  209. {
  210. get { return value; }
  211. }
  212. public SampleParentEquatable(int value)
  213. {
  214. this.value = value;
  215. }
  216. public override int GetHashCode()
  217. {
  218. return value.GetHashCode();
  219. }
  220. public override bool Equals(object other)
  221. {
  222. return Equals(other as SampleParentEquatable);
  223. }
  224. public bool Equals(SampleParentEquatable other)
  225. {
  226. return !ReferenceEquals(null, other) && (value == other.value);
  227. }
  228. bool IEquatable<ISampleEquatable>.Equals(ISampleEquatable other)
  229. {
  230. return Equals(other as SampleParentEquatable);
  231. }
  232. public static bool operator ==(SampleParentEquatable left, SampleParentEquatable right)
  233. {
  234. return (ReferenceEquals(null, left) && ReferenceEquals(null, right))
  235. || (!ReferenceEquals(null, left) && left.Equals(right));
  236. }
  237. public static bool operator !=(SampleParentEquatable left, SampleParentEquatable right)
  238. {
  239. return !(left == right);
  240. }
  241. }
  242. private class SampleChildEquatable : SampleParentEquatable, IEquatable<SampleChildEquatable>
  243. {
  244. public SampleChildEquatable(int value)
  245. : base(value)
  246. {
  247. }
  248. public bool Equals(SampleChildEquatable other)
  249. {
  250. return base.Equals(other);
  251. }
  252. }
  253. private class SampleWithMultipleUnrelatedEquatable : IEquatable<SampleWithMultipleUnrelatedEquatable>, IEquatable<int>, IEquatable<string>
  254. {
  255. private readonly int value;
  256. public int Value
  257. {
  258. get { return value; }
  259. }
  260. public SampleWithMultipleUnrelatedEquatable(string value)
  261. {
  262. this.value = Int32.Parse(value.Trim());
  263. }
  264. public override bool Equals(object obj)
  265. {
  266. return Equals(obj as SampleWithMultipleUnrelatedEquatable)
  267. || Equals(obj as string)
  268. || ((obj is int) ? Equals((int)obj) : false);
  269. }
  270. public bool Equals(SampleWithMultipleUnrelatedEquatable other)
  271. {
  272. return (other != null)
  273. && (value == other.value);
  274. }
  275. public bool Equals(int other)
  276. {
  277. return value == other;
  278. }
  279. public bool Equals(string other)
  280. {
  281. int otherValue;
  282. return (other != null)
  283. && Int32.TryParse(other.Trim(), out otherValue)
  284. && value == otherValue;
  285. }
  286. public override int GetHashCode()
  287. {
  288. return value.GetHashCode();
  289. }
  290. }
  291. #endregion
  292. }
  293. }