From 8f2958b1768b8846096e5447773287b0b8941b9c Mon Sep 17 00:00:00 2001 From: Magnus Hissingby Date: Wed, 13 Aug 2025 10:51:21 +0200 Subject: [PATCH 1/6] Core - tests for account creation passed --- src/main/java/com/booleanuk/core/Account.java | 35 +++++++++++ src/main/java/com/booleanuk/core/Bank.java | 35 +++++++++++ .../com/booleanuk/core/CurrentAccount.java | 8 +++ .../java/com/booleanuk/core/Customer.java | 58 +++++++++++++++++++ .../java/com/booleanuk/core/DomainModel.md | 37 ++++++++++++ .../com/booleanuk/core/SavingsAccount.java | 8 +++ .../booleanuk/core/BankChallengeTests.java | 39 +++++++++++++ 7 files changed, 220 insertions(+) create mode 100644 src/main/java/com/booleanuk/core/Account.java create mode 100644 src/main/java/com/booleanuk/core/Bank.java create mode 100644 src/main/java/com/booleanuk/core/CurrentAccount.java create mode 100644 src/main/java/com/booleanuk/core/Customer.java create mode 100644 src/main/java/com/booleanuk/core/DomainModel.md create mode 100644 src/main/java/com/booleanuk/core/SavingsAccount.java create mode 100644 src/test/java/com/booleanuk/core/BankChallengeTests.java diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java new file mode 100644 index 000000000..e26e0b2ca --- /dev/null +++ b/src/main/java/com/booleanuk/core/Account.java @@ -0,0 +1,35 @@ +package com.booleanuk.core; + +import java.util.HashMap; +import java.util.List; + +public abstract class Account { + private final String branch; + private final HashMap> transactions; + private final int id; + + public Account(String branch, int id){ + this.branch = branch; + this.id = id; + this.transactions = new HashMap<>(); + } + + public int getId(){ + return this.id; + } + + public HashMap> getTransactions(){ + return this.transactions; + } + + /* + public boolean deposit(int amount){ + + } + + public boolean withdraw(int amount){ + + } + */ + +} diff --git a/src/main/java/com/booleanuk/core/Bank.java b/src/main/java/com/booleanuk/core/Bank.java new file mode 100644 index 000000000..b4cb7b9c2 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Bank.java @@ -0,0 +1,35 @@ +package com.booleanuk.core; + +import java.util.ArrayList; +import java.util.List; + +public class Bank { + private final String name; + private final List allAccounts; + private int idIncrementer; + + public Bank(String name){ + this.name = name; + this.allAccounts = new ArrayList<>(); + this.idIncrementer = 1; + } + + public Account createCurrentAccount(Customer customer){ + Account newAccount = new CurrentAccount(customer.getBranch(), idIncrementer); + this.idIncrementer++; + return newAccount; + } + + public Account createSavingsAccount(Customer customer){ + Account newAccount = new SavingsAccount(customer.getBranch(), idIncrementer); + this.idIncrementer++; + return newAccount; + } + + /* + public boolean generateStatement(Account account){ + + } + + */ +} diff --git a/src/main/java/com/booleanuk/core/CurrentAccount.java b/src/main/java/com/booleanuk/core/CurrentAccount.java new file mode 100644 index 000000000..c4c1b665b --- /dev/null +++ b/src/main/java/com/booleanuk/core/CurrentAccount.java @@ -0,0 +1,8 @@ +package com.booleanuk.core; + +public class CurrentAccount extends Account { + + public CurrentAccount(String branch, int id){ + super(branch, id); + } +} diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java new file mode 100644 index 000000000..f389e22e8 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -0,0 +1,58 @@ +package com.booleanuk.core; + +public class Customer { + private final Bank bank; + private final String name; + private final String branch; + private SavingsAccount savingsAccount = null; + private CurrentAccount currentAccount = null; + + public Customer(Bank bank, String name, String branch){ + this.bank = bank; + this.name = name; + this.branch = branch; + } + + public String getName(){ + return this.name; + } + + public String getBranch(){ + return this.branch; + } + + public SavingsAccount getSavingsAccount(){ + return this.savingsAccount; + } + + public CurrentAccount getCurrentAccount(){ + return this.currentAccount; + } + + public boolean createCurrentAccount(){ + if (currentAccount != null){ return false; } + + Account newAccount = this.bank.createCurrentAccount(this); + this.currentAccount = (CurrentAccount) newAccount; + return currentAccount != null; + } + + public boolean createSavingsAccount(){ + if (savingsAccount != null) { return false; } + + Account newAccount = this.bank.createSavingsAccount(this); + this.savingsAccount = (SavingsAccount) newAccount; + return savingsAccount != null; + } + + /* + public boolean deposit(Account account, int amount){ + + } + + public boolean withdraw(Account account, int amount){ + + } + + */ +} diff --git a/src/main/java/com/booleanuk/core/DomainModel.md b/src/main/java/com/booleanuk/core/DomainModel.md new file mode 100644 index 000000000..c47290121 --- /dev/null +++ b/src/main/java/com/booleanuk/core/DomainModel.md @@ -0,0 +1,37 @@ + +| Class | Method | Scenario | Output | +|----------|------------------------------------------|---------------------------------------------|------------------| +| Customer | createCurrentAccount() | If current account already exists | false | +| | | If no current account exists | true | +| | | | | +| Customer | createSavingsAccount() | If savings account already exists | false | +| | | If no savings account exists | true | +| | | | | +| Customer | generateBankStatements(Account account)) | If account does not exist | false | +| | | If account exists | print statements | +| | | | | +| Customer | deposit(Account account, int amount) | If amount < 0 | false | +| | | If amount is > 0 | true | +| | | | | +| Customer | withdraw(Account account, int amount) | If amount is larger than balance | false | +| | | If amount is less or equal to balance | true | +| | | | | +| Bank | createCurrentAccount(Customer customer) | If customer has a current account | false | +| | | If customer does not have a current account | true | +| | | | | +| Bank | createSavingsAccount(Customer customer) | If customer has a savings account | false | +| | | If customer does not have a savings account | true | +| | | | | +| Bank | generateStatement(Account account) | If account does not exist | false | +| | | If account exists | print statements | +| | | | | +| Account | deposit(int amount) | If amount is < 0 | false | +| | | If amount is > 0 | true | +| | | | | +| Account | withdraw(int amount) | If amount is larger than balance | false | +| | | If amount is less or equal to balance | true | +| | | | | +| Account | generateStatement() | | print statements | +| | | | | +| | | | | +| | | | | diff --git a/src/main/java/com/booleanuk/core/SavingsAccount.java b/src/main/java/com/booleanuk/core/SavingsAccount.java new file mode 100644 index 000000000..1e0153bda --- /dev/null +++ b/src/main/java/com/booleanuk/core/SavingsAccount.java @@ -0,0 +1,8 @@ +package com.booleanuk.core; + +public class SavingsAccount extends Account{ + + public SavingsAccount(String branch, int id){ + super(branch, id); + } +} diff --git a/src/test/java/com/booleanuk/core/BankChallengeTests.java b/src/test/java/com/booleanuk/core/BankChallengeTests.java new file mode 100644 index 000000000..ed25c1b11 --- /dev/null +++ b/src/test/java/com/booleanuk/core/BankChallengeTests.java @@ -0,0 +1,39 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class BankChallengeTests { + + @Test + public void testAccountCreation(){ + Bank bank = new Bank("Nordea"); + + Customer jim = new Customer(bank, "Jim", "NewYork"); + Customer bob = new Customer(bank, "Bob", "Oslo"); + + jim.createCurrentAccount(); + bob.createCurrentAccount(); + + // Ids should be different + Assertions.assertTrue(jim.getCurrentAccount().getId() != bob.getCurrentAccount().getId()); + // Customers should only be able to create 1 current account and 1 savings account + Assertions.assertFalse(jim.createCurrentAccount()); + Assertions.assertTrue(bob.createSavingsAccount()); + Assertions.assertEquals(1, jim.getCurrentAccount().getId()); + } + + @Test + public void testDeposit(){ + } + + @Test + public void testWithdraw(){ + + } + + @Test + public void testGenerateStatement(){ + + } +} From 025f9b76546828d3b42d425dc65aa7a93d8c3fcd Mon Sep 17 00:00:00 2001 From: Magnus Hissingby Date: Wed, 13 Aug 2025 11:18:42 +0200 Subject: [PATCH 2/6] Core - tests for deposits and withdrawels passed --- src/main/java/com/booleanuk/core/Account.java | 40 ++++++++++++++++++- .../java/com/booleanuk/core/Customer.java | 7 +--- .../booleanuk/core/BankChallengeTests.java | 26 ++++++++++++ 3 files changed, 66 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index e26e0b2ca..8b7346ce5 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -1,10 +1,13 @@ package com.booleanuk.core; +import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; public abstract class Account { private final String branch; + private double balance; private final HashMap> transactions; private final int id; @@ -12,24 +15,57 @@ public Account(String branch, int id){ this.branch = branch; this.id = id; this.transactions = new HashMap<>(); + this.balance = 0.0; } public int getId(){ return this.id; } + public double getBalance(){ + return this.balance; + } + public HashMap> getTransactions(){ return this.transactions; } - /* public boolean deposit(int amount){ + if (amount < 0) { return false; } + this.balance += amount; + // create transaction + String date = currentDate(); + if (!transactions.containsKey(date)){ + transactions.put(date, new ArrayList<>(){{add(amount);}}); + } else { + transactions.get(date).add(amount); + } + return true; } public boolean withdraw(int amount){ + if (amount > this.balance) { return false; } + this.balance -= amount; + + // create transaction + String date = currentDate(); + if (!transactions.containsKey(date)){ + transactions.put(date, new ArrayList<>(){{add(-amount);}}); + } else { + transactions.get(date).add(-amount); + } + return true; + } + + public String currentDate(){ + LocalDateTime time = LocalDateTime.now(); + + String day = String.valueOf(time.getDayOfMonth()); + String month = String.valueOf(time.getMonthValue()); + String year = String.valueOf(time.getYear()); + return day + "/" + month + "/" + year; } - */ } diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java index f389e22e8..e765828f4 100644 --- a/src/main/java/com/booleanuk/core/Customer.java +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -45,14 +45,11 @@ public boolean createSavingsAccount(){ return savingsAccount != null; } - /* public boolean deposit(Account account, int amount){ - + return account.deposit(amount); } public boolean withdraw(Account account, int amount){ - + return account.withdraw(amount); } - - */ } diff --git a/src/test/java/com/booleanuk/core/BankChallengeTests.java b/src/test/java/com/booleanuk/core/BankChallengeTests.java index ed25c1b11..f635d014f 100644 --- a/src/test/java/com/booleanuk/core/BankChallengeTests.java +++ b/src/test/java/com/booleanuk/core/BankChallengeTests.java @@ -3,6 +3,8 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.time.LocalDateTime; + public class BankChallengeTests { @Test @@ -25,6 +27,30 @@ public void testAccountCreation(){ @Test public void testDeposit(){ + Bank bank = new Bank("DNB"); + + Customer jim = new Customer(bank, "Jim", "Ohio"); + Customer bob = new Customer(bank, "Bob", "Nevada"); + + jim.createCurrentAccount(); + bob.createSavingsAccount(); + + LocalDateTime time = LocalDateTime.now(); + String day = String.valueOf(time.getDayOfMonth()); + String month = String.valueOf(time.getMonthValue()); + String year = String.valueOf(time.getYear()); + String date = day + "/" + month + "/" + year; + + jim.deposit(jim.getCurrentAccount(), 500); + jim.deposit(jim.getCurrentAccount(), 200); + + Assertions.assertEquals(2, jim.getCurrentAccount().getTransactions().get(date).size()); + + Assertions.assertEquals(700, jim.getCurrentAccount().getBalance()); + Assertions.assertEquals(0, bob.getSavingsAccount().getBalance()); + Assertions.assertFalse(jim.withdraw(jim.getCurrentAccount(), 900)); + Assertions.assertTrue(jim.withdraw(jim.getCurrentAccount(), 600)); + Assertions.assertTrue(jim.deposit(jim.getCurrentAccount(), 100)); } @Test From 13399da7d85287b884f404664c9c5e55fa1296b8 Mon Sep 17 00:00:00 2001 From: Magnus Hissingby Date: Wed, 13 Aug 2025 12:49:29 +0200 Subject: [PATCH 3/6] Core - tests for generating statement passed --- src/main/java/com/booleanuk/core/Account.java | 27 ++++++- src/main/java/com/booleanuk/core/Bank.java | 18 ++--- .../java/com/booleanuk/core/Customer.java | 4 ++ .../java/com/booleanuk/core/DomainModel.md | 72 +++++++++---------- .../booleanuk/core/BankChallengeTests.java | 32 +++++++-- 5 files changed, 101 insertions(+), 52 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index 8b7346ce5..f1444b535 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -1,9 +1,9 @@ package com.booleanuk.core; - import java.time.LocalDateTime; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; public abstract class Account { private final String branch; @@ -26,6 +26,10 @@ public double getBalance(){ return this.balance; } + public String getBranch(){ + return this.branch; + } + public HashMap> getTransactions(){ return this.transactions; } @@ -68,4 +72,25 @@ public String currentDate(){ return day + "/" + month + "/" + year; } + public String generateStatement(){ + StringBuilder res = new StringBuilder(); + String start = "|" + "Date " + " |" + "Deposit" + " |" + "Withdraw" +" |" + "Balance" + " |\n"; + res.append(start); + double total = 0; + for (Map.Entry> entry : transactions.entrySet()) { + String date = entry.getKey(); + List value = entry.getValue(); + for (int trans : value) { + total += trans; + String curr; + if (trans > 0) { + curr = "|" + date + " |" + trans + " | |" + total + " |\n"; + } else { + curr = "|" + date + " |" + " |" + trans + " |" + total + " |\n"; + } + res.append(curr); + } + } + return res.toString(); + } } diff --git a/src/main/java/com/booleanuk/core/Bank.java b/src/main/java/com/booleanuk/core/Bank.java index b4cb7b9c2..c399720c5 100644 --- a/src/main/java/com/booleanuk/core/Bank.java +++ b/src/main/java/com/booleanuk/core/Bank.java @@ -1,5 +1,4 @@ package com.booleanuk.core; - import java.util.ArrayList; import java.util.List; @@ -14,22 +13,25 @@ public Bank(String name){ this.idIncrementer = 1; } + public String getName(){ + return this.name; + } + + public List getAllAccounts(){ + return this.allAccounts; + } + public Account createCurrentAccount(Customer customer){ Account newAccount = new CurrentAccount(customer.getBranch(), idIncrementer); + allAccounts.add(newAccount); this.idIncrementer++; return newAccount; } public Account createSavingsAccount(Customer customer){ Account newAccount = new SavingsAccount(customer.getBranch(), idIncrementer); + allAccounts.add(newAccount); this.idIncrementer++; return newAccount; } - - /* - public boolean generateStatement(Account account){ - - } - - */ } diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java index e765828f4..1a16646a6 100644 --- a/src/main/java/com/booleanuk/core/Customer.java +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -52,4 +52,8 @@ public boolean deposit(Account account, int amount){ public boolean withdraw(Account account, int amount){ return account.withdraw(amount); } + + public String generateStatement(Account account){ + return account.generateStatement(); + } } diff --git a/src/main/java/com/booleanuk/core/DomainModel.md b/src/main/java/com/booleanuk/core/DomainModel.md index c47290121..d6a435e0a 100644 --- a/src/main/java/com/booleanuk/core/DomainModel.md +++ b/src/main/java/com/booleanuk/core/DomainModel.md @@ -1,37 +1,37 @@ -| Class | Method | Scenario | Output | -|----------|------------------------------------------|---------------------------------------------|------------------| -| Customer | createCurrentAccount() | If current account already exists | false | -| | | If no current account exists | true | -| | | | | -| Customer | createSavingsAccount() | If savings account already exists | false | -| | | If no savings account exists | true | -| | | | | -| Customer | generateBankStatements(Account account)) | If account does not exist | false | -| | | If account exists | print statements | -| | | | | -| Customer | deposit(Account account, int amount) | If amount < 0 | false | -| | | If amount is > 0 | true | -| | | | | -| Customer | withdraw(Account account, int amount) | If amount is larger than balance | false | -| | | If amount is less or equal to balance | true | -| | | | | -| Bank | createCurrentAccount(Customer customer) | If customer has a current account | false | -| | | If customer does not have a current account | true | -| | | | | -| Bank | createSavingsAccount(Customer customer) | If customer has a savings account | false | -| | | If customer does not have a savings account | true | -| | | | | -| Bank | generateStatement(Account account) | If account does not exist | false | -| | | If account exists | print statements | -| | | | | -| Account | deposit(int amount) | If amount is < 0 | false | -| | | If amount is > 0 | true | -| | | | | -| Account | withdraw(int amount) | If amount is larger than balance | false | -| | | If amount is less or equal to balance | true | -| | | | | -| Account | generateStatement() | | print statements | -| | | | | -| | | | | -| | | | | +| Class | Method | Scenario | Output | +|----------|------------------------------------------|---------------------------------------------|--------| +| Customer | createCurrentAccount() | If current account already exists | false | +| | | If no current account exists | true | +| | | | | +| Customer | createSavingsAccount() | If savings account already exists | false | +| | | If no savings account exists | true | +| | | | | +| Customer | generateBankStatements(Account account)) | If account does not exist | null | +| | | If account exists | String | +| | | | | +| Customer | deposit(Account account, int amount) | If amount < 0 | false | +| | | If amount is > 0 | true | +| | | | | +| Customer | withdraw(Account account, int amount) | If amount is larger than balance | false | +| | | If amount is less or equal to balance | true | +| | | | | +| Bank | createCurrentAccount(Customer customer) | If customer has a current account | false | +| | | If customer does not have a current account | true | +| | | | | +| Bank | createSavingsAccount(Customer customer) | If customer has a savings account | false | +| | | If customer does not have a savings account | true | +| | | | | +| Bank | generateStatement(Account account) | If account does not exist | null | +| | | If account exists | String | +| | | | | +| Account | deposit(int amount) | If amount is < 0 | false | +| | | If amount is > 0 | true | +| | | | | +| Account | withdraw(int amount) | If amount is larger than balance | false | +| | | If amount is less or equal to balance | true | +| | | | | +| Account | generateStatement() | If list of statements is empty | null | +| | | If list of statements is not empty | String | +| | | | | +| | | | | diff --git a/src/test/java/com/booleanuk/core/BankChallengeTests.java b/src/test/java/com/booleanuk/core/BankChallengeTests.java index f635d014f..7a28fd3a8 100644 --- a/src/test/java/com/booleanuk/core/BankChallengeTests.java +++ b/src/test/java/com/booleanuk/core/BankChallengeTests.java @@ -1,8 +1,6 @@ package com.booleanuk.core; - import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - import java.time.LocalDateTime; public class BankChallengeTests { @@ -23,10 +21,16 @@ public void testAccountCreation(){ Assertions.assertFalse(jim.createCurrentAccount()); Assertions.assertTrue(bob.createSavingsAccount()); Assertions.assertEquals(1, jim.getCurrentAccount().getId()); + Assertions.assertEquals("NewYork", jim.getCurrentAccount().getBranch()); + Assertions.assertEquals("Nordea", bank.getName()); + Assertions.assertEquals(3, bank.getAllAccounts().size()); + Assertions.assertEquals("Jim", jim.getName()); + Assertions.assertInstanceOf(CurrentAccount.class, jim.getCurrentAccount()); + Assertions.assertInstanceOf(SavingsAccount.class, bob.getSavingsAccount()); } @Test - public void testDeposit(){ + public void testDepositAndWithdraw(){ Bank bank = new Bank("DNB"); Customer jim = new Customer(bank, "Jim", "Ohio"); @@ -54,12 +58,26 @@ public void testDeposit(){ } @Test - public void testWithdraw(){ + public void testGenerateStatement(){ + Bank bank = new Bank("Storebrand"); - } + Customer jim = new Customer(bank, "Jim", "Oslo"); + Customer bob = new Customer(bank, "Bob", "Oslo"); - @Test - public void testGenerateStatement(){ + jim.createCurrentAccount(); + bob.createSavingsAccount(); + + jim.deposit(jim.getCurrentAccount(), 500); + jim.withdraw(jim.getCurrentAccount(), 150); + jim.deposit(jim.getCurrentAccount(), 500); + jim.deposit(jim.getCurrentAccount(), 500); + jim.deposit(jim.getCurrentAccount(), 500); + jim.withdraw(jim.getCurrentAccount(), 200); + jim.withdraw(jim.getCurrentAccount(), 100); + jim.withdraw(jim.getCurrentAccount(), 105); + + System.out.println(jim.generateStatement(jim.getCurrentAccount())); + Assertions.assertTrue(jim.generateStatement(jim.getCurrentAccount()).contains(jim.getCurrentAccount().currentDate())); } } From 792dcb617086ce0b905886fe7afb37ce23bf29e7 Mon Sep 17 00:00:00 2001 From: Magnus Hissingby Date: Wed, 13 Aug 2025 12:54:14 +0200 Subject: [PATCH 4/6] Core completed --- src/main/java/com/booleanuk/core/Account.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index f1444b535..d54837eb7 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -84,9 +84,9 @@ public String generateStatement(){ total += trans; String curr; if (trans > 0) { - curr = "|" + date + " |" + trans + " | |" + total + " |\n"; + curr = "|" + date + " |" + trans + " | |" + total + " |\n"; } else { - curr = "|" + date + " |" + " |" + trans + " |" + total + " |\n"; + curr = "|" + date + " |" + " |" + trans + " |" + total + " |\n"; } res.append(curr); } From af406638253817e48754f80e093cbeacfc33ba9b Mon Sep 17 00:00:00 2001 From: Magnus Hissingby Date: Wed, 13 Aug 2025 13:07:45 +0200 Subject: [PATCH 5/6] Extension 1 complete - removed balance-variable from account and manually calculated it based on transaction-history --- src/main/java/com/booleanuk/core/Account.java | 15 +++++++++------ .../com/booleanuk/core/BankChallengeTests.java | 15 +++++++++++++++ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index d54837eb7..c984ccbdc 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -7,7 +7,6 @@ public abstract class Account { private final String branch; - private double balance; private final HashMap> transactions; private final int id; @@ -15,7 +14,6 @@ public Account(String branch, int id){ this.branch = branch; this.id = id; this.transactions = new HashMap<>(); - this.balance = 0.0; } public int getId(){ @@ -23,7 +21,14 @@ public int getId(){ } public double getBalance(){ - return this.balance; + double balance = 0.0; + for (Map.Entry> entry : transactions.entrySet()) { + List value = entry.getValue(); + for (int trans : value) { + balance += trans; + } + } + return balance; } public String getBranch(){ @@ -36,7 +41,6 @@ public HashMap> getTransactions(){ public boolean deposit(int amount){ if (amount < 0) { return false; } - this.balance += amount; // create transaction String date = currentDate(); @@ -49,8 +53,7 @@ public boolean deposit(int amount){ } public boolean withdraw(int amount){ - if (amount > this.balance) { return false; } - this.balance -= amount; + if (amount > getBalance()) { return false; } // create transaction String date = currentDate(); diff --git a/src/test/java/com/booleanuk/core/BankChallengeTests.java b/src/test/java/com/booleanuk/core/BankChallengeTests.java index 7a28fd3a8..771a770bf 100644 --- a/src/test/java/com/booleanuk/core/BankChallengeTests.java +++ b/src/test/java/com/booleanuk/core/BankChallengeTests.java @@ -80,4 +80,19 @@ public void testGenerateStatement(){ Assertions.assertTrue(jim.generateStatement(jim.getCurrentAccount()).contains(jim.getCurrentAccount().currentDate())); } + + @Test + public void testExtensionOne(){ + + Bank bank = new Bank("Storebrand"); + + Customer jim = new Customer(bank, "Jim", "Oslo"); + + jim.createCurrentAccount(); + + jim.deposit(jim.getCurrentAccount(), 500); + jim.withdraw(jim.getCurrentAccount(), 150); + + Assertions.assertEquals(350.0, jim.getCurrentAccount().getBalance()); + } } From 972190d45a122ec793fc0ae8c412a48ea8ff3000 Mon Sep 17 00:00:00 2001 From: Magnus Hissingby Date: Wed, 13 Aug 2025 14:08:13 +0200 Subject: [PATCH 6/6] All extensions complete except for the text-message one. Included updated class-diagram and domain-model in the core-folder --- src/main/java/com/booleanuk/core/Account.java | 12 +-- src/main/java/com/booleanuk/core/Bank.java | 8 +- .../com/booleanuk/core/CurrentAccount.java | 4 +- .../java/com/booleanuk/core/DomainModel.md | 74 +++++++++--------- src/main/java/com/booleanuk/core/Manager.java | 15 ++++ .../com/booleanuk/core/SavingsAccount.java | 4 +- .../com/booleanuk/core/bank-class-diagram.png | Bin 0 -> 72499 bytes .../booleanuk/core/BankChallengeTests.java | 57 +++++++++++--- 8 files changed, 116 insertions(+), 58 deletions(-) create mode 100644 src/main/java/com/booleanuk/core/Manager.java create mode 100644 src/main/java/com/booleanuk/core/bank-class-diagram.png diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index c984ccbdc..417515e4e 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -7,11 +7,13 @@ public abstract class Account { private final String branch; + private final Manager manager; private final HashMap> transactions; private final int id; - public Account(String branch, int id){ + public Account(String branch, int id, Manager manager){ this.branch = branch; + this.manager = manager; this.id = id; this.transactions = new HashMap<>(); } @@ -41,7 +43,6 @@ public HashMap> getTransactions(){ public boolean deposit(int amount){ if (amount < 0) { return false; } - // create transaction String date = currentDate(); if (!transactions.containsKey(date)){ @@ -53,8 +54,9 @@ public boolean deposit(int amount){ } public boolean withdraw(int amount){ - if (amount > getBalance()) { return false; } - + if (!manager.approveDraft(amount, getBalance()) || getBalance()-amount < 0 && this instanceof SavingsAccount) { + return false; + } // create transaction String date = currentDate(); if (!transactions.containsKey(date)){ @@ -67,11 +69,9 @@ public boolean withdraw(int amount){ public String currentDate(){ LocalDateTime time = LocalDateTime.now(); - String day = String.valueOf(time.getDayOfMonth()); String month = String.valueOf(time.getMonthValue()); String year = String.valueOf(time.getYear()); - return day + "/" + month + "/" + year; } diff --git a/src/main/java/com/booleanuk/core/Bank.java b/src/main/java/com/booleanuk/core/Bank.java index c399720c5..303f3ea38 100644 --- a/src/main/java/com/booleanuk/core/Bank.java +++ b/src/main/java/com/booleanuk/core/Bank.java @@ -6,11 +6,13 @@ public class Bank { private final String name; private final List allAccounts; private int idIncrementer; + Manager manager; - public Bank(String name){ + public Bank(String name, Manager manager){ this.name = name; this.allAccounts = new ArrayList<>(); this.idIncrementer = 1; + this.manager = manager; } public String getName(){ @@ -22,14 +24,14 @@ public List getAllAccounts(){ } public Account createCurrentAccount(Customer customer){ - Account newAccount = new CurrentAccount(customer.getBranch(), idIncrementer); + Account newAccount = new CurrentAccount(customer.getBranch(), idIncrementer, manager); allAccounts.add(newAccount); this.idIncrementer++; return newAccount; } public Account createSavingsAccount(Customer customer){ - Account newAccount = new SavingsAccount(customer.getBranch(), idIncrementer); + Account newAccount = new SavingsAccount(customer.getBranch(), idIncrementer, manager); allAccounts.add(newAccount); this.idIncrementer++; return newAccount; diff --git a/src/main/java/com/booleanuk/core/CurrentAccount.java b/src/main/java/com/booleanuk/core/CurrentAccount.java index c4c1b665b..1e4a1a979 100644 --- a/src/main/java/com/booleanuk/core/CurrentAccount.java +++ b/src/main/java/com/booleanuk/core/CurrentAccount.java @@ -2,7 +2,7 @@ public class CurrentAccount extends Account { - public CurrentAccount(String branch, int id){ - super(branch, id); + public CurrentAccount(String branch, int id, Manager manager){ + super(branch, id, manager); } } diff --git a/src/main/java/com/booleanuk/core/DomainModel.md b/src/main/java/com/booleanuk/core/DomainModel.md index d6a435e0a..fb8aa41f9 100644 --- a/src/main/java/com/booleanuk/core/DomainModel.md +++ b/src/main/java/com/booleanuk/core/DomainModel.md @@ -1,37 +1,39 @@ -| Class | Method | Scenario | Output | -|----------|------------------------------------------|---------------------------------------------|--------| -| Customer | createCurrentAccount() | If current account already exists | false | -| | | If no current account exists | true | -| | | | | -| Customer | createSavingsAccount() | If savings account already exists | false | -| | | If no savings account exists | true | -| | | | | -| Customer | generateBankStatements(Account account)) | If account does not exist | null | -| | | If account exists | String | -| | | | | -| Customer | deposit(Account account, int amount) | If amount < 0 | false | -| | | If amount is > 0 | true | -| | | | | -| Customer | withdraw(Account account, int amount) | If amount is larger than balance | false | -| | | If amount is less or equal to balance | true | -| | | | | -| Bank | createCurrentAccount(Customer customer) | If customer has a current account | false | -| | | If customer does not have a current account | true | -| | | | | -| Bank | createSavingsAccount(Customer customer) | If customer has a savings account | false | -| | | If customer does not have a savings account | true | -| | | | | -| Bank | generateStatement(Account account) | If account does not exist | null | -| | | If account exists | String | -| | | | | -| Account | deposit(int amount) | If amount is < 0 | false | -| | | If amount is > 0 | true | -| | | | | -| Account | withdraw(int amount) | If amount is larger than balance | false | -| | | If amount is less or equal to balance | true | -| | | | | -| Account | generateStatement() | If list of statements is empty | null | -| | | If list of statements is not empty | String | -| | | | | -| | | | | +| Class | Method | Scenario | Output | +|----------|---------------------------------------------|---------------------------------------------|--------| +| Customer | createCurrentAccount() | If current account already exists | false | +| | | If no current account exists | true | +| | | | | +| Customer | createSavingsAccount() | If savings account already exists | false | +| | | If no savings account exists | true | +| | | | | +| Customer | generateBankStatements(Account account)) | If account does not exist | null | +| | | If account exists | String | +| | | | | +| Customer | deposit(Account account, int amount) | If amount < 0 | false | +| | | If amount is > 0 | true | +| | | | | +| Customer | withdraw(Account account, int amount) | If amount is larger than balance | false | +| | | If amount is less or equal to balance | true | +| | | | | +| Bank | createCurrentAccount(Customer customer) | If customer has a current account | false | +| | | If customer does not have a current account | true | +| | | | | +| Bank | createSavingsAccount(Customer customer) | If customer has a savings account | false | +| | | If customer does not have a savings account | true | +| | | | | +| Bank | generateStatement(Account account) | If account does not exist | null | +| | | If account exists | String | +| | | | | +| Account | deposit(int amount) | If amount is < 0 | false | +| | | If amount is > 0 | true | +| | | | | +| Account | withdraw(int amount) | If amount is larger than balance | false | +| | | If amount is less or equal to balance | true | +| | | | | +| Account | generateStatement() | If list of statements is empty | null | +| | | If list of statements is not empty | String | +| | | | | +| Manager | approveDraft(double amount, double currBal) | If amount is too large | false | +| | | If amount is within the negative limit | true | +| | | | | diff --git a/src/main/java/com/booleanuk/core/Manager.java b/src/main/java/com/booleanuk/core/Manager.java new file mode 100644 index 000000000..789adb2de --- /dev/null +++ b/src/main/java/com/booleanuk/core/Manager.java @@ -0,0 +1,15 @@ +package com.booleanuk.core; + +public class Manager { + String name; + double draftLimit; + + public Manager(String name, double draftLimit){ + this.name = name; + this.draftLimit = draftLimit; + } + + public boolean approveDraft(double amount, double currentBalance){ + return (currentBalance-amount) > draftLimit; + } +} diff --git a/src/main/java/com/booleanuk/core/SavingsAccount.java b/src/main/java/com/booleanuk/core/SavingsAccount.java index 1e0153bda..f68fe752a 100644 --- a/src/main/java/com/booleanuk/core/SavingsAccount.java +++ b/src/main/java/com/booleanuk/core/SavingsAccount.java @@ -2,7 +2,7 @@ public class SavingsAccount extends Account{ - public SavingsAccount(String branch, int id){ - super(branch, id); + public SavingsAccount(String branch, int id, Manager manager){ + super(branch, id, manager); } } diff --git a/src/main/java/com/booleanuk/core/bank-class-diagram.png b/src/main/java/com/booleanuk/core/bank-class-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..6cee882be1c354962e823a741a8d4621168bac11 GIT binary patch literal 72499 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

`}qC-yeM$gW}n1f5P^)=jpJ_v)jD=BPD!;* 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 literal 0 HcmV?d00001 diff --git a/src/test/java/com/booleanuk/core/BankChallengeTests.java b/src/test/java/com/booleanuk/core/BankChallengeTests.java index 771a770bf..b72904ebe 100644 --- a/src/test/java/com/booleanuk/core/BankChallengeTests.java +++ b/src/test/java/com/booleanuk/core/BankChallengeTests.java @@ -7,8 +7,9 @@ public class BankChallengeTests { @Test public void testAccountCreation(){ - Bank bank = new Bank("Nordea"); + Manager manager = new Manager("Bard", -1000); + Bank bank = new Bank("Nordea", manager); Customer jim = new Customer(bank, "Jim", "NewYork"); Customer bob = new Customer(bank, "Bob", "Oslo"); @@ -31,8 +32,9 @@ public void testAccountCreation(){ @Test public void testDepositAndWithdraw(){ - Bank bank = new Bank("DNB"); + Manager manager = new Manager("Bard", -10000); + Bank bank = new Bank("DNB", manager); Customer jim = new Customer(bank, "Jim", "Ohio"); Customer bob = new Customer(bank, "Bob", "Nevada"); @@ -49,18 +51,17 @@ public void testDepositAndWithdraw(){ jim.deposit(jim.getCurrentAccount(), 200); Assertions.assertEquals(2, jim.getCurrentAccount().getTransactions().get(date).size()); - Assertions.assertEquals(700, jim.getCurrentAccount().getBalance()); Assertions.assertEquals(0, bob.getSavingsAccount().getBalance()); - Assertions.assertFalse(jim.withdraw(jim.getCurrentAccount(), 900)); Assertions.assertTrue(jim.withdraw(jim.getCurrentAccount(), 600)); Assertions.assertTrue(jim.deposit(jim.getCurrentAccount(), 100)); } @Test public void testGenerateStatement(){ - Bank bank = new Bank("Storebrand"); + Manager manager = new Manager("Bard", -1000); + Bank bank = new Bank("Storebrand", manager); Customer jim = new Customer(bank, "Jim", "Oslo"); Customer bob = new Customer(bank, "Bob", "Oslo"); @@ -77,22 +78,60 @@ public void testGenerateStatement(){ jim.withdraw(jim.getCurrentAccount(), 105); System.out.println(jim.generateStatement(jim.getCurrentAccount())); - Assertions.assertTrue(jim.generateStatement(jim.getCurrentAccount()).contains(jim.getCurrentAccount().currentDate())); } @Test public void testExtensionOne(){ - Bank bank = new Bank("Storebrand"); - + Manager manager = new Manager("Bard", -1000); + Bank bank = new Bank("Storebrand", manager); Customer jim = new Customer(bank, "Jim", "Oslo"); jim.createCurrentAccount(); - jim.deposit(jim.getCurrentAccount(), 500); jim.withdraw(jim.getCurrentAccount(), 150); Assertions.assertEquals(350.0, jim.getCurrentAccount().getBalance()); } + + @Test + public void testExtensionTwo(){ + + Manager manager = new Manager("Bard", -1000); + Bank bank = new Bank("Storebrand", manager); + Customer jim = new Customer(bank, "Jim", "Oslo"); + + jim.createCurrentAccount(); + jim.deposit(jim.getCurrentAccount(), 500); + jim.withdraw(jim.getCurrentAccount(), 150); + + Assertions.assertEquals(jim.getCurrentAccount().getBranch(), jim.getBranch()); + Assertions.assertEquals("Oslo", jim.getCurrentAccount().getBranch()); + } + + @Test + public void testExtensionThreeAndFour(){ + + Manager manager = new Manager("Bard", -1000); + Bank bank = new Bank("Storebrand", manager); + Customer jim = new Customer(bank, "Jim", "Oslo"); + + jim.createCurrentAccount(); + jim.createSavingsAccount(); + + jim.deposit(jim.getCurrentAccount(), 500); + jim.deposit(jim.getSavingsAccount(), 500); + jim.withdraw(jim.getCurrentAccount(), 150); + jim.withdraw(jim.getSavingsAccount(), 150); + // this next request should be approved since the limit for overdrafting is set to 1000 + boolean approved = jim.withdraw(jim.getCurrentAccount(), 500); + // this next request should not be approved, since it runs over the limit of 1000 + boolean notApprovedSavings = jim.withdraw(jim.getSavingsAccount(), 400); + boolean notApproved = jim.withdraw(jim.getCurrentAccount(), 1000); + + Assertions.assertTrue(approved); + Assertions.assertFalse(notApprovedSavings); + Assertions.assertFalse(notApproved); + } }