From 9e10ea55380b79327416a5c9c95551f8ec3ab646 Mon Sep 17 00:00:00 2001 From: Andreas <andreksv@ntnu.no> Date: Mon, 20 Mar 2023 11:39:15 +0100 Subject: [PATCH] Made subclasses to ItemRegister class and tests --- .../demo/data/Economics/ExpenseRegister.java | 38 +++++ .../demo/data/Economics/FileHandling.java | 7 +- .../demo/data/Economics/IncomeRegister.java | 36 +++++ .../demo/data/Economics/ItemRegister.java | 40 +----- .../expenseRegisterTest.itemRegister | 6 + .../resources/incomeRegisterTest.itemRegister | 6 + .../data/Economics/ExpenseRegisterTest.java | 64 +++++++++ .../demo/data/Economics/FileHandlingTest.java | 4 +- .../data/Economics/IncomeRegisterTest.java | 64 +++++++++ .../demo/data/Economics/ItemRegisterTest.java | 131 ------------------ 10 files changed, 222 insertions(+), 174 deletions(-) create mode 100644 src/main/java/no/ntnu/idatt1002/demo/data/Economics/ExpenseRegister.java create mode 100644 src/main/java/no/ntnu/idatt1002/demo/data/Economics/IncomeRegister.java create mode 100644 src/main/resources/expenseRegisterTest.itemRegister create mode 100644 src/main/resources/incomeRegisterTest.itemRegister create mode 100644 src/test/java/no/ntnu/idatt1002/demo/data/Economics/ExpenseRegisterTest.java create mode 100644 src/test/java/no/ntnu/idatt1002/demo/data/Economics/IncomeRegisterTest.java delete mode 100644 src/test/java/no/ntnu/idatt1002/demo/data/Economics/ItemRegisterTest.java diff --git a/src/main/java/no/ntnu/idatt1002/demo/data/Economics/ExpenseRegister.java b/src/main/java/no/ntnu/idatt1002/demo/data/Economics/ExpenseRegister.java new file mode 100644 index 00000000..1a279301 --- /dev/null +++ b/src/main/java/no/ntnu/idatt1002/demo/data/Economics/ExpenseRegister.java @@ -0,0 +1,38 @@ +package no.ntnu.idatt1002.demo.data.Economics; + +import java.util.List; + +/** + * ExpenseRegister is a class for + * storing Expenses. Subclass of + * ItemRegister. + */ +public class ExpenseRegister extends ItemRegister<Expense> { + + /** + * Class constructor that creates an empty List for storing Expense. + */ + public ExpenseRegister() { + super(); + } + + /** + * Class constructor that takes in a List of Expense as argument. + * + * @param expenses the List of Expense you want to register. + */ + public ExpenseRegister(List<Expense> expenses){ + super(expenses); + } + + /** + * Method for getting every Expense + * in a given ExpenseCategory. + * + * @param category the ExpenseCategory you want to get every Expense of. + * @return a List of every Expense with category. + */ + public List<Expense> getExpenseByCategory(ExpenseCategory category){ + return this.items.stream().filter(expense -> expense.getCategory().compareTo( category) == 0).toList(); + } +} diff --git a/src/main/java/no/ntnu/idatt1002/demo/data/Economics/FileHandling.java b/src/main/java/no/ntnu/idatt1002/demo/data/Economics/FileHandling.java index 279d2a2e..390906b5 100644 --- a/src/main/java/no/ntnu/idatt1002/demo/data/Economics/FileHandling.java +++ b/src/main/java/no/ntnu/idatt1002/demo/data/Economics/FileHandling.java @@ -4,8 +4,7 @@ import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.*; -import java.util.ArrayList; -import java.util.List; + /** * FileHandling is a class for writing and reading @@ -27,7 +26,7 @@ public class FileHandling { } public ItemRegister<Income> readIncomeRegisterFromFile(String fileTitle) throws IOException { - ItemRegister<Income> incomeRegister = new ItemRegister<>(); + IncomeRegister incomeRegister = new IncomeRegister(); String date = ""; String description = ""; double amount = 0; @@ -69,7 +68,7 @@ public class FileHandling { } public ItemRegister<Expense> readExpenseRegisterFromFile(String fileTitle) throws IOException { - ItemRegister<Expense> expenseRegister = new ItemRegister<>(); + ExpenseRegister expenseRegister = new ExpenseRegister(); String date = ""; String description = ""; double amount = 0; diff --git a/src/main/java/no/ntnu/idatt1002/demo/data/Economics/IncomeRegister.java b/src/main/java/no/ntnu/idatt1002/demo/data/Economics/IncomeRegister.java new file mode 100644 index 00000000..fa1dfbc8 --- /dev/null +++ b/src/main/java/no/ntnu/idatt1002/demo/data/Economics/IncomeRegister.java @@ -0,0 +1,36 @@ +package no.ntnu.idatt1002.demo.data.Economics; + +import java.util.List; + +/** + * IncomeRegister is a class for + * storing Income. Subclass of + * ItemRegister. + */ +public class IncomeRegister extends ItemRegister<Income>{ + /** + * Class constructor that creates an empty List for storing Income. + */ + public IncomeRegister(){ + super(); + } + + /** + * Class constructor that takes in a List of Income as argument. + * + * @param income the List of Income you want to register. + */ + public IncomeRegister(List<Income> income){ + super(income); + } + + /** + * Method for getting every Income + * in a given IncomeCategory. + * @param category the IncomeCategory you want to get every Income of. + * @return a List of every Income with category. + */ + public List<Income> getIncomeByCategory(IncomeCategory category){ + return items.stream().filter(income -> income.getCategory().compareTo(category) == 0).toList(); + } +} diff --git a/src/main/java/no/ntnu/idatt1002/demo/data/Economics/ItemRegister.java b/src/main/java/no/ntnu/idatt1002/demo/data/Economics/ItemRegister.java index f46dc6be..80b7ad88 100644 --- a/src/main/java/no/ntnu/idatt1002/demo/data/Economics/ItemRegister.java +++ b/src/main/java/no/ntnu/idatt1002/demo/data/Economics/ItemRegister.java @@ -2,7 +2,6 @@ package no.ntnu.idatt1002.demo.data.Economics; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; /** * ItemRegister is a generic class used @@ -10,11 +9,11 @@ import java.util.stream.Collectors; * * @param <T> Income or Expense */ -public class ItemRegister<T extends Item>{ +public abstract class ItemRegister<T extends Item>{ List<T> items; /** - * An "empty" class constructor. + * Class constructor that creates an empty List for storing T=(Income or Expense). */ public ItemRegister() { this.items = new ArrayList<>(); @@ -23,7 +22,7 @@ public class ItemRegister<T extends Item>{ /** * Class constructor that takes in a List of T=(Income or Expense) as argument. * - * @param items a List of T=(Income or Expense) you want to register. + * @param items the List of T=(Income or Expense) you want to register. */ public ItemRegister(List<T> items) { this.items = items; @@ -69,39 +68,6 @@ public class ItemRegister<T extends Item>{ return items.stream().map(Item::getAmount).mapToDouble(Double::doubleValue).sum(); } - /** - * Get a List of every T=(Income or Expense) - * in a given category. - * - * @param category the category you want to get every T=(Income or Expense) of. - * @param <S> IncomeCategory or ExpenseCategory. - * @throws IllegalArgumentException if S is not IncomeCategory or ExpenseCategory. - * @throws ClassCastException if you use an IncomeCategory for Expense register (and vice versa). - * @return a List of every T=(Income or Expense) with the given S=(IncomeCategory or ExpenseCategory). - */ - public <S> List<T> getItemsByCategory(S category) throws IllegalArgumentException, ClassCastException { - //Checks if category is an instance of IncomeCategory - if(category instanceof IncomeCategory) { - try { - ArrayList<Income> castedIncome = (ArrayList<Income>) items; - return (ArrayList<T>) castedIncome.stream().filter(income -> income.getCategory().compareTo((IncomeCategory) category) == 0).collect(Collectors.toList()); - } catch (ClassCastException ex) { - throw new ClassCastException("Can´t use IncomeCategory for Expense´s: " + ex.getMessage()); - } - } - //Checks category is s an instance of ExpenseCategory - else if(category instanceof ExpenseCategory){ - try { - ArrayList<Expense> castedExpenses = (ArrayList<Expense>) items; - return (ArrayList<T>) castedExpenses.stream().filter(expense -> expense.getCategory().compareTo((ExpenseCategory) category) == 0).collect(Collectors.toList()); - } catch (ClassCastException ex){ - throw new ClassCastException("Can´t use ExpenseCategory for Income: " + ex.getMessage()); - } - } else{ - throw new IllegalArgumentException("The category must be of type IncomeCategory or ExpenseCategory"); - } - } - @Override public String toString() { StringBuilder stringItems = new StringBuilder(); diff --git a/src/main/resources/expenseRegisterTest.itemRegister b/src/main/resources/expenseRegisterTest.itemRegister new file mode 100644 index 00000000..7f98526b --- /dev/null +++ b/src/main/resources/expenseRegisterTest.itemRegister @@ -0,0 +1,6 @@ + +date=03.03.23 +description=description +amount=59.900001525878906 +isReoccuring=Not reoccurring +category=CLOTHES diff --git a/src/main/resources/incomeRegisterTest.itemRegister b/src/main/resources/incomeRegisterTest.itemRegister new file mode 100644 index 00000000..6bfe0943 --- /dev/null +++ b/src/main/resources/incomeRegisterTest.itemRegister @@ -0,0 +1,6 @@ + +date=03.03.23 +description=description +amount=59.900001525878906 +isReoccuring=Not reoccurring +category=GIFT diff --git a/src/test/java/no/ntnu/idatt1002/demo/data/Economics/ExpenseRegisterTest.java b/src/test/java/no/ntnu/idatt1002/demo/data/Economics/ExpenseRegisterTest.java new file mode 100644 index 00000000..1d6d108b --- /dev/null +++ b/src/test/java/no/ntnu/idatt1002/demo/data/Economics/ExpenseRegisterTest.java @@ -0,0 +1,64 @@ +package no.ntnu.idatt1002.demo.data.Economics; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class ExpenseRegisterTest { + ExpenseRegister expenseRegister = new ExpenseRegister(); + @Test + @DisplayName("addItem method throws exception when it should") + void addItemThrows() { + Expense expense = new Expense("description", 59.9f, false, ExpenseCategory.CLOTHES, "03.03.23"); + expenseRegister.addItem(expense); + assertThrows(IllegalArgumentException.class, () -> expenseRegister.addItem(expense)); + } + + @Test + @DisplayName("addItem method does not throw exception when it should not") + void addItemDoesNotThrow() { + Expense expense1 = new Expense("description", 59.9f, false, ExpenseCategory.CLOTHES, "03.03.23"); + Expense expense2 = new Expense("anotherDescription", 6.5f, true, ExpenseCategory.BOOKS, "02.03.23"); + assertDoesNotThrow(() -> expenseRegister.addItem(expense1)); + assertDoesNotThrow(() -> expenseRegister.addItem(expense2)); + } + + @Nested + @DisplayName("Test getTotalSum and getExpenseByCategory methods") + class testGetExpenseByCategoryMethod { + Expense expense1; + Expense expense2; + Expense expense3; + + @BeforeEach + void addExpensesToRegister() { + expense1 = new Expense("description1", 59.9f, false, ExpenseCategory.CLOTHES, "03.03.23"); + expense2 = new Expense("description2", 62.4f, true, ExpenseCategory.FOOD, "01.02.21"); + expense3 = new Expense("description3", 9.81f, false, ExpenseCategory.CLOTHES, "05.07.23"); + + expenseRegister.addItem(expense1); + expenseRegister.addItem(expense2); + expenseRegister.addItem(expense3); + } + + @Test + @DisplayName("getTotalSum method gives correct amount") + void getTotalSumCorrectAmount() { + double totalIncome = 59.9f + 62.4f + 9.81f; + assertEquals(Math.round(expenseRegister.getTotalSum()), Math.round(totalIncome)); + } + + @Test + @DisplayName("getExpenseByCategory gives expected Expenses back") + void getExpensesByCategoryGivesExpectedExpensesBack() { + List<Expense> expenseSalary = expenseRegister.getExpenseByCategory(ExpenseCategory.CLOTHES); + assertTrue(expenseSalary.contains(expense1) && expenseSalary.contains(expense3)); + } + } +} diff --git a/src/test/java/no/ntnu/idatt1002/demo/data/Economics/FileHandlingTest.java b/src/test/java/no/ntnu/idatt1002/demo/data/Economics/FileHandlingTest.java index 70a52491..6c6289c7 100644 --- a/src/test/java/no/ntnu/idatt1002/demo/data/Economics/FileHandlingTest.java +++ b/src/test/java/no/ntnu/idatt1002/demo/data/Economics/FileHandlingTest.java @@ -8,8 +8,8 @@ import static org.junit.jupiter.api.Assertions.*; class FileHandlingTest { FileHandling fileHandling = new FileHandling(); - ItemRegister<Expense> expenseRegister = new ItemRegister<>(); - ItemRegister<Income> incomeRegister = new ItemRegister<>(); + ExpenseRegister expenseRegister = new ExpenseRegister(); + IncomeRegister incomeRegister = new IncomeRegister(); @Nested @DisplayName("FileHandling IncomeRegister to file") class fileHandlingIncomeRegisterToFile{ diff --git a/src/test/java/no/ntnu/idatt1002/demo/data/Economics/IncomeRegisterTest.java b/src/test/java/no/ntnu/idatt1002/demo/data/Economics/IncomeRegisterTest.java new file mode 100644 index 00000000..1c4c173d --- /dev/null +++ b/src/test/java/no/ntnu/idatt1002/demo/data/Economics/IncomeRegisterTest.java @@ -0,0 +1,64 @@ +package no.ntnu.idatt1002.demo.data.Economics; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +public class IncomeRegisterTest { + IncomeRegister incomeRegister = new IncomeRegister(); + @Test + @DisplayName("addItem method throws exception when it should") + void addItemThrows() { + Income income = new Income("description", 59.9f, false, IncomeCategory.SALARY, "03.03.23"); + incomeRegister.addItem(income); + assertThrows(IllegalArgumentException.class, () -> incomeRegister.addItem(income)); + } + + @Test + @DisplayName("addItem method does not throw exception when it should not") + void addItemDoesNotThrow() { + Income income1 = new Income("description", 59.9f, false, IncomeCategory.GIFT, "03.03.23"); + Income income2 = new Income("anotherDescription", 6.5f, true, IncomeCategory.SALARY, "02.03.23"); + assertDoesNotThrow(() -> incomeRegister.addItem(income1)); + assertDoesNotThrow(() -> incomeRegister.addItem(income2)); + } + + @Nested + @DisplayName("test getTotalSum and getIncomeByCategory methods") + class testGetTotalSumAndGetIncomeByCategoryMethods { + + Income income1; + Income income2; + Income income3; + + @BeforeEach + void addIncomeToRegister() { + income1 = new Income("description1", 59.9f, false, IncomeCategory.SALARY, "03.03.23"); + income2 = new Income("description2", 62.4f, true, IncomeCategory.GIFT, "01.02.21"); + income3 = new Income("description3", 9.81f, false, IncomeCategory.SALARY, "05.07.23"); + incomeRegister.addItem(income1); + incomeRegister.addItem(income2); + incomeRegister.addItem(income3); + } + + @Test + @DisplayName("getTotalSum method gives correct amount") + void getTotalSumCorrectAmount() { + double totalIncome = 59.9f + 62.4f + 9.81f; + assertEquals(Math.round(incomeRegister.getTotalSum()), Math.round(totalIncome)); + } + + @Test + @DisplayName("getItemsByCategory gives expected Income back") + void getIncomeByCategoryGivesCorrectIncome() { + List<Income> incomeSalary = incomeRegister.getIncomeByCategory(IncomeCategory.SALARY); + assertTrue(incomeSalary.contains(income1) && incomeSalary.contains(income3)); + } + } +} + diff --git a/src/test/java/no/ntnu/idatt1002/demo/data/Economics/ItemRegisterTest.java b/src/test/java/no/ntnu/idatt1002/demo/data/Economics/ItemRegisterTest.java deleted file mode 100644 index 34569ad6..00000000 --- a/src/test/java/no/ntnu/idatt1002/demo/data/Economics/ItemRegisterTest.java +++ /dev/null @@ -1,131 +0,0 @@ -package no.ntnu.idatt1002.demo.data.Economics; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -public class ItemRegisterTest { - ItemRegister<Income> incomeRegister = new ItemRegister<>(); - ItemRegister<Expense> expenseRegister = new ItemRegister<>(); - - @Nested - @DisplayName("Test ItemRegister when using Income") - class incomeRegisterTests { - @Test - @DisplayName("addItem method throws exception when it should") - void addItemThrows() { - Income income = new Income("description", 59.9f, false, IncomeCategory.SALARY, "03.03.23"); - incomeRegister.addItem(income); - assertThrows(IllegalArgumentException.class, () -> incomeRegister.addItem(income)); - } - - @Test - @DisplayName("addItem method does not throw exception when it should not") - void addItemDoesNotThrow() { - Income income1 = new Income("description", 59.9f, false, IncomeCategory.GIFT, "03.03.23"); - Income income2 = new Income("anotherDescription", 6.5f, true, IncomeCategory.SALARY, "02.03.23"); - assertDoesNotThrow(() -> incomeRegister.addItem(income1)); - assertDoesNotThrow(() -> incomeRegister.addItem(income2)); - } - - Income income1; - Income income2; - Income income3; - @BeforeEach - void addIncomeToRegister(){ - income1 = new Income("description1", 59.9f, false, IncomeCategory.SALARY, "03.03.23"); - income2 = new Income("description2", 62.4f, true, IncomeCategory.GIFT, "01.02.21"); - income3 = new Income("description3", 9.81f, false, IncomeCategory.SALARY, "05.07.23"); - incomeRegister.addItem(income1); - incomeRegister.addItem(income2); - incomeRegister.addItem(income3); - } - - @Test - @DisplayName("getTotalSum method gives correct amount") - void getTotalSumCorrectAmount() { - double totalIncome = 59.9f + 62.4f + 9.81f; - assertEquals(Math.round(incomeRegister.getTotalSum()), Math.round(totalIncome)); - } - - @Test - @DisplayName("getItemsByCategory gives expected Income back") - void getIncomeByCategoryGivesCorrectIncome() { - List<Income> incomeSalary = incomeRegister.getItemsByCategory(IncomeCategory.SALARY); - assertTrue(incomeSalary.contains(income1) && incomeSalary.contains(income3)); - } - - @Test - @DisplayName("getItemsByCategory throws exception when it takes in ExpenseCategory") - void getIncomeByExpenseCategoryThrowsException(){ - assertThrows(ClassCastException.class, () -> incomeRegister.getItemsByCategory(ExpenseCategory.CLOTHES)); - } - } - - @Nested - @DisplayName("Test ItemRegister when using Expense") - class expenseRegisterTests { - @Test - @DisplayName("addItem method throws exception when it should") - void addItemThrows() { - Expense expense = new Expense("description", 59.9f, false, ExpenseCategory.CLOTHES, "03.03.23"); - expenseRegister.addItem(expense); - assertThrows(IllegalArgumentException.class, () -> expenseRegister.addItem(expense)); - } - - @Test - @DisplayName("addItem method does not throw exception when it should not") - void addItemDoesNotThrow() { - Expense expense1 = new Expense("description", 59.9f, false, ExpenseCategory.CLOTHES, "03.03.23"); - Expense expense2 = new Expense("anotherDescription", 6.5f, true, ExpenseCategory.BOOKS, "02.03.23"); - assertDoesNotThrow(() -> expenseRegister.addItem(expense1)); - assertDoesNotThrow(() -> expenseRegister.addItem(expense2)); - } - - Expense expense1; - Expense expense2; - Expense expense3; - @BeforeEach - void addExpensesToRegister(){ - expense1 = new Expense("description1", 59.9f, false, ExpenseCategory.CLOTHES, "03.03.23"); - expense2 = new Expense("description2", 62.4f, true, ExpenseCategory.FOOD, "01.02.21"); - expense3 = new Expense("description3", 9.81f, false, ExpenseCategory.CLOTHES, "05.07.23"); - - expenseRegister.addItem(expense1); - expenseRegister.addItem(expense2); - expenseRegister.addItem(expense3); - } - - @Test - @DisplayName("getTotalSum method gives correct amount") - void getTotalSumCorrectAmount(){ - double totalIncome = 59.9f + 62.4f + 9.81f; - assertEquals(Math.round(expenseRegister.getTotalSum()), Math.round(totalIncome)); - } - - @Test - @DisplayName("getItemsByCategory gives expected Expenses back") - void getIncomeBasedOnCategoryGivesCorrectIncome() { - List<Expense> expenseSalary = expenseRegister.getItemsByCategory(ExpenseCategory.CLOTHES); - assertTrue(expenseSalary.contains(expense1) && expenseSalary.contains(expense3)); - } - - @Test - @DisplayName("getItemsByCategory throws exception when it takes in IncomeCategory") - void getIncomeByExpenseCategoryThrowsException(){ - assertThrows(ClassCastException.class, () -> expenseRegister.getItemsByCategory(IncomeCategory.SALARY)); - } - } - - @Test - @DisplayName("getItemsByCategory throws exception when IncomeCategory or ExpenseCategory is not used") - void getItemsByCategoryThrowsExceptionWhenIncomeCategoryOrExpenseCategoryIsNotUsed(){ - assertThrows(IllegalArgumentException.class, () -> incomeRegister.getItemsByCategory("Not IncomeCategory")); - } -} -- GitLab