public void GCRemovesDelegates()
        {
            MockDelegateTarget mockDelegateTarget1 = new MockDelegateTarget();
            MockDelegateTarget mockDelegateTarget2 = new MockDelegateTarget();

            var weakMulticastDelegate = new WeakMulticastDelegate <Action <object> >();

            weakMulticastDelegate.Add(mockDelegateTarget1.DelegateMethod);
            weakMulticastDelegate.Add(mockDelegateTarget2.DelegateMethod);
            weakMulticastDelegate.Add(mockDelegateTarget1.DelegateMethod2);
            weakMulticastDelegate.Add(mockDelegateTarget2.DelegateMethod2);

            Assert.AreEqual(4, weakMulticastDelegate.Count);

            mockDelegateTarget2 = null;
            GC.Collect();
            object parameter = new object();

            weakMulticastDelegate.Invoke(parameter);
            Assert.AreEqual(2, weakMulticastDelegate.Count);
            Assert.IsTrue(mockDelegateTarget1.DelegateCalled);
            Assert.IsTrue(mockDelegateTarget1.DelegateCalled2);
            Assert.AreSame(parameter, mockDelegateTarget1.DelegateParameter);
            Assert.AreSame(parameter, mockDelegateTarget1.DelegateParameter2);

            mockDelegateTarget1 = null;
            GC.Collect();
            weakMulticastDelegate.Remove(null);
            Assert.AreEqual(0, weakMulticastDelegate.Count);

            weakMulticastDelegate.Invoke(parameter); // Dummy invoke on empty WeakDelegateManager.
        }
        public void GCRemovesDelegates()
        {
            MockDelegateTarget mockDelegateTarget1 = new MockDelegateTarget();
              MockDelegateTarget mockDelegateTarget2 = new MockDelegateTarget();

              var weakMulticastDelegate = new WeakMulticastDelegate<Action<object>>();
              weakMulticastDelegate.Add(mockDelegateTarget1.DelegateMethod);
              weakMulticastDelegate.Add(mockDelegateTarget2.DelegateMethod);
              weakMulticastDelegate.Add(mockDelegateTarget1.DelegateMethod2);
              weakMulticastDelegate.Add(mockDelegateTarget2.DelegateMethod2);

              Assert.AreEqual(4, weakMulticastDelegate.Count);

              mockDelegateTarget2 = null;
              GC.Collect();
              object parameter = new object();
              weakMulticastDelegate.Invoke(parameter);
              Assert.AreEqual(2, weakMulticastDelegate.Count);
              Assert.IsTrue(mockDelegateTarget1.DelegateCalled);
              Assert.IsTrue(mockDelegateTarget1.DelegateCalled2);
              Assert.AreSame(parameter, mockDelegateTarget1.DelegateParameter);
              Assert.AreSame(parameter, mockDelegateTarget1.DelegateParameter2);

              mockDelegateTarget1 = null;
              GC.Collect();
              weakMulticastDelegate.Remove(null);
              Assert.AreEqual(0, weakMulticastDelegate.Count);

              weakMulticastDelegate.Invoke(parameter); // Dummy invoke on empty WeakDelegateManager.
        }
        public void RemoveRegisteredDelegates()
        {
            MockDelegateTarget mockDelegateTarget1 = new MockDelegateTarget();
            MockDelegateTarget mockDelegateTarget2 = new MockDelegateTarget();

            var weakMulticastDelegate = new WeakMulticastDelegate <Action <object> >();

            weakMulticastDelegate.Add(mockDelegateTarget1.DelegateMethod);
            weakMulticastDelegate.Add(mockDelegateTarget2.DelegateMethod);
            weakMulticastDelegate.Add(mockDelegateTarget1.DelegateMethod2);
            weakMulticastDelegate.Add(mockDelegateTarget2.DelegateMethod2);
            weakMulticastDelegate.Add(MockStaticDelegateTarget.DelegateMethod);

            weakMulticastDelegate.Remove(mockDelegateTarget1.DelegateMethod);
            weakMulticastDelegate.Remove(mockDelegateTarget1.DelegateMethod); // Remove twice
            weakMulticastDelegate.Remove(mockDelegateTarget2.DelegateMethod);
            weakMulticastDelegate.Remove(mockDelegateTarget2.DelegateMethod2);
            weakMulticastDelegate.Remove(MockStaticDelegateTarget.DelegateMethod);

            MockStaticDelegateTarget.Clear();
            object parameter = new object();

            weakMulticastDelegate.Invoke(parameter);

            Assert.IsFalse(mockDelegateTarget1.DelegateCalled);
            Assert.IsFalse(mockDelegateTarget2.DelegateCalled);
            Assert.IsTrue(mockDelegateTarget1.DelegateCalled2);
            Assert.IsFalse(mockDelegateTarget2.DelegateCalled2);
            Assert.IsFalse(MockStaticDelegateTarget.DelegateCalled);
            Assert.AreSame(parameter, mockDelegateTarget1.DelegateParameter2);
        }
        public void InvokesRegisteredDelegates()
        {
            MockDelegateTarget mockDelegateTarget1 = new MockDelegateTarget();
              MockDelegateTarget mockDelegateTarget2 = new MockDelegateTarget();

              var weakMulticastDelegate = new WeakMulticastDelegate<Action<object>>();
              weakMulticastDelegate.Add(mockDelegateTarget1.DelegateMethod);
              weakMulticastDelegate.Add(mockDelegateTarget2.DelegateMethod);
              weakMulticastDelegate.Add(mockDelegateTarget1.DelegateMethod2);
              weakMulticastDelegate.Add(mockDelegateTarget2.DelegateMethod2);
              weakMulticastDelegate.Add(MockStaticDelegateTarget.DelegateMethod);

              MockStaticDelegateTarget.Clear();
              object parameter = new object();
              weakMulticastDelegate.Invoke(parameter);

              Assert.IsTrue(mockDelegateTarget1.DelegateCalled);
              Assert.IsTrue(mockDelegateTarget2.DelegateCalled);
              Assert.IsTrue(mockDelegateTarget1.DelegateCalled2);
              Assert.IsTrue(mockDelegateTarget2.DelegateCalled2);
              Assert.IsTrue(MockStaticDelegateTarget.DelegateCalled);
              Assert.AreSame(parameter, mockDelegateTarget1.DelegateParameter);
              Assert.AreSame(parameter, mockDelegateTarget2.DelegateParameter);
              Assert.AreSame(parameter, mockDelegateTarget1.DelegateParameter2);
              Assert.AreSame(parameter, mockDelegateTarget2.DelegateParameter2);
              Assert.AreSame(parameter, MockStaticDelegateTarget.DelegateParameter);
        }