public void WhenShowDetailsCommandIsExecuted_ThenUpdatesShowingDetails()
        {
            Action <IOperationResult <IEnumerable <Contact> > > getContactsCallback = null;
            var serviceMock = new Mock <IChatService>();

            serviceMock
            .Setup(svc => svc.GetContacts(It.IsAny <Action <IOperationResult <IEnumerable <Contact> > > >()))
            .Callback <Action <IOperationResult <IEnumerable <Contact> > > >(c => getContactsCallback = c);

            var contacts   = new[] { new Contact(), new Contact() };
            var resultMock = new Mock <IOperationResult <IEnumerable <Contact> > >();

            resultMock.SetupGet(r => r.Result).Returns(contacts);

            var viewModel = new ChatViewModel(serviceMock.Object);

            getContactsCallback(resultMock.Object);

            viewModel.ContactsView.MoveCurrentTo(contacts[0]);

            var tracker = new PropertyChangeTracker(viewModel);

            Assert.IsFalse(viewModel.ShowDetails);

            viewModel.ShowDetailsCommand.Execute(true);

            Assert.IsTrue(viewModel.ShowDetails);
            CollectionAssert.AreEqual(new[] { "ShowDetails" }, tracker.ChangedProperties);
        }
        public void WhenSendingMessage_ThenUpdatesAndNotifiesSendingMessage()
        {
            var contact = new Contact();
            var message = "message";
            Action <IOperationResult <IEnumerable <Contact> > > getContactsCallback = null;
            Action <IOperationResult> sendMessageCallback = null;

            var serviceMock = new Mock <IChatService>(MockBehavior.Strict);

            serviceMock
            .SetupSet(svc => svc.Connected = true);
            serviceMock
            .Setup(svc => svc.GetContacts(It.IsAny <Action <IOperationResult <IEnumerable <Contact> > > >()))
            .Callback <Action <IOperationResult <IEnumerable <Contact> > > >(cb => getContactsCallback = cb);
            serviceMock
            .Setup(svc => svc.SendMessage(contact, message, It.IsAny <Action <IOperationResult> >()))
            .Callback <Contact, string, Action <IOperationResult> >((c, m, cb) => sendMessageCallback = cb);


            var getContactsOperationMock = new Mock <IOperationResult <IEnumerable <Contact> > >();

            getContactsOperationMock.SetupGet(or => or.Result).Returns(new[] { contact });

            var viewModel = new ChatViewModel(serviceMock.Object);

            InteractionRequestedEventArgs args = null;

            viewModel.SendMessageRequest.Raised += (s, e) => args = e;

            getContactsCallback(getContactsOperationMock.Object);

            viewModel.ContactsView.MoveCurrentTo(contact);

            var tracker = new PropertyChangeTracker(viewModel);

            Assert.IsFalse(viewModel.SendingMessage);

            viewModel.SendMessage();

            Assert.IsFalse(viewModel.SendingMessage);

            var sendMessage = args.Context as SendMessageViewModel;

            sendMessage.Result  = true;
            sendMessage.Message = message;

            args.Callback();

            Assert.IsTrue(viewModel.SendingMessage);
            CollectionAssert.AreEqual(new[] { "SendingMessage" }, tracker.ChangedProperties);

            tracker.Reset();

            sendMessageCallback(new Mock <IOperationResult>().Object);

            Assert.IsFalse(viewModel.SendingMessage);
            CollectionAssert.AreEqual(new[] { "SendingMessage" }, tracker.ChangedProperties);
        }
        public void WhenChangingShowDetails_ThenNotifiesPropertyChange()
        {
            var serviceMock = new Mock <IChatService>(MockBehavior.Strict);

            serviceMock
            .SetupSet(svc => svc.Connected = true);
            serviceMock
            .Setup(svc => svc.GetContacts(It.IsAny <Action <IOperationResult <IEnumerable <Contact> > > >()));
            var viewModel = new ChatViewModel(serviceMock.Object);

            var tracker = new PropertyChangeTracker(viewModel);

            viewModel.ShowDetails = true;

            CollectionAssert.AreEqual(new[] { "ShowDetails" }, tracker.ChangedProperties);

            serviceMock.VerifyAll();
        }
        public void WhenChangingConnectionStatus_ThenUpdatesServiceAndNotifiesPropertyChange()
        {
            var serviceMock = new Mock <IChatService>(MockBehavior.Strict);

            serviceMock
            .SetupSet(svc => svc.Connected = true);
            serviceMock
            .SetupSet(svc => svc.Connected              = false)
            .Raises(svc => svc.ConnectionStatusChanged += null, EventArgs.Empty);
            serviceMock
            .Setup(svc => svc.GetContacts(It.IsAny <Action <IOperationResult <IEnumerable <Contact> > > >()));
            var viewModel = new ChatViewModel(serviceMock.Object);

            var tracker = new PropertyChangeTracker(viewModel);

            viewModel.ConnectionStatus = "Unavailable";

            CollectionAssert.AreEqual(new[] { "ConnectionStatus" }, tracker.ChangedProperties);

            serviceMock.VerifyAll();
        }
        public void WhenChangingConnectionStatus_ThenUpdatesServiceAndNotifiesPropertyChange()
        {
            var serviceMock = new Mock<IChatService>(MockBehavior.Strict);
            serviceMock
                .SetupSet(svc => svc.Connected = true);
            serviceMock
                .SetupSet(svc => svc.Connected = false)
                .Raises(svc => svc.ConnectionStatusChanged += null, EventArgs.Empty);
            serviceMock
                .Setup(svc => svc.GetContacts(It.IsAny<Action<IOperationResult<IEnumerable<Contact>>>>()));
            var viewModel = new ChatViewModel(serviceMock.Object);

            var tracker = new PropertyChangeTracker(viewModel);

            viewModel.ConnectionStatus = "Unavailable";

            CollectionAssert.AreEqual(new[] { "ConnectionStatus" }, tracker.ChangedProperties);

            serviceMock.VerifyAll();
        }
        public void WhenSendingMessage_ThenUpdatesAndNotifiesSendingMessage()
        {
            var contact = new Contact();
            var message = "message";
            Action<IOperationResult<IEnumerable<Contact>>> getContactsCallback = null;
            Action<IOperationResult> sendMessageCallback = null;

            var serviceMock = new Mock<IChatService>(MockBehavior.Strict);
            serviceMock
                .SetupSet(svc => svc.Connected = true);
            serviceMock
                .Setup(svc => svc.GetContacts(It.IsAny<Action<IOperationResult<IEnumerable<Contact>>>>()))
                .Callback<Action<IOperationResult<IEnumerable<Contact>>>>(cb => getContactsCallback = cb);
            serviceMock
                .Setup(svc => svc.SendMessage(contact, message, It.IsAny<Action<IOperationResult>>()))
                .Callback<Contact, string, Action<IOperationResult>>((c, m, cb) => sendMessageCallback = cb);


            var getContactsOperationMock = new Mock<IOperationResult<IEnumerable<Contact>>>();
            getContactsOperationMock.SetupGet(or => or.Result).Returns(new[] { contact });

            var viewModel = new ChatViewModel(serviceMock.Object);

            InteractionRequestedEventArgs args = null;
            viewModel.SendMessageRequest.Raised += (s, e) => args = e;

            getContactsCallback(getContactsOperationMock.Object);

            viewModel.ContactsView.MoveCurrentTo(contact);

            var tracker = new PropertyChangeTracker(viewModel);

            Assert.IsFalse(viewModel.SendingMessage);

            viewModel.SendMessage();

            Assert.IsFalse(viewModel.SendingMessage);

            var sendMessage = args.Context as SendMessageViewModel;
            sendMessage.Result = true;
            sendMessage.Message = message;

            args.Callback();

            Assert.IsTrue(viewModel.SendingMessage);
            CollectionAssert.AreEqual(new[] { "SendingMessage" }, tracker.ChangedProperties);

            tracker.Reset();

            sendMessageCallback(new Mock<IOperationResult>().Object);

            Assert.IsFalse(viewModel.SendingMessage);
            CollectionAssert.AreEqual(new[] { "SendingMessage" }, tracker.ChangedProperties);
        }
        public void WhenShowDetailsCommandIsExecuted_ThenUpdatesShowingDetails()
        {
            Action<IOperationResult<IEnumerable<Contact>>> getContactsCallback = null;
            var serviceMock = new Mock<IChatService>();
            serviceMock
                .Setup(svc => svc.GetContacts(It.IsAny<Action<IOperationResult<IEnumerable<Contact>>>>()))
                .Callback<Action<IOperationResult<IEnumerable<Contact>>>>(c => getContactsCallback = c);

            var contacts = new[] { new Contact(), new Contact() };
            var resultMock = new Mock<IOperationResult<IEnumerable<Contact>>>();
            resultMock.SetupGet(r => r.Result).Returns(contacts);

            var viewModel = new ChatViewModel(serviceMock.Object);

            getContactsCallback(resultMock.Object);

            viewModel.ContactsView.MoveCurrentTo(contacts[0]);

            var tracker = new PropertyChangeTracker(viewModel);

            Assert.IsFalse(viewModel.ShowDetails);

            viewModel.ShowDetailsCommand.Execute(true);

            Assert.IsTrue(viewModel.ShowDetails);
            CollectionAssert.AreEqual(new[] { "ShowDetails" }, tracker.ChangedProperties);
        }
        public void WhenChangingShowDetails_ThenNotifiesPropertyChange()
        {
            var serviceMock = new Mock<IChatService>(MockBehavior.Strict);
            serviceMock
                .SetupSet(svc => svc.Connected = true);
            serviceMock
                .Setup(svc => svc.GetContacts(It.IsAny<Action<IOperationResult<IEnumerable<Contact>>>>()));
            var viewModel = new ChatViewModel(serviceMock.Object);

            var tracker = new PropertyChangeTracker(viewModel);

            viewModel.ShowDetails = true;

            CollectionAssert.AreEqual(new[] { "ShowDetails" }, tracker.ChangedProperties);

            serviceMock.VerifyAll();
        }