/src/Castle.Core.Tests/MixinDataTestCase.cs

https://github.com/mirajavora/Castle.Core-READONLY · C# · 196 lines · 159 code · 24 blank · 13 comment · 0 complexity · 17559ba9e15f3f38210f9179f3a88730 MD5 · raw file

  1. // Copyright 2004-2010 Castle Project - http://www.castleproject.org/
  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. namespace Castle.DynamicProxy.Tests
  15. {
  16. using System;
  17. using System.Collections.Generic;
  18. using Castle.DynamicProxy.Tests.Mixins;
  19. using NUnit.Framework;
  20. [TestFixture]
  21. public class MixinDataTestCase
  22. {
  23. private SimpleMixin simpleMixin;
  24. private OtherMixin otherMixin;
  25. private ComplexMixin complexMixin;
  26. [SetUp]
  27. public void SetUp()
  28. {
  29. simpleMixin = new SimpleMixin();
  30. otherMixin = new OtherMixin();
  31. complexMixin = new ComplexMixin();
  32. }
  33. [Test]
  34. public void Mixins()
  35. {
  36. MixinData mixinData = new MixinData(new object[] {simpleMixin});
  37. List<object> mixins = new List<object>(mixinData.Mixins);
  38. Assert.AreEqual(1, mixins.Count);
  39. Assert.AreSame(simpleMixin, mixins[0]);
  40. }
  41. [Test]
  42. public void ContainsMixinWithInterface()
  43. {
  44. MixinData mixinData = new MixinData(new object[] { simpleMixin });
  45. Assert.IsTrue(mixinData.ContainsMixin(typeof(ISimpleMixin)));
  46. Assert.IsFalse(mixinData.ContainsMixin(typeof(IOtherMixin)));
  47. }
  48. [Test]
  49. public void MixinsNotImplementingInterfacesAreIgnored()
  50. {
  51. MixinData mixinData = new MixinData(new object[] {new object()});
  52. List<object> mixins = new List<object>(mixinData.Mixins);
  53. Assert.AreEqual(0, mixins.Count);
  54. }
  55. [Test]
  56. public void MixinsAreSortedByInterface()
  57. {
  58. MixinData mixinData1 = new MixinData(new object[] {simpleMixin, otherMixin});
  59. List<object> mixins1 = new List<object>(mixinData1.Mixins);
  60. Assert.AreEqual(2, mixins1.Count);
  61. Assert.AreSame(otherMixin, mixins1[0]);
  62. Assert.AreSame(simpleMixin, mixins1[1]);
  63. MixinData mixinData2 = new MixinData(new object[] {otherMixin, simpleMixin});
  64. List<object> mixins2 = new List<object>(mixinData2.Mixins);
  65. Assert.AreEqual(2, mixins2.Count);
  66. Assert.AreSame(otherMixin, mixins2[0]);
  67. Assert.AreSame(simpleMixin, mixins2[1]);
  68. }
  69. [Test]
  70. public void MixinInterfaces()
  71. {
  72. MixinData mixinData = new MixinData(new object[] { simpleMixin });
  73. List<Type> mixinInterfaces = new List<Type>(mixinData.MixinInterfaces);
  74. Assert.AreEqual(1, mixinInterfaces.Count);
  75. Assert.AreSame(mixinInterfaces[0], typeof (ISimpleMixin));
  76. }
  77. [Test]
  78. public void MixinInterfaces_SortedLikeMixins()
  79. {
  80. MixinData mixinData1 = new MixinData(new object[] { simpleMixin, otherMixin });
  81. List<Type> mixinInterfaces1 = new List<Type>(mixinData1.MixinInterfaces);
  82. Assert.AreEqual(2, mixinInterfaces1.Count);
  83. Assert.AreSame(typeof(IOtherMixin), mixinInterfaces1[0]);
  84. Assert.AreSame(typeof(ISimpleMixin), mixinInterfaces1[1]);
  85. MixinData mixinData2 = new MixinData(new object[] { otherMixin, simpleMixin });
  86. List<Type> mixinInterfaces2 = new List<Type>(mixinData2.MixinInterfaces);
  87. Assert.AreEqual(2, mixinInterfaces2.Count);
  88. Assert.AreSame(typeof (IOtherMixin), mixinInterfaces2[0]);
  89. Assert.AreSame(typeof (ISimpleMixin), mixinInterfaces2[1]);
  90. }
  91. [Test]
  92. public void GetMixinPosition()
  93. {
  94. MixinData mixinData = new MixinData(new object[] { simpleMixin });
  95. Assert.AreEqual(0, mixinData.GetMixinPosition(typeof(ISimpleMixin)));
  96. }
  97. [Test]
  98. public void GetMixinPosition_MatchesMixinInstances()
  99. {
  100. MixinData mixinData1 = new MixinData(new object[] {simpleMixin, otherMixin});
  101. Assert.AreEqual(0, mixinData1.GetMixinPosition(typeof(IOtherMixin)));
  102. Assert.AreEqual(1, mixinData1.GetMixinPosition(typeof(ISimpleMixin)));
  103. MixinData mixinData2 = new MixinData(new object[] {otherMixin, simpleMixin});
  104. Assert.AreEqual(0, mixinData2.GetMixinPosition(typeof(IOtherMixin)));
  105. Assert.AreEqual(1, mixinData2.GetMixinPosition(typeof(ISimpleMixin)));
  106. }
  107. [Test]
  108. public void GetMixinPosition_MatchesMixinInstances_WithMultipleInterfacesPerMixin()
  109. {
  110. MixinData mixinData = new MixinData(new object[] { complexMixin, simpleMixin });
  111. Assert.AreEqual(0, mixinData.GetMixinPosition(typeof(IFirst)));
  112. Assert.AreEqual(1, mixinData.GetMixinPosition(typeof(ISecond)));
  113. Assert.AreEqual(2, mixinData.GetMixinPosition(typeof(ISimpleMixin)));
  114. Assert.AreEqual(3, mixinData.GetMixinPosition(typeof(IThird)));
  115. List<object> mixins = new List<object>(mixinData.Mixins);
  116. Assert.AreSame(complexMixin, mixins[0]);
  117. Assert.AreSame(complexMixin, mixins[1]);
  118. Assert.AreSame(simpleMixin, mixins[2]);
  119. Assert.AreSame(complexMixin, mixins[3]);
  120. }
  121. [Test]
  122. public void Equals_True_WithDifferentOrder()
  123. {
  124. MixinData mixinData1 = new MixinData(new object[] {simpleMixin, otherMixin});
  125. MixinData mixinData2 = new MixinData(new object[] {otherMixin, simpleMixin});
  126. Assert.AreEqual(mixinData1, mixinData2);
  127. }
  128. [Test]
  129. public void Equals_True_WithDifferentInstances()
  130. {
  131. MixinData mixinData1 = new MixinData(new object[] {simpleMixin, otherMixin});
  132. MixinData mixinData2 = new MixinData(new object[] {new SimpleMixin(), new OtherMixin()});
  133. Assert.AreEqual(mixinData1, mixinData2);
  134. }
  135. [Test]
  136. public void Equals_False_WithDifferentInstances()
  137. {
  138. MixinData mixinData1 = new MixinData(new object[] {simpleMixin, otherMixin});
  139. MixinData mixinData2 = new MixinData(new object[] {simpleMixin, complexMixin});
  140. Assert.AreNotEqual(mixinData1, mixinData2);
  141. }
  142. [Test]
  143. public void Equals_False_WithInstanceCount()
  144. {
  145. MixinData mixinData1 = new MixinData(new object[] {otherMixin});
  146. MixinData mixinData2 = new MixinData(new object[] {otherMixin, simpleMixin});
  147. Assert.AreNotEqual(mixinData1, mixinData2);
  148. }
  149. [Test]
  150. public void GetHashCode_Equal_WithDifferentOrder()
  151. {
  152. MixinData mixinData1 = new MixinData(new object[] {simpleMixin, otherMixin});
  153. MixinData mixinData2 = new MixinData(new object[] {otherMixin, simpleMixin});
  154. Assert.AreEqual(mixinData1.GetHashCode(), mixinData2.GetHashCode());
  155. }
  156. [Test]
  157. public void GetHashCode_Equal_WithDifferentInstances()
  158. {
  159. MixinData mixinData1 = new MixinData(new object[] {simpleMixin, otherMixin});
  160. MixinData mixinData2 = new MixinData(new object[] {new SimpleMixin(), new OtherMixin()});
  161. Assert.AreEqual(mixinData1.GetHashCode(), mixinData2.GetHashCode());
  162. }
  163. [Test]
  164. [ExpectedException(typeof(ArgumentException))]
  165. public void TwoMixinsWithSameInterfaces()
  166. {
  167. SimpleMixin mixin1 = new SimpleMixin();
  168. OtherMixinImplementingISimpleMixin mixin2 = new OtherMixinImplementingISimpleMixin();
  169. new MixinData(new object[] { mixin1, mixin2 });
  170. }
  171. }
  172. }