public void MealForTodayAddedToChildrenWhenAddedToRepository() { var dataRepositoryMock = new Mock<IDataRepository>(); var data = new MockData(); var allMeals = data.Meals(); dataRepositoryMock.Setup( x => x.GetAllMealsForDate( DateTime.Now.Date ) ).Returns( new ReadOnlyCollection<Meal>( (from meal in allMeals where meal.DateAndTimeOfMeal.Date == DateTime.Now.Date select meal).ToList() ) ); dataRepositoryMock.Setup( x => x.GetAllMealsForDate( DateTime.Now.Date.AddDays( MockData.DaysToAddForFutureMeals ) ) ).Returns( new ReadOnlyCollection<Meal>( (from meal in allMeals where meal.DateAndTimeOfMeal.Date == DateTime.Now.Date.AddDays( MockData.DaysToAddForFutureMeals ) select meal).ToList() ) ); var mealNodeViewModel = new MealNodeViewModel( dataRepositoryMock.Object, null ); Assert.AreEqual( 3, mealNodeViewModel.Children.Count ); var newMeal = new Meal( Guid.NewGuid(), new MealType( Guid.NewGuid(), "Doesn't Matter", "", DateTime.Now, false ), DateTime.Now, "Test Meal", "Just a test" ); newMeal.FoodItemServings.Add( new Serving<FoodItem>( new FoodItem( Guid.NewGuid(), "test", "", 42 ), 1 ) ); allMeals.Add( newMeal ); dataRepositoryMock.Raise( e => e.ItemAdded += null, new RepositoryObjectEventArgs( newMeal ) ); Assert.AreEqual( 4, mealNodeViewModel.Children.Count ); foreach (ClickableTreeNodeViewModel node in mealNodeViewModel.Children) { Meal meal = allMeals.Find( m => m.ID == (Guid)node.Parameter ); Assert.IsNotNull( meal ); Assert.AreEqual( meal.Name, node.Name ); } }
public void MealDefault() { // Create a mealTemplate. It should be invalid and empty with the exception of an ID. // Other tests handle making a valid object, so ignore that with this one. Meal meal = new Meal(); Assert.IsFalse( meal.IsValid ); Assert.IsNotNull( meal.ID ); Assert.IsNull( meal.TypeOfMeal ); Assert.AreEqual( meal.DateAndTimeOfMeal, default( DateTime ) ); Assert.AreEqual( 0, meal.FoodItemServings.Count ); Assert.AreEqual( 0, meal.FoodGroupServings.Count ); Assert.AreEqual( 0, meal.Calories ); Assert.AreEqual( Messages.Error_No_MealType, meal["TypeOfMeal"] ); Assert.AreEqual( Messages.Error_No_MealTime, meal["TimeOfMeal"] ); Assert.AreEqual( Messages.Error_No_FoodItems, meal["FoodItemServings"] ); }
public void MealCopy() { 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 ); DateTime theTime = DateTime.Now; Meal mealModel = new Meal( new Guid( "d88a6942-663d-4f6f-831d-ea9127ccc0e9" ), dataRepository.FindMealType( mt => mt.Name == "Lunch" ), theTime, "Lunch", null ); mealModel.FoodItemServings.Add( new Serving<FoodItem>( dataRepository.FindFoodItem( food => food.Name == "Baby Carrots" ), 2.5M ) ); mealModel.FoodItemServings.Add( new Serving<FoodItem>( dataRepository.FindFoodItem( food => food.Name == "Deluxe Bacon Cheese Burger" ), 1 ) ); mealModel.FoodItemServings.Add( new Serving<FoodItem>( dataRepository.FindFoodItem( food => food.Name == "Glass of Skim Milk" ), 2 ) ); Assert.IsTrue( mealModel.IsValid ); Meal meal = new Meal( mealModel ); Assert.IsNotNull( meal.ID ); Assert.AreEqual( mealModel.ID, meal.ID ); Assert.IsTrue( meal.IsValid ); Assert.AreEqual( mealModel.TypeOfMeal, meal.TypeOfMeal ); Assert.AreEqual( mealModel.DateAndTimeOfMeal, meal.DateAndTimeOfMeal ); Assert.AreEqual( mealModel.Calories, meal.Calories ); Assert.AreEqual( mealModel.FoodItemServings.Count, meal.FoodItemServings.Count ); for (Int32 idx = 0; idx < mealModel.FoodItemServings.Count; idx++) { Assert.AreEqual( mealModel.FoodItemServings[idx].Quantity, meal.FoodItemServings[idx].Quantity ); Assert.AreEqual( mealModel.FoodItemServings[idx].Entity, meal.FoodItemServings[idx].Entity ); } Assert.AreEqual( mealModel.FoodGroupServings.Count, meal.FoodGroupServings.Count ); }
/// <summary> /// Creates a new meal using the passed in meal as a model. /// </summary> /// <param name="meal">The meal to use as a model</param> public Meal( Meal meal ) : base(meal) { }
public void MealIdTypeAndTime() { 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 ); DateTime theTime = DateTime.Now; Meal meal = new Meal( new Guid( "d678325f-6bd0-4fae-8847-ebb07323b9bc" ), dataRepository.FindMealType( mt => mt.Name == "Lunch" ), theTime, "Lunch", null ); // Should be invalid when instantiated since there is a lot of missing data Assert.IsFalse( meal.IsValid ); Assert.IsNull( meal["TypeOfMeal"] ); Assert.IsNull( meal["TimeOfMeal"] ); Assert.AreEqual( Messages.Error_No_FoodItems, meal["FoodItemServings"] ); Assert.AreEqual( new Guid( "d678325f-6bd0-4fae-8847-ebb07323b9bc" ), meal.ID ); Assert.AreEqual( "Lunch", meal.TypeOfMeal.Name ); Assert.ReferenceEquals( dataRepository.FindMealType( mt => mt.Name == "Lunch" ), meal.TypeOfMeal ); Assert.AreEqual( theTime, meal.DateAndTimeOfMeal ); Assert.AreEqual( 0, meal.FoodItemServings.Count ); Assert.AreEqual( 0, meal.Calories ); Assert.AreEqual( 0, meal.FoodGroupServings.Count ); // Add missing data, show that it is now valid meal.FoodItemServings.Add( new Serving<FoodItem>( dataRepository.FindFoodItem( food => food.Name == "Baby Carrots" ), 2.5M ) ); meal.FoodItemServings.Add( new Serving<FoodItem>( dataRepository.FindFoodItem( food => food.Name == "Deluxe Bacon Cheese Burger" ), 1 ) ); meal.FoodItemServings.Add( new Serving<FoodItem>( dataRepository.FindFoodItem( food => food.Name == "Glass of Skim Milk" ), 2 ) ); Assert.IsTrue( meal.IsValid ); Assert.IsNull( meal["TypeOfMeal"] ); Assert.IsNull( meal["TimeOfMeal"] ); Assert.IsNull( meal["FoodItemServings"] ); Assert.AreEqual( (2.5M * 40) + 650 + (2 * 90), meal.Calories ); Assert.AreEqual( 4, meal.FoodGroupServings.Count ); Assert.AreEqual( 3, meal.FoodGroupServings.Find( fg => fg.Entity.Name == "Vegetable" ).Quantity ); Assert.AreEqual( 1, meal.FoodGroupServings.Find( fg => fg.Entity.Name == "Grain" ).Quantity ); Assert.AreEqual( 1.5M, meal.FoodGroupServings.Find( fg => fg.Entity.Name == "Meat" ).Quantity ); Assert.AreEqual( 5, meal.FoodGroupServings.Find( fg => fg.Entity.Name == "Dairy" ).Quantity ); }
public MealTemplate( Meal meal ) : base(meal) { }
public void AddingMealForDateToRepositoryUpdatesCaloriesAndFoodGroups() { PropertyChangedHandler propertyChangedHandler = new PropertyChangedHandler(); var loggerMock = new Mock<ILoggerFacade>(); var dataRepositoryMock = new Mock<IDataRepository>(); var regionManagerMock = new Mock<IRegionManager>(); var interactionServiceMock = new Mock<IInteractionService>(); var navigationServiceMock = new Mock<IRegionNavigationService>(); var data = new MockData(); var fullMealList = data.Meals(); var todaysMeals = (from meal in fullMealList where meal.DateAndTimeOfMeal.Date == DateTime.Today select meal).ToList(); dataRepositoryMock.Setup( x => x.GetAllMealsForDate( DateTime.Today ) ).Returns( new ReadOnlyCollection<Meal>( todaysMeals ) ); var viewModel = new DailyLogViewModel( dataRepositoryMock.Object, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); viewModel.CurrentDate = DateTime.Today; viewModel.PropertyChanged += propertyChangedHandler.OnPropertyChanged; Int32 originalFoodGroupCount = viewModel.FoodGroupServings.Count; Decimal originalFoodGroupServings = (from foodGroupServing in viewModel.FoodGroupServings select foodGroupServing.Quantity).Sum(); Decimal originalCalories = viewModel.Calories; var foodGroupServings = viewModel.FoodGroupServings; Assert.AreEqual( 5, foodGroupServings.Count ); var serving = foodGroupServings.ToList().Find( x => x.Entity.Name == "Fruit" ); Assert.IsNotNull( serving ); Assert.AreEqual( 2.5M, serving.Quantity ); serving = foodGroupServings.ToList().Find( x => x.Entity.Name == "Starch" ); Assert.IsNotNull( serving ); Assert.AreEqual( 5.0M, serving.Quantity ); serving = foodGroupServings.ToList().Find( x => x.Entity.Name == "Dairy" ); Assert.IsNotNull( serving ); Assert.AreEqual( 4.75M, serving.Quantity ); serving = foodGroupServings.ToList().Find( x => x.Entity.Name == "Meat" ); Assert.IsNotNull( serving ); Assert.AreEqual( 2.5M, serving.Quantity ); serving = foodGroupServings.ToList().Find( x => x.Entity.Name == "Vegetable" ); Assert.IsNotNull( serving ); Assert.AreEqual( 3.5M, serving.Quantity ); var foodItem = new FoodItem( Guid.NewGuid(), "test", "", 42 ); foodItem.FoodGroupsPerServing.Add( new Serving<FoodGroup>( new FoodGroup( Guid.NewGuid(), "Test1", "" ), 2 ) ); foodItem.FoodGroupsPerServing.Add( new Serving<FoodGroup>( new FoodGroup( Guid.NewGuid(), "Test2", "" ), 1 ) ); var newMeal = new Meal( Guid.NewGuid(), new MealType( Guid.NewGuid(), "Doesn't Matter", "", DateTime.Now, false ), DateTime.Now, "Test Meal", "Just a test" ); newMeal.FoodItemServings.Add( new Serving<FoodItem>( foodItem, 1 ) ); todaysMeals.Add( newMeal ); dataRepositoryMock.Raise( e => e.ItemAdded += null, new RepositoryObjectEventArgs( newMeal ) ); Assert.AreEqual( originalCalories + 42, viewModel.Calories ); Assert.AreEqual( originalFoodGroupCount + 2, viewModel.FoodGroupServings.Count ); Assert.AreEqual( originalFoodGroupServings + 3, (from foodGroupServing in viewModel.FoodGroupServings select foodGroupServing.Quantity).Sum() ); foodGroupServings = viewModel.FoodGroupServings; Assert.AreEqual( 7, foodGroupServings.Count ); serving = foodGroupServings.ToList().Find( x => x.Entity.Name == "Fruit" ); Assert.IsNotNull( serving ); Assert.AreEqual( 2.5M, serving.Quantity ); serving = foodGroupServings.ToList().Find( x => x.Entity.Name == "Starch" ); Assert.IsNotNull( serving ); Assert.AreEqual( 5.0M, serving.Quantity ); serving = foodGroupServings.ToList().Find( x => x.Entity.Name == "Dairy" ); Assert.IsNotNull( serving ); Assert.AreEqual( 4.75M, serving.Quantity ); serving = foodGroupServings.ToList().Find( x => x.Entity.Name == "Meat" ); Assert.IsNotNull( serving ); Assert.AreEqual( 2.5M, serving.Quantity ); serving = foodGroupServings.ToList().Find( x => x.Entity.Name == "Vegetable" ); Assert.IsNotNull( serving ); Assert.AreEqual( 3.5M, serving.Quantity ); serving = foodGroupServings.ToList().Find( x => x.Entity.Name == "Test1" ); Assert.IsNotNull( serving ); Assert.AreEqual( 2, serving.Quantity ); serving = foodGroupServings.ToList().Find( x => x.Entity.Name == "Test2" ); Assert.IsNotNull( serving ); Assert.AreEqual( 1, serving.Quantity ); Assert.AreEqual( 2, propertyChangedHandler.PropertiesChanged.Count ); Assert.AreEqual( viewModel, propertyChangedHandler.Sender ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "Calories" ) ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "FoodGroupServings" ) ); }
public override void OnNavigatedTo( NavigationContext navigationContext ) { if (Model == null) { String idParameter = navigationContext.Parameters["ID"]; Guid myID; Meal meal = null; if (idParameter != null && Guid.TryParse( idParameter, out myID )) { meal = this.DataRepository.GetMeal( myID ); } else { meal = new Meal(); meal.DateAndTimeOfMeal = DateTime.Now; } Model = meal; base.OnNavigatedTo( navigationContext ); } }
public void SaveNotCalledForNonChangedMeal() { var dataRepositoryMock = new Mock<IDataRepository>(); var meal = new Meal( Guid.NewGuid(), new MealType( Guid.NewGuid(), "Meal Type", "", DateTime.Now, false ), DateTime.Now, "Meal", "Test Meal" ); meal.FoodItemServings.Add( new Serving<FoodItem>( new FoodItem( Guid.NewGuid(), "Test Item", "", 420 ), 1 ) ); dataRepositoryMock.Setup( x => x.GetAllFoodItems() ) .Returns( new ReadOnlyCollection<FoodItem>( new List<FoodItem>() ) ); dataRepositoryMock.Setup( x => x.GetAllMealTypes() ) .Returns( new ReadOnlyCollection<MealType>( new List<MealType>() ) ); dataRepositoryMock.Setup( x => x.Contains( It.IsAny<Meal>() ) ).Returns( true ); var mealViewModel = CreateViewModelForMeal( new Meal( meal ), dataRepositoryMock ); Assert.IsTrue( mealViewModel.IsValid ); Assert.IsFalse( mealViewModel.IsDirty ); Assert.IsFalse( mealViewModel.IsNew ); mealViewModel.SaveCommand.Execute( null ); dataRepositoryMock.Verify( x => x.SaveItem( It.IsAny<Meal>() ), Times.Never() ); }
public void DeleteMeal() { 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 HealthTracker.DataRepository.Services.DataRepository( configurationMock.Object ); // Make a deep copy of a meal var chzBurgerMealID = new Guid( "FEB4A1B2-796F-11E0-BB69-31B74724019B" ); var chzBurgerMeal = new Meal(); chzBurgerMeal.InitializeData( dataRepository.FindMeal( m => m.ID == chzBurgerMealID ) ); Assert.IsNotNull( chzBurgerMeal ); // Delete the meal. Show that the meal has been deleted, but none of the // other data repository items have not been effected. Int32 origFoodGroupCount = dataRepository.GetAllFoodGroups().Count; Int32 origFoodItemCount = dataRepository.GetAllFoodItems().Count; Int32 origMealTypeCount = dataRepository.GetAllMealTypes().Count; Int32 origMealTemplateCount = dataRepository.GetAllMealTemplates().Count; Int32 origMealCount = dataRepository.GetAllMeals().Count; dataRepository.Remove( chzBurgerMeal ); Assert.AreEqual( origFoodGroupCount, dataRepository.GetAllFoodGroups().Count ); Assert.AreEqual( origFoodItemCount, dataRepository.GetAllFoodItems().Count ); Assert.AreEqual( origMealTypeCount, dataRepository.GetAllMealTypes().Count ); Assert.AreEqual( origMealTemplateCount, dataRepository.GetAllMealTemplates().Count ); Assert.AreEqual( origMealCount - 1, dataRepository.GetAllMeals().Count ); Assert.IsNotNull( chzBurgerMeal.ID ); Assert.IsNull( dataRepository.FindMealTemplate( mt => mt.ID == chzBurgerMeal.ID ) ); }
public void SaveMeal() { var configurationMock = new Mock<IConfiguration>(); configurationMock.Setup( x => x.DataSource ).Returns( DataSourceType.XMLFile ); configurationMock.Setup( x => x.FileName ).Returns( FullTestData.DataFileName ); FullTestData.Reset(); HealthTracker.DataRepository.Services.DataRepository dataRepository = new HealthTracker.DataRepository.Services.DataRepository( configurationMock.Object ); // Get some food items that we can use for the new meal. FoodItem fruitSalad = dataRepository.FindFoodItem( f => f.ID == FullTestData.FruitSaladID ); FoodItem glassOfMilk = dataRepository.FindFoodItem( f => f.ID == FullTestData.GlassOfMilkID ); FoodItem glassOfWater = dataRepository.FindFoodItem( f => f.ID == FullTestData.GlassOfWaterID ); MealType breakfast = dataRepository.FindMealType( f => f.ID == FullTestData.BreakfastID ); // Create one new meal, and get a deep copy of one out of the repository. // When the new one is saved, a meal should be added to the repository. // When the deep copy of the existing one is modified, the modifications should not be applied to the repository // until the copy is saved, at which time a new meal should not be created, but the meal object with the same // ID should have the modifications applied to it. Guid breakfastMealID = new Guid( "12ed06f0-2251-44c3-bced-b656e6fbe558" ); Guid lunchMealID = new Guid( "53edb94e-3b15-497e-9907-34de41c9bc8d" ); Meal fruitBreakfast = new Meal( breakfastMealID, breakfast, DateTime.Now, "Fruit Breakfast", "Fruit Salad and some milk" ); fruitBreakfast.FoodItemServings.Add( new Serving<FoodItem>( fruitSalad, 1 ) ); fruitBreakfast.FoodItemServings.Add( new Serving<FoodItem>( glassOfMilk, 1 ) ); Assert.IsTrue( fruitBreakfast.IsValid ); Meal repositoryChzBurgerLunch = dataRepository.FindMeal( m => m.ID == lunchMealID ); Assert.IsNotNull( repositoryChzBurgerLunch ); Meal chzBurgerLunch = new Meal(); chzBurgerLunch.InitializeData( repositoryChzBurgerLunch ); Int32 origMealCount = dataRepository.GetAllMeals().Count; // Verifiy the copies are the same Assert.AreEqual( repositoryChzBurgerLunch.ID, chzBurgerLunch.ID ); Assert.AreEqual( repositoryChzBurgerLunch.Name, chzBurgerLunch.Name ); Assert.AreEqual( repositoryChzBurgerLunch.Description, chzBurgerLunch.Description ); Assert.AreEqual( repositoryChzBurgerLunch.Calories, chzBurgerLunch.Calories ); Assert.AreEqual( repositoryChzBurgerLunch.FoodItemServings.Count, chzBurgerLunch.FoodItemServings.Count ); // Replace the glasses of milk with a glass of water, and only have one burger chzBurgerLunch.FoodItemServings.Remove( chzBurgerLunch.FoodItemServings.Find( f => f.Entity.ID == FullTestData.GlassOfMilkID ) ); chzBurgerLunch.FoodItemServings.Add( new Serving<FoodItem>( glassOfWater, 1.5M ) ); chzBurgerLunch.FoodItemServings.Find( f => f.Entity.ID == FullTestData.CheeseBurgerID ).Quantity = 1; chzBurgerLunch.Description = "A typical cheese burger lunch, made a bit healthier"; repositoryChzBurgerLunch = dataRepository.FindMeal( m => m.ID == lunchMealID ); Assert.AreEqual( repositoryChzBurgerLunch.ID, chzBurgerLunch.ID ); Assert.AreEqual( repositoryChzBurgerLunch.Name, chzBurgerLunch.Name ); Assert.AreNotEqual( repositoryChzBurgerLunch.Description, chzBurgerLunch.Description ); Assert.AreNotEqual( repositoryChzBurgerLunch.Calories, chzBurgerLunch.Calories ); // Save the changes and verify the changes were saved dataRepository.SaveItem( chzBurgerLunch ); repositoryChzBurgerLunch = dataRepository.FindMeal( m => m.ID == lunchMealID ); Assert.AreEqual( chzBurgerLunch.Name, repositoryChzBurgerLunch.Name ); Assert.AreEqual( chzBurgerLunch.Description, repositoryChzBurgerLunch.Description ); Assert.AreEqual( chzBurgerLunch.FoodItemServings.Count, repositoryChzBurgerLunch.FoodItemServings.Count ); Assert.AreEqual( chzBurgerLunch.Calories, repositoryChzBurgerLunch.Calories ); Assert.AreEqual( origMealCount, dataRepository.GetAllMeals().Count ); // Save the breakfast dataRepository.SaveItem( fruitBreakfast ); Assert.AreEqual( origMealCount + 1, dataRepository.GetAllMeals().Count ); var repositoryFruitBreakfast = dataRepository.FindMeal( f => f.ID == breakfastMealID ); Assert.IsNotNull( repositoryFruitBreakfast ); Assert.AreEqual( fruitBreakfast.ID, repositoryFruitBreakfast.ID ); Assert.AreEqual( fruitBreakfast.Name, repositoryFruitBreakfast.Name ); Assert.AreEqual( fruitBreakfast.Description, repositoryFruitBreakfast.Description ); Assert.AreEqual( fruitBreakfast.FoodItemServings.Count, repositoryFruitBreakfast.FoodItemServings.Count ); Assert.AreEqual( fruitBreakfast.Calories, repositoryFruitBreakfast.Calories ); }
// This is really, really ugly. It works, but it is not pretty. Look into changing this. private void LoadRepository( String dataFileName ) { XDocument xmlDoc; using (FileStream stream = new FileStream( dataFileName, FileMode.Open )) { using (XmlReader xmlRdr = new XmlTextReader( stream )) { xmlDoc = XDocument.Load( xmlRdr ); // If we don't have the root element if (xmlDoc.Element( rootNodeTag ) == null) { _foodGroups = new List<FoodGroup>(); _foodItems = new List<FoodItem>(); _mealTypes = new List<MealType>(); _mealTemplates = new List<MealTemplate>(); _meals = new List<Meal>(); } else { if (xmlDoc.Element( rootNodeTag ).Element( foodGroupsNodeTag ) != null) { _foodGroups = (from foodGroupElement in xmlDoc.Element( rootNodeTag ).Element( foodGroupsNodeTag ).Elements( foodGroupNodeTag ) select new FoodGroup( (Guid)foodGroupElement.Attribute( idAttribute ), (String)foodGroupElement.Attribute( nameAttribute ), foodGroupElement.Element( descriptionNodeTag ) == null ? null : (String)foodGroupElement.Element( descriptionNodeTag ).Value )).ToList(); } else { _foodGroups = new List<FoodGroup>(); } // FoodItems _foodItems = new List<FoodItem>(); if (xmlDoc.Element( rootNodeTag ).Element( foodItemsNodeTag ) != null) { foreach (XElement foodItemElement in xmlDoc.Element( rootNodeTag ).Element( foodItemsNodeTag ).Elements( foodItemNodeTag )) { // Construct a food item and add it to the collection FoodItem foodItem = new FoodItem( (Guid)foodItemElement.Attribute( idAttribute ), (String)foodItemElement.Attribute( nameAttribute ), foodItemElement.Element( descriptionNodeTag ) == null ? null : (String)foodItemElement.Element( descriptionNodeTag ).Value, (Decimal)foodItemElement.Attribute( caloriesAttribute ) ); // TODO: Should probably do a tryparse on that... _foodItems.Add( foodItem ); // Loop through the FoodGroupServings to build that list if (foodItemElement.Element( foodGroupServingsNodeTag ) != null) { foreach (XElement servingElement in foodItemElement.Element( foodGroupServingsNodeTag ).Elements( servingNodeTag )) { Serving<FoodGroup> foodGroupServing = new Serving<FoodGroup>( _foodGroups.Find( fg => fg.ID == (Guid)servingElement.Attribute( foodGroupIdAttribute ) ), (Decimal)servingElement.Attribute( quantityAttribute ) ); foodItem.FoodGroupsPerServing.Add( foodGroupServing ); } } } } if (xmlDoc.Element( rootNodeTag ).Element( mealTypesNodeTag ) != null) { _mealTypes = (from mealTypeElement in xmlDoc.Element( rootNodeTag ).Element( mealTypesNodeTag ).Elements( mealTypeNodeTag ) select new MealType( (Guid)mealTypeElement.Attribute( idAttribute ), (String)mealTypeElement.Attribute( nameAttribute ), mealTypeElement.Element( descriptionNodeTag ) == null ? null : (String)mealTypeElement.Element( descriptionNodeTag ).Value, (DateTime)mealTypeElement.Attribute( dateTimeAttribute ), (Boolean)mealTypeElement.Attribute( useDefaultDateTimeAttribute ) )).ToList(); } else { _mealTypes = new List<MealType>(); } // Meal Templates _mealTemplates = new List<MealTemplate>(); if (xmlDoc.Element( rootNodeTag ).Element( mealTemplatesNodeTag ) != null) { foreach (XElement mealTemplateElement in xmlDoc.Element( rootNodeTag ).Element( mealTemplatesNodeTag ).Elements( mealNodeTag )) { // Construct a food item and add it to the collection MealTemplate mealTemplate = new MealTemplate( (Guid)mealTemplateElement.Attribute( idAttribute ), _mealTypes.Find( mt => mt.ID == (Guid)mealTemplateElement.Attribute( mealTypeIdAttribute ) ), (DateTime)mealTemplateElement.Attribute( dateTimeAttribute ), (String)mealTemplateElement.Attribute( nameAttribute ), mealTemplateElement.Element( descriptionNodeTag ) == null ? null : (String)mealTemplateElement.Element( descriptionNodeTag ).Value ); _mealTemplates.Add( mealTemplate ); // Loop through the FoodItemServings to build that list if (mealTemplateElement.Element( foodItemServingsNodeTag ) != null) { foreach (XElement servingElement in mealTemplateElement.Element( foodItemServingsNodeTag ).Elements( servingNodeTag )) { Serving<FoodItem> foodItem = new Serving<FoodItem>( _foodItems.Find( fi => fi.ID == (Guid)servingElement.Attribute( foodItemIdAttribute ) ), (Decimal)servingElement.Attribute( quantityAttribute ) ); mealTemplate.FoodItemServings.Add( foodItem ); } } } } // Meals _meals = new List<Meal>(); if (xmlDoc.Element( rootNodeTag ).Element( mealsNodeTag ) != null) { foreach (XElement mealElement in xmlDoc.Element( rootNodeTag ).Element( mealsNodeTag ).Elements( mealNodeTag )) { // Construct a food item and add it to the collection var meal = new Meal( (Guid)mealElement.Attribute( idAttribute ), _mealTypes.Find( mt => mt.ID == (Guid)mealElement.Attribute( mealTypeIdAttribute ) ), (DateTime)mealElement.Attribute( dateTimeAttribute ), (String)mealElement.Attribute( nameAttribute ), mealElement.Element( descriptionNodeTag ) == null ? null : (String)mealElement.Element( descriptionNodeTag ).Value ); _meals.Add( meal ); // Loop through the FoodItemServings to build that list if (mealElement.Element( foodItemServingsNodeTag ) != null) { foreach (XElement servingElement in mealElement.Element( foodItemServingsNodeTag ).Elements( servingNodeTag )) { Serving<FoodItem> foodItem = new Serving<FoodItem>( _foodItems.Find( fi => fi.ID == (Guid)servingElement.Attribute( foodItemIdAttribute ) ), (Decimal)servingElement.Attribute( quantityAttribute ) ); meal.FoodItemServings.Add( foodItem ); } } } } } } } }
public void SaveItem( Meal meal ) { if (meal == null) { throw new ArgumentNullException( "meal" ); } if (!Contains( meal )) { _meals.Add( new Meal( meal ) ); if (ItemAdded != null) { ItemAdded( this, new RepositoryObjectEventArgs( meal ) ); } } else { var repositoryMeal = _meals.Find( m => m.ID == meal.ID ); Debug.Assert( repositoryMeal != null ); repositoryMeal.InitializeData( meal ); if (ItemModified != null) { ItemModified( this, new RepositoryObjectEventArgs( meal ) ); } } this.SaveRepository(); }
public void Remove( Meal meal ) { Debug.Assert( meal != null ); if (Contains( meal )) { _meals.Remove( _meals.Find( mt => mt.ID == meal.ID ) ); if (ItemDeleted != null) { ItemDeleted( this, new RepositoryObjectEventArgs( meal ) ); } SaveRepository(); } }
/// <summary> /// Determine if the repository contains the given mealTemplate /// </summary> /// <param name="mealTemplate">The mealTemplate to look for</param> /// <returns>True of the mealTemplate is in the repository, false otherwise</returns> public Boolean Contains( Meal meal ) { return (_meals.Find( item => item.ID == meal.ID ) != null); }
public void IsNavigationTargetTrueWhenIDMatches() { var loggerMock = new Mock<ILoggerFacade>(); var regionNavigationServiceMock = new Mock<IRegionNavigationService>(); var regionManagerMock = new Mock<IRegionManager>(); var interactionServiceMock = new Mock<IInteractionService>(); var dataRepositoryMock = new Mock<IDataRepository>(); dataRepositoryMock .Setup( x => x.GetAllMealTypes() ) .Returns( new ReadOnlyCollection<MealType>( new List<MealType>() ) ); dataRepositoryMock .Setup( x => x.GetAllFoodItems() ) .Returns( new ReadOnlyCollection<FoodItem>( new List<FoodItem>() ) ); var meal = new Meal( Guid.NewGuid(), new MealType( Guid.NewGuid(), "Test", "", DateTime.Now, false ), DateTime.Now, "Test", "This is a test meal" ); dataRepositoryMock.Setup( x => x.GetMeal( meal.ID ) ).Returns( meal ); var viewModel = new MealViewModel( dataRepositoryMock.Object, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); var query = new UriQuery(); query.Add( "ID", meal.ID.ToString() ); var navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "MealView" + query.ToString(), UriKind.Relative ) ); viewModel.OnNavigatedTo( navigationContext ); Assert.IsTrue( viewModel.IsNavigationTarget( navigationContext ) ); }
public void NavigateToNewMealCreatesEmptyMeal() { var loggerMock = new Mock<ILoggerFacade>(); var regionNavigationServiceMock = new Mock<IRegionNavigationService>(); var regionManagerMock = new Mock<IRegionManager>(); var interactionServiceMock = new Mock<IInteractionService>(); var dataRepositoryMock = new Mock<IDataRepository>(); dataRepositoryMock .Setup( x => x.GetAllMealTypes() ) .Returns( new ReadOnlyCollection<MealType>( new List<MealType>() ) ); dataRepositoryMock .Setup( x => x.GetAllFoodItems() ) .Returns( new ReadOnlyCollection<FoodItem>( new List<FoodItem>() ) ); var meal = new Meal( Guid.NewGuid(), new MealType( Guid.NewGuid(), "Test", "", DateTime.Now, false ), DateTime.Now, "Test", "This is a test meal" ); dataRepositoryMock.Setup( x => x.GetMeal( meal.ID ) ).Returns( meal ); var viewModel = new MealViewModel( dataRepositoryMock.Object, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); var navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "MealView", UriKind.Relative ) ); viewModel.OnNavigatedTo( navigationContext ); Assert.AreNotEqual( meal.ID, viewModel.ID ); Assert.IsNull( viewModel.Name ); Assert.IsNull( viewModel.Description ); Assert.AreEqual( 0, viewModel.FoodItemServings.Count ); Assert.IsFalse( viewModel.IsDirty ); }
public void UndoRedoMealViewModel() { // Create a meal and then navigate to it to bring it into the view model var meal = new Meal( Guid.NewGuid(), new MealType( Guid.NewGuid(), "Test", "", DateTime.Now, false ), DateTime.Now, "Bob", "Battery Operated Buddy" ); var glassOfWater = new FoodItem( Guid.NewGuid(), "Glass of Water", "", 0 ); glassOfWater.FoodGroupsPerServing.Add( new Serving<FoodGroup>( new FoodGroup( Guid.NewGuid(), "Water", "" ), 1 ) ); meal.FoodItemServings.Add( new Serving<FoodItem>( glassOfWater, 1.0M ) ); var mealViewModel = CreateViewModelForMeal( meal ); Assert.IsFalse( mealViewModel.IsDirty ); Assert.IsFalse( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( mealViewModel.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 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 mealViewModel.Name = "Pete"; Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( mealViewModel.RedoCommand.CanExecute( null ) ); mealViewModel.Name += "r"; Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( mealViewModel.RedoCommand.CanExecute( null ) ); mealViewModel.Description = "The Rock"; Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( mealViewModel.RedoCommand.CanExecute( null ) ); mealViewModel.Name = "Simon"; Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( mealViewModel.RedoCommand.CanExecute( null ) ); mealViewModel.Name = "Saul"; Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( mealViewModel.RedoCommand.CanExecute( null ) ); mealViewModel.Description = "The Persecutor"; Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( mealViewModel.RedoCommand.CanExecute( null ) ); mealViewModel.Description = "The Apostle"; Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( mealViewModel.RedoCommand.CanExecute( null ) ); mealViewModel.Name = "Paul"; Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( mealViewModel.RedoCommand.CanExecute( null ) ); Assert.AreEqual( "Paul", mealViewModel.Name ); Assert.AreEqual( "The Apostle", mealViewModel.Description ); // Undo once. Verify last thing done is undone, and we can redo. mealViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Saul", mealViewModel.Name ); Assert.AreEqual( "The Apostle", mealViewModel.Description ); Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( mealViewModel.RedoCommand.CanExecute( null ) ); // Redo. Verify last thing undone is redone, can no longer redo, can still undo. mealViewModel.RedoCommand.Execute( null ); Assert.AreEqual( "Paul", mealViewModel.Name ); Assert.AreEqual( "The Apostle", mealViewModel.Description ); Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsFalse( mealViewModel.RedoCommand.CanExecute( null ) ); // Undo 4 times, verify undo worked mealViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Saul", mealViewModel.Name ); Assert.AreEqual( "The Apostle", mealViewModel.Description ); Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( mealViewModel.RedoCommand.CanExecute( null ) ); mealViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Saul", mealViewModel.Name ); Assert.AreEqual( "The Persecutor", mealViewModel.Description ); Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( mealViewModel.RedoCommand.CanExecute( null ) ); mealViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Saul", mealViewModel.Name ); Assert.AreEqual( "The Rock", mealViewModel.Description ); Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( mealViewModel.RedoCommand.CanExecute( null ) ); mealViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Simon", mealViewModel.Name ); Assert.AreEqual( "The Rock", mealViewModel.Description ); Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( mealViewModel.RedoCommand.CanExecute( null ) ); // Redo 2 times, verify mealViewModel.RedoCommand.Execute( null ); Assert.AreEqual( "Saul", mealViewModel.Name ); Assert.AreEqual( "The Rock", mealViewModel.Description ); Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( mealViewModel.RedoCommand.CanExecute( null ) ); mealViewModel.RedoCommand.Execute( null ); Assert.AreEqual( "Saul", mealViewModel.Name ); Assert.AreEqual( "The Persecutor", mealViewModel.Description ); Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( mealViewModel.RedoCommand.CanExecute( null ) ); // Undo 6 times. Back to original, cannot undo, can redo mealViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Saul", mealViewModel.Name ); Assert.AreEqual( "The Rock", mealViewModel.Description ); Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( mealViewModel.RedoCommand.CanExecute( null ) ); mealViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Simon", mealViewModel.Name ); Assert.AreEqual( "The Rock", mealViewModel.Description ); Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( mealViewModel.RedoCommand.CanExecute( null ) ); mealViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Peter", mealViewModel.Name ); Assert.AreEqual( "The Rock", mealViewModel.Description ); Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( mealViewModel.RedoCommand.CanExecute( null ) ); mealViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Peter", mealViewModel.Name ); Assert.AreEqual( "Battery Operated Buddy", mealViewModel.Description ); Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( mealViewModel.RedoCommand.CanExecute( null ) ); mealViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Pete", mealViewModel.Name ); Assert.AreEqual( "Battery Operated Buddy", mealViewModel.Description ); Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( mealViewModel.RedoCommand.CanExecute( null ) ); mealViewModel.UndoCommand.Execute( null ); Assert.AreEqual( "Bob", mealViewModel.Name ); Assert.AreEqual( "Battery Operated Buddy", mealViewModel.Description ); Assert.IsFalse( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( mealViewModel.RedoCommand.CanExecute( null ) ); // Redo 3 times, verify mealViewModel.RedoCommand.Execute( null ); Assert.AreEqual( "Pete", mealViewModel.Name ); Assert.AreEqual( "Battery Operated Buddy", mealViewModel.Description ); Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( mealViewModel.RedoCommand.CanExecute( null ) ); mealViewModel.RedoCommand.Execute( null ); Assert.AreEqual( "Peter", mealViewModel.Name ); Assert.AreEqual( "Battery Operated Buddy", mealViewModel.Description ); Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( mealViewModel.RedoCommand.CanExecute( null ) ); mealViewModel.RedoCommand.Execute( null ); Assert.AreEqual( "Peter", mealViewModel.Name ); Assert.AreEqual( "The Rock", mealViewModel.Description ); Assert.IsTrue( mealViewModel.UndoCommand.CanExecute( null ) ); Assert.IsTrue( mealViewModel.RedoCommand.CanExecute( null ) ); }
public void TimeOfMealForExistingMealResetBasedOnMealTypeIfTimeNeverManuallySet() { double mealHour = 12.5; var mealType = new MealType( Guid.NewGuid(), "test", "test", DateTime.Today.AddDays( -42 ).AddHours( mealHour ), true ); var meal = new Meal( Guid.NewGuid(), mealType, DateTime.Today.AddHours( mealHour ), "test", "test" ); var viewModel = CreateViewModelForMeal( new Meal( meal ) ); viewModel.TypeOfMeal = new MealType( Guid.NewGuid(), "Another Test", "d00d", DateTime.Today.AddDays( -345 ).AddHours( mealHour + 2.0 ), true ); Assert.AreEqual( DateTime.Today.AddHours( mealHour + 2.0 ), viewModel.TimeOfMeal ); }
private MealViewModel CreateViewModelForMeal( Meal meal, Mock<IDataRepository> dataRepositoryMock, Mock<IRegionManager> regionManagerMock, Mock<IInteractionService> interactionServiceMock ) { var loggerMock = new Mock<ILoggerFacade>(); var regionNavigationServiceMock = new Mock<IRegionNavigationService>(); var viewModel = new MealViewModel( dataRepositoryMock.Object, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); dataRepositoryMock.Setup( x => x.GetMeal( meal.ID ) ).Returns( meal ); var navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "MealView?ID=" + meal.ID.ToString(), UriKind.Relative ) ); viewModel.OnNavigatedTo( navigationContext ); return viewModel; }
public void AddingMealForOtherDateToRepositoryDoesNotUpdateCaloriesAndFoodGroups() { PropertyChangedHandler propertyChangedHandler = new PropertyChangedHandler(); var loggerMock = new Mock<ILoggerFacade>(); var dataRepositoryMock = new Mock<IDataRepository>(); var regionManagerMock = new Mock<IRegionManager>(); var interactionServiceMock = new Mock<IInteractionService>(); var navigationServiceMock = new Mock<IRegionNavigationService>(); var data = new MockData(); var fullMealList = data.Meals(); var todaysMeals = (from meal in fullMealList where meal.DateAndTimeOfMeal.Date == DateTime.Today select meal).ToList(); dataRepositoryMock.Setup( x => x.GetAllMealsForDate( DateTime.Today ) ).Returns( new ReadOnlyCollection<Meal>( todaysMeals ) ); var viewModel = new DailyLogViewModel( dataRepositoryMock.Object, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); viewModel.CurrentDate = DateTime.Today; viewModel.PropertyChanged += propertyChangedHandler.OnPropertyChanged; Int32 originalFoodGroupCount = viewModel.FoodGroupServings.Count; Decimal originalFoodGroupServings = (from foodGroupServing in viewModel.FoodGroupServings select foodGroupServing.Quantity).Sum(); Decimal originalCalories = viewModel.Calories; var foodItem = new FoodItem( Guid.NewGuid(), "test", "", 42 ); foodItem.FoodGroupsPerServing.Add( new Serving<FoodGroup>( new FoodGroup( Guid.NewGuid(), "Test1", "" ), 2 ) ); foodItem.FoodGroupsPerServing.Add( new Serving<FoodGroup>( new FoodGroup( Guid.NewGuid(), "Test2", "" ), 1 ) ); var newMeal = new Meal( Guid.NewGuid(), new MealType( Guid.NewGuid(), "Doesn't Matter", "", DateTime.Now, false ), DateTime.Now.AddDays( 1 ), "Test Meal", "Just a test" ); newMeal.FoodItemServings.Add( new Serving<FoodItem>( foodItem, 1 ) ); dataRepositoryMock.Raise( e => e.ItemAdded += null, new RepositoryObjectEventArgs( newMeal ) ); Assert.AreEqual( originalCalories, viewModel.Calories ); Assert.AreEqual( originalFoodGroupCount, viewModel.FoodGroupServings.Count ); Assert.AreEqual( originalFoodGroupServings, (from foodGroupServing in viewModel.FoodGroupServings select foodGroupServing.Quantity).Sum() ); Assert.AreEqual( 0, propertyChangedHandler.PropertiesChanged.Count ); }
private MealViewModel CreateViewModelForMeal( Meal meal, Mock<IDataRepository> dataRepositoryMock ) { var regionManagerMock = new Mock<IRegionManager>(); var interactionServiceMock = new Mock<IInteractionService>(); return CreateViewModelForMeal( meal, dataRepositoryMock, regionManagerMock, interactionServiceMock ); }
public void ModifyingMealNotOnDateDoesNotUpdateCaloriesAndFoodGroups() { PropertyChangedHandler propertyChangedHandler = new PropertyChangedHandler(); var loggerMock = new Mock<ILoggerFacade>(); var dataRepositoryMock = new Mock<IDataRepository>(); var regionManagerMock = new Mock<IRegionManager>(); var interactionServiceMock = new Mock<IInteractionService>(); var navigationServiceMock = new Mock<IRegionNavigationService>(); var data = new MockData(); var fullMealList = data.Meals(); var todaysMeals = (from meal in fullMealList where meal.DateAndTimeOfMeal.Date == DateTime.Today select meal).ToList(); dataRepositoryMock.Setup( x => x.GetAllMealsForDate( DateTime.Today ) ) .Returns( new ReadOnlyCollection<Meal>( todaysMeals ) ); var viewModel = new DailyLogViewModel( dataRepositoryMock.Object, regionManagerMock.Object, interactionServiceMock.Object, loggerMock.Object ); viewModel.CurrentDate = DateTime.Today; viewModel.PropertyChanged += propertyChangedHandler.OnPropertyChanged; Decimal originalFoodGroupServings = (from foodGroupServing in viewModel.FoodGroupServings select foodGroupServing.Quantity).Sum(); Decimal originalCalories = viewModel.Calories; var mealToModify = new Meal( fullMealList.Find( x => x.TypeOfMeal.Name == "Breakfast" && x.DateAndTimeOfMeal.Date != DateTime.Today ) ); Assert.IsNotNull( mealToModify ); mealToModify.FoodItemServings.Remove( mealToModify.FoodItemServings.Find( x => x.Entity.Name == "Orange Juice" ) ); dataRepositoryMock.Raise( x => x.ItemModified += null, new RepositoryObjectEventArgs( mealToModify ) ); Assert.AreEqual( originalFoodGroupServings, (from foodGroupServing in viewModel.FoodGroupServings select foodGroupServing.Quantity).Sum() ); Assert.AreEqual( originalCalories, viewModel.Calories ); Assert.AreEqual( 0, propertyChangedHandler.PropertiesChanged.Count ); }
private MealViewModel CreateViewModelForMeal( Meal meal ) { var dataRepositoryMock = new Mock<IDataRepository>(); dataRepositoryMock.Setup( x => x.GetAllFoodItems() ) .Returns( new ReadOnlyCollection<FoodItem>( new List<FoodItem>() ) ); dataRepositoryMock.Setup( x => x.GetAllMealTypes() ) .Returns( new ReadOnlyCollection<MealType>( new List<MealType>() ) ); return CreateViewModelForMeal( meal, dataRepositoryMock ); }
public void MealValidationTest() { 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 ); DateTime theTime = DateTime.Now; Meal meal = new Meal( Guid.NewGuid(), default( MealType ), default( DateTime ), null, null ); Assert.IsFalse( meal.IsValid ); Assert.IsNull( meal["ID"] ); Assert.AreEqual( Messages.Error_No_Name, meal["Name"] ); Assert.AreEqual( Messages.Error_No_MealType, meal["TypeOfMeal"] ); Assert.AreEqual( Messages.Error_No_MealTime, meal["TimeOfMeal"] ); Assert.AreEqual( Messages.Error_No_FoodItems, meal["FoodItemServings"] ); // Add a name meal.Name = "A nice little lunch"; Assert.IsNull( meal["ID"] ); Assert.IsNull( meal["Name"] ); Assert.AreEqual( Messages.Error_No_MealType, meal["TypeOfMeal"] ); Assert.AreEqual( Messages.Error_No_MealTime, meal["TimeOfMeal"] ); Assert.AreEqual( Messages.Error_No_FoodItems, meal["FoodItemServings"] ); // Add a valid mealTemplate type meal.TypeOfMeal = dataRepository.FindMealType( mt => mt.Name == "Lunch" ); Assert.IsFalse( meal.IsValid ); Assert.IsNull( meal["ID"] ); Assert.IsNull( meal["Name"] ); Assert.IsNull( meal["TypeOfMeal"] ); Assert.AreEqual( Messages.Error_No_MealTime, meal["TimeOfMeal"] ); Assert.AreEqual( Messages.Error_No_FoodItems, meal["FoodItemServings"] ); // Add a valid time for the mealTemplate meal.DateAndTimeOfMeal = theTime; Assert.IsFalse( meal.IsValid ); Assert.IsNull( meal["ID"] ); Assert.IsNull( meal["Name"] ); Assert.IsNull( meal["TypeOfMeal"] ); Assert.IsNull( meal["TimeOfMeal"] ); Assert.AreEqual( Messages.Error_No_FoodItems, meal["FoodItemServings"] ); // Add a food item serving meal.FoodItemServings.Add( new Serving<FoodItem>( dataRepository.FindFoodItem( food => food.Name == "Baby Carrots" ), 2.5M ) ); Assert.IsTrue( meal.IsValid ); Assert.IsNull( meal["ID"] ); Assert.IsNull( meal["Name"] ); Assert.IsNull( meal["TypeOfMeal"] ); Assert.IsNull( meal["TimeOfMeal"] ); Assert.IsNull( meal["FoodItemServings"] ); }
/// <summary> /// Close test meal. 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 testFoodItem = new FoodItem( Guid.NewGuid(), "Test Food Item", "Test Food Item Description", 42.0M ); testFoodItem.FoodGroupsPerServing.Add( new Serving<FoodGroup>( testFoodGroup, 5.0M ) ); Assert.IsTrue( testFoodItem.IsValid ); List<FoodItem> foodItems = new List<FoodItem>(); foodItems.Add( testFoodItem ); dataRepositoryMock.Setup( x => x.GetAllFoodItems() ).Returns( new ReadOnlyCollection<FoodItem>( foodItems ) ); MealType testMealType = new MealType( Guid.NewGuid(), "Lunch", "A lunch for testing", DateTime.Now, false ); Assert.IsTrue( testMealType.IsValid ); List<MealType> mealTypes = new List<MealType>(); mealTypes.Add( testMealType ); dataRepositoryMock.Setup( x => x.GetAllMealTypes() ).Returns( new ReadOnlyCollection<MealType>( mealTypes ) ); var meal = new Meal( Guid.NewGuid(), testMealType, DateTime.Now, "test meal", "This is a test" ); meal.FoodItemServings.Add( new Serving<FoodItem>( testFoodItem, 1.5M ) ); dataRepositoryMock.Setup( x => x.GetMeal( meal.ID ) ).Returns( meal ); dataRepositoryMock.Setup( x => x.Contains( meal ) ).Returns( true ); // Create the view model under test and associate it with a view var viewModel = new MealViewModel( 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 foodGroup. This loads the view model NavigationContext navigationContext = new NavigationContext( regionNavigationServiceMock.Object, new Uri( "MealView?ID=" + meal.ID.ToString(), UriKind.Relative ) ); viewModel.OnNavigatedTo( navigationContext ); if (makeDirty) { if (makeInvalid) { interactionServiceMock .Setup( x => x.ShowMessageBox( Messages.Question_Meal_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_Meal_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( meal ), Times.Exactly( 1 ) ); dataRepositoryMock.Verify( x => x.SaveItem( It.IsAny<Meal>() ), Times.Exactly( 1 ) ); } else { dataRepositoryMock.Verify( x => x.SaveItem( It.IsAny<Meal>() ), Times.Never() ); } }
public void CannotSaveAfterFoodItemModificationSaved() { var dataRepositoryMock = new Mock<IDataRepository>(); dataRepositoryMock.Setup( x => x.GetAllFoodItems() ) .Returns( new ReadOnlyCollection<FoodItem>( new List<FoodItem>() ) ); dataRepositoryMock.Setup( x => x.GetAllMealTypes() ) .Returns( new ReadOnlyCollection<MealType>( new List<MealType>() ) ); var foodGroupOne = new FoodGroup( Guid.NewGuid(), "Food Group One", "" ); var foodGroupTwo = new FoodGroup( Guid.NewGuid(), "Food Group Two", "" ); var foodItemOne = new FoodItem( Guid.NewGuid(), "Food Item #1", "", 100 ); foodItemOne.FoodGroupsPerServing.Add( new Serving<FoodGroup>( foodGroupOne, 1.5M ) ); var foodItemTwo = new FoodItem( Guid.NewGuid(), "Food Item #2", "", 150 ); foodItemTwo.FoodGroupsPerServing.Add( new Serving<FoodGroup>( foodGroupTwo, 2.25M ) ); var meal = new Meal( Guid.NewGuid(), new MealType( Guid.NewGuid(), "Test", "", DateTime.Now, false ), DateTime.Now, "Test Meal", "This is a test" ); meal.FoodItemServings.Add( new Serving<FoodItem>( foodItemOne, 1 ) ); meal.FoodItemServings.Add( new Serving<FoodItem>( foodItemTwo, 2 ) ); dataRepositoryMock.Setup( x => x.GetMeal( meal.ID ) ).Returns( meal ); dataRepositoryMock.Setup( x => x.Contains( meal ) ).Returns( true ); var viewModel = CreateViewModelForMeal( meal, dataRepositoryMock ); Assert.IsFalse( viewModel.IsDirty ); Assert.IsFalse( viewModel.SaveCommand.CanExecute( null ) ); viewModel.FoodItemServings[0].Quantity += 1.5M; Assert.IsTrue( viewModel.IsDirty ); Assert.IsTrue( viewModel.SaveCommand.CanExecute( null ) ); viewModel.SaveCommand.Execute( null ); Assert.IsFalse( viewModel.IsDirty ); Assert.IsFalse( viewModel.SaveCommand.CanExecute( null ) ); }
public void DeleteMealNotPerformedIfAnswerIsNo() { var dataRepositoryMock = new Mock<IDataRepository>(); var interactionServiceMock = new Mock<IInteractionService>(); var regionManagerMock = new Mock<IRegionManager>(); var meal = new Meal( Guid.NewGuid(), new MealType( Guid.NewGuid(), "test", "test", DateTime.Now, false ), DateTime.Now, "test", "This is a test" ); meal.FoodItemServings.Add( new Serving<FoodItem>( new FoodItem( Guid.NewGuid(), "test", "test", 100.0M ), 1.5M ) ); dataRepositoryMock.Setup( x => x.Contains( meal ) ).Returns( true ); dataRepositoryMock.Setup( x => x.GetMeal( meal.ID ) ).Returns( meal ); dataRepositoryMock .Setup( x => x.GetAllMealTypes() ) .Returns( new ReadOnlyCollection<MealType>( new List<MealType>() ) ); dataRepositoryMock .Setup( x => x.GetAllFoodItems() ) .Returns( new ReadOnlyCollection<FoodItem>( new List<FoodItem>() ) ); var viewModel = CreateViewModelForMeal( meal, dataRepositoryMock, regionManagerMock, interactionServiceMock ); // Setup the regions so we can determine if the view has been removed or not var regionMock = new Mock<IRegion>(); var view = CreateViewInRegion( viewModel, regionMock, regionManagerMock ); interactionServiceMock .Setup( x => x.ShowMessageBox( Messages.Question_Meal_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( meal ), Times.Never() ); regionMock.Verify( x => x.Remove( It.IsAny<Object>() ), Times.Never() ); }
public void MealTemplateMeal() { 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 ); DateTime theTime = DateTime.Now; Meal meal = new Meal( Guid.NewGuid(), dataRepository.FindMealType( mt => mt.Name == "Lunch" ), theTime, "Lunch", null ); meal.FoodItemServings.Add( new Serving<FoodItem>( dataRepository.FindFoodItem( food => food.Name == "Baby Carrots" ), 2.5M ) ); meal.FoodItemServings.Add( new Serving<FoodItem>( dataRepository.FindFoodItem( food => food.Name == "Deluxe Bacon Cheese Burger" ), 1 ) ); Assert.IsTrue( meal.IsValid ); Assert.AreEqual( 750, meal.Calories ); MealTemplate mealTemplate = new MealTemplate( meal ); Assert.AreEqual( meal.ID, mealTemplate.ID ); Assert.AreEqual( meal.TypeOfMeal, mealTemplate.TypeOfMeal ); Assert.AreEqual( meal.DateAndTimeOfMeal, mealTemplate.DateAndTimeOfMeal ); Assert.AreEqual( 2, mealTemplate.FoodItemServings.Count ); Assert.IsNotNull( mealTemplate.FoodItemServings.Find( s => s.Entity.Name == "Baby Carrots" ) ); Assert.IsNotNull( mealTemplate.FoodItemServings.Find( s => s.Entity.Name == "Deluxe Bacon Cheese Burger" ) ); Assert.IsTrue( mealTemplate.IsValid ); Assert.IsNull( mealTemplate["Name"] ); }
public List<Meal> Meals() { var fruit = FoodGroups().Find( fg => fg.ID == fruitID ); var dairy = FoodGroups().Find( fg => fg.ID == dairyID ); var meat = FoodGroups().Find( fg => fg.ID == meatID ); var vegetable = FoodGroups().Find( fg => fg.ID == vegetableID ); var starch = FoodGroups().Find( fg => fg.ID == starchID ); var breakfast = MealTypes().Find( mt => mt.ID == breakfastID ); var lunch = MealTypes().Find( mt => mt.ID == lunchID ); var dinner = MealTypes().Find( mt => mt.ID == dinnerID ); // drinks var milk = Foods().Find( f => f.ID == milkID ); var oj = Foods().Find( f => f.ID == ojID ); var friedEgg = Foods().Find( f => f.ID == friedEggID ); var hashBrowns = Foods().Find( f => f.ID == hashBrownsID ); var bacon = Foods().Find( f => f.ID == baconID ); var cereal = Foods().Find( f => f.ID == cerealID ); var hamSandwich = Foods().Find( f => f.ID == hamSandwichID ); var baconCheeseBurger = Foods().Find( f => f.ID == baconCheeseBurgerID ); var frenchFries = Foods().Find( f => f.ID == frenchFriesID ); var carrotSticks = Foods().Find( f => f.ID == carrotSticksID ); var chickenDinner = Foods().Find( f => f.ID == chickenDinnerID ); var steakDinner = Foods().Find( f => f.ID == steakDinnerID ); if (_meals == null) { _meals = new List<Meal>(); // Meals for Today // // Breakfast: // 2.5 glasses of Orange Juice // Calories: 100 * 2.5 = 250 // Food Groups: // Fruit: 2.5 // 1.0 Cereal // Calories: 125 // Food Groups: // Starch: 2.0 // 0.75 Milk // Calories: 90 * 0.75 = 67.5 // Food Groups: // Dairy: 0.75 // // Lunch: // 1.0 Ham Sandwich // Calories: 320 // Food Groups: // Meat: 1.0 // Vegetable: 0.5 // Dairy: 0.5 // Starch: 2.0 // 2.0 Carrot Sticks // Calories: 2 * 40 = 80 // Food Groups: // Vegetable: 2.0 // 1.5 Glasses of Milk // Calories: 1.5 * 90 = 135 // Food Groups: // Dairy: 1.5 // // Dinner: // 1.0 Steak Dinner // Calories: 1200 // Food Groups: // Meat: 1.5 // Vegetable: 1.0 // Starch: 1.0 // 2.0 Glasses of Milk // Calories: 2.0 * 90 = 180 // Food Groups: // Dairy: 2.0 // // Totals: // Calories: 250 + 125 + 67.5 + 320 + 80 + 135 + 1200 + 180 = 2357.5 // Food Groups: // Fruit: 2.5 // Starch: 2.0 + 2.0 + 1.0 = 5.0 // Dairy: 0.75 + 0.5 + 1.5 + 2.0 = 4.75 // Meat: 1.0 + 1.5 = 2.5 // Vegetable: 0.5 + 2.0 + 1.0 = 3.5 var meal = new Meal( DayOneBreakfastID, breakfast, DateTime.Today.AddHours( 6.5 ), "Breakfast", "" ); meal.FoodItemServings.Add( new Serving<FoodItem>( oj, 2.5M ) ); meal.FoodItemServings.Add( new Serving<FoodItem>( cereal, 1.0M ) ); meal.FoodItemServings.Add( new Serving<FoodItem>( milk, 0.75M ) ); _meals.Add( meal ); meal = new Meal( DayOneLunchID, lunch, DateTime.Today.AddHours( 12 ), "Lunch", "" ); meal.FoodItemServings.Add( new Serving<FoodItem>( hamSandwich, 1.0M ) ); meal.FoodItemServings.Add( new Serving<FoodItem>( carrotSticks, 2.0M ) ); meal.FoodItemServings.Add( new Serving<FoodItem>( milk, 1.5M ) ); _meals.Add( meal ); meal = new Meal( DayOneDinnerID, dinner, DateTime.Today.AddHours( 17.75 ), "Dinner", "" ); meal.FoodItemServings.Add( new Serving<FoodItem>( steakDinner, 1.0M ) ); meal.FoodItemServings.Add( new Serving<FoodItem>( milk, 2.0M ) ); _meals.Add( meal ); // Meals for DaysToAddForFutureMeals days into the future. // // Breakfast: // 2.0 Eggs // Calories: 2 * 60.0 = 120.0 // Food Groups: // Meat: 2.0 // 1.0 Hash Browns // Calories: 125.5 // Food Groups: // Starch: 1.0 // 1.0 Bacon // Calories: 100 // Food Groups: // Meat: 1.0 // 2.0 oj // Calories: 200 // Food Groups: // Fruit: 2.0 // // Lunch: // None // // Dinner: // 1.0 Chicken Dinner // Calories: 700 // Food Groups: // Meat: 1.0 // Vegetable: 1.0 // Starch: 1.0 // 2.0 Glasses of Milk // Calories: 2.0 * 90 = 180 // Food Groups: // Dairy: 2.0 // // Totals: // Calories: 700 + 180 + 120 + 125.5 + 100 + 200 = 1425.5 // Food Groups: // Meat: 1.0 + 1.0 + 1.0 = 3.0 // Vegetable: 1.0 // Starch: 1.0 + 1.0 = 2.0 // Dairy: 2.0 // Fruit: 2.0 meal = new Meal( DayTwoBreakfastID, breakfast, DateTime.Today.AddDays( DaysToAddForFutureMeals ).AddHours( 6 ), "Breakfast", "" ); meal.FoodItemServings.Add( new Serving<FoodItem>( friedEgg, 2.0M ) ); meal.FoodItemServings.Add( new Serving<FoodItem>( hashBrowns, 1.0M ) ); meal.FoodItemServings.Add( new Serving<FoodItem>( bacon, 1.0M ) ); meal.FoodItemServings.Add( new Serving<FoodItem>( oj, 2.0M ) ); _meals.Add( meal ); meal = new Meal( DayTwoDinnerID, dinner, DateTime.Today.AddDays( DaysToAddForFutureMeals ).AddHours( 18 ), "Dinner", "" ); meal.FoodItemServings.Add( new Serving<FoodItem>( chickenDinner, 1.0M ) ); meal.FoodItemServings.Add( new Serving<FoodItem>( milk, 2.0M ) ); _meals.Add( meal ); } return _meals; }