private static void RegisterC3(ListenerManager_v2 <C1> manager, Listener listener)
 {
     manager.RegisterFor <C3>()
     .Register <EventArgs>(listener.Listen,
                           (x, h) => x.Ev1 += h,
                           (x, h) => x.Ev1 -= h)
     .RegisterProperty("V1", x => x.V1, listener.Listen, false)
     .RegisterProperty("V2", x => x.V2, listener.Listen, false);
 }
        public void Test1()
        {
            Listener listener = new Listener();

            ListenerManager_v2 <C1> manager = new ListenerManager_v2 <C1>();
            List <int> registered           = new List <int>();

            manager.Registering += (sender, args) =>
            {
                int id = ((Base)args.Item).Id;
                registered.Add(id);

                //Debug.WriteLine("Registering " + args.Item);
            };
            manager.Unregistering += (sender, args) =>
            {
                int id = ((Base)args.Item).Id;
                registered.Remove(id);

                //Debug.WriteLine("Unregistering " + args.Item);
            };

            RegisterC1(manager, listener);
            RegisterC2(manager, listener);
            RegisterC3(manager, listener);

            C1 root = CreateTest();

            // Se envian eventos cuando aun no esta conectado.
            SendEvent(root);

            Assert.IsTrue(registered.Count == 0);
            Assert.IsTrue(listener.PropertyArgs.Count == 0);
            Assert.IsTrue(listener.ListArgs.Count == 0);
            Assert.IsTrue(listener.OtherArgs.Count == 0);

            // Se establece la raiz.
            manager.SetRoot(root);

            Assert.IsTrue(registered.Count == 133);
            Assert.IsTrue(listener.PropertyArgs.Count == 0);
            Assert.IsTrue(listener.ListArgs.Count == 0);
            Assert.IsTrue(listener.OtherArgs.Count == 0);

            // Se envian eventos cuando ya esta conectado pero sin contenido.
            SendEvent(root);

            Assert.IsTrue(registered.Count == 133);
            Assert.IsTrue(listener.PropertyArgs.Count == 266);
            Assert.IsTrue(listener.ListArgs.Count == 0);
            Assert.IsTrue(listener.OtherArgs.Count == 133);

            listener.PropertyArgs.Clear();
            listener.OtherArgs.Clear();

            // Se elimina la raiz.
            manager.SetRoot(null);

            Assert.IsTrue(registered.Count == 0);
            Assert.IsTrue(listener.PropertyArgs.Count == 0);
            Assert.IsTrue(listener.ListArgs.Count == 0);
            Assert.IsTrue(listener.OtherArgs.Count == 0);

            // Se envian eventos cuando ya no esta conectado.
            SendEvent(root);

            Assert.IsTrue(registered.Count == 0);
            Assert.IsTrue(listener.PropertyArgs.Count == 0);
            Assert.IsTrue(listener.ListArgs.Count == 0);
            Assert.IsTrue(listener.OtherArgs.Count == 0);
        }