diff --git a/src/main/java/mi/hdm/recipes/IngredientManager.java b/src/main/java/mi/hdm/recipes/IngredientManager.java index e43138be0e27343f6106d04bd07d5b915b539b02..32e7d40cf697794b3b3251de0b0f75a995552982 100644 --- a/src/main/java/mi/hdm/recipes/IngredientManager.java +++ b/src/main/java/mi/hdm/recipes/IngredientManager.java @@ -19,6 +19,7 @@ public class IngredientManager { public static IngredientManager getInstance() { return instance; } + /** * Adds an ingredient if there is no equal ingredient (no ingredient with the same name). * @param in Ingredient that is to be added @@ -34,16 +35,10 @@ public class IngredientManager { return true; } } + public boolean addIngredient(Measurement unit, String name, NutritionTable nutritionTable) { Ingredient in = new Ingredient(unit, name, nutritionTable); - if (allIngredients.contains(in)) { - log.error("Ingredient: {} not added because it already exists", in.getName()); - return false; - } else { - log.info("Ingredient {} added successfully.", in.getName()); - allIngredients.add(in); - return true; - } + return addIngredient(in); } public Ingredient deleteIngredient(int i) { diff --git a/src/main/java/mi/hdm/recipes/NutritionCalculator.java b/src/main/java/mi/hdm/recipes/NutritionCalculator.java index f465c550bad77d71d1e297ad31a5e1e67a33eccd..20ccdec334936ba693dbd24a4d66a3a5e59e53ff 100644 --- a/src/main/java/mi/hdm/recipes/NutritionCalculator.java +++ b/src/main/java/mi/hdm/recipes/NutritionCalculator.java @@ -2,8 +2,37 @@ package mi.hdm.recipes; import mi.hdm.mealPlan.MealPlan; +import java.util.Map; + public class NutritionCalculator { - public static NutritionTable calculateNutritionTable(Recipe recipe) { return null; } + /** + * Method to calculate the nutrition table for a recipe out of its ingredients. + * + * @return the nutrition table for this recipe based on its ingredients. All nutrition values are added up. + */ + public static NutritionTable calculateNutritionTable(Map<RecipeComponent, Integer> ingredients) { + double totalCals = 0, + totalCarbs = 0, + totalFats = 0, + totalProteins = 0, + totalFibers = 0, + totalSalt = 0; + + for (RecipeComponent entry : ingredients.keySet()) { + final Map<Nutrition, Double> nutritionTable = entry.getNutritionTable().getTable(); + + totalCals += nutritionTable.get(Nutrition.CALORIES) * ingredients.get(entry) / 100; + totalCarbs += nutritionTable.get(Nutrition.CARBS) * ingredients.get(entry) / 100; + totalFats += nutritionTable.get(Nutrition.FAT) * ingredients.get(entry) / 100; + totalProteins += nutritionTable.get(Nutrition.PROTEINS) * ingredients.get(entry) / 100; + totalFibers += nutritionTable.get(Nutrition.FIBERS) * ingredients.get(entry) / 100; + totalSalt += nutritionTable.get(Nutrition.SALT) * ingredients.get(entry) / 100; + } + + return new NutritionTable(totalCals, totalCarbs, totalFats, totalProteins, totalFibers, totalSalt); + } - public static NutritionTable calculateNutritionTable(MealPlan mealPlan) { return null; } + public static NutritionTable calculateNutritionTable(MealPlan mealPlan) { + return null; + } } diff --git a/src/main/java/mi/hdm/recipes/NutritionTable.java b/src/main/java/mi/hdm/recipes/NutritionTable.java index ec215d813b027fa419dc51df84e2a924105cecf0..1ff90190ac58c3e4491f8b213273cc5ab9a88917 100644 --- a/src/main/java/mi/hdm/recipes/NutritionTable.java +++ b/src/main/java/mi/hdm/recipes/NutritionTable.java @@ -9,7 +9,8 @@ public class NutritionTable { private final Map<Nutrition, Double> table; /** - * Creates a new nutrition table that can be used in an ingredient. Expects values for all the nutrition values in order: Calories, Carbs, Fats, Proteins, Fibers, Salt + * Creates a new nutrition table that can be used in an ingredient. Expects values for all the nutrition values in order: Calories, Carbs, Fats, Proteins, Fibers, Salt. + * All values supplied should be in relation to 100 grams or 1 piece. */ public NutritionTable(double calories, double carbs, double fats, double proteins, double fibers, double salt) { this.table = new HashMap<>(); @@ -32,4 +33,20 @@ public class NutritionTable { public NutritionTable get() { return this; } + + @Override + public boolean equals(Object o) { + if (o instanceof NutritionTable) { + NutritionTable n = (NutritionTable) o; + + double delta = 0.03; + return n.getTable().get(Nutrition.CALORIES) - table.get(Nutrition.CALORIES) < delta + && n.getTable().get(Nutrition.CARBS) - table.get(Nutrition.CARBS) < delta + && n.getTable().get(Nutrition.FAT) - table.get(Nutrition.FAT) < delta + && n.getTable().get(Nutrition.PROTEINS) - table.get(Nutrition.PROTEINS) < delta + && n.getTable().get(Nutrition.FIBERS) - table.get(Nutrition.FIBERS) < delta + && n.getTable().get(Nutrition.SALT) - table.get(Nutrition.SALT) < delta; + } + return false; + } } diff --git a/src/main/java/mi/hdm/recipes/Recipe.java b/src/main/java/mi/hdm/recipes/Recipe.java index 091899ce632651abfedc2af645f8f28be64e0a4e..bd8eeaa0bbdc5225364752bbcbc3328e8c4da104 100644 --- a/src/main/java/mi/hdm/recipes/Recipe.java +++ b/src/main/java/mi/hdm/recipes/Recipe.java @@ -5,35 +5,33 @@ import mi.hdm.exceptions.InvalidRecipeException; import java.time.LocalDateTime; import java.util.List; import java.util.Map; -import java.util.Set; public class Recipe implements RecipeComponent { private Map<RecipeComponent, Integer> ingredients; private String name; private String description; private List<String> preparation; - private Set<Category> categories; + private List<Category> categories; private Integer preparationTimeMins; - private LocalDateTime created; private NutritionTable nutritionTable; + private final LocalDateTime creationTime; public Recipe( - Map<RecipeComponent,Integer> ingredients, + Map<RecipeComponent, Integer> ingredients, String name, String description, List<String> preparation, - Set<Category> categories, - Integer preparationTimeMins, - NutritionTable nutritionTable) { + List<Category> categories, + Integer preparationTimeMins) { this.ingredients = ingredients; this.name = name; this.description = description; this.preparation = preparation; this.categories = categories; this.preparationTimeMins = preparationTimeMins; - this.nutritionTable = nutritionTable; + nutritionTable = NutritionCalculator.calculateNutritionTable(ingredients); - created = LocalDateTime.now(); + creationTime = LocalDateTime.now(); } public void setName(String name) { @@ -63,27 +61,31 @@ public class Recipe implements RecipeComponent { this.preparation = preparation; } - public Set<Category> getCategories() { + public List<Category> getCategories() { return categories; } - public void setCategories(Set<Category> categories) { + public void setCategories(List<Category> categories) { this.categories = categories; } + public void addCategory(Category category) { + categories.add(category); + } + public Integer getPreparationTimeMins() { return preparationTimeMins; } public void setPreparationTimeMins(int preparationTimeMins) { - if (preparationTimeMins < 0) { - throw new InvalidRecipeException("PreparationTime must be a positive value"); - } + if (preparationTimeMins < 0) { + throw new InvalidRecipeException("PreparationTime must be a positive value"); + } this.preparationTimeMins = preparationTimeMins; } - public LocalDateTime getCreated() { - return created; + public LocalDateTime getCreationTime() { + return creationTime; } public void setNutritionTable(NutritionTable nutritionTable) { diff --git a/src/test/java/mi/hdm/recipes/CategoryTest.java b/src/test/java/mi/hdm/recipes/CategoryTest.java index a1f01c8560fd066866a4b0f5de65e74e05a01317..3edc2e9080432fbbf89bae106d30b6b99822a960 100644 --- a/src/test/java/mi/hdm/recipes/CategoryTest.java +++ b/src/test/java/mi/hdm/recipes/CategoryTest.java @@ -2,7 +2,6 @@ package mi.hdm.recipes; import mi.hdm.exceptions.InvalidCategoryException; import org.junit.Assert; -import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -12,7 +11,7 @@ public class CategoryTest { CategoryManager underTest = CategoryManager.getInstance(); @Test - public void testEquals() { + public void testEqualCategories() { underTest.clearCategories(); Category c1 = new Category("Abend", 0x00FF00); Category c2 = new Category("LEcker", 0x13); diff --git a/src/test/java/mi/hdm/recipes/IngredientTest.java b/src/test/java/mi/hdm/recipes/IngredientTest.java index 447a05383f32de2b0d2497128a263696c1d32410..6988335005d201fccc199493c2abe5c3b4136d4a 100644 --- a/src/test/java/mi/hdm/recipes/IngredientTest.java +++ b/src/test/java/mi/hdm/recipes/IngredientTest.java @@ -3,19 +3,16 @@ package mi.hdm.recipes; import org.junit.Assert; import org.junit.Test; -import java.util.ArrayList; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; public class IngredientTest { - IngredientManager underTest = IngredientManager.getInstance(); - NutritionTable tt = ValidObjectsPool.getValidNutritionTable(); + NutritionTable tt = ValidObjectsPool.getValidNutritionTableOne(); @Test - public void testEquals() { + public void testEqualIngredients() { Ingredient i1 = new Ingredient(Measurement.GRAM, "Banana", tt); Ingredient i2 = new Ingredient(Measurement.PIECE, "Banana", tt); Ingredient i3 = new Ingredient(Measurement.GRAM, "Apple", tt); diff --git a/src/test/java/mi/hdm/recipes/NutritionCalculatorTest.java b/src/test/java/mi/hdm/recipes/NutritionCalculatorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..d54f4f9c86fad9f3d86647bcb6d8774f805b9520 --- /dev/null +++ b/src/test/java/mi/hdm/recipes/NutritionCalculatorTest.java @@ -0,0 +1,41 @@ +package mi.hdm.recipes; + +import org.junit.Before; +import org.junit.Test; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class NutritionCalculatorTest { + List<Ingredient> ingredients = ValidObjectsPool.getValidIngredientList(); + Map<RecipeComponent, Integer> recipeMap; + + + @Before + public void setUp() { + recipeMap = new HashMap<>(); + ingredients.forEach(ingredient -> recipeMap.put(ingredient, 100)); + } + + @Test + public void testCalculateNutritionTableFromIngredients() { + //given + NutritionTable expected = new NutritionTable(363.1, 42.4, 9.6, 4.3, 2.4, 1.2); + + //when + NutritionTable actual = NutritionCalculator.calculateNutritionTable(recipeMap); + + //expect + assertEquals(expected, actual); + } + + @Test + public void testCalculateNutritionTableFromRecipes() { + //TODO + assertTrue(true); + } +} diff --git a/src/test/java/mi/hdm/recipes/NutritionTableTest.java b/src/test/java/mi/hdm/recipes/NutritionTableTest.java index a2a1a601d4c021be0d8cf01c62de23d9d86a2556..0338d3f10c30ab52a48d32683385229054dedb7e 100644 --- a/src/test/java/mi/hdm/recipes/NutritionTableTest.java +++ b/src/test/java/mi/hdm/recipes/NutritionTableTest.java @@ -7,6 +7,7 @@ import java.util.HashMap; import java.util.Map; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; public class NutritionTableTest { @@ -40,4 +41,14 @@ public class NutritionTableTest { assertEquals(expected, underTest.getTable()); } + @Test + public void testEqualNutritionTable() { + NutritionTable underTestOne = ValidObjectsPool.getValidNutritionTableOne(); + NutritionTable underTestTwo = ValidObjectsPool.getValidNutritionTableTwo(); + NutritionTable underTestEqualToOne = new NutritionTable(100.0, 17.2, 9.4, 4.3, 2.4, 0.4); + + assertNotEquals(underTestEqualToOne, underTestTwo); + assertEquals(underTestEqualToOne, underTestEqualToOne); + } + } \ No newline at end of file diff --git a/src/test/java/mi/hdm/recipes/ValidObjectsPool.java b/src/test/java/mi/hdm/recipes/ValidObjectsPool.java index cd01118d8cfbbf3ac87c7bd8c7c6b206a62c3682..be78044ed75088c24ac5315b0d5f2e9ca0d0e3ea 100644 --- a/src/test/java/mi/hdm/recipes/ValidObjectsPool.java +++ b/src/test/java/mi/hdm/recipes/ValidObjectsPool.java @@ -1,11 +1,36 @@ package mi.hdm.recipes; +import java.util.List; + public class ValidObjectsPool { - private final static NutritionTable nutritionTable = new NutritionTable(100.0, 17.2, 9.4, 4.3, 2.4, 0.4); + private final static Category categoryOne = new Category("Frühstück", 0xFF0000); + private final static Category categoryTwo = new Category("Abendessen", 0x00FF00); + private final static NutritionTable nutritionTableOne = new NutritionTable(100.0, 17.2, 9.4, 4.3, 2.4, 0.4); + private final static NutritionTable nutritionTableTwo = new NutritionTable(263.1, 25.2, 0.2, 0.0, 0.0, 0.8); + private final static Ingredient ingredientOne = new Ingredient(Measurement.GRAM, "Zucker", nutritionTableOne); + private final static Ingredient ingredientTwo = new Ingredient(Measurement.PIECE, "Apple", nutritionTableTwo); - public static NutritionTable getValidNutritionTable() { - return nutritionTable; + public static NutritionTable getValidNutritionTableOne() { + return nutritionTableOne; } + public static NutritionTable getValidNutritionTableTwo() { + return nutritionTableTwo; + } + public static Ingredient getValidIngredient() { + return ingredientOne; + } + + public static List<Ingredient> getValidIngredientList() { + return List.of(ingredientOne, ingredientTwo); + } + + public static Category getValidCategory() { + return categoryOne; + } + + public static List<Category> getValidCategoryList() { + return List.of(categoryOne, categoryTwo); + } }