From 8d7bb774b9e49c12e249154bf41f8213cfbf3705 Mon Sep 17 00:00:00 2001
From: Lara Blersch <lb210@hdm-stuttgart.de>
Date: Wed, 17 May 2023 17:15:00 +0200
Subject: [PATCH] changed double to BigDecimal in NutritionTable

---
 .../java/mi/hdm/filesystem/CSVParser.java     |  6 ++-
 .../mi/hdm/recipes/NutritionCalculator.java   | 30 +++++++------
 .../java/mi/hdm/recipes/NutritionTable.java   | 45 +++++++++++--------
 .../mi/hdm/recipes/NutritionTableTest.java    | 15 ++++---
 4 files changed, 55 insertions(+), 41 deletions(-)

diff --git a/src/main/java/mi/hdm/filesystem/CSVParser.java b/src/main/java/mi/hdm/filesystem/CSVParser.java
index 053799f..c3c9c65 100644
--- a/src/main/java/mi/hdm/filesystem/CSVParser.java
+++ b/src/main/java/mi/hdm/filesystem/CSVParser.java
@@ -10,6 +10,7 @@ import java.io.BufferedReader;
 import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.InvalidPropertiesFormatException;
@@ -61,7 +62,7 @@ public class CSVParser {
         final List<String> splitLine = splitLine(line, split);
 
         final String recipeName = splitLine.get(idx[0]);
-        final List<Double> nutrition = new ArrayList<>();
+        final List<BigDecimal> nutrition = new ArrayList<>();
 
         for (int i = 1; i < idx.length; i++) {
             //String element = splitLine.get(idx[i]).split(" ")[0];
@@ -70,7 +71,8 @@ public class CSVParser {
             if (getMeasurementFromString(element).equals("mg")) {
                 quantity = quantity /1000;
             }
-            nutrition.add(quantity);
+
+            nutrition.add(BigDecimal.valueOf(quantity));
         }
 
         final NutritionTable nutritionTable = new NutritionTable(nutrition);
diff --git a/src/main/java/mi/hdm/recipes/NutritionCalculator.java b/src/main/java/mi/hdm/recipes/NutritionCalculator.java
index cd1106e..25e8556 100644
--- a/src/main/java/mi/hdm/recipes/NutritionCalculator.java
+++ b/src/main/java/mi/hdm/recipes/NutritionCalculator.java
@@ -4,6 +4,7 @@ import mi.hdm.mealPlan.MealPlan;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.Map;
 
@@ -30,7 +31,8 @@ public class NutritionCalculator {
                 totalSalt = 0;
 
         for (RecipeComponent entry : ingredients.keySet()) {
-            final Map<Nutrition, Double> nutritionTable = entry.getNutritionTable().getTable();
+            //TODO: adjust to change in NutritionTable: double -> BigDecimal
+            final Map<Nutrition, BigDecimal> nutritionTable = entry.getNutritionTable().getTable();
 
             int divisor;
             if (entry.getMeasurement() == Measurement.PIECE || entry.getMeasurement() == Measurement.PINCH) {
@@ -38,12 +40,12 @@ public class NutritionCalculator {
             } else {
                 divisor = 100;
             }
-            totalCals += nutritionTable.get(Nutrition.CALORIES) * ingredients.get(entry) / divisor;
-            totalCarbs += nutritionTable.get(Nutrition.CARBS) * ingredients.get(entry) / divisor;
-            totalFats += nutritionTable.get(Nutrition.FAT) * ingredients.get(entry) / divisor;
-            totalProteins += nutritionTable.get(Nutrition.PROTEINS) * ingredients.get(entry) / divisor;
-            totalFibers += nutritionTable.get(Nutrition.FIBERS) * ingredients.get(entry) / divisor;
-            totalSalt += nutritionTable.get(Nutrition.SALT) * ingredients.get(entry) / divisor;
+            totalCals += nutritionTable.get(Nutrition.CALORIES).doubleValue() * ingredients.get(entry) / divisor;
+            totalCarbs += nutritionTable.get(Nutrition.CARBS).doubleValue() * ingredients.get(entry) / divisor;
+            totalFats += nutritionTable.get(Nutrition.FAT).doubleValue() * ingredients.get(entry) / divisor;
+            totalProteins += nutritionTable.get(Nutrition.PROTEINS).doubleValue() * ingredients.get(entry) / divisor;
+            totalFibers += nutritionTable.get(Nutrition.FIBERS).doubleValue() * ingredients.get(entry) / divisor;
+            totalSalt += nutritionTable.get(Nutrition.SALT).doubleValue() * ingredients.get(entry) / divisor;
         }
         log.info("NutritionTable calculated successfully.");
         return new NutritionTable(totalCals, totalCarbs, totalFats, totalProteins, totalFibers, totalSalt);
@@ -62,13 +64,13 @@ public class NutritionCalculator {
                 totalSalt = 0;
 
         for (Recipe r : plan.values()) {
-            final Map<Nutrition, Double> nutritionTable = r.getNutritionTable().getTable();
-            totalCals += nutritionTable.get(Nutrition.CALORIES);
-            totalCarbs += nutritionTable.get(Nutrition.CARBS);
-            totalFats += nutritionTable.get(Nutrition.FAT);
-            totalProteins += nutritionTable.get(Nutrition.PROTEINS);
-            totalFibers += nutritionTable.get(Nutrition.FIBERS);
-            totalSalt += nutritionTable.get(Nutrition.SALT);
+            final Map<Nutrition, BigDecimal> nutritionTable = r.getNutritionTable().getTable();
+            totalCals += nutritionTable.get(Nutrition.CALORIES).doubleValue();
+            totalCarbs += nutritionTable.get(Nutrition.CARBS).doubleValue();
+            totalFats += nutritionTable.get(Nutrition.FAT).doubleValue();
+            totalProteins += nutritionTable.get(Nutrition.PROTEINS).doubleValue();
+            totalFibers += nutritionTable.get(Nutrition.FIBERS).doubleValue();
+            totalSalt += nutritionTable.get(Nutrition.SALT).doubleValue();
         }
         log.info("NutritionTable calculated successfully.");
 
diff --git a/src/main/java/mi/hdm/recipes/NutritionTable.java b/src/main/java/mi/hdm/recipes/NutritionTable.java
index d7ca2bb..3d0c42f 100644
--- a/src/main/java/mi/hdm/recipes/NutritionTable.java
+++ b/src/main/java/mi/hdm/recipes/NutritionTable.java
@@ -2,20 +2,28 @@ package mi.hdm.recipes;
 
 import mi.hdm.exceptions.InvalidNutritionTableException;
 
+import java.math.BigDecimal;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 public class NutritionTable {
     //TODO: refactor this class to use BigDecimal
-    private final Map<Nutrition, Double> table;
+    private final Map<Nutrition, BigDecimal> 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.
      * 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) {
-        if (calories < 0 || carbs < 0 || fats < 0 || proteins < 0 || fibers < 0 || salt < 0) {
+    public NutritionTable(double caloriesDouble, double carbsDouble, double fatsDouble, double proteinsDouble, double fibersDouble, double saltDouble) {
+
+        BigDecimal calories = BigDecimal.valueOf(caloriesDouble),
+                carbs = BigDecimal.valueOf(carbsDouble),
+                fats = BigDecimal.valueOf(fatsDouble),
+                proteins = BigDecimal.valueOf(proteinsDouble),
+                fibers = BigDecimal.valueOf(fibersDouble),
+                salt = BigDecimal.valueOf(saltDouble);
+        if (calories.compareTo(BigDecimal.ZERO) < 0 || carbs.compareTo(BigDecimal.ZERO) < 0 || fats.compareTo(BigDecimal.ZERO) < 0 || proteins.compareTo(BigDecimal.ZERO) < 0 || fibers.compareTo(BigDecimal.ZERO) < 0 || salt.compareTo(BigDecimal.ZERO) < 0) {
             throw new InvalidNutritionTableException("Can't create NutritionTable where any of the arguments is < 0");
         }
         this.table = new HashMap<>();
@@ -28,7 +36,7 @@ public class NutritionTable {
         table.put(Nutrition.SALT, salt);
     }
 
-    public NutritionTable(List<Double> nutrition) {
+    public NutritionTable(List<BigDecimal> nutrition) {
         if (nutrition == null || nutrition.size() != Nutrition.values().length)
             throw new InvalidNutritionTableException("You supplied a list that was null or had an invalid size.");
 
@@ -42,15 +50,15 @@ public class NutritionTable {
     private NutritionTable() {
         this.table = new HashMap<>();
 
-        table.put(Nutrition.CALORIES, 0.0);
-        table.put(Nutrition.CARBS, 0.0);
-        table.put(Nutrition.FAT, 0.0);
-        table.put(Nutrition.PROTEINS, 0.0);
-        table.put(Nutrition.FIBERS, 0.0);
-        table.put(Nutrition.SALT, 0.0);
+        table.put(Nutrition.CALORIES, BigDecimal.valueOf(0.0));
+        table.put(Nutrition.CARBS, BigDecimal.valueOf(0.0));
+        table.put(Nutrition.FAT, BigDecimal.valueOf(0.0));
+        table.put(Nutrition.PROTEINS, BigDecimal.valueOf(0.0));
+        table.put(Nutrition.FIBERS, BigDecimal.valueOf(0.0));
+        table.put(Nutrition.SALT, BigDecimal.valueOf(0.0));
     }
 
-    public Map<Nutrition, Double> getTable() {
+    public Map<Nutrition, BigDecimal> getTable() {
         return table;
     }
 
@@ -67,14 +75,15 @@ public class NutritionTable {
      */
     @Override
     public boolean equals(Object o) {
+        //TODO: rewrite method
         if (o instanceof NutritionTable n) {
-            double delta = 0.001;
-            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 n.getTable().get(Nutrition.CALORIES).equals(table.get(Nutrition.CALORIES))
+                    && n.getTable().get(Nutrition.CARBS).equals(table.get(Nutrition.CARBS))
+                    && n.getTable().get(Nutrition.FAT).equals(table.get(Nutrition.FAT))
+                    && n.getTable().get(Nutrition.PROTEINS).equals(table.get(Nutrition.PROTEINS))
+                    && n.getTable().get(Nutrition.FIBERS).equals(table.get(Nutrition.FIBERS))
+                    && n.getTable().get(Nutrition.SALT).equals(table.get(Nutrition.SALT));
         }
         return false;
     }
diff --git a/src/test/java/mi/hdm/recipes/NutritionTableTest.java b/src/test/java/mi/hdm/recipes/NutritionTableTest.java
index 38176e2..23f20dd 100644
--- a/src/test/java/mi/hdm/recipes/NutritionTableTest.java
+++ b/src/test/java/mi/hdm/recipes/NutritionTableTest.java
@@ -4,6 +4,7 @@ import mi.hdm.exceptions.InvalidNutritionTableException;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
+import java.math.BigDecimal;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -28,13 +29,13 @@ public class NutritionTableTest {
         NutritionTable underTest = new NutritionTable(calories, carbs, fats, protein, fibers, salt);
 
         //expect
-        Map<Nutrition, Double> expected = new HashMap<>();
-        expected.put(Nutrition.CALORIES, calories);
-        expected.put(Nutrition.CARBS, carbs);
-        expected.put(Nutrition.FAT, fats);
-        expected.put(Nutrition.PROTEINS, protein);
-        expected.put(Nutrition.FIBERS, fibers);
-        expected.put(Nutrition.SALT, salt);
+        Map<Nutrition, BigDecimal> expected = new HashMap<>();
+        expected.put(Nutrition.CALORIES, BigDecimal.valueOf(calories));
+        expected.put(Nutrition.CARBS, BigDecimal.valueOf(carbs));
+        expected.put(Nutrition.FAT, BigDecimal.valueOf(fats));
+        expected.put(Nutrition.PROTEINS, BigDecimal.valueOf(protein));
+        expected.put(Nutrition.FIBERS, BigDecimal.valueOf(fibers));
+        expected.put(Nutrition.SALT, BigDecimal.valueOf(salt));
 
         Assertions.assertEquals(expected, underTest.getTable());
     }
-- 
GitLab