public void CannotDeleteFoodItemIfNew() { var loggerMock = new Mock<ILoggerFacade>(); var dataRepositoryMock = new Mock<IDataRepository>(); var interactionServiceMock = new Mock<IInteractionService>(); var regionNavigationServiceMock = new Mock<IRegionNavigationService>(); var regionManagerMock = new Mock<IRegionManager>(); dataRepositoryMock.Setup( x => x.Contains( It.IsAny<FoodItem>() ) ).Returns( false ); dataRepositoryMock.Setup( x => x.ItemIsUsed( It.IsAny<FoodItem>() ) ).Returns( false ); dataRepositoryMock .Setup( x => x.GetAllFoodGroups() ) .Returns( new ReadOnlyCollection<FoodGroup>( new List<FoodGroup>() ) ); var viewModel = new FoodItemViewModel( dataRepositoryMock.Object, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); var navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "FoodItem", UriKind.Relative ) ); viewModel.OnNavigatedTo( navigationContext ); viewModel.Name = "test"; viewModel.Description = "This is a test"; viewModel.FoodGroupsPerServing.Add( new ServingViewModel<FoodGroup>( new FoodGroup( Guid.NewGuid(), "test", "test" ), 1.5M ) ); // Setup the regions so we can determine if the view has been removed or not var view = new UserControl(); view.DataContext = viewModel; var views = new List<UserControl>(); views.Add( new UserControl() ); views.Add( view ); views.Add( new UserControl() ); views.Add( new UserControl() ); var regionMock = new Mock<IRegion>(); var regions = new List<IRegion>(); regions.Add( regionMock.Object ); regionManagerMock.Setup( x => x.Regions.GetEnumerator() ).Returns( regions.GetEnumerator() ); regionMock.Setup( x => x.Views.GetEnumerator() ).Returns( views.GetEnumerator() ); Assert.IsTrue( viewModel.IsNew ); Assert.IsFalse( viewModel.IsUsed ); Assert.IsTrue( viewModel.IsValid ); Assert.IsFalse( viewModel.DeleteCommand.CanExecute( null ) ); interactionServiceMock.Verify( x => x.ShowMessageBox( It.IsAny<String>(), It.IsAny<String>(), It.IsAny<MessageBoxButton>(), It.IsAny<MessageBoxImage>() ), Times.Never() ); regionMock.Verify( x => x.Remove( It.IsAny<Object>() ), Times.Never() ); }
public void FoodItemViewModelIsDirty() { var loggerMock = new Mock<ILoggerFacade>(); var regionNavigationServiceMock = new Mock<IRegionNavigationService>(); var regionManagerMock = new Mock<IRegionManager>(); var interactionServiceMock = new Mock<IInteractionService>(); var configurationMock = new Mock<IConfiguration>(); configurationMock.Setup( x => x.DataSource ).Returns( DataSourceType.XMLFile ); configurationMock.Setup( x => x.FileName ).Returns( FullTestData.DataFileName ); FullTestData.Reset(); var dataRepository = new DataRepository( configurationMock.Object ); // Existing Food Item // Starts clean // Change Name - dirty // Undo - clean // Change Description - dirty // Undo - clean // Change Calories - dirty // Undo - clean // Change Food Group Serving - dirty // Undo - clean // Add food group - dirty // undo - clean // FoodItem cheeseBurger = dataRepository.GetFoodItem( FullTestData.CheeseBurgerID ); Assert.IsNotNull( cheeseBurger ); String originalName = cheeseBurger.Name; String originalDescription = cheeseBurger.Description; FoodItemViewModel cheeseBurgerViewModel = new FoodItemViewModel( dataRepository, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); NavigationContext navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "FoodItemView?ID=" + cheeseBurger.ID.ToString(), UriKind.Relative ) ); cheeseBurgerViewModel.OnNavigatedTo( navigationContext ); Assert.IsFalse( cheeseBurgerViewModel.IsDirty ); cheeseBurgerViewModel.Name += "Modified"; Assert.IsTrue( cheeseBurgerViewModel.IsDirty ); cheeseBurgerViewModel.Name = originalName; Assert.IsFalse( cheeseBurgerViewModel.IsDirty ); cheeseBurgerViewModel.Description += "Different"; Assert.IsTrue( cheeseBurgerViewModel.IsDirty ); cheeseBurgerViewModel.Description = originalDescription; Assert.IsFalse( cheeseBurgerViewModel.IsDirty ); cheeseBurgerViewModel.Name = null; Assert.IsTrue( cheeseBurgerViewModel.IsDirty ); cheeseBurgerViewModel.Name = originalName; Assert.IsFalse( cheeseBurgerViewModel.IsDirty ); cheeseBurgerViewModel.CaloriesPerServing += 90; Assert.IsTrue( cheeseBurgerViewModel.IsDirty ); cheeseBurgerViewModel.CaloriesPerServing -= 90; Assert.IsFalse( cheeseBurgerViewModel.IsDirty ); cheeseBurgerViewModel.FoodGroupsPerServing[0].Quantity += 1; Assert.IsTrue( cheeseBurgerViewModel.IsDirty ); cheeseBurgerViewModel.FoodGroupsPerServing[0].Quantity -= 1; Assert.IsFalse( cheeseBurgerViewModel.IsDirty ); ServingViewModel<FoodGroup> serving = cheeseBurgerViewModel.FoodGroupsPerServing[0]; cheeseBurgerViewModel.FoodGroupsPerServing.Remove( serving ); Assert.IsTrue( cheeseBurgerViewModel.IsDirty ); // Create an exact duplicate of the servings. ServingViewModel<FoodGroup> copyOfServing = new ServingViewModel<FoodGroup>( serving.Entity, serving.Quantity ); cheeseBurgerViewModel.FoodGroupsPerServing.Add( copyOfServing ); Assert.IsFalse( cheeseBurgerViewModel.IsDirty ); serving = new ServingViewModel<FoodGroup>( dataRepository.FindFoodGroup( fg => fg.Name == "Water" ), 1 ); cheeseBurgerViewModel.FoodGroupsPerServing.Add( serving ); Assert.IsTrue( cheeseBurgerViewModel.IsDirty ); cheeseBurgerViewModel.FoodGroupsPerServing.Remove( serving ); Assert.IsFalse( cheeseBurgerViewModel.IsDirty ); }
public void FoodItemViewModelID() { var loggerMock = new Mock<ILoggerFacade>(); var regionNavigationServiceMock = new Mock<IRegionNavigationService>(); var regionManagerMock = new Mock<IRegionManager>(); var interactionServiceMock = new Mock<IInteractionService>(); var configurationMock = new Mock<IConfiguration>(); configurationMock.Setup( x => x.DataSource ).Returns( DataSourceType.XMLFile ); configurationMock.Setup( x => x.FileName ).Returns( FullTestData.DataFileName ); FullTestData.Reset(); var dataRepository = new DataRepository( configurationMock.Object ); FoodItemViewModel testFoodItemViewModel = new FoodItemViewModel( dataRepository, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); NavigationContext navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "FoodItemView?ID=" + FullTestData.FruitSaladID, UriKind.Relative ) ); testFoodItemViewModel.OnNavigatedTo( navigationContext ); Assert.AreEqual( FullTestData.FruitSaladID, testFoodItemViewModel.ID ); }
public void FoodItemViewModelFoodGroupServings() { var loggerMock = new Mock<ILoggerFacade>(); var regionNavigationServiceMock = new Mock<IRegionNavigationService>(); var regionManagerMock = new Mock<IRegionManager>(); var interactionServiceMock = new Mock<IInteractionService>(); var configurationMock = new Mock<IConfiguration>(); configurationMock.Setup( x => x.DataSource ).Returns( DataSourceType.XMLFile ); configurationMock.Setup( x => x.FileName ).Returns( FullTestData.DataFileName ); FullTestData.Reset(); var dataRepository = new DataRepository( configurationMock.Object ); PropertyChangedHandler propertyChangedHandler = new PropertyChangedHandler(); // Navigate to a known food group mealType and make sure the food group servings makes sense. // NOTE: No need to get too fancy, the model tests makes sure the data loaded properly. FoodItem foodItem = dataRepository.GetFoodItem( FullTestData.CheeseBurgerID ); FoodItemViewModel foodItemViewModel = new FoodItemViewModel( dataRepository, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); NavigationContext navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "FoodItemView?ID=" + foodItem.ID.ToString(), UriKind.Relative ) ); foodItemViewModel.OnNavigatedTo( navigationContext ); foodItemViewModel.PropertyChanged += propertyChangedHandler.OnPropertyChanged; Assert.AreEqual( foodItem.FoodGroupsPerServing.Count, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.IsFalse( foodItemViewModel.IsDirty ); Assert.IsTrue( foodItemViewModel.IsValid ); // Add a food group ServingViewModel<FoodGroup> testFoodServings = new ServingViewModel<FoodGroup>( dataRepository.GetFoodGroup( FullTestData.JunkFoodID ), 1 ); foodItemViewModel.FoodGroupsPerServing.Add( testFoodServings ); Assert.IsTrue( foodItemViewModel.IsDirty ); Assert.IsTrue( foodItemViewModel.IsValid ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "FoodGroupsPerServing" ) ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "IsDirty" ) ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "IsValid" ) ); Assert.AreEqual( 3, propertyChangedHandler.PropertiesChanged.Count ); foodItemViewModel.FoodGroupsPerServing.Remove( testFoodServings ); Assert.IsTrue( foodItemViewModel.IsValid ); Assert.IsFalse( foodItemViewModel.IsDirty ); propertyChangedHandler.Reset(); // Delete a food group testFoodServings = foodItemViewModel.FoodGroupsPerServing.ElementAt( 0 ); foodItemViewModel.FoodGroupsPerServing.Remove( testFoodServings ); Assert.IsTrue( foodItemViewModel.IsDirty ); Assert.IsTrue( foodItemViewModel.IsValid ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "FoodGroupsPerServing" ) ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "IsDirty" ) ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "IsValid" ) ); Assert.AreEqual( 3, propertyChangedHandler.PropertiesChanged.Count ); foodItemViewModel.FoodGroupsPerServing.Add( testFoodServings ); Assert.IsTrue( foodItemViewModel.IsValid ); Assert.IsFalse( foodItemViewModel.IsDirty ); propertyChangedHandler.Reset(); // Modify a food group foodItemViewModel.FoodGroupsPerServing[0].Quantity += 1; Assert.AreEqual( foodItem.FoodGroupsPerServing.Count, foodItemViewModel.FoodGroupsPerServing.Count ); Serving<FoodGroup> modelServing = foodItem.FoodGroupsPerServing.Find( f => f.Entity.ID == foodItemViewModel.FoodGroupsPerServing[0].Entity.ID ); Assert.IsNotNull( modelServing ); Assert.IsTrue( foodItemViewModel.IsDirty ); Assert.IsTrue( foodItemViewModel.IsValid ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "FoodGroupsPerServing" ) ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "IsDirty" ) ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "IsValid" ) ); Assert.AreEqual( 3, propertyChangedHandler.PropertiesChanged.Count ); foodItemViewModel.FoodGroupsPerServing[0].Quantity -= 1; Assert.IsTrue( foodItemViewModel.IsValid ); Assert.IsFalse( foodItemViewModel.IsDirty ); propertyChangedHandler.Reset(); // Make a serving invalid. foodItemViewModel.FoodGroupsPerServing[0].Quantity *= -1; Assert.AreEqual( foodItem.FoodGroupsPerServing.Count, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.IsTrue( foodItemViewModel.IsDirty ); Assert.IsFalse( foodItemViewModel.IsValid ); Assert.AreEqual( Messages.Error_No_Quantity, foodItemViewModel.Error ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "FoodGroupsPerServing" ) ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "IsDirty" ) ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "IsValid" ) ); Assert.AreEqual( 3, propertyChangedHandler.PropertiesChanged.Count ); foodItemViewModel.FoodGroupsPerServing[0].Quantity *= -1; Assert.IsTrue( foodItemViewModel.IsValid ); Assert.IsFalse( foodItemViewModel.IsDirty ); propertyChangedHandler.Reset(); // Remove all food groups foodItemViewModel.FoodGroupsPerServing.Clear(); Assert.IsTrue( foodItemViewModel.IsDirty ); Assert.IsFalse( foodItemViewModel.IsValid ); Assert.AreEqual( Messages.Error_No_FoodGroups, foodItemViewModel.Error ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "FoodGroupsPerServing" ) ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "IsDirty" ) ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "IsValid" ) ); Assert.AreEqual( 3, propertyChangedHandler.PropertiesChanged.Count ); }
public void NavigateToFoodItem() { var loggerMock = new Mock<ILoggerFacade>(); var regionNavigationServiceMock = new Mock<IRegionNavigationService>(); var regionManagerMock = new Mock<IRegionManager>(); var interactionServiceMock = new Mock<IInteractionService>(); var configurationMock = new Mock<IConfiguration>(); configurationMock.Setup( x => x.DataSource ).Returns( DataSourceType.XMLFile ); configurationMock.Setup( x => x.FileName ).Returns( FullTestData.DataFileName ); FullTestData.Reset(); var dataRepository = new DataRepository( configurationMock.Object ); FoodItemViewModel viewModel = new FoodItemViewModel( dataRepository, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); NavigationContext navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "Something?ID=" + FullTestData.CheeseBurgerID, UriKind.Relative ) ); viewModel.OnNavigatedTo( navigationContext ); Assert.AreEqual( FullTestData.CheeseBurgerID, viewModel.ID ); Assert.AreEqual( "Deluxe Bacon Cheese Burger", viewModel.Name ); Assert.AreEqual( "Ground up cow, topped with curdled milk and salted pig fat. Add lettuce, tomato, and onion for health.", viewModel.Description ); Assert.AreEqual( 4, viewModel.FoodGroupsPerServing.Count ); Assert.IsFalse( viewModel.IsDirty ); }
public void FoodItemViewModelDefault() { var loggerMock = new Mock<ILoggerFacade>(); var configurationMock = new Mock<IConfiguration>(); configurationMock.Setup( x => x.DataSource ).Returns( DataSourceType.XMLFile ); configurationMock.Setup( x => x.FileName ).Returns( FullTestData.DataFileName ); FullTestData.Reset(); var dataRepository = new DataRepository( configurationMock.Object ); FoodItemViewModel foodItemViewModel = new FoodItemViewModel( dataRepository, null, null, loggerMock.Object ); Assert.AreEqual( DisplayStrings.NewFoodItemTitle, foodItemViewModel.Title ); }
public void ExistingFoodItemViewModelIsNotNew() { var loggerMock = new Mock<ILoggerFacade>(); var regionNavigationServiceMock = new Mock<IRegionNavigationService>(); var regionManagerMock = new Mock<IRegionManager>(); var dataRepositoryMock = new Mock<IDataRepository>(); var interactionServiceMock = new Mock<IInteractionService>(); var foodItem = new FoodItem( Guid.NewGuid(), "Test Food Item", "", 420 ); dataRepositoryMock.Setup( x => x.GetAllFoodGroups() ) .Returns( new ReadOnlyCollection<FoodGroup>( new List<FoodGroup>() ) ); dataRepositoryMock.Setup( x => x.Contains( foodItem ) ).Returns( true ); dataRepositoryMock.Setup( x => x.GetFoodItem( foodItem.ID ) ).Returns( foodItem ); var testFoodItemViewModel = new FoodItemViewModel( dataRepositoryMock.Object, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); var navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "FoodItemView?ID=" + foodItem.ID.ToString(), UriKind.Relative ) ); testFoodItemViewModel.OnNavigatedTo( navigationContext ); Assert.IsFalse( testFoodItemViewModel.IsNew ); }
public void FoodItemViewModelTitle() { var loggerMock = new Mock<ILoggerFacade>(); var regionNavigationServiceMock = new Mock<IRegionNavigationService>(); var regionManagerMock = new Mock<IRegionManager>(); var interactionServiceMock = new Mock<IInteractionService>(); var configurationMock = new Mock<IConfiguration>(); configurationMock.Setup( x => x.DataSource ).Returns( DataSourceType.XMLFile ); configurationMock.Setup( x => x.FileName ).Returns( FullTestData.DataFileName ); FullTestData.Reset(); DataRepository dataRepository = new DataRepository( configurationMock.Object ); FoodItemViewModel foodItemViewModel = new FoodItemViewModel( dataRepository, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); Assert.AreEqual( DisplayStrings.NewFoodItemTitle, foodItemViewModel.Title ); // Need to navigate to a new food group in order to makes changes and save them. NavigationContext navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "FoodItemView", UriKind.Relative ) ); foodItemViewModel.OnNavigatedTo( navigationContext ); Assert.AreEqual( DisplayStrings.NewFoodItemTitle, foodItemViewModel.Title ); foodItemViewModel.Name = "Test the Title"; foodItemViewModel.Description = "This is just to test the title"; foodItemViewModel.CaloriesPerServing = 90; foodItemViewModel.FoodGroupsPerServing.Add( new ServingViewModel<FoodGroup>( dataRepository.GetAllFoodGroups()[0], 1 ) ); Assert.AreEqual( DisplayStrings.NewFoodItemTitle, foodItemViewModel.Title ); Assert.IsTrue( foodItemViewModel.SaveCommand.CanExecute( null ) ); foodItemViewModel.SaveCommand.Execute( null ); Assert.AreEqual( "Test the Title", foodItemViewModel.Title ); }
public void SaveNotCalledForNonChangedFoodItem() { var loggerMock = new Mock<ILoggerFacade>(); var regionManagerMock = new Mock<IRegionManager>(); var regionNavigationServiceMock = new Mock<IRegionNavigationService>(); var dataRepositoryMock = new Mock<IDataRepository>(); var interactionServiceMock = new Mock<IInteractionService>(); var foodItem = new FoodItem( Guid.NewGuid(), "FoodItem", "", 420 ); foodItem.FoodGroupsPerServing.Add( new Serving<FoodGroup>( new FoodGroup( Guid.NewGuid(), "Test Group", "" ), 1 ) ); dataRepositoryMock.Setup( x => x.GetAllFoodGroups() ) .Returns( new ReadOnlyCollection<FoodGroup>( new List<FoodGroup>() ) ); dataRepositoryMock.Setup( x => x.Contains( foodItem ) ).Returns( true ); dataRepositoryMock.Setup( x => x.GetFoodItem( foodItem.ID ) ).Returns( foodItem ); var foodItemViewModel = new FoodItemViewModel( dataRepositoryMock.Object, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); var navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "FoodItemView?ID=" + foodItem.ID.ToString(), UriKind.Relative ) ); foodItemViewModel.OnNavigatedTo( navigationContext ); Assert.IsTrue( foodItemViewModel.IsValid ); Assert.IsFalse( foodItemViewModel.IsDirty ); Assert.IsFalse( foodItemViewModel.IsNew ); foodItemViewModel.SaveCommand.Execute( null ); dataRepositoryMock.Verify( x => x.SaveItem( It.IsAny<FoodItem>() ), Times.Never() ); }
/// <summary> /// Close test template. All of the close tests follow this based pattern, so they all call this rather than repeating everything /// </summary> private void RunCloseTest( Boolean makeDirty, Boolean makeInvalid, MessageBoxResult messageResponse, Boolean expectRemove, Boolean expectSave ) { var loggerMock = new Mock<ILoggerFacade>(); Mock<IDataRepository> dataRepositoryMock = new Mock<IDataRepository>(); Mock<IRegionNavigationService> regionNavigationServiceMock = new Mock<IRegionNavigationService>(); Mock<IRegionManager> regionManagerMock = new Mock<IRegionManager>(); Mock<IRegion> regionWithoutViewMock = new Mock<IRegion>(); Mock<IRegion> regionMock = new Mock<IRegion>(); Mock<IInteractionService> interactionServiceMock = new Mock<IInteractionService>(); // Set up the food group list in the data repository mock. FoodGroup testFoodGroup = new FoodGroup( Guid.NewGuid(), "test", "The only food group in the mock data repository" ); List<FoodGroup> foodGroups = new List<FoodGroup>(); foodGroups.Add( testFoodGroup ); dataRepositoryMock.Setup( x => x.GetAllFoodGroups() ).Returns( new ReadOnlyCollection<FoodGroup>( foodGroups ) ); FoodItem foodItem = new FoodItem( Guid.NewGuid(), "Test Food Item", "Test Food Item Description", 42.0M ); foodItem.FoodGroupsPerServing.Add( new Serving<FoodGroup>( testFoodGroup, 5.0M ) ); Assert.IsTrue( foodItem.IsValid ); dataRepositoryMock.Setup( x => x.GetFoodItem( foodItem.ID ) ).Returns( foodItem ); dataRepositoryMock.Setup( x => x.Contains( foodItem ) ).Returns( true ); // Create the view model under test and associate it with a view FoodItemViewModel viewModel = new FoodItemViewModel( dataRepositoryMock.Object, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); UserControl view = new UserControl(); view.DataContext = viewModel; // Set up two regions each with their own set of views. List<UserControl> views = new List<UserControl>(); views.Add( new UserControl() ); views.Add( view ); views.Add( new UserControl() ); views.Add( new UserControl() ); List<UserControl> viewsWithoutView = new List<UserControl>(); viewsWithoutView.Add( new UserControl() ); viewsWithoutView.Add( new UserControl() ); List<IRegion> regions = new List<IRegion>(); regions.Add( regionMock.Object ); regionManagerMock.Setup( x => x.Regions.GetEnumerator() ).Returns( regions.GetEnumerator() ); regionWithoutViewMock.Setup( x => x.Views.GetEnumerator() ).Returns( viewsWithoutView.GetEnumerator() ); regionMock.Setup( x => x.Views.GetEnumerator() ).Returns( views.GetEnumerator() ); // Navigate to the view that "displays" our food mealType. This loads the view model NavigationContext navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "FoodItemView?ID=" + foodItem.ID.ToString(), UriKind.Relative ) ); viewModel.OnNavigatedTo( navigationContext ); if (makeDirty) { if (makeInvalid) { interactionServiceMock .Setup( x => x.ShowMessageBox( Messages.Question_FoodItem_Close, DisplayStrings.CloseCaption, MessageBoxButton.YesNo, MessageBoxImage.Question ) ) .Returns( messageResponse ); viewModel.Name = ""; Assert.IsTrue( viewModel.IsDirty ); Assert.IsFalse( viewModel.IsValid ); } else { interactionServiceMock .Setup( x => x.ShowMessageBox( Messages.Question_FoodItem_Save, DisplayStrings.SaveChangesCaption, MessageBoxButton.YesNoCancel, MessageBoxImage.Question ) ) .Returns( messageResponse ); viewModel.Name = "Something Else"; Assert.IsTrue( viewModel.IsDirty ); Assert.IsTrue( viewModel.IsValid ); } } else { // This will fail if we have passed in the non-sensical makeDirty == false, makeInvalid == true Assert.AreEqual( makeDirty, viewModel.IsDirty ); } // Attempt a close. viewModel.CloseCommand.Execute( null ); // If we were dirty, then we need to verify that the correct interaction was done, otherwise, that no interaction was done if (makeDirty) { interactionServiceMock.VerifyAll(); } else { interactionServiceMock.Verify( x => x.ShowMessageBox( It.IsAny<String>(), It.IsAny<String>(), It.IsAny<MessageBoxButton>(), It.IsAny<MessageBoxImage>() ), Times.Never() ); } if (expectRemove) { regionMock.Verify( x => x.Remove( view ), Times.Exactly( 1 ) ); regionMock.Verify( x => x.Remove( It.IsAny<UserControl>() ), Times.Exactly( 1 ) ); } else { regionMock.Verify( x => x.Remove( It.IsAny<UserControl>() ), Times.Never() ); } if (expectSave) { dataRepositoryMock.Verify( x => x.SaveItem( foodItem ), Times.Exactly( 1 ) ); dataRepositoryMock.Verify( x => x.SaveItem( It.IsAny<FoodItem>() ), Times.Exactly( 1 ) ); } else { dataRepositoryMock.Verify( x => x.SaveItem( It.IsAny<FoodItem>() ), Times.Never() ); } }
public void SaveNotCalledForInvalidNewFoodItem() { var loggerMock = new Mock<ILoggerFacade>(); var regionManagerMock = new Mock<IRegionManager>(); var regionNavigationServiceMock = new Mock<IRegionNavigationService>(); var dataRepositoryMock = new Mock<IDataRepository>(); var interactionServiceMock = new Mock<IInteractionService>(); dataRepositoryMock.Setup( x => x.GetAllFoodGroups() ) .Returns( new ReadOnlyCollection<FoodGroup>( new List<FoodGroup>() ) ); dataRepositoryMock.Setup( x => x.Contains( It.IsAny<FoodItem>() ) ).Returns( false ); var foodItemViewModel = new FoodItemViewModel( dataRepositoryMock.Object, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); var navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "FoodItemView", UriKind.Relative ) ); foodItemViewModel.OnNavigatedTo( navigationContext ); foodItemViewModel.Name = "New Food Item"; foodItemViewModel.CaloriesPerServing = 420; Assert.IsFalse( foodItemViewModel.IsValid ); Assert.IsTrue( foodItemViewModel.IsNew ); foodItemViewModel.SaveCommand.Execute( null ); dataRepositoryMock.Verify( x => x.SaveItem( It.IsAny<FoodItem>() ), Times.Never() ); }
public void NewFoodItemViewModelIsNew() { var loggerMock = new Mock<ILoggerFacade>(); var regionNavigationServiceMock = new Mock<IRegionNavigationService>(); var regionManagerMock = new Mock<IRegionManager>(); var dataRepositoryMock = new Mock<IDataRepository>(); var interactionServiceMock = new Mock<IInteractionService>(); dataRepositoryMock.Setup( x => x.GetAllFoodGroups() ) .Returns( new ReadOnlyCollection<FoodGroup>( new List<FoodGroup>() ) ); dataRepositoryMock.Setup( x => x.Contains( It.IsAny<FoodItem>() ) ).Returns( false ); var testFoodItemViewModel = new FoodItemViewModel( dataRepositoryMock.Object, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); var navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "FoodItemView", UriKind.Relative ) ); testFoodItemViewModel.OnNavigatedTo( navigationContext ); Assert.IsTrue( testFoodItemViewModel.IsNew ); }
public void NavigateToNewFoodItem() { var loggerMock = new Mock<ILoggerFacade>(); var regionNavigationServiceMock = new Mock<IRegionNavigationService>(); var regionManagerMock = new Mock<IRegionManager>(); var interactionServiceMock = new Mock<IInteractionService>(); var configurationMock = new Mock<IConfiguration>(); configurationMock.Setup( x => x.DataSource ).Returns( DataSourceType.XMLFile ); configurationMock.Setup( x => x.FileName ).Returns( FullTestData.DataFileName ); FullTestData.Reset(); var dataRepository = new DataRepository( configurationMock.Object ); var viewModel = new FoodItemViewModel( dataRepository, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); var navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "FoodItemViewModel", UriKind.Relative ) ); viewModel.OnNavigatedTo( navigationContext ); foreach (var foodItem in dataRepository.GetAllFoodItems()) { Assert.AreNotEqual( foodItem.ID, viewModel.ID ); } Assert.IsNull( viewModel.Name ); Assert.IsNull( viewModel.Description ); Assert.AreEqual( 0, viewModel.FoodGroupsPerServing.Count ); Assert.IsFalse( viewModel.IsDirty ); }
public void FoodItemViewModelIsValid() { var loggerMock = new Mock<ILoggerFacade>(); var regionNavigationServiceMock = new Mock<IRegionNavigationService>(); var regionManagerMock = new Mock<IRegionManager>(); var interactionServiceMock = new Mock<IInteractionService>(); var configurationMock = new Mock<IConfiguration>(); configurationMock.Setup( x => x.DataSource ).Returns( DataSourceType.XMLFile ); configurationMock.Setup( x => x.FileName ).Returns( FullTestData.DataFileName ); FullTestData.Reset(); var dataRepository = new DataRepository( configurationMock.Object ); FoodItemViewModel testFoodItemViewModel = new FoodItemViewModel( dataRepository, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); NavigationContext navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "FoodItemView", UriKind.Relative ) ); testFoodItemViewModel.OnNavigatedTo( navigationContext ); Assert.IsFalse( testFoodItemViewModel.IsValid ); Assert.AreEqual( Messages.Error_No_Name, testFoodItemViewModel["Name"] ); Assert.AreEqual( Messages.Error_No_FoodGroups, testFoodItemViewModel["FoodGroupsPerServing"] ); Assert.IsTrue( String.IsNullOrEmpty( testFoodItemViewModel["Description"] ) ); testFoodItemViewModel.Name = "Fruit Salad"; testFoodItemViewModel.FoodGroupsPerServing.Add( new ServingViewModel<FoodGroup>( dataRepository.FindFoodGroup( fg => fg.Name == "Fruit" ), 1 ) ); Assert.IsFalse( testFoodItemViewModel.IsValid ); Assert.AreEqual( Messages.Error_FoodItem_Exists, testFoodItemViewModel["Name"] ); Assert.IsTrue( String.IsNullOrEmpty( testFoodItemViewModel["FoodGroupsPerServing"] ) ); Assert.IsTrue( String.IsNullOrEmpty( testFoodItemViewModel["Description"] ) ); testFoodItemViewModel.Name = "Some Unique Name"; Assert.IsTrue( testFoodItemViewModel.IsValid ); Assert.IsTrue( String.IsNullOrEmpty( testFoodItemViewModel.Error ) ); Assert.IsTrue( String.IsNullOrEmpty( testFoodItemViewModel["Name"] ) ); Assert.IsTrue( String.IsNullOrEmpty( testFoodItemViewModel["FoodGroupsPerServing"] ) ); Assert.IsTrue( String.IsNullOrEmpty( testFoodItemViewModel["Description"] ) ); }
public void FoodItemIsNotDeletedIfAnswerIsNo() { var loggerMock = new Mock<ILoggerFacade>(); var dataRepositoryMock = new Mock<IDataRepository>(); var interactionServiceMock = new Mock<IInteractionService>(); var regionNavigationServiceMock = new Mock<IRegionNavigationService>(); var regionManagerMock = new Mock<IRegionManager>(); var foodItem = new FoodItem( Guid.NewGuid(), "Test", "This is a test", 90.5M ); foodItem.FoodGroupsPerServing.Add( new Serving<FoodGroup>( new FoodGroup( Guid.NewGuid(), "test", "test" ), 1.5M ) ); dataRepositoryMock.Setup( x => x.Contains( foodItem ) ).Returns( true ); dataRepositoryMock.Setup( x => x.ItemIsUsed( foodItem ) ).Returns( false ); dataRepositoryMock.Setup( x => x.GetFoodItem( foodItem.ID ) ).Returns( foodItem ); dataRepositoryMock .Setup( x => x.GetAllFoodGroups() ) .Returns( new ReadOnlyCollection<FoodGroup>( new List<FoodGroup>() ) ); var viewModel = new FoodItemViewModel( dataRepositoryMock.Object, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); var navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "FoodItem?ID=" + foodItem.ID.ToString(), UriKind.Relative ) ); viewModel.OnNavigatedTo( navigationContext ); // Setup the regions so we can determine if the view has been removed or not var view = new UserControl(); view.DataContext = viewModel; var views = new List<UserControl>(); views.Add( new UserControl() ); views.Add( view ); views.Add( new UserControl() ); views.Add( new UserControl() ); var regionMock = new Mock<IRegion>(); var regions = new List<IRegion>(); regions.Add( regionMock.Object ); regionManagerMock.Setup( x => x.Regions.GetEnumerator() ).Returns( regions.GetEnumerator() ); regionMock.Setup( x => x.Views.GetEnumerator() ).Returns( views.GetEnumerator() ); interactionServiceMock .Setup( x => x.ShowMessageBox( Messages.Question_FoodItem_Delete, DisplayStrings.DeleteCaption, MessageBoxButton.YesNo, MessageBoxImage.Question ) ) .Returns( MessageBoxResult.No ); Assert.IsTrue( viewModel.DeleteCommand.CanExecute( null ) ); viewModel.DeleteCommand.Execute( null ); interactionServiceMock.VerifyAll(); dataRepositoryMock.VerifyAll(); dataRepositoryMock.Verify( x => x.Remove( foodItem ), Times.Never() ); regionMock.Verify( x => x.Remove( view ), Times.Never() ); regionMock.Verify( x => x.Remove( It.IsAny<Object>() ), Times.Never() ); }
public void FoodItemViewModelName() { var loggerMock = new Mock<ILoggerFacade>(); var regionNavigationServiceMock = new Mock<IRegionNavigationService>(); var regionManagerMock = new Mock<IRegionManager>(); var interactionServiceMock = new Mock<IInteractionService>(); var configurationMock = new Mock<IConfiguration>(); configurationMock.Setup( x => x.DataSource ).Returns( DataSourceType.XMLFile ); configurationMock.Setup( x => x.FileName ).Returns( FullTestData.DataFileName ); FullTestData.Reset(); var dataRepository = new DataRepository( configurationMock.Object ); PropertyChangedHandler propertyChangedHandler = new PropertyChangedHandler(); FoodItem testFoodItem = dataRepository.GetFoodItem( FullTestData.CheeseBurgerID ); FoodItemViewModel testFoodItemViewModel = new FoodItemViewModel( dataRepository, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); // Tests: // o Name is the same as the object from the repository // o Changing the name causes appropriate properties to be marked as changed NavigationContext navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "FoodItemView?ID=" + testFoodItem.ID.ToString(), UriKind.Relative ) ); testFoodItemViewModel.OnNavigatedTo( navigationContext ); testFoodItemViewModel.PropertyChanged += propertyChangedHandler.OnPropertyChanged; Assert.AreEqual( testFoodItem.Name, testFoodItemViewModel.Name ); testFoodItemViewModel.Name = "Some other name"; Assert.AreEqual( "Some other name", testFoodItemViewModel.Name ); Assert.AreEqual( 3, propertyChangedHandler.PropertiesChanged.Count ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "Name" ) ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "IsDirty" ) ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "IsValid" ) ); }
public void FoodItemViewModelCaloriesPerServing() { var loggerMock = new Mock<ILoggerFacade>(); var regionNavigationServiceMock = new Mock<IRegionNavigationService>(); var regionManagerMock = new Mock<IRegionManager>(); var interactionServiceMock = new Mock<IInteractionService>(); var configurationMock = new Mock<IConfiguration>(); configurationMock.Setup( x => x.DataSource ).Returns( DataSourceType.XMLFile ); configurationMock.Setup( x => x.FileName ).Returns( FullTestData.DataFileName ); FullTestData.Reset(); var dataRepository = new DataRepository( configurationMock.Object ); PropertyChangedHandler propertyChangedHandler = new PropertyChangedHandler(); // Construct a known food group mealType and make sure the food group servings makes sense. FoodItem foodItem = dataRepository.GetFoodItem( FullTestData.CheeseBurgerID ); FoodItemViewModel foodItemViewModel = new FoodItemViewModel( dataRepository, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); NavigationContext navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "FoodItemView?ID=" + foodItem.ID.ToString(), UriKind.Relative ) ); foodItemViewModel.OnNavigatedTo( navigationContext ); foodItemViewModel.PropertyChanged += propertyChangedHandler.OnPropertyChanged; Assert.AreEqual( foodItem.CaloriesPerServing, foodItemViewModel.CaloriesPerServing ); Assert.IsFalse( foodItemViewModel.IsDirty ); Assert.IsTrue( foodItemViewModel.IsValid ); // Change the calories foodItemViewModel.CaloriesPerServing = 700; Assert.IsTrue( foodItemViewModel.IsDirty ); Assert.IsTrue( foodItemViewModel.IsValid ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "CaloriesPerServing" ) ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "IsDirty" ) ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "IsValid" ) ); Assert.AreEqual( 3, propertyChangedHandler.PropertiesChanged.Count ); foodItemViewModel.CaloriesPerServing = 650; Assert.IsFalse( foodItemViewModel.IsDirty ); Assert.IsTrue( foodItemViewModel.IsValid ); propertyChangedHandler.Reset(); // Make the calories invalid foodItemViewModel.CaloriesPerServing = -700; Assert.IsTrue( foodItemViewModel.IsDirty ); Assert.IsFalse( foodItemViewModel.IsValid ); Assert.AreEqual( Messages.Error_Negative_Calories, foodItemViewModel.Error ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "CaloriesPerServing" ) ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "IsDirty" ) ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "IsValid" ) ); Assert.AreEqual( 3, propertyChangedHandler.PropertiesChanged.Count ); }
public void FoodItemViewModelUndoRedo() { var loggerMock = new Mock<ILoggerFacade>(); Mock<IRegionNavigationService> regionNavigationServiceMock = new Mock<IRegionNavigationService>(); Mock<IRegionManager> regionManagerMock = new Mock<IRegionManager>(); Mock<IInteractionService> interactionServiceMock = new Mock<IInteractionService>(); var configurationMock = new Mock<IConfiguration>(); configurationMock.Setup( x => x.DataSource ).Returns( DataSourceType.XMLFile ); configurationMock.Setup( x => x.FileName ).Returns( FullTestData.DataFileName ); FullTestData.Reset(); DataRepository dataRepository = new DataRepository( configurationMock.Object ); // TODO: Update this test when the undo and redo is expanded. // TODO: Update this test to include Calories (can be done before expansion) // Should not be able to undo or redo on a new object. ServingViewModel<FoodGroup> waterServing = new ServingViewModel<FoodGroup>( dataRepository.GetFoodGroup( FullTestData.WaterID ), 1.0M ); ServingViewModel<FoodGroup> meatServing = new ServingViewModel<FoodGroup>( dataRepository.GetFoodGroup( FullTestData.MeatID ), 1.5M ); ServingViewModel<FoodGroup> fruitServing = new ServingViewModel<FoodGroup>( dataRepository.GetFoodGroup( FullTestData.FruitID ), 2.5M ); FoodItemViewModel foodItemViewModel = new FoodItemViewModel( dataRepository, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); NavigationContext navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "FoodItemView", UriKind.Relative ) ); foodItemViewModel.OnNavigatedTo( navigationContext ); Assert.IsFalse( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( foodItemViewModel.RedoCommand.CanExecute( null ) ); // Assign values to properties, save, and the load into new view model to reset the undo/redo log foodItemViewModel.Name = "Bob"; foodItemViewModel.Description = "Battery Operated Buddy"; foodItemViewModel.CaloriesPerServing = 42.0M; foodItemViewModel.FoodGroupsPerServing.Add( waterServing ); navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "FoodItemView?ID=" + foodItemViewModel.ID.ToString(), UriKind.Relative ) ); foodItemViewModel.SaveCommand.Execute( null ); foodItemViewModel = new FoodItemViewModel( dataRepository, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); foodItemViewModel.OnNavigatedTo( navigationContext ); Assert.IsFalse( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( foodItemViewModel.RedoCommand.CanExecute( null ) ); // Make changes as such: // o name changed from Bob to Pete // o name changed from Pete to Peter // o Description changed from "Battery Operated Buddy" to "The Rock" // o Add Meat food group serving (1.5) // o Change Calroies to 69 // o Add Fruit food group serving (2.5) // o Change Meat servings to 3 // o Remove the Fruit food serving // o name changed from Peter to Simon // o name changed from Simon to Saul // o description changed from "The Rock" to "The Persecutor" // o description changed from "The Persecutor" to "The Apostle" // o name changed from Saul to Paul // Verify can undo, cannot redo at each step foodItemViewModel.Name = "Pete"; Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.Name += "r"; Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.Description = "The Rock"; Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.FoodGroupsPerServing.Add( meatServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.CaloriesPerServing = 69; Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.FoodGroupsPerServing.Add( fruitServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( foodItemViewModel.RedoCommand.CanExecute( null ) ); meatServing.Quantity = 3; Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.FoodGroupsPerServing.Remove( fruitServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.Name = "Simon"; Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.Name = "Saul"; Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.Description = "The Persecutor"; Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.Description = "The Apostle"; Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.Name = "Paul"; Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( foodItemViewModel.RedoCommand.CanExecute( null ) ); Assert.AreEqual( "Paul", foodItemViewModel.Name ); Assert.AreEqual( "The Apostle", foodItemViewModel.Description ); Assert.AreEqual( 2, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.IsTrue( foodItemViewModel.FoodGroupsPerServing.Contains( meatServing ) ); Assert.AreEqual( 69, foodItemViewModel.CaloriesPerServing ); // Undo once. Verify last thing done is undone, and we can redo. foodItemViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Saul", foodItemViewModel.Name ); Assert.AreEqual( "The Apostle", foodItemViewModel.Description ); Assert.AreEqual( 2, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.IsTrue( foodItemViewModel.FoodGroupsPerServing.Contains( meatServing ) ); Assert.AreEqual( 69, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); // Redo. Verify last thing undone is redone, can no longer redo, can still undo. foodItemViewModel.RedoCommand.Execute( null ); Assert.AreEqual( "Paul", foodItemViewModel.Name ); Assert.AreEqual( "The Apostle", foodItemViewModel.Description ); Assert.AreEqual( 2, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.IsTrue( foodItemViewModel.FoodGroupsPerServing.Contains( meatServing ) ); Assert.AreEqual( 69, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( foodItemViewModel.RedoCommand.CanExecute( null ) ); // Undo 4 times, verify undo worked foodItemViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Saul", foodItemViewModel.Name ); Assert.AreEqual( "The Apostle", foodItemViewModel.Description ); Assert.AreEqual( 2, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.IsTrue( foodItemViewModel.FoodGroupsPerServing.Contains( meatServing ) ); Assert.AreEqual( 69, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Saul", foodItemViewModel.Name ); Assert.AreEqual( "The Persecutor", foodItemViewModel.Description ); Assert.AreEqual( 2, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.IsTrue( foodItemViewModel.FoodGroupsPerServing.Contains( meatServing ) ); Assert.AreEqual( 69, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Saul", foodItemViewModel.Name ); Assert.AreEqual( "The Rock", foodItemViewModel.Description ); Assert.AreEqual( 2, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.IsTrue( foodItemViewModel.FoodGroupsPerServing.Contains( meatServing ) ); Assert.AreEqual( 69, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Simon", foodItemViewModel.Name ); Assert.AreEqual( "The Rock", foodItemViewModel.Description ); Assert.AreEqual( 2, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.IsTrue( foodItemViewModel.FoodGroupsPerServing.Contains( meatServing ) ); Assert.AreEqual( 69, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); // Redo 2 times, verify foodItemViewModel.RedoCommand.Execute( null ); Assert.AreEqual( "Saul", foodItemViewModel.Name ); Assert.AreEqual( "The Rock", foodItemViewModel.Description ); Assert.AreEqual( 2, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.IsTrue( foodItemViewModel.FoodGroupsPerServing.Contains( meatServing ) ); Assert.AreEqual( 69, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.RedoCommand.Execute( null ); Assert.AreEqual( "Saul", foodItemViewModel.Name ); Assert.AreEqual( "The Persecutor", foodItemViewModel.Description ); Assert.AreEqual( 2, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.IsTrue( foodItemViewModel.FoodGroupsPerServing.Contains( meatServing ) ); Assert.AreEqual( 69, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); // Undo until back to original, cannot undo, can redo foodItemViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Saul", foodItemViewModel.Name ); Assert.AreEqual( "The Rock", foodItemViewModel.Description ); Assert.AreEqual( 2, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.IsTrue( foodItemViewModel.FoodGroupsPerServing.Contains( meatServing ) ); Assert.AreEqual( 3, meatServing.Quantity ); Assert.AreEqual( 69, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Simon", foodItemViewModel.Name ); Assert.AreEqual( "The Rock", foodItemViewModel.Description ); Assert.AreEqual( 2, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.IsTrue( foodItemViewModel.FoodGroupsPerServing.Contains( meatServing ) ); Assert.AreEqual( 3, meatServing.Quantity ); Assert.AreEqual( 69, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Peter", foodItemViewModel.Name ); Assert.AreEqual( "The Rock", foodItemViewModel.Description ); Assert.AreEqual( 2, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.IsTrue( foodItemViewModel.FoodGroupsPerServing.Contains( meatServing ) ); Assert.AreEqual( 3, meatServing.Quantity ); Assert.AreEqual( 69, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Peter", foodItemViewModel.Name ); Assert.AreEqual( "The Rock", foodItemViewModel.Description ); Assert.AreEqual( 3, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.IsTrue( foodItemViewModel.FoodGroupsPerServing.Contains( meatServing ) ); Assert.IsTrue( foodItemViewModel.FoodGroupsPerServing.Contains( fruitServing ) ); Assert.AreEqual( 3, meatServing.Quantity ); Assert.AreEqual( 69, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Peter", foodItemViewModel.Name ); Assert.AreEqual( "The Rock", foodItemViewModel.Description ); Assert.AreEqual( 3, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.IsTrue( foodItemViewModel.FoodGroupsPerServing.Contains( meatServing ) ); Assert.IsTrue( foodItemViewModel.FoodGroupsPerServing.Contains( fruitServing ) ); Assert.AreEqual( 1.5M, meatServing.Quantity ); Assert.AreEqual( 69, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Peter", foodItemViewModel.Name ); Assert.AreEqual( "The Rock", foodItemViewModel.Description ); Assert.AreEqual( 2, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.IsTrue( foodItemViewModel.FoodGroupsPerServing.Contains( meatServing ) ); Assert.AreEqual( 1.5M, meatServing.Quantity ); Assert.AreEqual( 69, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Peter", foodItemViewModel.Name ); Assert.AreEqual( "The Rock", foodItemViewModel.Description ); Assert.AreEqual( 2, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.IsTrue( foodItemViewModel.FoodGroupsPerServing.Contains( meatServing ) ); Assert.AreEqual( 1.5M, meatServing.Quantity ); Assert.AreEqual( 42, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Peter", foodItemViewModel.Name ); Assert.AreEqual( "The Rock", foodItemViewModel.Description ); Assert.AreEqual( 1, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.AreEqual( 1.5M, meatServing.Quantity ); Assert.AreEqual( 42, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Peter", foodItemViewModel.Name ); Assert.AreEqual( "Battery Operated Buddy", foodItemViewModel.Description ); Assert.AreEqual( 1, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.AreEqual( 1.5M, meatServing.Quantity ); Assert.AreEqual( 42, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Pete", foodItemViewModel.Name ); Assert.AreEqual( "Battery Operated Buddy", foodItemViewModel.Description ); Assert.AreEqual( 1, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.AreEqual( 1.5M, meatServing.Quantity ); Assert.AreEqual( 42, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Bob", foodItemViewModel.Name ); Assert.AreEqual( "Battery Operated Buddy", foodItemViewModel.Description ); Assert.AreEqual( 1, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.AreEqual( 1.5M, meatServing.Quantity ); Assert.AreEqual( 42, foodItemViewModel.CaloriesPerServing ); Assert.IsFalse( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); // Redo 4 times, verify foodItemViewModel.RedoCommand.Execute( null ); Assert.AreEqual( "Pete", foodItemViewModel.Name ); Assert.AreEqual( "Battery Operated Buddy", foodItemViewModel.Description ); Assert.AreEqual( 1, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.AreEqual( 42, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.RedoCommand.Execute( null ); Assert.AreEqual( "Peter", foodItemViewModel.Name ); Assert.AreEqual( "Battery Operated Buddy", foodItemViewModel.Description ); Assert.AreEqual( 1, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.AreEqual( 42, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.RedoCommand.Execute( null ); Assert.AreEqual( "Peter", foodItemViewModel.Name ); Assert.AreEqual( "The Rock", foodItemViewModel.Description ); Assert.AreEqual( 1, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.AreEqual( 42, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); foodItemViewModel.RedoCommand.Execute( null ); Assert.AreEqual( "Peter", foodItemViewModel.Name ); Assert.AreEqual( "The Rock", foodItemViewModel.Description ); Assert.AreEqual( 2, foodItemViewModel.FoodGroupsPerServing.Count ); Assert.IsTrue( foodItemViewModel.FoodGroupsPerServing.Contains( meatServing ) ); Assert.AreEqual( 42, foodItemViewModel.CaloriesPerServing ); Assert.IsTrue( foodItemViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( foodItemViewModel.RedoCommand.CanExecute( null ) ); }
public void FoodItemViewModelValidFoodGroups() { var loggerMock = new Mock<ILoggerFacade>(); var regionManagerMock = new Mock<IRegionManager>(); var interactionServiceMock = new Mock<IInteractionService>(); var configurationMock = new Mock<IConfiguration>(); configurationMock.Setup( x => x.DataSource ).Returns( DataSourceType.XMLFile ); configurationMock.Setup( x => x.FileName ).Returns( FullTestData.DataFileName ); FullTestData.Reset(); var dataRepository = new DataRepository( configurationMock.Object ); FoodItemViewModel foodItemViewModel = new FoodItemViewModel( dataRepository, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); Assert.IsNotNull( foodItemViewModel.ValidFoodGroups ); Assert.AreEqual( dataRepository.GetAllFoodGroups().Count, foodItemViewModel.ValidFoodGroups.Items.Count ); }