public void GetMixinArray_WithTwoFittingSupplied()
        {
            var mixin1 = new NullMixin();
            MixinArrayInitializer initializer = CreateInitializer(typeof(NullTarget), typeof(NullMixin));

            initializer.CreateMixinArray(new object[] { mixin1, mixin1 });
        }
        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 GetMixinArray_ForOrdinaryMixin()
        {
            MixinArrayInitializer initializer = CreateInitializer(typeof(NullTarget), typeof(NullMixin));

            var mixinArray = initializer.CreateMixinArray(null);

            Assert.That(mixinArray.Length, Is.EqualTo(1));
            Assert.That(mixinArray[0], Is.InstanceOf(typeof(NullMixin)));
        }
        public void GetMixinArray_ForValueTypeMixin()
        {
            MixinArrayInitializer initializer = CreateInitializer(typeof(BaseType1), typeof(ValueTypeMixin));

            var mixinArray = initializer.CreateMixinArray(null);

            Assert.That(mixinArray.Length, Is.EqualTo(1));
            Assert.That(mixinArray[0], Is.InstanceOf(typeof(ValueTypeMixin)));
        }
        public void GetMixinArray_WithSuppliedAssignableMixin()
        {
            var mixin1 = new DerivedNullMixin();
            MixinArrayInitializer initializer = CreateInitializer(typeof(NullTarget), typeof(NullMixin));

            var mixinArray = initializer.CreateMixinArray(new object[] { mixin1 });

            Assert.That(mixinArray.Length, Is.EqualTo(1));
            Assert.That(mixinArray[0], Is.SameAs(mixin1));
        }
        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_WithSuppliedMixins()
        {
            var mixin1 = new NullMixin();
            var mixin3 = new NullMixin3();

            MixinArrayInitializer initializer = CreateInitializer(typeof(NullTarget), typeof(NullMixin), typeof(NullMixin2), typeof(NullMixin3));

            var mixinArray = initializer.CreateMixinArray(new object[] { mixin1, mixin3 });

            Assert.That(mixinArray.Length, Is.EqualTo(3));
            Assert.That(mixinArray[0], Is.SameAs(mixin1));
            Assert.That(mixinArray[1], Is.InstanceOf(typeof(NullMixin2)));
            Assert.That(mixinArray[2], Is.SameAs(mixin3));
        }
        public void CheckMixinArray_NonMatchingMixins_InvalidOrder()
        {
            MixinArrayInitializer initializer = CreateInitializer(typeof(NullTarget), typeof(NullMixin), typeof(NullMixin2));

            initializer.CheckMixinArray(new object[] { new NullMixin2(), new NullMixin() });
        }
        public void CheckMixinArray_WrongNumberOfMixins()
        {
            MixinArrayInitializer initializer = CreateInitializer(typeof(NullTarget), typeof(NullMixin));

            initializer.CheckMixinArray(new object[0]);
        }
        public void CheckMixinArray_MatchingMixins()
        {
            MixinArrayInitializer initializer = CreateInitializer(typeof(NullTarget), typeof(NullMixin));

            initializer.CheckMixinArray(new object[] { new NullMixin() });
        }
        public void GetMixinArray_MixinCtorNotFound()
        {
            MixinArrayInitializer initializer = CreateInitializer(typeof(NullTarget), typeof(MixinArrayInitializer));

            initializer.CreateMixinArray(null);
        }