public void AcceptCommandShouldRefreshCommandState()
        {
            var oldTerm = TermListViewModelFixture.SampleTerms[0];
            var newTerm = new Term("term4", "def 4");

            var service = this._termsServiceMock;

            service
            .Setup(s => s.UpdateTerm(oldTerm, newTerm, ThreadPoolScheduler.Instance))
            .Returns(() => Observable.Return(newTerm));

            var editModel = TermListViewModelFixture.MockEditModel(newTerm);
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(service.Object, editModel);

            listModel.EditTerm.Execute(oldTerm);
            listModel.Accept.Execute(null);

            DispatcherHelper.ProcessCurrentQueue();

            Assert.IsTrue(listModel.AddTerm.CanExecute(null));
            Assert.IsTrue(listModel.EditTerm.CanExecute(newTerm));
            Assert.IsFalse(listModel.DeleteTerm.CanExecute(null));
            Assert.IsFalse(listModel.Accept.CanExecute(null));
            Assert.IsFalse(listModel.Cancel.CanExecute(null));
        }
        public void RecreateStorageCommandSubscibesRecreateStorage()
        {
            var term = new Term("term4", "def 4");

            // Create service mock that allows to load terms, prevents
            // adding a term, and verifies recreation attempt.

            var observable = new Mock <IObservable <Unit> >();

            observable.Setup(o => o.Subscribe(It.IsAny <IObserver <Unit> >())).Verifiable();

            var service = this._termsServiceMock;

            service
            .Setup(s => s.AddTerm(term, ThreadPoolScheduler.Instance))
            .Returns(() => Observable.Throw <Term>(new InvalidTermsStorageException("Invalid")));
            service
            .Setup(s => s.RecreateStorage(
                       It.Is <IEnumerable <Term> >(terms => !TermListViewModelFixture.SampleTerms.Except(terms).Any()),
                       ThreadPoolScheduler.Instance))
            .Returns(() => observable.Object);

            // Create view model to test invokation on RecreateStorage.

            var editModel = TermListViewModelFixture.MockEditModel(term);
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(service.Object, editModel);

            listModel.AddTerm.Execute(null);

            DispatcherHelper.ProcessCurrentQueue();

            listModel.RecreateStorage.Execute(null);

            observable.Verify();
        }
        public void ModelNotifiesAndStaysInEditModeWhenAcceptEditFailed()
        {
            var oldTerm = TermListViewModelFixture.SampleTerms[0];
            var newTerm = new Term("term4", "def 4");

            var msg = "Failed";

            var service = this._termsServiceMock;

            service
            .Setup(s => s.UpdateTerm(oldTerm, newTerm, ThreadPoolScheduler.Instance))
            .Returns(() => Observable.Throw <Term>(new Exception(msg)));

            var editModel = TermListViewModelFixture.MockEditModel(newTerm);
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(service.Object, editModel);

            listModel.EditTerm.Execute(oldTerm);
            listModel.Accept.Execute(null);

            DispatcherHelper.ProcessCurrentQueue();

            Assert.IsTrue(listModel.Terms.Cast <Term>().Contains(oldTerm));
            Assert.IsFalse(listModel.Terms.Cast <Term>().Contains(newTerm));

            Assert.AreEqual(msg, listModel.Notification);
            Assert.IsTrue(listModel.IsEditMode);
        }
        public void ModelNotifiesWhenRecreateStorageFailed()
        {
            var term = new Term("term4", "def 4");

            var service = new Mock <ITermsService>();

            service
            .Setup(s => s.LoadTerms(ThreadPoolScheduler.Instance))
            .Returns(() => Observable.Throw <IEnumerable <Term> >(new InvalidTermsStorageException("Invalid")));
            service
            .Setup(s => s.RecreateStorage(It.Is <IEnumerable <Term> >(terms => !terms.Any()), ThreadPoolScheduler.Instance))
            .Returns(() => Observable.Throw <Unit>(new InvalidTermsStorageException("Invalid")));

            var editModel = TermListViewModelFixture.MockEditModel(term);
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(service.Object, editModel);

            Assert.IsTrue(listModel.RecreateStorage.CanExecute(null));

            listModel.RecreateStorage.Execute(null);

            DispatcherHelper.ProcessCurrentQueue();

            Assert.IsNotNull(listModel.Notification);
            Assert.IsTrue(listModel.RecreateStorage.CanExecute(null));
        }
        public void EditTermCommandShouldNotExecuteOnUnknownTerm()
        {
            var editModel = new Mock <ITermEditViewModel>();
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(this._termsServiceMock.Object, editModel.Object);

            Assert.IsFalse(listModel.EditTerm.CanExecute(null));
            Assert.IsFalse(listModel.EditTerm.CanExecute(new Term("term4", "def 4")));
        }
        public void AddTermCommandEntersEmptyEditMode()
        {
            var editModel = new Mock <ITermEditViewModel>();
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(this._termsServiceMock.Object, editModel.Object);

            listModel.AddTerm.Execute(null);

            editModel.VerifySet(m => m.Name       = String.Empty);
            editModel.VerifySet(m => m.Definition = String.Empty);

            Assert.IsTrue(listModel.IsEditMode);
        }
        public void AddTermCommandRefreshesCommandState()
        {
            var editModel = new Mock <ITermEditViewModel>();
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(this._termsServiceMock.Object, editModel.Object);

            listModel.AddTerm.Execute(null);

            Assert.IsFalse(listModel.AddTerm.CanExecute(null));
            Assert.IsFalse(listModel.EditTerm.CanExecute(TermListViewModelFixture.SampleTerms[0]));
            Assert.IsFalse(listModel.DeleteTerm.CanExecute(null));
            Assert.IsTrue(listModel.Accept.CanExecute(null));
            Assert.IsTrue(listModel.Cancel.CanExecute(null));
        }
        public void ModelEnablesRecreateStorageForInvalidStorageOnStartup()
        {
            var service = this._termsServiceMock;

            service
            .Setup(s => s.LoadTerms(ThreadPoolScheduler.Instance))
            .Returns(() => Observable.Throw <IEnumerable <Term> >(new InvalidTermsStorageException("Invalid")));

            var editModel = Mock.Of <ITermEditViewModel>();
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(service.Object, editModel);

            Assert.IsTrue(listModel.RecreateStorage.CanExecute(null));
        }
        public void EditTermCommandEntersExistentEditMode()
        {
            var editModel = new Mock <ITermEditViewModel>();
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(this._termsServiceMock.Object, editModel.Object);

            var term = TermListViewModelFixture.SampleTerms[0];

            listModel.EditTerm.Execute(term);

            editModel.VerifySet(m => m.Name       = term.Name);
            editModel.VerifySet(m => m.Definition = term.Definition);

            Assert.IsTrue(listModel.IsEditMode);
        }
        public void ModelNotifiesAndStaysInEditModeWhenAcceptAddInvalidTerm()
        {
            var editModel = new Mock <ITermEditViewModel>();

            editModel.SetupGet(m => m.Error).Returns("Error");

            var listModel = TermListViewModelFixture.CreateViewModelLoaded(this._termsServiceMock.Object, editModel.Object);

            listModel.AddTerm.Execute(null);
            listModel.Accept.Execute(null);

            StringAssert.Contains(listModel.Notification, editModel.Object.Error);
            Assert.IsTrue(listModel.IsEditMode);
        }
        public void ModelSubscibesLoadTermsOnStartup()
        {
            var observable = new Mock <IObservable <IEnumerable <Term> > >();

            observable.Setup(o => o.Subscribe(It.IsAny <IObserver <IEnumerable <Term> > >())).Verifiable();

            var service = new Mock <ITermsService>();

            service.Setup(s => s.LoadTerms(ThreadPoolScheduler.Instance)).Returns(() => observable.Object);

            TermListViewModelFixture.CreateViewModelLoaded(service.Object, Mock.Of <ITermEditViewModel>());

            observable.Verify();
        }
        public void ModelNotifiesWhenLoadTermsFailed()
        {
            var msg = "Failed";

            var service = this._termsServiceMock;

            service
            .Setup(s => s.LoadTerms(ThreadPoolScheduler.Instance))
            .Returns(() => Observable.Throw <IEnumerable <Term> >(new Exception(msg)));

            var editModel = Mock.Of <ITermEditViewModel>();
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(service.Object, editModel);

            Assert.AreEqual(msg, listModel.Notification);
        }
        public void DeleteTermCommandHidesDeletedTerm()
        {
            var term = TermListViewModelFixture.SampleTerms[0];

            var service = this._termsServiceMock;

            service.Setup(s => s.RemoveTerm(term, ThreadPoolScheduler.Instance)).Returns(() => Observable.Return(term));

            var editModel = Mock.Of <ITermEditViewModel>();
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(service.Object, editModel);

            listModel.EditTerm.Execute(term);
            listModel.DeleteTerm.Execute(null);

            DispatcherHelper.ProcessCurrentQueue();

            Assert.IsFalse(listModel.Terms.Cast <Term>().Contains(term));
            Assert.IsFalse(listModel.IsEditMode);
        }
        public void AcceptAddCommandShowsNewTerm()
        {
            var term = new Term("term4", "def 4");

            var service = this._termsServiceMock;

            service.Setup(s => s.AddTerm(term, ThreadPoolScheduler.Instance)).Returns(() => Observable.Return(term));

            var editModel = TermListViewModelFixture.MockEditModel(term);
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(service.Object, editModel);

            listModel.AddTerm.Execute(null);
            listModel.Accept.Execute(null);

            DispatcherHelper.ProcessCurrentQueue();

            Assert.IsTrue(listModel.Terms.Cast <Term>().Contains(term));
            Assert.IsFalse(listModel.IsEditMode);
        }
        public void CancelCommandExitsEditMode()
        {
            var editModel = new Mock <ITermEditViewModel>();

            // Test exit after add.

            var listModel = TermListViewModelFixture.CreateViewModelLoaded(this._termsServiceMock.Object, editModel.Object);

            listModel.AddTerm.Execute(null);
            listModel.Cancel.Execute(null);
            Assert.IsFalse(listModel.IsEditMode);

            // Test exit after edit.

            listModel = TermListViewModelFixture.CreateViewModelLoaded(this._termsServiceMock.Object, editModel.Object);

            listModel.EditTerm.Execute(TermListViewModelFixture.SampleTerms[0]);
            listModel.Cancel.Execute(null);

            Assert.IsFalse(listModel.IsEditMode);
        }
        public void DeleteTermCommandRefreshesCommandState()
        {
            var term = TermListViewModelFixture.SampleTerms[0];

            var service = this._termsServiceMock;

            service.Setup(s => s.RemoveTerm(term, ThreadPoolScheduler.Instance)).Returns(() => Observable.Return(term));

            var editModel = Mock.Of <ITermEditViewModel>();
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(service.Object, editModel);

            listModel.EditTerm.Execute(term);
            listModel.DeleteTerm.Execute(null);

            DispatcherHelper.ProcessCurrentQueue();

            Assert.IsTrue(listModel.AddTerm.CanExecute(null));
            Assert.IsTrue(listModel.EditTerm.CanExecute(TermListViewModelFixture.SampleTerms[1]));
            Assert.IsFalse(listModel.DeleteTerm.CanExecute(null));
            Assert.IsFalse(listModel.Accept.CanExecute(null));
            Assert.IsFalse(listModel.Cancel.CanExecute(null));
        }
        public void DeleteTermCommandSubscibesRemoveTerm()
        {
            var term = TermListViewModelFixture.SampleTerms[0];

            var observable = new Mock <IObservable <Term> >();

            observable.Setup(o => o.Subscribe(It.IsAny <IObserver <Term> >())).Verifiable();

            var service = this._termsServiceMock;

            service.Setup(s => s.RemoveTerm(term, ThreadPoolScheduler.Instance)).Returns(() => observable.Object);

            var editModel = Mock.Of <ITermEditViewModel>();
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(service.Object, editModel);

            listModel.EditTerm.Execute(term);
            listModel.DeleteTerm.Execute(null);

            DispatcherHelper.ProcessCurrentQueue();

            observable.Verify();
        }
        public void AcceptAddCommandSubscibesAddTerm()
        {
            var term = new Term("term4", "def 4");

            var observable = new Mock <IObservable <Term> >();

            observable.Setup(o => o.Subscribe(It.IsAny <IObserver <Term> >())).Verifiable();

            var service = this._termsServiceMock;

            service.Setup(s => s.AddTerm(term, ThreadPoolScheduler.Instance)).Returns(() => observable.Object);

            var editModel = TermListViewModelFixture.MockEditModel(term);
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(service.Object, editModel);

            listModel.AddTerm.Execute(null);
            listModel.Accept.Execute(null);

            DispatcherHelper.ProcessCurrentQueue();

            observable.Verify();
        }
        public void AcceptAddCommandEnablesRecreateStorageForInvalidStorage()
        {
            var term = new Term("term4", "def 4");

            var service = this._termsServiceMock;

            service
            .Setup(s => s.AddTerm(term, ThreadPoolScheduler.Instance))
            .Returns(() => Observable.Throw <Term>(new InvalidTermsStorageException("Invalid")));

            var editModel = TermListViewModelFixture.MockEditModel(term);
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(service.Object, editModel);

            listModel.AddTerm.Execute(null);

            Assert.IsFalse(listModel.RecreateStorage.CanExecute(null));

            listModel.Accept.Execute(null);

            DispatcherHelper.ProcessCurrentQueue();

            Assert.IsTrue(listModel.RecreateStorage.CanExecute(null));
        }
        public void DeleteCommandEnablesRecreateStorageForInvalidStorage()
        {
            var term = TermListViewModelFixture.SampleTerms[0];

            var service = this._termsServiceMock;

            service
            .Setup(s => s.RemoveTerm(term, ThreadPoolScheduler.Instance))
            .Returns(() => Observable.Throw <Term>(new InvalidTermsStorageException("Invalid")));

            var editModel = Mock.Of <ITermEditViewModel>();
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(service.Object, editModel);

            listModel.EditTerm.Execute(term);

            Assert.IsFalse(listModel.RecreateStorage.CanExecute(null));

            listModel.DeleteTerm.Execute(null);

            DispatcherHelper.ProcessCurrentQueue();

            Assert.IsTrue(listModel.RecreateStorage.CanExecute(null));
        }
        public void ModelNotifiesAndStaysInEditModeWhenDeleteFailed()
        {
            var term = TermListViewModelFixture.SampleTerms[0];
            var msg  = "Failed";

            var service = this._termsServiceMock;

            service
            .Setup(s => s.RemoveTerm(term, ThreadPoolScheduler.Instance))
            .Returns(() => Observable.Throw <Term>(new Exception(msg)));

            var editModel = Mock.Of <ITermEditViewModel>();
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(service.Object, editModel);

            listModel.EditTerm.Execute(term);
            listModel.DeleteTerm.Execute(null);

            DispatcherHelper.ProcessCurrentQueue();

            Assert.IsTrue(listModel.Terms.Cast <Term>().Contains(term));
            Assert.AreEqual(msg, listModel.Notification);
            Assert.IsTrue(listModel.IsEditMode);
        }
        public void ModelExposesTermsAfterLoadTerms()
        {
            var model = TermListViewModelFixture.CreateViewModelLoaded(this._termsServiceMock.Object, Mock.Of <ITermEditViewModel>());

            ReactiveAssert.AreElementsEqual(TermListViewModelFixture.SampleTerms, model.Terms.Cast <Term>());
        }