public void NestedInterfaceWithOverrides() { var generatedType = CodeGenerationTypeMother.GetGeneratedMixinType(typeof(ClassOverridingMixinMembers), typeof(MixinWithAbstractMembers)); var overrideInterface = generatedType.GetNestedType("IOverriddenMethods"); Assert.That(overrideInterface, Is.Not.Null); var method = overrideInterface.GetMethod("AbstractMethod"); Assert.That(method, Is.Not.Null); Assert.That(method.ReturnType, Is.SameAs(typeof(string))); var parameters = method.GetParameters(); Assert.That(parameters.Length, Is.EqualTo(1)); Assert.That(parameters[0].ParameterType, Is.SameAs(typeof(int))); Assert.That(parameters[0].Name, Is.EqualTo("i")); var propertyAccessor = overrideInterface.GetMethod("get_AbstractProperty"); Assert.That(propertyAccessor, Is.Not.Null); var eventAccessor = overrideInterface.GetMethod("add_AbstractEvent"); Assert.That(eventAccessor, Is.Not.Null); }
public void CheckMixinArray_MatchingMixins_NeedDerived() { Type concreteMixinType = CodeGenerationTypeMother.GetGeneratedMixinType(typeof(ClassOverridingSpecificMixinMember), typeof(MixinWithVirtualMethod)); var initializer = CreateInitializer(typeof(ClassOverridingSpecificMixinMember), typeof(MixinWithVirtualMethod)); var mixin = Activator.CreateInstance(concreteMixinType); initializer.CheckMixinArray(new[] { mixin }); }
public void CheckMixinArray_NonMatchingMixins_NeedDerived() { Type concreteMixinType = CodeGenerationTypeMother.GetGeneratedMixinType(typeof(ClassOverridingSpecificMixinMember), typeof(MixinWithVirtualMethod)); MixinArrayInitializer initializer = CreateInitializer(typeof(ClassOverridingSpecificMixinMember), concreteMixinType); initializer.CheckMixinArray(new object[] { new MixinWithVirtualMethod() }); }
public void GetMixinArray_WithFittingSuppliedForDerivedMixin() { var mixin1 = new MixinWithVirtualMethod(); var concreteMixinType = CodeGenerationTypeMother.GetGeneratedMixinType(typeof(ClassOverridingSpecificMixinMember), typeof(MixinWithVirtualMethod)); MixinArrayInitializer initializer = CreateInitializer(typeof(ClassOverridingSpecificMixinMember), concreteMixinType); initializer.CreateMixinArray(new object[] { mixin1 }); }
public void TypeImplementedOverrideInterfaces_OfMixinTypes() { var concreteType = CreateMixedType(typeof(ClassOverridingMixinMembers), typeof(MixinWithAbstractMembers)); var concreteMixinType = CodeGenerationTypeMother.GetGeneratedMixinTypeAndMetadata( typeof(ClassOverridingMixinMembers), typeof(MixinWithAbstractMembers)); Assert.That(concreteType.GetInterfaces(), Has.Member(concreteMixinType.GeneratedOverrideInterface)); }
public void GeneratedMixinTypeHasMixinTypeAttribute() { Type generatedType = CodeGenerationTypeMother.GetGeneratedMixinType(typeof(ClassOverridingMixinMembers), typeof(MixinWithAbstractMembers)); Assert.That(generatedType.IsDefined(typeof(ConcreteMixinTypeAttribute), false), Is.True); var attributes = (ConcreteMixinTypeAttribute[])generatedType.GetCustomAttributes(typeof(ConcreteMixinTypeAttribute), false); Assert.That(attributes.Length, Is.EqualTo(1)); }
public void GetMixinArray_ForDerivedMixin() { Type concreteMixinType = CodeGenerationTypeMother.GetGeneratedMixinType(typeof(ClassOverridingMixinMembers), typeof(MixinWithAbstractMembers)); MixinArrayInitializer initializer = CreateInitializer(typeof(ClassOverridingMixinMembers), concreteMixinType); var mixinArray = initializer.CreateMixinArray(null); Assert.That(mixinArray.Length, Is.EqualTo(1)); Assert.That(mixinArray[0], Is.InstanceOf(typeof(MixinWithAbstractMembers))); Assert.That(mixinArray[0].GetType(), Is.Not.SameAs(typeof(MixinWithAbstractMembers))); }
public void GetMixinArray_WithFittingDerivedSuppliedForDerivedMixin() { using (MixinConfiguration.BuildNew().ForClass <ClassOverridingSpecificMixinMember> ().AddMixin <MixinWithVirtualMethod> ().EnterScope()) { var concreteMixinType = CodeGenerationTypeMother.GetGeneratedMixinType(typeof(ClassOverridingSpecificMixinMember), typeof(MixinWithVirtualMethod)); var initializer = CreateInitializer(typeof(ClassOverridingSpecificMixinMember), concreteMixinType); var mixin1 = Activator.CreateInstance(concreteMixinType); var mixins = initializer.CreateMixinArray(new[] { mixin1 }); Assert.That(mixins, Is.EqualTo(new[] { mixin1 })); } }
public void IdentifierMember_HoldsIdentifier() { var requestingClass = MixinConfiguration.ActiveConfiguration.GetContext(typeof(ClassOverridingMixinMembers)); MixinDefinition mixinDefinition = DefinitionObjectMother.GetTargetClassDefinition(requestingClass).Mixins[typeof(MixinWithAbstractMembers)]; Assert.That(mixinDefinition, Is.Not.Null); Type generatedType = CodeGenerationTypeMother.GetGeneratedMixinType(requestingClass, typeof(MixinWithAbstractMembers)); var identifier = generatedType.GetField("__identifier").GetValue(null); Assert.That(identifier, Is.EqualTo(mixinDefinition.GetConcreteMixinTypeIdentifier())); }
public void MixinTypeAttribute_CanBeUsedToGetIdentifier() { var requestingClass = MixinConfiguration.ActiveConfiguration.GetContext(typeof(ClassOverridingMixinMembers)); MixinDefinition mixinDefinition = DefinitionObjectMother.GetTargetClassDefinition(requestingClass).Mixins[typeof(MixinWithAbstractMembers)]; Assert.That(mixinDefinition, Is.Not.Null); Type generatedType = CodeGenerationTypeMother.GetGeneratedMixinType(requestingClass, typeof(MixinWithAbstractMembers)); Assert.That(generatedType.IsDefined(typeof(ConcreteMixinTypeAttribute), false), Is.True); var attributes = (ConcreteMixinTypeAttribute[])generatedType.GetCustomAttributes(typeof(ConcreteMixinTypeAttribute), false); Assert.That(attributes[0].GetIdentifier(), Is.EqualTo(mixinDefinition.GetConcreteMixinTypeIdentifier())); }
public void TypeImplementedOverrideInterfaces_OfMixinTypes_ProtectedOverriders() { var concreteType = CreateMixedType(typeof(ClassOverridingMixinMembersProtected), typeof(MixinWithAbstractMembers)); var concreteMixinType = CodeGenerationTypeMother.GetGeneratedMixinTypeAndMetadata( typeof(ClassOverridingMixinMembersProtected), typeof(MixinWithAbstractMembers)); Assert.That(concreteType.GetInterfaces(), Has.Member(concreteMixinType.GeneratedOverrideInterface)); var abstractMethodWrapperName = MethodOverrideUtility.GetNameForExplicitOverride(concreteMixinType.GeneratedOverrideInterface.GetMethod("AbstractMethod")); var explicitInterfaceMember = concreteType.GetMethod(abstractMethodWrapperName, BindingFlags.NonPublic | BindingFlags.Instance); Assert.That(explicitInterfaceMember, Is.Not.Null); var abstractGetterWrapperName = MethodOverrideUtility.GetNameForExplicitOverride(concreteMixinType.GeneratedOverrideInterface.GetMethod("get_AbstractProperty")); var explicitInterfacePropertyGetter = concreteType.GetMethod( abstractGetterWrapperName, BindingFlags.NonPublic | BindingFlags.Instance); Assert.That(explicitInterfacePropertyGetter, Is.Not.Null); }
public void GeneratedTypeImplementsMarkerInterface() { Type generatedType = CodeGenerationTypeMother.GetGeneratedMixinType(typeof(ClassOverridingMixinMembers), typeof(MixinWithAbstractMembers)); Assert.That(typeof(IGeneratedMixinType).IsAssignableFrom(generatedType), Is.True); }