public void Equals_True_WithDifferentOrder() { MixinData mixinData1 = new MixinData(new object[] { simpleMixin, otherMixin }); MixinData mixinData2 = new MixinData(new object[] { otherMixin, simpleMixin }); Assert.AreEqual(mixinData1, mixinData2); }
public void GetMixinInterfaceImplementationsAsArray() { MixinData mixinData = new MixinData(new object[] {simpleMixin}); object[] mixinsAsArray = mixinData.GetMixinInterfaceImplementationsAsArray(); Assert.AreEqual(1, mixinsAsArray.Length); Assert.AreSame(simpleMixin, mixinsAsArray[0]); }
public void Equals_false_for_two_instances_having_compatible_delegate_type_mixins() { MixinData mixinData1 = new MixinData(new object[] { typeof(Func <object, bool>) }); MixinData mixinData2 = new MixinData(new object[] { typeof(Predicate <object>) }); Assert.AreNotEqual(mixinData1, mixinData2); }
public void Equals_False_WithInstanceCount() { MixinData mixinData1 = new MixinData(new object[] { otherMixin }); MixinData mixinData2 = new MixinData(new object[] { otherMixin, simpleMixin }); Assert.AreNotEqual(mixinData1, mixinData2); }
public void MixinInterfaces() { MixinData mixinData = new MixinData(new object[] { simpleMixin }); List<Type> mixinInterfaces = new List<Type>(mixinData.MixinInterfaces); Assert.AreEqual(1, mixinInterfaces.Count); Assert.AreSame(mixinInterfaces[0], typeof (ISimpleMixin)); }
public void GetHashCode_Equal_WithDifferentInstances() { MixinData mixinData1 = new MixinData(new object[] { simpleMixin, otherMixin }); MixinData mixinData2 = new MixinData(new object[] { new SimpleMixin(), new OtherMixin() }); Assert.AreEqual(mixinData1.GetHashCode(), mixinData2.GetHashCode()); }
public void GetHashCode_Equal_WithDifferentOrder() { MixinData mixinData1 = new MixinData(new object[] { simpleMixin, otherMixin }); MixinData mixinData2 = new MixinData(new object[] { otherMixin, simpleMixin }); Assert.AreEqual(mixinData1.GetHashCode(), mixinData2.GetHashCode()); }
public void ContainsMixinWithInterface() { MixinData mixinData = new MixinData(new object[] { simpleMixin }); Assert.IsTrue(mixinData.ContainsMixin(typeof(ISimpleMixin))); Assert.IsFalse(mixinData.ContainsMixin(typeof(IOtherMixin))); }
public void Mixins() { MixinData mixinData = new MixinData(new object[] {simpleMixin}); List<object> mixins = new List<object>(mixinData.Mixins); Assert.AreEqual(1, mixins.Count); Assert.AreSame(simpleMixin, mixins[0]); }
public void MixinsNotImplementingInterfacesAreIgnored() { MixinData mixinData = new MixinData(new object[] { new object() }); List <object> mixins = new List <object>(mixinData.Mixins); Assert.AreEqual(0, mixins.Count); }
public void GetHashCode_equal_for_two_instances_having_different_delegate_type_mixins() { MixinData mixinData1 = new MixinData(new object[] { typeof(Action) }); MixinData mixinData2 = new MixinData(new object[] { typeof(Action <int>) }); Assert.AreEqual(mixinData1.GetHashCode(), mixinData2.GetHashCode()); }
public void MixinData() { _options1.Initialize(); MixinData data = _options1.MixinData; Assert.AreEqual(0, new List <object>(data.Mixins).Count); }
public void Equals_False_WithDifferentInstances() { MixinData mixinData1 = new MixinData(new object[] { simpleMixin, otherMixin }); MixinData mixinData2 = new MixinData(new object[] { simpleMixin, complexMixin }); Assert.AreNotEqual(mixinData1, mixinData2); }
public void Equals_true_for_two_instances_having_same_delegate_type_mixins() { MixinData mixinData1 = new MixinData(new object[] { typeof(Action) }); MixinData mixinData2 = new MixinData(new object[] { typeof(Action) }); Assert.AreEqual(mixinData1, mixinData2); }
public void Equals_false_for_two_instances_having_different_delegate_type_mixins() { MixinData mixinData1 = new MixinData(new object[] { typeof(Action) }); MixinData mixinData2 = new MixinData(new object[] { typeof(Action <int>) }); Assert.AreNotEqual(mixinData1, mixinData2); }
public void Equals_True_WithDifferentInstances() { MixinData mixinData1 = new MixinData(new object[] { simpleMixin, otherMixin }); MixinData mixinData2 = new MixinData(new object[] { new SimpleMixin(), new OtherMixin() }); Assert.AreEqual(mixinData1, mixinData2); }
public void Mixins() { MixinData mixinData = new MixinData(new object[] { simpleMixin }); List <object> mixins = new List <object>(mixinData.Mixins); Assert.AreEqual(1, mixins.Count); Assert.AreSame(simpleMixin, mixins[0]); }
public void Ctor_succeeds_when_mixing_regular_mixin_instances_with_delegate_type_mixins() { var mixinData = new MixinData(new object[] { new NotADelegate(), typeof(Action), }); }
public void MixinData_NeedsInitialize() { Assert.Throws <InvalidOperationException>(delegate { #pragma warning disable 219 MixinData data = _options1.MixinData; #pragma warning restore 219 }); }
public void MixinData_WithMixins() { _options1.AddMixinInstance(new SimpleMixin()); _options1.Initialize(); MixinData data = _options1.MixinData; Assert.AreEqual(1, new List <object>(data.Mixins).Count); }
public void MixinInterfaces() { MixinData mixinData = new MixinData(new object[] { simpleMixin }); List <Type> mixinInterfaces = new List <Type>(mixinData.MixinInterfaces); Assert.AreEqual(1, mixinInterfaces.Count); Assert.AreSame(mixinInterfaces[0], typeof(ISimpleMixin)); }
public void MixinData_NoReInitializeWhenNothingChanged() { _options1.AddMixinInstance(new SimpleMixin()); _options1.Initialize(); MixinData data1 = _options1.MixinData; _options1.Initialize(); MixinData data2 = _options1.MixinData; Assert.AreSame(data1, data2); }
public void MixinInterfacesAndPositions_SortedLikeMixins() { MixinData mixinData1 = new MixinData(new object[] {simpleMixin, otherMixin}); Assert.AreEqual(2, mixinData1.MixinInterfacesAndPositions.Count); Assert.AreEqual(0, mixinData1.MixinInterfacesAndPositions[typeof (IOtherMixin)]); Assert.AreEqual(1, mixinData1.MixinInterfacesAndPositions[typeof (ISimpleMixin)]); MixinData mixinData2 = new MixinData(new object[] {otherMixin, simpleMixin}); Assert.AreEqual(2, mixinData2.MixinInterfacesAndPositions.Count); Assert.AreEqual(0, mixinData2.MixinInterfacesAndPositions[typeof (IOtherMixin)]); Assert.AreEqual(1, mixinData2.MixinInterfacesAndPositions[typeof (ISimpleMixin)]); }
public void GetMixinPosition_MatchesMixinInstances() { MixinData mixinData1 = new MixinData(new object[] { simpleMixin, otherMixin }); Assert.AreEqual(0, mixinData1.GetMixinPosition(typeof(IOtherMixin))); Assert.AreEqual(1, mixinData1.GetMixinPosition(typeof(ISimpleMixin))); MixinData mixinData2 = new MixinData(new object[] { otherMixin, simpleMixin }); Assert.AreEqual(0, mixinData2.GetMixinPosition(typeof(IOtherMixin))); Assert.AreEqual(1, mixinData2.GetMixinPosition(typeof(ISimpleMixin))); }
public void MixinsAreSortedByInterface() { MixinData mixinData1 = new MixinData(new object[] {simpleMixin, otherMixin}); List<object> mixins1 = new List<object>(mixinData1.Mixins); Assert.AreEqual(2, mixins1.Count); Assert.AreSame(otherMixin, mixins1[0]); Assert.AreSame(simpleMixin, mixins1[1]); MixinData mixinData2 = new MixinData(new object[] {otherMixin, simpleMixin}); List<object> mixins2 = new List<object>(mixinData2.Mixins); Assert.AreEqual(2, mixins2.Count); Assert.AreSame(otherMixin, mixins2[0]); Assert.AreSame(simpleMixin, mixins2[1]); }
public void MixinsAreSortedByInterface() { MixinData mixinData1 = new MixinData(new object[] {simpleMixin, otherMixin}); object[] mixinsAsArray1 = mixinData1.GetMixinInterfaceImplementationsAsArray(); Assert.AreEqual(2, mixinsAsArray1.Length); Assert.AreSame(otherMixin, mixinsAsArray1[0]); Assert.AreSame(simpleMixin, mixinsAsArray1[1]); MixinData mixinData2 = new MixinData(new object[] {otherMixin, simpleMixin}); object[] mixinsAsArray2 = mixinData2.GetMixinInterfaceImplementationsAsArray(); Assert.AreEqual(2, mixinsAsArray2.Length); Assert.AreSame(otherMixin, mixinsAsArray2[0]); Assert.AreSame(simpleMixin, mixinsAsArray2[1]); }
public void MixinData_ReInitializeWhenMixinsChanged() { _options1.AddMixinInstance(new SimpleMixin()); _options1.Initialize(); MixinData data1 = _options1.MixinData; _options1.AddMixinInstance(new OtherMixin()); _options1.Initialize(); MixinData data2 = _options1.MixinData; Assert.AreNotSame(data1, data2); Assert.AreEqual(1, new List <object>(data1.Mixins).Count); Assert.AreEqual(2, new List <object>(data2.Mixins).Count); }
public void GetMixinPosition_MatchesMixinInstances_WithMultipleInterfacesPerMixin() { MixinData mixinData = new MixinData(new object[] { complexMixin, simpleMixin }); Assert.AreEqual(0, mixinData.GetMixinPosition(typeof(IFirst))); Assert.AreEqual(1, mixinData.GetMixinPosition(typeof(ISecond))); Assert.AreEqual(2, mixinData.GetMixinPosition(typeof(ISimpleMixin))); Assert.AreEqual(3, mixinData.GetMixinPosition(typeof(IThird))); List <object> mixins = new List <object>(mixinData.Mixins); Assert.AreSame(complexMixin, mixins[0]); Assert.AreSame(complexMixin, mixins[1]); Assert.AreSame(simpleMixin, mixins[2]); Assert.AreSame(complexMixin, mixins[3]); }
public void MixinsAreSortedByInterface() { MixinData mixinData1 = new MixinData(new object[] { simpleMixin, otherMixin }); List <object> mixins1 = new List <object>(mixinData1.Mixins); Assert.AreEqual(2, mixins1.Count); Assert.AreSame(otherMixin, mixins1[0]); Assert.AreSame(simpleMixin, mixins1[1]); MixinData mixinData2 = new MixinData(new object[] { otherMixin, simpleMixin }); List <object> mixins2 = new List <object>(mixinData2.Mixins); Assert.AreEqual(2, mixins2.Count); Assert.AreSame(otherMixin, mixins2[0]); Assert.AreSame(simpleMixin, mixins2[1]); }
public void MixinInterfaces_SortedLikeMixins() { MixinData mixinData1 = new MixinData(new object[] { simpleMixin, otherMixin }); List <Type> mixinInterfaces1 = new List <Type>(mixinData1.MixinInterfaces); Assert.AreEqual(2, mixinInterfaces1.Count); Assert.AreSame(typeof(IOtherMixin), mixinInterfaces1[0]); Assert.AreSame(typeof(ISimpleMixin), mixinInterfaces1[1]); MixinData mixinData2 = new MixinData(new object[] { otherMixin, simpleMixin }); List <Type> mixinInterfaces2 = new List <Type>(mixinData2.MixinInterfaces); Assert.AreEqual(2, mixinInterfaces2.Count); Assert.AreSame(typeof(IOtherMixin), mixinInterfaces2[0]); Assert.AreSame(typeof(ISimpleMixin), mixinInterfaces2[1]); }
public void GetMixinPosition_MatchesMixinInstances() { MixinData mixinData1 = new MixinData(new object[] {simpleMixin, otherMixin}); Assert.AreEqual(0, mixinData1.GetMixinPosition(typeof(IOtherMixin))); Assert.AreEqual(1, mixinData1.GetMixinPosition(typeof(ISimpleMixin))); MixinData mixinData2 = new MixinData(new object[] {otherMixin, simpleMixin}); Assert.AreEqual(0, mixinData2.GetMixinPosition(typeof(IOtherMixin))); Assert.AreEqual(1, mixinData2.GetMixinPosition(typeof(ISimpleMixin))); }
public void GetMixinPosition_MatchesMixinInstances_WithMultipleInterfacesPerMixin() { MixinData mixinData = new MixinData(new object[] { complexMixin, simpleMixin }); Assert.AreEqual(0, mixinData.GetMixinPosition(typeof(IFirst))); Assert.AreEqual(1, mixinData.GetMixinPosition(typeof(ISecond))); Assert.AreEqual(2, mixinData.GetMixinPosition(typeof(ISimpleMixin))); Assert.AreEqual(3, mixinData.GetMixinPosition(typeof(IThird))); List<object> mixins = new List<object>(mixinData.Mixins); Assert.AreSame(complexMixin, mixins[0]); Assert.AreSame(complexMixin, mixins[1]); Assert.AreSame(simpleMixin, mixins[2]); Assert.AreSame(complexMixin, mixins[3]); }
public void Equals_True_WithDifferentOrder() { MixinData mixinData1 = new MixinData(new object[] {simpleMixin, otherMixin}); MixinData mixinData2 = new MixinData(new object[] {otherMixin, simpleMixin}); Assert.AreEqual(mixinData1, mixinData2); }
Expression <Action <object> > MakeInitExpression(Type proxyType, IInterceptorSelector selector, MixinData mixins) { var fields = proxyType.GetFields().ToDictionary(f => f.Name); var parameter = Expression.Parameter(typeof(object)); var variable = Expression.Variable(proxyType); var expressions = new List <Expression>(); expressions.Add(Expression.Assign(variable, Expression.Convert(parameter, proxyType))); expressions.Add(Expression.Assign( Expression.MakeMemberAccess(variable, fields["__selector"]), Expression.Constant(selector) )); expressions.AddRange(mixins.MixinInterfaces.Zip(mixins.Mixins, (t, o) => Expression.Assign( Expression.MakeMemberAccess(variable, fields["__mixin_" + t.FullName.Replace(".", "_")]), Expression.New(o.GetType()) ) )); return(Expression.Lambda <Action <object> >(Expression.Block(new[] { variable }, expressions), parameter)); }
public void MixinsNotImplementingInterfacesAreIgnored() { MixinData mixinData = new MixinData(new object[] {new object()}); object[] mixinsAsArray = mixinData.GetMixinInterfaceImplementationsAsArray(); Assert.AreEqual(0, mixinsAsArray.Length); }
public void GetMixinPosition() { MixinData mixinData = new MixinData(new object[] { simpleMixin }); Assert.AreEqual(0, mixinData.GetMixinPosition(typeof(ISimpleMixin))); }
public void GetHashCode_Equal_WithDifferentOrder() { MixinData mixinData1 = new MixinData(new object[] {simpleMixin, otherMixin}); MixinData mixinData2 = new MixinData(new object[] {otherMixin, simpleMixin}); Assert.AreEqual(mixinData1.GetHashCode(), mixinData2.GetHashCode()); }
public void GetHashCode_Equal_WithDifferentInstances() { MixinData mixinData1 = new MixinData(new object[] {simpleMixin, otherMixin}); MixinData mixinData2 = new MixinData(new object[] {new SimpleMixin(), new OtherMixin()}); Assert.AreEqual(mixinData1.GetHashCode(), mixinData2.GetHashCode()); }
public void MixinsNotImplementingInterfacesAreIgnored() { MixinData mixinData = new MixinData(new object[] {new object()}); List<object> mixins = new List<object>(mixinData.Mixins); Assert.AreEqual(0, mixins.Count); }
public void MixinInterfaces_SortedLikeMixins() { MixinData mixinData1 = new MixinData(new object[] { simpleMixin, otherMixin }); List<Type> mixinInterfaces1 = new List<Type>(mixinData1.MixinInterfaces); Assert.AreEqual(2, mixinInterfaces1.Count); Assert.AreSame(typeof(IOtherMixin), mixinInterfaces1[0]); Assert.AreSame(typeof(ISimpleMixin), mixinInterfaces1[1]); MixinData mixinData2 = new MixinData(new object[] { otherMixin, simpleMixin }); List<Type> mixinInterfaces2 = new List<Type>(mixinData2.MixinInterfaces); Assert.AreEqual(2, mixinInterfaces2.Count); Assert.AreSame(typeof (IOtherMixin), mixinInterfaces2[0]); Assert.AreSame(typeof (ISimpleMixin), mixinInterfaces2[1]); }
public void Equals_False_WithInstanceCount() { MixinData mixinData1 = new MixinData(new object[] {otherMixin}); MixinData mixinData2 = new MixinData(new object[] {otherMixin, simpleMixin}); Assert.AreNotEqual(mixinData1, mixinData2); }
public void MixinData_NeedsInitialize() { #pragma warning disable 219 MixinData data = _options1.MixinData; #pragma warning restore 219 }
public void Equals_False_WithDifferentInstances() { MixinData mixinData1 = new MixinData(new object[] {simpleMixin, otherMixin}); MixinData mixinData2 = new MixinData(new object[] {simpleMixin, complexMixin}); Assert.AreNotEqual(mixinData1, mixinData2); }
public void MixinInterfacesAndPositions() { MixinData mixinData = new MixinData(new object[] {simpleMixin}); Assert.AreEqual(1, mixinData.MixinInterfacesAndPositions.Count); Assert.AreEqual(0, mixinData.MixinInterfacesAndPositions[typeof (ISimpleMixin)]); }
public void Equals_True_WithDifferentInstances() { MixinData mixinData1 = new MixinData(new object[] {simpleMixin, otherMixin}); MixinData mixinData2 = new MixinData(new object[] {new SimpleMixin(), new OtherMixin()}); Assert.AreEqual(mixinData1, mixinData2); }
public void MixinData_NeedsInitialize() { MixinData data = _options1.MixinData; }
Tuple <string, Expression <Func <object[], object> > > MakeCreateExpression(Type proxyType, IInterceptorSelector selector, MixinData mixins, ConstructorInfo ctor, ParameterInfo[] ctorArgs) { var key = new StringBuilder(); var ctorArgsParameter = Expression.Parameter(typeof(object[])); var arguments = mixins.Mixins.Select(m => Expression.New(m.GetType())).Cast <Expression>().ToList(); arguments.Add(Expression.Convert(Expression.Constant(null), typeof(IInterceptor[]))); arguments.Add(Expression.Constant(selector)); for (int i = arguments.Count, j = 0; i < ctorArgs.Length; i++, j++) { key.Append(ctorArgs[i].ParameterType.ToString()); var argExpr = Expression.ArrayIndex(ctorArgsParameter, Expression.Constant(j)); arguments.Add(Expression.ConvertChecked(argExpr, ctorArgs[i].ParameterType)); } var body = Expression.New(ctor, arguments); var method = Expression.Lambda <Func <object[], object> >(body, ctorArgsParameter); return(Tuple.Create(key.ToString(), method)); }