public async Task <ActionResult <ResultSetDto <ServingNewDtoModel> > > AddServing([FromBody] ServingNewDtoModel request) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } Serving serving = new Serving() { Title = request.Title, Price = request.Price, Desc = request.Desc }; var resultSave = await _servingService.AddServingAsync(serving); if (!resultSave.IsSucced) { return(BadRequest(resultSave.Message)); } request.ServingId = resultSave.Data.Id.ToString(); return(Ok(new ResultSetDto <ServingNewDtoModel>() { IsSuced = true, Message = "", Data = request })); }
public async Task <ResultSet> EditServingAsync(Serving request) { if (!_servingRepository.EditServing(request)) { return new ResultSet() { IsSucced = false, Message = "Serving Not Edited" } } ; try { await _servingRepository.SaveAsync(); } catch (Exception e) { return(new ResultSet() { IsSucced = false, Message = e.Message }); } return(new ResultSet() { IsSucced = true, Message = string.Empty }); }
public void ServingDefault() { Serving<String> serving = new Serving<String>(); Assert.AreEqual(default(String), serving.Entity); Assert.AreEqual(0, serving.Quantity); Assert.IsFalse( serving.IsValid ); Assert.AreEqual( Messages.Error_No_ServingItem, serving["Entity"] ); Assert.AreEqual( Messages.Error_No_Quantity, serving["Quantity"] ); // Set the Item serving.Entity = "This is a test"; Assert.IsFalse( serving.IsValid ); Assert.IsNull( serving["Entity"] ); Assert.AreEqual( Messages.Error_No_Quantity, serving["Quantity"] ); // Set the Quantity to another invalid value serving.Quantity = -1; Assert.IsFalse( serving.IsValid ); Assert.IsNull( serving["Entity"] ); Assert.AreEqual( Messages.Error_No_Quantity, serving["Quantity"] ); // Set the Quantity to a valid value serving.Quantity = 1; Assert.IsTrue( serving.IsValid ); Assert.IsNull( serving["Entity"] ); Assert.IsNull( serving["Quantity"] ); }
public async Task CreateAsync(Serving serving) { using var ctx = new RestaurantContext(); await ctx.Servings.AddAsync(serving); await ctx.SaveChangesAsync(); }
public Serving ToModel(Serving model) { model.MenuId = MenuId; model.CourseId = CourseId; model.DishId = DishId; return(model); }
static void ObjectHierarchy() { Beer beer = new Beer() { Name = "Sly Fox IPA", Flavor = "yummy", OriginalGravity = 4.2m }; Glass glass = new Glass() { Name = "Pilsner", Ounces = 16 }; Database.Connection().Insert("InsertBeer", beer); Database.Connection().Insert("InsertGlass", glass); Serving serving = new Serving() { When = DateTime.Parse("1/1/2012") }; serving.Beer = beer; serving.Glass = glass; Database.Connection().Insert("InsertServing", serving); var servings = Database.Connection().QuerySql <Serving, Beer, Glass>("SELECT s.*, b.*, g.* FROM Servings s JOIN Beer b ON (s.BeerID = b.ID) JOIN Glasses g ON (s.GlassesID = g.ID)", Parameters.Empty); foreach (var s in servings) { Console.WriteLine("{0} {1} {2}", s.When, s.Beer.Name, s.Glass.Ounces); } }
public ResultSet EditServing(Serving request) { if (!_servingRepository.EditServing(request)) { return new ResultSet() { IsSucced = false, Message = "Serving Not Edited" } } ; try { _servingRepository.Save(); } catch { return(new ResultSet() { IsSucced = false, Message = "Serving Not Edited" }); } return(new ResultSet() { IsSucced = true, Message = string.Empty }); }
public void TestCreateServingAsync() { ContextSeeders.Seed(); var sbo = new ServingBusinessObject(); var rbo = new RestaurantBusinessObject(); var mealbo = new MealBusinessObject(); var drbo = new DietaryRestrictionBusinessObject(); var mbo = new MenuBusinessObject(); var cbo = new CourseBusinessObject(); var dbo = new DishBusinessObject(); var restaurant = new Restaurant("a", "b", "c", "d", "f", 6); var meal = new Meal("a", "b", "c"); var dr = new DietaryRestriction("ok"); var menu = new Menu(DateTime.Now, restaurant.Id, meal.Id); var course = new Course("yes"); var dish = new Dish("uh", dr.Id); rbo.Create(restaurant); mealbo.Create(meal); drbo.Create(dr); mbo.Create(menu); cbo.Create(course); dbo.Create(dish); var serving = new Serving(menu.Id, course.Id, dish.Id); var resCreate = sbo.CreateAsync(serving).Result; var resGet = sbo.ReadAsync(serving.Id).Result; Assert.IsTrue(resCreate.Success && resGet.Success && resGet.Result != null); }
public ActionResult Create([FromBody] ServingViewModel vm) { var s = new Serving(vm.MenuId, vm.CourseId, vm.DishId); var res = _bo.Create(s); var code = res.Success ? HttpStatusCode.OK : HttpStatusCode.InternalServerError; return(new ObjectResult(code)); }
public ActionResult Post([FromBody] Serving value) { _servingRepository.Create(value); _mealService.calculateCalories(value.MealId); return(Ok(_servingRepository.Save())); }
public void ApplyData(Serving s, int kcal100) { Name.Text = HTMLCleaner.Static.Replace(s.name); Description.Text = string.Format("{0}g", s.weight_gram); double _kcal = (((double)kcal100 / 100) * int.Parse(s.weight_gram)); Kcal.Text = Math.Round(_kcal).ToString(); }
public static ServingViewModel Parse(Serving vm) { return(new ServingViewModel() { MenuId = vm.MenuId, CourseId = vm.CourseId, DishId = vm.DishId }); }
public static ServingViewModel Parse(Serving serving) { return(new ServingViewModel() { Id = serving.Id, MenuId = serving.MenuId, DishId = serving.DishId, CourseId = serving.CourseId, }); }
public void ServingEntityQuantity() { Serving<String> serving = new Serving<String>( "This is a test string", 42 ); Assert.AreEqual( "This is a test string", serving.Entity ); Assert.AreEqual( 42, serving.Quantity ); Assert.IsTrue( serving.IsValid ); Assert.IsNull( serving["Entity"] ); Assert.IsNull( serving["Quantity"] ); }
protected override void SynchronizeProperties() { //base.SynchronizeProperties(); Serving serving = (Serving)Data.DataBoundItem; Dish dish = serving.Dish; string name = dish.Name; int quantity = serving.Quantity; this.ToolTipText = string.Format("Carbo: {0}\nProteine: {1}\nGrassi: {2}\nKcal: {3}\n", dish.Carbohydrates, dish.Proteins, dish.Fats, dish.Calories); this.Text = "<html>" + name + " (" + quantity + "g)</html>"; }
public bool AddServing(Serving serving) { try { _servingRepository.Insert(serving); } catch { return(false); } return(true); }
protected override GeneralViewHolder populateHolder(GeneralViewHolder _holder) { Serving item = (Serving)items[itemPosition]; ServingItemViewHolder holder = (ServingItemViewHolder)_holder; if (item != null) { holder.ApplyData(item, int.Parse(SessionManager.Static.Item.Data.kcal)); } return(holder); }
public ResultSet <Serving> AddServing(Serving request) { _servingRepository.AddServing(request); _servingRepository.Save(); return(new ResultSet <Serving>() { IsSucced = true, Message = string.Empty, Data = request }); }
public bool EditServing(Serving serving) { try { _servingRepository.Update(serving); } catch { return(false); } return(true); }
public async Task Handle(OrderPayedNotification notification, CancellationToken cancellationToken) { var order = await _db.Orders .Include(x => x.Lines) .FirstAsync(x => x.Id == notification.OrderId); var payment = await _db.Payments .Include(x => x.Account) .FirstAsync(x => x.Id == notification.PaymentId); var highPriority = payment.Method == PaymentMethod.Account && payment.Account.HighPriorityServing; var servingLines = order.Lines .OrderBy(x => x.Position) .Where(x => x.IsServing) .Select((line, index) => new ServingLine() { Position = index, OrderLineId = line.Id, Name = line.Name, Quantity = line.Quantity - line.Receiveable }) .Where(x => x.Quantity > 0) .ToList(); if (servingLines.Count > 0) { var newestTag = await _db.OrderTags .OrderByDescending(x => x.Attached) .FirstOrDefaultAsync(x => x.OrderId == order.Id && x.Detached == null); var serving = new Serving() { OrderId = order.Id, PointOfSaleId = order.PointOfSaleId, State = ServingState.Pending, HighPriority = highPriority, Created = LocalClock.Now, TagNumber = newestTag?.Number, Lines = servingLines.ToList() }; _db.Servings.Add(serving); await _db.SaveChangesAsync(); await _mediator.Publish(new ServingCreatedNotification(serving.Id)); } }
public async Task <ActionResult <Serving> > Create(int orderId, Serving serving) { var order = await _db.Orders .Include(x => x.Lines) .FirstOrDefaultAsync(x => x.Id == orderId); if (order == null) { return(NotFound()); } var newestTag = await _db.OrderTags .OrderByDescending(x => x.Attached) .FirstOrDefaultAsync(x => x.OrderId == order.Id && x.Detached == null); serving.OrderId = orderId; serving.State = ServingState.Pending; serving.TagNumber = newestTag?.Number; serving.Created = LocalClock.Now; var orderLinesById = order.Lines.ToDictionary(x => x.Id, x => x); var position = 0; foreach (var servingLine in serving.Lines) { if (orderLinesById.TryGetValue(servingLine.OrderLineId, out var orderLine)) { servingLine.Position = position++; servingLine.Name = orderLine.Name; // Adjust receivable on order line orderLine.Receiveable = Math.Max(orderLine.Receiveable - servingLine.Quantity, 0); } else { return(BadRequest()); } } _db.Servings.Add(serving); await _db.SaveChangesAsync(); await _mediator.Publish(new ServingCreatedNotification(serving.Id)); return(serving); }
public async Task <ActionResult <ResultSetDto <ServingEditDtoModel> > > EditServing([FromBody] ServingEditDtoModel request) { if (!ModelState.IsValid) { string message = ""; foreach (var er in ModelState.Values.SelectMany(modelstate => modelstate.Errors)) { message += er.ErrorMessage + " \n"; } return(Ok(new ResultSetDto() { IsSuced = false, Message = message })); } var resultServing = await _servingService.GetServingByIdAsync(Guid.Parse(request.ServingId)); if (!resultServing.IsSucced) { return(BadRequest(resultServing.Message)); } Serving servingEdit = resultServing.Data; servingEdit.Title = request.Title; servingEdit.Price = request.Price; servingEdit.Desc = request.Desc; var result = await _servingService.EditServingAsync(servingEdit); if (!result.IsSucced) { return(BadRequest(result.Message)); } return(Ok(new ResultSetDto <ServingEditDtoModel>() { IsSuced = true, Message = "", Data = request })); }
public OperationResult Delete(Serving serving) { try { _dao.Delete(serving); return(new OperationResult() { Success = true }); } catch (Exception e) { return(new OperationResult() { Success = false, Exception = e }); } }
public async Task <ResultSet <Serving> > AddServingAsync(Serving request) { _servingRepository.AddServing(request); try{ await _servingRepository.SaveAsync(); } catch (Exception e) { return(new ResultSet <Serving>() { IsSucced = false, Message = e.Message }); } return(new ResultSet <Serving>() { IsSucced = true, Message = string.Empty, Data = request }); }
public OperationResult Create(Serving item) { try { _dao.Create(item); return(new OperationResult() { Success = true }); } catch (Exception e) { return(new OperationResult() { Success = false, Exception = e }); } }
public void TestCreateAndListServingAsync() { RestaurantSeeder.Seed(); var cbo = new CourseBusinessObject(); var dbo = new DishBusinessObject(); var mbo = new MenuBusinessObject(); var sbo = new ServingBusinessObject(); var c = cbo.ListAsync().Result.Result.First(); var d = dbo.ListAsync().Result.Result.First(); var m = mbo.ListAsync().Result.Result.First(); var dr = new Serving(m.Id, d.Id, c.Id); var resCreate = sbo.CreateAsync(dr).Result; var resGet = sbo.ReadAsync(dr.Id).Result; Assert.IsTrue(resCreate.Success && resGet.Success && resGet.Result != null); }
public virtual OperationResult Delete(Serving serving) { try { using var transactionScope = new TransactionScope(TransactionScopeOption.Required, transactionOptions, TransactionScopeAsyncFlowOption.Enabled); _dao.Update(serving); transactionScope.Complete(); return(new OperationResult { Success = true }); } catch (Exception e) { return(new OperationResult() { Success = false, Exception = e }); } }
public async Task <OperationResult> DeleteAsync(Serving serving) { try { await _dao.DeleteAsync(serving); return(new OperationResult() { Success = true }); } catch (Exception e) { return(new OperationResult() { Success = false, Exception = e }); } }
public async Task <OperationResult> CreateAsync(Serving item) { try { await _dao.CreateAsync(item); return(new OperationResult() { Success = true }); } catch (Exception e) { return(new OperationResult() { Success = false, Exception = e }); } }
public void TestUpdateServingAsync() { ContextSeeders.Seed(); var sbo = new ServingBusinessObject(); var resList = sbo.List(); var item = resList.Result.FirstOrDefault(); var rbo = new RestaurantBusinessObject(); var mealbo = new MealBusinessObject(); var drbo = new DietaryRestrictionBusinessObject(); var mbo = new MenuBusinessObject(); var cbo = new CourseBusinessObject(); var dbo = new DishBusinessObject(); var restaurant = new Restaurant("a", "b", "c", "d", "f", 6); var meal = new Meal("a", "b", "c"); var dr = new DietaryRestriction("ok"); var menu = new Menu(DateTime.Now, restaurant.Id, meal.Id); var course = new Course("yes"); var dish = new Dish("uh", dr.Id); rbo.Create(restaurant); mealbo.Create(meal); drbo.Create(dr); mbo.Create(menu); cbo.Create(course); dbo.Create(dish); var newServing = new Serving(menu.Id, course.Id, dish.Id); item.MenuId = newServing.MenuId; item.CourseId = newServing.CourseId; item.DishId = newServing.DishId; var resUpdate = sbo.UpdateAsync(item).Result; resList = sbo.ListAsync().Result; Assert.IsTrue(resList.Success && resUpdate.Success && resList.Result.First().MenuId == newServing.MenuId && resList.Result.First().CourseId == newServing.CourseId && resList.Result.First().DishId == newServing.DishId); }
public async virtual Task <OperationResult> UpdateAsync(Serving serving) { try { using var transactionScope = new TransactionScope(TransactionScopeOption.Required, transactionOptions, TransactionScopeAsyncFlowOption.Enabled); await _dao.UpdateAsync(serving); transactionScope.Complete(); return(new OperationResult <List <Serving> > { Success = true }); } catch (Exception e) { return(new OperationResult <List <Serving> >() { Success = false, Exception = e }); } }
/// <summary> /// Extension метод для суммирования полей класса NutritionInfo со значениями класса Serving и количества еды. /// </summary> /// <param name="nutritionInfo">Экземпляр класса NutritionInfo информации о энергетической ценности.</param> /// <param name="serving">Экземпляр класса Serving информации о порции еды.</param> /// <param name="foodQty">Количество еды.</param> public static void Sum(this NutritionInfoDTO nutritionInfo, Serving serving, decimal foodQty) { nutritionInfo.Kcal += serving.KCal.HasValue ? (serving.KCal.Value) * foodQty : 0; nutritionInfo.Carbohydrate += (serving.Carbohydrate) * foodQty; nutritionInfo.Protein += (serving.Protein) * foodQty; nutritionInfo.Fat += (serving.Fat) * foodQty; nutritionInfo.DietaryFiber += (serving.DietaryFiber) * foodQty; nutritionInfo.Sugars += (serving.Sugars) * foodQty; nutritionInfo.SaturatedFat += (serving.SaturatedFat) * foodQty; nutritionInfo.MonounsaturatedFat += (serving.MonounsaturatedFat) * foodQty; nutritionInfo.PolyunsaturatedFat += (serving.PolyunsaturatedFat) * foodQty; nutritionInfo.TransFat += (serving.TransFat) * foodQty; nutritionInfo.Cholesterol += (serving.Cholesterol) * foodQty; nutritionInfo.Sodium += (serving.Sodium) * foodQty; nutritionInfo.Potassium += (serving.Potassium) * foodQty; nutritionInfo.Calcium += (serving.Calcium) * foodQty; nutritionInfo.Iron += (serving.Iron) * foodQty; nutritionInfo.VitaminA += (serving.VitaminA) * foodQty; nutritionInfo.VitaminC += (serving.VitaminC) * foodQty; }
static void ObjectHierarchy() { Beer beer = new Beer() { Name = "Sly Fox IPA", Flavor = "yummy", OriginalGravity = 4.2m }; Glass glass = new Glass() { Name = "Pilsner", Ounces = 16 }; Database.Connection().Insert("InsertBeer", beer); Database.Connection().Insert("InsertGlass", glass); Serving serving = new Serving() { When = DateTime.Parse("1/1/2012") }; serving.Beer = beer; serving.Glass = glass; Database.Connection().Insert("InsertServing", serving); var servings = Database.Connection().QuerySql<Serving, Beer, Glass>("SELECT s.*, b.*, g.* FROM Servings s JOIN Beer b ON (s.BeerID = b.ID) JOIN Glasses g ON (s.GlassesID = g.ID)", Parameters.Empty); foreach (var s in servings) Console.WriteLine("{0} {1} {2}", s.When, s.Beer.Name, s.Glass.Ounces); }
// 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 ServingViewModelServing() { FoodGroup foodGroupOne = new FoodGroup( Guid.NewGuid(), "FoodGroupOne", "Test Food Group #1" ); Serving<FoodGroup> serving = new Serving<FoodGroup>( foodGroupOne, 2.5M ); ServingViewModel<FoodGroup> servingViewModel = new ServingViewModel<FoodGroup>( serving ); Assert.IsTrue( servingViewModel.IsValid ); Assert.AreEqual( foodGroupOne, servingViewModel.Entity ); Assert.AreEqual( 2.5M, servingViewModel.Quantity ); Assert.IsNull( servingViewModel["Quantity"] ); Assert.IsNull( servingViewModel["Entity"] ); }
public void ServingViewModelPropertyChanged() { MealType pi = new MealType( Guid.NewGuid(), "pi", "not the tasty kind", DateTime.Now, false ); MealType e = new MealType( Guid.NewGuid(), "e", "exponent", DateTime.Now, false ); PropertyChangedHandler propertyChangedHandler = new PropertyChangedHandler(); Serving<MealType> serving = new Serving<MealType>( pi, 3.14159M ); ServingViewModel<MealType> servingViewModel = new ServingViewModel<MealType>( serving ); servingViewModel.PropertyChanged += propertyChangedHandler.OnPropertyChanged; Assert.AreEqual( pi, servingViewModel.Entity ); Assert.AreEqual( 3.14159M, servingViewModel.Quantity ); Assert.IsNull( propertyChangedHandler.Sender ); Assert.AreEqual( 0, propertyChangedHandler.PropertiesChanged.Count ); servingViewModel.Entity = e; Assert.AreEqual( servingViewModel, propertyChangedHandler.Sender ); Assert.AreEqual( 3, propertyChangedHandler.PropertiesChanged.Count ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "Entity" ) ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "IsDirty" ) ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "IsValid" ) ); Assert.AreEqual( e, serving.Entity ); Assert.AreEqual( 3.14159M, serving.Quantity ); propertyChangedHandler.Reset(); servingViewModel.Quantity = 2.71828183M; Assert.AreEqual( servingViewModel, propertyChangedHandler.Sender ); Assert.AreEqual( 3, propertyChangedHandler.PropertiesChanged.Count ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "Quantity" ) ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "IsDirty" ) ); Assert.IsTrue( propertyChangedHandler.PropertiesChanged.Contains( "IsValid" ) ); Assert.AreEqual( e, serving.Entity ); Assert.AreEqual( 2.71828183M, serving.Quantity ); }