public void EventsAreIntercepted() { CallCountHandler fireHandler = new CallCountHandler(); CallCountHandler addHandler = new CallCountHandler(); VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor(); Assert.IsTrue(interceptor.CanIntercept(typeof(OverrideableProperies))); Type proxyType = interceptor.CreateProxyType(typeof(ClassWithEvent)); ClassWithEvent instance = (ClassWithEvent)Activator.CreateInstance(proxyType); PipelineManager manager = new PipelineManager(); ((IInterceptingProxy)instance).AddInterceptionBehavior(new PolicyInjectionBehavior(manager)); SetPipeline(manager, instance, "add_MyEvent", addHandler); SetPipeline(manager, instance, "FireMyEvent", fireHandler); bool raised = false; instance.MyEvent += delegate { raised = true; }; instance.FireMyEvent(); instance.FireMyEvent(); Assert.IsTrue(raised); Assert.AreEqual(2, fireHandler.CallCount); Assert.AreEqual(1, addHandler.CallCount); }
public void CanCreateInstanceForGeneratedTypeForAbstractTypeWithProtectedConstructor() { VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor(); Type proxyType = interceptor.CreateProxyType(typeof(AbstractClassWithProtectedConstructor)); Activator.CreateInstance(proxyType, 100); }
public void CanGenerateDerivedTypeForAbstractType() { VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor(); Type proxyType = interceptor.CreateProxyType(typeof(AbstractClassWithPublicConstructor)); Assert.AreSame(typeof(AbstractClassWithPublicConstructor), proxyType.BaseType); }
public void CanInterceptProperties() { CallCountHandler getHandler = new CallCountHandler(); CallCountHandler setHandler = new CallCountHandler(); VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor(); Assert.IsTrue(interceptor.CanIntercept(typeof(OverrideableProperies))); Type proxyType = interceptor.CreateProxyType(typeof(OverrideableProperies)); OverrideableProperies instance = (OverrideableProperies)Activator.CreateInstance(proxyType); PipelineManager manager = new PipelineManager(); ((IInterceptingProxy)instance).AddInterceptionBehavior(new PolicyInjectionBehavior(manager)); SetPipeline(manager, instance, "get_IntProperty", getHandler); SetPipeline(manager, instance, "set_IntProperty", setHandler); instance.IntProperty = 12; instance.IntProperty = 15; int total = 0; for (int i = 0; i < 5; ++i) { total += instance.IntProperty; } Assert.AreEqual(5 * 15, total); Assert.AreEqual(5, getHandler.CallCount); Assert.AreEqual(2, setHandler.CallCount); }
public void AttemptingToInterceptInvalidClassThrows() { PostCallCountHandler handler = new PostCallCountHandler(); VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor(); interceptor.CreateProxyType(typeof(CantTouchThis)); }
public void InterceptableClassWithNoVirtualMethodsReturnsEmptyMethodList() { VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor(); List <MethodImplementationInfo> methods = new List <MethodImplementationInfo>(interceptor.GetInterceptableMethods(typeof(ClassWithNoVirtuals), typeof(ClassWithNoVirtuals))); Assert.AreEqual(0, methods.Count); }
public void AssortedParameterKindsAreProperlyHandled() { var interceptor = new VirtualMethodInterceptor(); var type = interceptor.CreateProxyType(typeof(AssortedParameterKindsAreProperlyHandledHelper.TypeWithAssertedParameterKinds)); IInterceptingProxy proxy = Activator.CreateInstance(type) as IInterceptingProxy; AssortedParameterKindsAreProperlyHandledHelper.PerformTest(proxy); }
public void CanDoVirtualInterception() { //Virtual method interceptor var type = typeof(MyType); var handlerType = typeof(ModifyResultHandler); var interceptor = new VirtualMethodInterceptor(); var canIntercept = interceptor.CanIntercept(type); var myProxyType = interceptor.Intercept(type, handlerType); var myProxy = Activator.CreateInstance(myProxyType) as IMyType; var result = myProxy.MyMethod(); Assert.Equal(20, result); }
public void InterceptingClassOverridesBaseClassVirtualMethods() { Type baseType = typeof(ClassWithDefaultCtor); VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor(); InterceptingClassGenerator generator = new InterceptingClassGenerator(baseType); Type generatedType = generator.GenerateType(); MethodInfo methodOne = generatedType.GetMethod("MethodOne"); MethodInfo calculateAnswer = generatedType.GetMethod("CalculateAnswer"); Assert.AreSame(generatedType, methodOne.DeclaringType); Assert.AreSame(generatedType, calculateAnswer.DeclaringType); }
static void VirtualMethodInterceptor(Type type) { //Virtual method interceptor var interceptor = new VirtualMethodInterceptor(); var canIntercept = interceptor.CanIntercept(type); var myProxyType = interceptor.Intercept(type, typeof(MyHandler)); var myProxy = Activator.CreateInstance(myProxyType) as IMyType; var proxy = myProxy as IInterceptionProxy; var otherInterceptor = proxy.Interceptor; var result = myProxy.MyMethod(); Assert.AreEqual(20, result); }
public void ReflectingOverProxyTypesGivesOnlyBaseProperties() { VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor(); Assert.IsTrue(interceptor.CanIntercept(typeof(OverrideableProperies))); Type proxyType = interceptor.CreateProxyType(typeof(OverrideableProperies)); PropertyInfo[] properties = proxyType.GetProperties(); Assert.AreEqual(2, properties.Length); Assert.IsTrue(Sequence.ForAll(properties, delegate(PropertyInfo pi) { return(pi.DeclaringType == typeof(OverrideableProperies)); })); }
public void AttemptingToInterceptInvalidClassThrows() { PostCallCountHandler handler = new PostCallCountHandler(); VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor(); try { interceptor.CreateProxyType(typeof(CantTouchThis)); Assert.Fail(); } catch (Exception ex) { Assert.IsInstanceOfType(ex, typeof(InvalidOperationException)); } }
public void CanInterceptMethods() { CallCountHandler h1 = new CallCountHandler(); VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor(); Type proxyType = interceptor.CreateProxyType(typeof(TwoOverrideableMethods)); TwoOverrideableMethods instance = (TwoOverrideableMethods)Activator.CreateInstance(proxyType); SetPipeline(instance, "DoSomething", h1); instance.DoSomething(); Assert.IsTrue(instance.DidSomething); Assert.AreEqual(1, h1.CallCount); }
public void InvokingAbstractMethodFromInterceptedAbstracTypeInstanceThrows() { VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor(); Type proxyType = interceptor.CreateProxyType(typeof(AbstractClassWithPublicConstructor)); AbstractClassWithPublicConstructor instance = (AbstractClassWithPublicConstructor)Activator.CreateInstance(proxyType); try { instance.AbstractMethod(); Assert.Fail("should have thrown"); } catch (NotImplementedException) { } }
public void CanInterceptMethods() { CallCountHandler h1 = new CallCountHandler(); VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor(); Type proxyType = interceptor.CreateProxyType(typeof(TwoOverrideableMethods)); TwoOverrideableMethods instance = (TwoOverrideableMethods)Activator.CreateInstance(proxyType); PipelineManager manager = new PipelineManager(); ((IInterceptingProxy)instance).AddInterceptionBehavior(new PolicyInjectionBehavior(manager)); SetPipeline(manager, instance, "DoSomething", h1); instance.DoSomething(); Assert.IsTrue(instance.DidSomething); Assert.AreEqual(1, h1.CallCount); }
public void CanInvokeOverridenAbstractMethodMethodOnInterceptedAbstractDerivedFromAbstractTypeInstance() { VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor(); Type proxyType = interceptor.CreateProxyType(typeof(AbstractDerivedFromAbstractClassWithPublicConstructor)); AbstractDerivedFromAbstractClassWithPublicConstructor instance = (AbstractDerivedFromAbstractClassWithPublicConstructor)Activator.CreateInstance(proxyType); bool invoked = false; ((IInterceptingProxy)instance).AddInterceptionBehavior( new DelegateInterceptionBehavior((mi, gn) => { invoked = true; return(gn()(mi, gn)); })); int value = instance.AbstractMethod(); Assert.AreEqual(200, value); Assert.IsTrue(invoked); }
public void CanInterceptTypeWithNonDefaultCtor() { CallCountHandler h1 = new CallCountHandler(); VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor(); Type proxyType = interceptor.CreateProxyType(typeof(ClassWithNonDefaultCtor)); ClassWithNonDefaultCtor instance = (ClassWithNonDefaultCtor)Activator.CreateInstance(proxyType, "arg-value"); PipelineManager manager = new PipelineManager(); ((IInterceptingProxy)instance).AddInterceptionBehavior(new PolicyInjectionBehavior(manager)); SetPipeline(manager, instance, "GetArg", h1); Assert.AreEqual("arg-value", instance.GetArg()); Assert.AreEqual(1, h1.CallCount); }
public void CanInterceptNonPublicPropertiesUsingVirtualInterceptor() { VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor(); Type generatedType = interceptor.CreateProxyType(typeof(ClassWithNonPublicVirtualProperties)); ClassWithNonPublicVirtualProperties instance = (ClassWithNonPublicVirtualProperties)Activator.CreateInstance(generatedType); bool intercepted = false; ((IInterceptingProxy)instance) .AddInterceptionBehavior( new ActionInterceptionBehavior(() => intercepted = true)); var result = instance.GetSomePropertyValue(); Assert.IsTrue(intercepted); }
internal static T GetInterceptingInstance <T>(params object[] ctorValues) { VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor(); Type typeToIntercept = typeof(T); if (typeToIntercept.IsGenericType) { typeToIntercept = typeToIntercept.GetGenericTypeDefinition(); } InterceptingClassGenerator generator = new InterceptingClassGenerator(typeToIntercept); Type generatedType = generator.GenerateType(); if (generatedType.IsGenericTypeDefinition) { generatedType = generatedType.MakeGenericType(typeof(T).GetGenericArguments()); } return((T)Activator.CreateInstance(generatedType, ctorValues)); }
public void ReflectingOverProxyTypesGivesOnlyBaseProperties() { VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor(); Assert.IsTrue(interceptor.CanIntercept(typeof(OverrideableProperies))); Type proxyType = interceptor.CreateProxyType(typeof(OverrideableProperies)); PropertyInfo[] properties = proxyType.GetProperties(); Assert.AreEqual(2, properties.Length); Assert.IsTrue(properties.All(pi => pi.DeclaringType == typeof(OverrideableProperies))); }
public void CantInterceptSealedClass() { VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor(); Assert.IsFalse(interceptor.CanIntercept(typeof(CantOverride))); }
public void CanInterceptBasicClass() { VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor(); Assert.IsTrue(interceptor.CanIntercept(typeof(ClassWithNoVirtuals))); }
public void CanInvokeOverridenAbstractMethodMethodOnInterceptedAbstractDerivedFromAbstractTypeInstance() { VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor(); Type proxyType = interceptor.CreateProxyType(typeof(AbstractDerivedFromAbstractClassWithPublicConstructor)); AbstractDerivedFromAbstractClassWithPublicConstructor instance = (AbstractDerivedFromAbstractClassWithPublicConstructor)Activator.CreateInstance(proxyType); bool invoked = false; ((IInterceptingProxy)instance).AddInterceptionBehavior( new DelegateInterceptionBehavior((mi, gn) => { invoked = true; return gn()(mi, gn); })); int value = instance.AbstractMethod(); Assert.AreEqual(200, value); Assert.IsTrue(invoked); }