private static void WeakEvent1Core(int addCount, bool removeTwice) { var(weakManager, weakSubscriber) = WeakEventHandlerCore(null, null, addCount: addCount, removeTwice: removeTwice); GC.Collect(); Assert.IsFalse(weakManager.TryGetTarget(out _)); Assert.IsFalse(weakSubscriber.TryGetTarget(out _)); Assert.AreEqual(addCount, StaticPublisher.EventHandlerCount); StaticPublisher.RaiseEvent(); Assert.AreEqual(0, StaticPublisher.EventHandlerCount); StaticPublisher.RaiseEvent(); Assert.AreEqual(0, StaticPublisher.EventHandlerCount); }
private static (WeakReference <Manager>, WeakReference <Subscriber>) WeakEventHandlerCore(Manager?manager, Subscriber?subscriber, int raiseCount = 1, int addCount = 1, bool remove = false, bool removeTwice = false) { manager ??= new Manager(); subscriber ??= new Subscriber(); Assert.AreEqual(0, StaticPublisher.EventHandlerCount); for (int i = 0; i < addCount; i++) { manager.Add(subscriber); } IWeakEventProxy?proxy1 = null; if (removeTwice) { proxy1 = manager.Proxy; manager.Add(subscriber); } Assert.AreEqual(removeTwice ? 2 : addCount, StaticPublisher.EventHandlerCount); proxy1?.Remove(); proxy1?.Remove(); GC.Collect(); Assert.AreEqual(0, subscriber.HandlerCallCount); for (int i = 0; i < raiseCount; i++) { StaticPublisher.RaiseEvent(); } Assert.AreEqual(addCount * raiseCount, subscriber.HandlerCallCount); if (remove) { var count = subscriber.HandlerCallCount; manager.Proxy !.Remove(); StaticPublisher.RaiseEvent(); Assert.AreEqual(count, subscriber.HandlerCallCount); manager.Proxy !.Remove(); StaticPublisher.RaiseEvent(); Assert.AreEqual(count, subscriber.HandlerCallCount); } return(new WeakReference <Manager>(manager), new WeakReference <Subscriber>(subscriber)); }