Add function to compute an equivalent food from a recipe
This commit is contained in:
parent
4a541490e4
commit
e06f9cf25c
@ -18,6 +18,8 @@ type Ingredient struct {
|
|||||||
InRecipeID RecipeID `db:"in_recipe_id"`
|
InRecipeID RecipeID `db:"in_recipe_id"`
|
||||||
ListOrder int64 `db:"list_order"`
|
ListOrder int64 `db:"list_order"`
|
||||||
IsHidden bool `db:"is_hidden"`
|
IsHidden bool `db:"is_hidden"`
|
||||||
|
|
||||||
|
Food *Food
|
||||||
}
|
}
|
||||||
|
|
||||||
// // Format as string
|
// // Format as string
|
||||||
@ -85,3 +87,7 @@ func (db *DB) DeleteIngredient(i Ingredient) {
|
|||||||
panic(fmt.Errorf("tried to delete ingredient with ID (%d) but it doesn't exist", i.ID))
|
panic(fmt.Errorf("tried to delete ingredient with ID (%d) but it doesn't exist", i.ID))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (i Ingredient) Quantity() float32 {
|
||||||
|
return float32(i.QuantityNumerator) / float32(i.QuantityDenominator)
|
||||||
|
}
|
||||||
|
@ -35,6 +35,7 @@ func TestSaveAndLoadIngredient(t *testing.T) {
|
|||||||
// Create an ingredient on the recipe
|
// Create an ingredient on the recipe
|
||||||
ingr := Ingredient{
|
ingr := Ingredient{
|
||||||
FoodID: food.ID,
|
FoodID: food.ID,
|
||||||
|
Food: &food,
|
||||||
QuantityNumerator: 3,
|
QuantityNumerator: 3,
|
||||||
QuantityDenominator: 2,
|
QuantityDenominator: 2,
|
||||||
Units: 1, // count
|
Units: 1, // count
|
||||||
|
@ -94,5 +94,51 @@ func (db *DB) GetRecipeByID(id RecipeID) (ret Recipe, err error) {
|
|||||||
where in_recipe_id = ?
|
where in_recipe_id = ?
|
||||||
order by list_order asc
|
order by list_order asc
|
||||||
`, id)
|
`, id)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
for i := range ret.Ingredients {
|
||||||
|
var food Food
|
||||||
|
if ret.Ingredients[i].FoodID != FoodID(0) {
|
||||||
|
// ingredient is a food
|
||||||
|
food, err = db.GetFoodByID(ret.Ingredients[i].FoodID)
|
||||||
|
ret.Ingredients[i].Food = &food
|
||||||
|
} else {
|
||||||
|
// ingredient is a food; i.Food is the ComputedFood of the Recipe
|
||||||
|
var computed_food_id FoodID
|
||||||
|
err = db.DB.Get(&computed_food_id, `select computed_food_id from recipes where rowid = ?`, ret.Ingredients[i].RecipeID)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
food, err = db.GetFoodByID(computed_food_id)
|
||||||
|
ret.Ingredients[i].Food = &food
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r Recipe) ComputeFood() Food {
|
||||||
|
ret := Food{}
|
||||||
|
for _, ingr := range r.Ingredients {
|
||||||
|
ret.Cals += ingr.Quantity() * ingr.Food.Cals
|
||||||
|
ret.Carbs += ingr.Quantity() * ingr.Food.Carbs
|
||||||
|
ret.Protein += ingr.Quantity() * ingr.Food.Protein
|
||||||
|
ret.Fat += ingr.Quantity() * ingr.Food.Fat
|
||||||
|
ret.Sugar += ingr.Quantity() * ingr.Food.Sugar
|
||||||
|
ret.Alcohol += ingr.Quantity() * ingr.Food.Alcohol
|
||||||
|
ret.Water += ingr.Quantity() * ingr.Food.Water
|
||||||
|
ret.Potassium += ingr.Quantity() * ingr.Food.Potassium
|
||||||
|
ret.Calcium += ingr.Quantity() * ingr.Food.Calcium
|
||||||
|
ret.Sodium += ingr.Quantity() * ingr.Food.Sodium
|
||||||
|
ret.Magnesium += ingr.Quantity() * ingr.Food.Magnesium
|
||||||
|
ret.Phosphorus += ingr.Quantity() * ingr.Food.Phosphorus
|
||||||
|
ret.Iron += ingr.Quantity() * ingr.Food.Iron
|
||||||
|
ret.Zinc += ingr.Quantity() * ingr.Food.Zinc
|
||||||
|
ret.Mass += ingr.Quantity() * ingr.Food.Mass
|
||||||
|
ret.Price += ingr.Quantity() * ingr.Food.Price
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
@ -42,3 +42,53 @@ func TestRecipeSaveAndLoad(t *testing.T) {
|
|||||||
t.Error(diff)
|
t.Error(diff)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRecipeComputeFood(t *testing.T) {
|
||||||
|
assert := assert.New(t)
|
||||||
|
f1 := Food{0, "", 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 0, 0}
|
||||||
|
f2 := Food{0, "", 16.5, 15.5, 14.5, 13.5, 12.5, 11.5, 10.5, 9.5, 8.5, 7.5, 6.5, 5.5, 4.5, 3.5, 2.5, 1.5, 0, 0}
|
||||||
|
|
||||||
|
recipe := Recipe{Ingredients: []Ingredient{
|
||||||
|
{QuantityNumerator: 1, QuantityDenominator: 1, Food: &f1},
|
||||||
|
{QuantityNumerator: 1, QuantityDenominator: 1, Food: &f2},
|
||||||
|
}}
|
||||||
|
computed_food := recipe.ComputeFood()
|
||||||
|
assert.Equal(computed_food.Cals, float32(17.5))
|
||||||
|
assert.Equal(computed_food.Carbs, float32(17.5))
|
||||||
|
assert.Equal(computed_food.Protein, float32(17.5))
|
||||||
|
assert.Equal(computed_food.Fat, float32(17.5))
|
||||||
|
assert.Equal(computed_food.Sugar, float32(17.5))
|
||||||
|
assert.Equal(computed_food.Alcohol, float32(17.5))
|
||||||
|
assert.Equal(computed_food.Water, float32(17.5))
|
||||||
|
assert.Equal(computed_food.Potassium, float32(17.5))
|
||||||
|
assert.Equal(computed_food.Calcium, float32(17.5))
|
||||||
|
assert.Equal(computed_food.Sodium, float32(17.5))
|
||||||
|
assert.Equal(computed_food.Magnesium, float32(17.5))
|
||||||
|
assert.Equal(computed_food.Phosphorus, float32(17.5))
|
||||||
|
assert.Equal(computed_food.Iron, float32(17.5))
|
||||||
|
assert.Equal(computed_food.Zinc, float32(17.5))
|
||||||
|
assert.Equal(computed_food.Mass, float32(17.5))
|
||||||
|
assert.Equal(computed_food.Price, float32(17.5))
|
||||||
|
|
||||||
|
recipe2 := Recipe{Ingredients: []Ingredient{
|
||||||
|
{QuantityNumerator: 3, QuantityDenominator: 2, Food: &f1},
|
||||||
|
{QuantityNumerator: 1, QuantityDenominator: 2, Food: &f2},
|
||||||
|
}}
|
||||||
|
computed_food2 := recipe2.ComputeFood()
|
||||||
|
assert.Equal(computed_food2.Cals, float32(9.75))
|
||||||
|
assert.Equal(computed_food2.Carbs, float32(10.75))
|
||||||
|
assert.Equal(computed_food2.Protein, float32(11.75))
|
||||||
|
assert.Equal(computed_food2.Fat, float32(12.75))
|
||||||
|
assert.Equal(computed_food2.Sugar, float32(13.75))
|
||||||
|
assert.Equal(computed_food2.Alcohol, float32(14.75))
|
||||||
|
assert.Equal(computed_food2.Water, float32(15.75))
|
||||||
|
assert.Equal(computed_food2.Potassium, float32(16.75))
|
||||||
|
assert.Equal(computed_food2.Calcium, float32(17.75))
|
||||||
|
assert.Equal(computed_food2.Sodium, float32(18.75))
|
||||||
|
assert.Equal(computed_food2.Magnesium, float32(19.75))
|
||||||
|
assert.Equal(computed_food2.Phosphorus, float32(20.75))
|
||||||
|
assert.Equal(computed_food2.Iron, float32(21.75))
|
||||||
|
assert.Equal(computed_food2.Zinc, float32(22.75))
|
||||||
|
assert.Equal(computed_food2.Mass, float32(23.75))
|
||||||
|
assert.Equal(computed_food2.Price, float32(24.75))
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user