public void Transform_ThrowsArgumentException_IfThereIsNoFieldOrPropertyWithName()
        {
            // instance.RemoveNonExistentEvent(handler);
            Expression instance = Expression.Parameter(typeof(Fixture), "instance");
            Expression handler  = Expression.Parameter(typeof(EventHandler), "handler");
            Expression input    = Expression.Call(instance, FixtureRemoveNonExistentEvent, handler);

            // Validating that EventRemoveAttribute fails on non-existent event
            EventRemoveAttribute attribute = new EventRemoveAttribute("NonExistentEvent");

            Assert.ThrowsException <ArgumentException>(() => attribute.Transform(input));
        }
        public void Transform_ReplacesMethodCallExpressionWithAddAssignExpression_ForFieldEvents()
        {
            // Creating the expression "instance.RemoveEvent(handler)"
            ParameterExpression instance = Expression.Parameter(typeof(Fixture), "instance");
            ParameterExpression handler  = Expression.Parameter(typeof(EventHandler), "handler");
            Expression          input    = Expression.Call(instance, FixtureRemoveEvent, handler);

            // Validating that EventRemoveAttribute creates expression unsubscribing to Event
            Expression output = new EventRemoveAttribute("Event").Transform(input);
            Action <Fixture, EventHandler> removeEvent = Expression.Lambda <Action <Fixture, EventHandler> >(output, new[] { instance, handler }).Compile();

            bool         eventEmitted = false;
            Fixture      fixture      = new Fixture();
            EventHandler eventHandler = (sender, e) => eventEmitted = true;

            fixture.Event += eventHandler;
            removeEvent(fixture, eventHandler);
            fixture.TriggerEvent();
            Assert.IsFalse(eventEmitted);
        }