public void Events()
        {
            TargetClassDefinition targetClass = DefinitionObjectMother.GetActiveTargetClassDefinition(typeof(BaseType1));

            EventInfo baseEvent1 = typeof(BaseType1).GetEvent("VirtualEvent");
            EventInfo baseEvent2 = typeof(BaseType1).GetEvent("ExplicitEvent");
            EventInfo mixinEvent = typeof(BT1Mixin1).GetEvent("VirtualEvent");

            Assert.That(targetClass.Events.ContainsKey(baseEvent1), Is.True);
            Assert.That(targetClass.Events.ContainsKey(baseEvent2), Is.True);
            Assert.That(targetClass.Events.ContainsKey(mixinEvent), Is.False);

            EventDefinition member = targetClass.Events[baseEvent1];

            Assert.That(new List <MemberDefinitionBase> (targetClass.GetAllMembers()).Contains(member), Is.True);
            Assert.That(new List <MemberDefinitionBase> (targetClass.Mixins[typeof(BT1Mixin1)].GetAllMembers()).Contains(member), Is.False);

            Assert.That(member.Name, Is.EqualTo("VirtualEvent"));
            Assert.That(member.FullName, Is.EqualTo(typeof(BaseType1).FullName + ".VirtualEvent"));
            Assert.That(member.IsEvent, Is.True);
            Assert.That(member.IsMethod, Is.False);
            Assert.That(member.IsProperty, Is.False);
            Assert.That(member.DeclaringClass, Is.SameAs(targetClass));
            Assert.That(member.AddMethod, Is.Not.Null);
            Assert.That(member.RemoveMethod, Is.Not.Null);

            Assert.That(targetClass.Methods.ContainsKey(member.AddMethod.MethodInfo), Is.False);
            Assert.That(targetClass.Methods.ContainsKey(member.RemoveMethod.MethodInfo), Is.False);

            Assert.That(member.AddMethod.Parent, Is.SameAs(member));
            Assert.That(member.RemoveMethod.Parent, Is.SameAs(member));

            member = targetClass.Events[baseEvent2];
            Assert.That(member.AddMethod, Is.Not.Null);
            Assert.That(member.RemoveMethod, Is.Not.Null);

            MixinDefinition mixin1 = targetClass.Mixins[typeof(BT1Mixin1)];

            Assert.That(mixin1.Events.ContainsKey(baseEvent1), Is.False);
            Assert.That(mixin1.Events.ContainsKey(mixinEvent), Is.True);

            member = mixin1.Events[mixinEvent];

            Assert.That(new List <MemberDefinitionBase> (mixin1.GetAllMembers()).Contains(member), Is.True);

            Assert.That(member.Name, Is.EqualTo("VirtualEvent"));
            Assert.That(member.FullName, Is.EqualTo(typeof(BT1Mixin1).FullName + ".VirtualEvent"));
            Assert.That(member.IsEvent, Is.True);
            Assert.That(member.IsMethod, Is.False);
            Assert.That(member.IsProperty, Is.False);
            Assert.That(member.DeclaringClass, Is.SameAs(mixin1));

            Assert.That(member.AddMethod, Is.Not.Null);
            Assert.That(member.RemoveMethod, Is.Not.Null);
        }
        public void Methods()
        {
            TargetClassDefinition targetClass = DefinitionObjectMother.GetActiveTargetClassDefinition(typeof(BaseType1));

            MethodInfo baseMethod1  = typeof(BaseType1).GetMethod("VirtualMethod", new Type[0]);
            MethodInfo baseMethod2  = typeof(BaseType1).GetMethod("VirtualMethod", new[] { typeof(string) });
            MethodInfo mixinMethod1 = typeof(BT1Mixin1).GetMethod("VirtualMethod", new Type[0]);

            Assert.That(targetClass.Methods.ContainsKey(baseMethod1), Is.True);
            Assert.That(targetClass.Methods.ContainsKey(mixinMethod1), Is.False);

            MemberDefinitionBase member = targetClass.Methods[baseMethod1];

            Assert.That(new List <MemberDefinitionBase> (targetClass.GetAllMembers()).Contains(member), Is.True);
            Assert.That(new List <MemberDefinitionBase> (targetClass.Mixins[typeof(BT1Mixin1)].GetAllMembers()).Contains(member), Is.False);

            Assert.That(member.Name, Is.EqualTo("VirtualMethod"));
            Assert.That(member.FullName, Is.EqualTo(typeof(BaseType1).FullName + ".VirtualMethod"));
            Assert.That(member.IsMethod, Is.True);
            Assert.That(member.IsProperty, Is.False);
            Assert.That(member.IsEvent, Is.False);
            Assert.That(member.DeclaringClass, Is.SameAs(targetClass));
            Assert.That(member.Parent, Is.SameAs(targetClass));

            Assert.That(targetClass.Methods.ContainsKey(baseMethod2), Is.True);
            Assert.That(targetClass.Methods[baseMethod2], Is.Not.SameAs(member));

            MixinDefinition mixin1 = targetClass.Mixins[typeof(BT1Mixin1)];

            Assert.That(mixin1.Methods.ContainsKey(baseMethod1), Is.False);
            Assert.That(mixin1.Methods.ContainsKey(mixinMethod1), Is.True);
            member = mixin1.Methods[mixinMethod1];

            Assert.That(new List <MemberDefinitionBase> (mixin1.GetAllMembers()).Contains(member), Is.True);

            Assert.That(member.Name, Is.EqualTo("VirtualMethod"));
            Assert.That(member.FullName, Is.EqualTo(typeof(BT1Mixin1).FullName + ".VirtualMethod"));
            Assert.That(member.IsMethod, Is.True);
            Assert.That(member.IsProperty, Is.False);
            Assert.That(member.IsEvent, Is.False);
            Assert.That(member.DeclaringClass, Is.SameAs(mixin1));
        }
        public void Properties()
        {
            TargetClassDefinition targetClass = DefinitionObjectMother.GetActiveTargetClassDefinition(typeof(BaseType1));

            PropertyInfo baseProperty     = typeof(BaseType1).GetProperty("VirtualProperty");
            PropertyInfo indexedProperty1 = typeof(BaseType1).GetProperty("Item", new[] { typeof(int) });
            PropertyInfo indexedProperty2 = typeof(BaseType1).GetProperty("Item", new[] { typeof(string) });
            PropertyInfo mixinProperty    = typeof(BT1Mixin1).GetProperty("VirtualProperty", new Type[0]);

            Assert.That(targetClass.Properties.ContainsKey(baseProperty), Is.True);
            Assert.That(targetClass.Properties.ContainsKey(indexedProperty1), Is.True);
            Assert.That(targetClass.Properties.ContainsKey(indexedProperty2), Is.True);
            Assert.That(targetClass.Properties.ContainsKey(mixinProperty), Is.False);

            PropertyDefinition member = targetClass.Properties[baseProperty];

            Assert.That(new List <MemberDefinitionBase> (targetClass.GetAllMembers()).Contains(member), Is.True);
            Assert.That(new List <MemberDefinitionBase> (targetClass.Mixins[typeof(BT1Mixin1)].GetAllMembers()).Contains(member), Is.False);

            Assert.That(member.Name, Is.EqualTo("VirtualProperty"));
            Assert.That(member.FullName, Is.EqualTo(typeof(BaseType1).FullName + ".VirtualProperty"));
            Assert.That(member.IsProperty, Is.True);
            Assert.That(member.IsMethod, Is.False);
            Assert.That(member.IsEvent, Is.False);
            Assert.That(member.DeclaringClass, Is.SameAs(targetClass));
            Assert.That(member.GetMethod, Is.Not.Null);
            Assert.That(member.SetMethod, Is.Not.Null);

            Assert.That(targetClass.Methods.ContainsKey(member.GetMethod.MethodInfo), Is.False);
            Assert.That(targetClass.Methods.ContainsKey(member.SetMethod.MethodInfo), Is.False);

            Assert.That(member.GetMethod.Parent, Is.SameAs(member));
            Assert.That(member.SetMethod.Parent, Is.SameAs(member));

            member = targetClass.Properties[indexedProperty1];
            Assert.That(targetClass.Properties[indexedProperty2], Is.Not.SameAs(member));

            Assert.That(member.GetMethod, Is.Not.Null);
            Assert.That(member.SetMethod, Is.Null);

            member = targetClass.Properties[indexedProperty2];

            Assert.That(member.GetMethod, Is.Null);
            Assert.That(member.SetMethod, Is.Not.Null);

            MixinDefinition mixin1 = targetClass.Mixins[typeof(BT1Mixin1)];

            Assert.That(mixin1.Properties.ContainsKey(baseProperty), Is.False);
            Assert.That(mixin1.Properties.ContainsKey(mixinProperty), Is.True);

            member = mixin1.Properties[mixinProperty];

            Assert.That(new List <MemberDefinitionBase> (mixin1.GetAllMembers()).Contains(member), Is.True);

            Assert.That(member.Name, Is.EqualTo("VirtualProperty"));
            Assert.That(member.FullName, Is.EqualTo(typeof(BT1Mixin1).FullName + ".VirtualProperty"));
            Assert.That(member.IsProperty, Is.True);
            Assert.That(member.IsMethod, Is.False);
            Assert.That(member.IsEvent, Is.False);
            Assert.That(member.DeclaringClass, Is.SameAs(mixin1));

            Assert.That(member.GetMethod, Is.Null);
            Assert.That(member.SetMethod, Is.Not.Null);
        }