public void ConstructWithParameters()
        {
            var alternateImplementations = Enumerable.Empty <IAlternateMethod>();
            var loggerMock = new Mock <ILogger>();

            var hook = new AlternateTypeGenerationHook <ITab>(alternateImplementations, loggerMock.Object);

            Assert.Equal(alternateImplementations, hook.MethodImplementations);
            Assert.Equal(loggerMock.Object, hook.Logger);
        }
        public void ConstructWithParameters()
        {
            var alternateImplementations = Enumerable.Empty<IAlternateMethod>();
            var loggerMock = new Mock<ILogger>();

            var hook = new AlternateTypeGenerationHook<ITab>(alternateImplementations, loggerMock.Object);

            Assert.Equal(alternateImplementations, hook.MethodImplementations);
            Assert.Equal(loggerMock.Object, hook.Logger);
        }
        public void LogWhenMethodsInspected()
        {
            var alternateImplementations = Enumerable.Empty <IAlternateMethod>();
            var loggerMock = new Mock <ILogger>();

            var hook = new AlternateTypeGenerationHook <ITab>(alternateImplementations, loggerMock.Object);

            hook.MethodsInspected();

            loggerMock.Verify(l => l.Debug(It.IsAny <string>(), It.IsAny <Type>()), Times.Once());
        }
        public void LogWhenMethodsInspected()
        {
            var alternateImplementations = Enumerable.Empty<IAlternateMethod>();
            var loggerMock = new Mock<ILogger>();

            var hook = new AlternateTypeGenerationHook<ITab>(alternateImplementations, loggerMock.Object);

            hook.MethodsInspected();

            loggerMock.Verify(l=>l.Debug(It.IsAny<string>(), It.IsAny<Type>()), Times.Once());
        }
        public void LogWhenNonProxableMemberNotification()
        {
            var alternateImplementations = Enumerable.Empty <IAlternateMethod>();
            var loggerMock = new Mock <ILogger>();

            var hook = new AlternateTypeGenerationHook <ITab>(alternateImplementations, loggerMock.Object);

            var type       = typeof(AlternateTypeGenerationHookShould);
            var memberInfo = type.GetMember("LogWhenNonProxableMemberNotification")[0];

            hook.NonProxyableMemberNotification(type, memberInfo);

            loggerMock.Verify(l => l.Debug(It.IsAny <string>(), memberInfo.Name, type), Times.Once());
        }
        public void LogWhenNonProxableMemberNotification()
        {
            var alternateImplementations = Enumerable.Empty<IAlternateMethod>();
            var loggerMock = new Mock<ILogger>();

            var hook = new AlternateTypeGenerationHook<ITab>(alternateImplementations, loggerMock.Object);

            var type = typeof (AlternateTypeGenerationHookShould);
            var memberInfo = type.GetMember("LogWhenNonProxableMemberNotification")[0];

            hook.NonProxyableMemberNotification(type, memberInfo);

            loggerMock.Verify(l => l.Debug(It.IsAny<string>(), memberInfo.Name, type), Times.Once());
        }
        public void CanInterceptMethods()
        {
            var type = typeof (AlternateTypeGenerationHookShould);
            var methodInfo = type.GetMethod("CanInterceptMethods");
            var implementationMock = new Mock<IAlternateMethod>();
            implementationMock.Setup(i => i.MethodToImplement).Returns(methodInfo);

            var alternateImplementations = new List<IAlternateMethod>();
            alternateImplementations.Add(implementationMock.Object);
            
            var loggerMock = new Mock<ILogger>();

            var hook = new AlternateTypeGenerationHook<ITab>(alternateImplementations, loggerMock.Object);

            var result = hook.ShouldInterceptMethod(type, methodInfo);

            Assert.True(result);
        }
        private ProxyGenerationOptions CreateProxyOptions <T>(IEnumerable <IAlternateMethod> methodImplementations, IEnumerable <object> mixins)
        {
            var generationHook = new AlternateTypeGenerationHook <T>(methodImplementations, Logger);
            var selector       = new AlternateTypeSelector();
            var options        = new ProxyGenerationOptions(generationHook)
            {
                Selector = selector
            };

            if (mixins != null)
            {
                foreach (var mixin in mixins)
                {
                    options.AddMixinInstance(mixin);
                }
            }

            return(options);
        }
        public void NotInterceptMethodsWithMismatch()
        {
            var type               = typeof(AlternateTypeGenerationHookShould);
            var methodInfo         = type.GetMethod("CanInterceptMethods");
            var implementationMock = new Mock <IAlternateMethod>();

            implementationMock.Setup(i => i.MethodToImplement).Returns(methodInfo);

            var alternateImplementations = new List <IAlternateMethod>();

            alternateImplementations.Add(implementationMock.Object);

            var loggerMock = new Mock <ILogger>();

            var hook = new AlternateTypeGenerationHook <ITab>(alternateImplementations, loggerMock.Object);

            var result = hook.ShouldInterceptMethod(type, type.GetMethod("NotInterceptMethodsWithMismatch"));

            Assert.False(result);
        }
        public void ReturnNonMatchingHashCodesWithDifferentCollections()
        {
            var implementationMock1 = new Mock <IAlternateMethod>();
            var implementationMock2 = new Mock <IAlternateMethod>();

            var implementations1 = new List <IAlternateMethod>
            {
                implementationMock1.Object,
                implementationMock2.Object
            };

            var implementations2 = new List <IAlternateMethod>
            {
                implementationMock1.Object                           //One less object
            };
            var loggerMock = new Mock <ILogger>();

            var hook1 = new AlternateTypeGenerationHook <ITab>(implementations1, loggerMock.Object);
            var hook2 = new AlternateTypeGenerationHook <ITab>(implementations2, loggerMock.Object);

            Assert.NotEqual(hook2.GetHashCode(), hook1.GetHashCode());
            Assert.False(hook2.Equals(hook1));
        }
        public void ReturnNonMatchingHashCodesWithDifferentCollections()
        {
            var implementationMock1 = new Mock<IAlternateMethod>();
            var implementationMock2 = new Mock<IAlternateMethod>();

            var implementations1 = new List<IAlternateMethod>
                                      {
                                          implementationMock1.Object,
                                          implementationMock2.Object
                                      };

            var implementations2 = new List<IAlternateMethod> 
                                      {
                                          implementationMock1.Object //One less object
                                      };
            var loggerMock = new Mock<ILogger>();

            var hook1 = new AlternateTypeGenerationHook<ITab>(implementations1, loggerMock.Object);
            var hook2 = new AlternateTypeGenerationHook<ITab>(implementations2, loggerMock.Object);

            Assert.NotEqual(hook2.GetHashCode(), hook1.GetHashCode());
            Assert.False(hook2.Equals(hook1));
            
        }