public void Throws_If_Target_Is_Null() { Foo foo = null; var proxy = new Proxy<IFoo>() .Intercept(f => f.Go()) .OnInvoke(mi => foo.Go()) .Save(); // TODO: Validate that the target isn't null, action.Target doesn't work, it means that the method is static. Assert.Throws<NullReferenceException>(() => proxy.Go()); }
public void Can_Intercept_Virtual_Methods() { var foo = new Foo(); var proxy = new Proxy<Foo>() .Target(foo) .InterceptMethod(f => f.Go()) .OnBefore(() => Assert.False(foo.WasExecuted)) .Save(); proxy.Go(); Assert.True(foo.WasExecuted); }
public void Can_Callback_OnAfter() { var foo = new Foo(); var proxy = new Proxy<IFoo>() .Intercept(f => f.Go()) .OnInvoke(mi => foo.Go()) .OnAfter(() => Assert.True(foo.WasExecuted)) .Save(); Assert.False(foo.WasExecuted); proxy.Go(); }
public void Can_Callback_OnBefore_OnFinally_And_OnAfter() { var ack = 0; var foo = new Foo(); var proxy = new Proxy<IFoo>() .Intercept(f => f.Go()) .OnBefore(() => { ack++; Assert.False(foo.WasExecuted); }) .OnInvoke(mi => foo.Go()) .OnFinally(() => ack++) .OnAfter(() => { ack++; Assert.True(foo.WasExecuted); }) .Save(); proxy.Go(); Assert.Equal(3, ack); }
public void Can_Intercept_Multiple_Methods_Using_A_Filter() { var ack = 0; var foo = new Foo(); var proxy = new Proxy<IFoo>() .Target(foo) .InterceptWhere(mi => mi.Name.EndsWith("Go")) //.InterceptWhere(mi => mi.IsGenericMethod ) .OnBefore(mi => ack++) .Save(); // intercepted proxy.Go(); proxy.GenericGo<int>(-1); proxy.OverloadedGo(-1); proxy.OverloadedGo(string.Empty); // not intercepted proxy.Name = string.Empty; proxy.Return(); Assert.Equal(4, ack); }
public void Can_Intercept_Multiple_Members_Using_A_Single_Fluent_Instruction() { var ack = 0; var foo = new Foo(); var proxy = new Proxy<IFoo>() .Target(foo) .InterceptMethod(f => f.Go()) .OnBefore(() => Assert.Equal(0, ack)) .OnAfter(() => ack++) .InterceptGetter(f => f.Name) .OnBefore(() => Assert.Equal(1, ack)) .OnAfter(() => ack++) .InterceptSetter(f => f.Description) .OnBefore(() => Assert.Equal(2, ack)) .OnAfter(() => ack++) .Save(); // intercepted proxy.Go(); var name = proxy.Name; proxy.Description = string.Empty; // not intercpted proxy.Return(); proxy.Name = string.Empty; var desc = proxy.Description; Assert.Equal(3, ack); }
public void Can_Intercept_Many_Methods_With_One_Advice() { var ack = 0; var foo = new Foo(); var proxy = new Proxy<IFoo>() .Target(foo) .InterceptMethods( f => f.Return(), f => f.GenericGo<int>(It.Any<int>()), f => f.Go()) .OnBefore(mi => ack++) .Save(); // intercepted proxy.Go(); proxy.Return(); proxy.GenericGo<int>(-1); // not intercepted proxy.Name = string.Empty; proxy.OverloadedGo(-1); proxy.OverloadedGo(string.Empty); Assert.Equal(3, ack); }
public void Can_Intercept_All_Methods_Getters_And_Setters() { var ack = 0; var foo = new Foo(); var proxy = new Proxy<IFoo>() .Target(foo) .InterceptAll() .OnFinally(() => { ack++; }) .Save(); // intercepts all gettrers, setters and methods... proxy.Go(); var name = proxy.Name; var description = proxy.Description; proxy.Name = string.Empty; var result = proxy.GenericGo<int>(-1); Assert.Equal(5, ack); }
public void Can_Infer_Target_Method_If_A_Target_Object_Exists() { var foo = new Foo(); var proxy = new Proxy<IFoo>() .Target(foo) .Intercept(f => f.Go()) .OnBefore(() => Assert.False(foo.WasExecuted)) //.OnInvoke(mi => foo.Go()) must be inferred from context .Save(); proxy.Go(); Assert.True(foo.WasExecuted); }