From 1eedd9dcc45d6c82e8495dc6c0dce49f4320ad6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 09:30:19 +0100 Subject: [PATCH 01/36] Create initial class diagram --- bank_class_diagram.png | Bin 0 -> 24325 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 bank_class_diagram.png diff --git a/bank_class_diagram.png b/bank_class_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..b4c354c3d4377c7bf6747b427899112ea12cfe7c GIT binary patch literal 24325 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 Un&$}gwdb+hb8z=lOON>f0!GhWc>n+a literal 0 HcmV?d00001 From 58d3652b93e92a35a9606e4b428f1ff7a324c036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 09:49:09 +0100 Subject: [PATCH 02/36] Create sanity check test for Transaction class --- .../com/booleanuk/core/TestTransaction.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/test/java/com/booleanuk/core/TestTransaction.java diff --git a/src/test/java/com/booleanuk/core/TestTransaction.java b/src/test/java/com/booleanuk/core/TestTransaction.java new file mode 100644 index 000000000..1af8e03fc --- /dev/null +++ b/src/test/java/com/booleanuk/core/TestTransaction.java @@ -0,0 +1,19 @@ +package com.booleanuk.core; + +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; + +import java.time.LocalDateTime; + +public class TestTransaction { + @Test + public void canCreateTransaction() { + double amount = 1000; + double currentBalance = 100; + LocalDateTime dt = LocalDateTime.now(); + Transaction t = new Transaction(amount, currentBalance + amount, dt); + assertEquals(1000, t.getAmount()); + assertEquals(1100, t.getCurrentBalance()); + assertEquals(dt, t.getDateTime()); + } +} From 54f713d8baf6d90202d6769e984b1d21275242be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 09:49:25 +0100 Subject: [PATCH 03/36] Create Transaction class --- .../java/com/booleanuk/core/Transaction.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/com/booleanuk/core/Transaction.java diff --git a/src/main/java/com/booleanuk/core/Transaction.java b/src/main/java/com/booleanuk/core/Transaction.java new file mode 100644 index 000000000..b8b998930 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Transaction.java @@ -0,0 +1,27 @@ +package com.booleanuk.core; + +import java.time.LocalDateTime; + +public class Transaction { + private double amount; + private double currentBalance; + private LocalDateTime dateTime; + + public Transaction(double amount, double currentBalance, LocalDateTime dateTime) { + this.amount = amount; + this.currentBalance = currentBalance; + this.dateTime = dateTime; + } + + public double getAmount() { + return amount; + } + + public double getCurrentBalance() { + return currentBalance; + } + + public LocalDateTime getDateTime() { + return dateTime; + } +} From 99465ff86fdb529ff0a0b0130168c6a008f81bc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 09:56:06 +0100 Subject: [PATCH 04/36] Create dummy tests and empty bank account classes --- .../java/com/booleanuk/core/BankAccount.java | 4 +++ .../com/booleanuk/core/CurrentAccount.java | 4 +++ .../com/booleanuk/core/SavingsAccount.java | 4 +++ .../java/com/booleanuk/core/Transaction.java | 6 ++-- .../com/booleanuk/core/TestBankAccount.java | 35 +++++++++++++++++++ 5 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/booleanuk/core/BankAccount.java create mode 100644 src/main/java/com/booleanuk/core/CurrentAccount.java create mode 100644 src/main/java/com/booleanuk/core/SavingsAccount.java create mode 100644 src/test/java/com/booleanuk/core/TestBankAccount.java diff --git a/src/main/java/com/booleanuk/core/BankAccount.java b/src/main/java/com/booleanuk/core/BankAccount.java new file mode 100644 index 000000000..1f939a6ff --- /dev/null +++ b/src/main/java/com/booleanuk/core/BankAccount.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class BankAccount { +} 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..12ebeaec9 --- /dev/null +++ b/src/main/java/com/booleanuk/core/CurrentAccount.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class CurrentAccount extends BankAccount { +} 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..5229ffd4d --- /dev/null +++ b/src/main/java/com/booleanuk/core/SavingsAccount.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class SavingsAccount extends BankAccount { +} diff --git a/src/main/java/com/booleanuk/core/Transaction.java b/src/main/java/com/booleanuk/core/Transaction.java index b8b998930..3f19c6e62 100644 --- a/src/main/java/com/booleanuk/core/Transaction.java +++ b/src/main/java/com/booleanuk/core/Transaction.java @@ -3,9 +3,9 @@ import java.time.LocalDateTime; public class Transaction { - private double amount; - private double currentBalance; - private LocalDateTime dateTime; + private final double amount; + private final double currentBalance; + private final LocalDateTime dateTime; public Transaction(double amount, double currentBalance, LocalDateTime dateTime) { this.amount = amount; diff --git a/src/test/java/com/booleanuk/core/TestBankAccount.java b/src/test/java/com/booleanuk/core/TestBankAccount.java new file mode 100644 index 000000000..6b2abec08 --- /dev/null +++ b/src/test/java/com/booleanuk/core/TestBankAccount.java @@ -0,0 +1,35 @@ +package com.booleanuk.core; + +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; + +public class TestBankAccount { + @Test + public void newAccountInstancesAreValid() { + assertTrue(true); + } + @Test + public void withdrawTooMuchShouldFail() { + assertTrue(true); + } + + @Test + public void canWithdrawWithinReason() { + assertTrue(true); + } + + @Test + public void depositAddsTheRightAmount() { + assertTrue(true); + } + + @Test + public void generateStatementOnNoTransactions() { + assertTrue(true); + } + + @Test + public void generateStatementOnSomeTransactions() { + assertTrue(true); + } +} From 8acc01d1835d3340bb7bec2c465598f1dd665a28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 10:36:02 +0100 Subject: [PATCH 05/36] Add test to verify attributes of new accounts --- src/test/java/com/booleanuk/core/TestBankAccount.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/booleanuk/core/TestBankAccount.java b/src/test/java/com/booleanuk/core/TestBankAccount.java index 6b2abec08..07ba83a86 100644 --- a/src/test/java/com/booleanuk/core/TestBankAccount.java +++ b/src/test/java/com/booleanuk/core/TestBankAccount.java @@ -6,7 +6,11 @@ public class TestBankAccount { @Test public void newAccountInstancesAreValid() { - assertTrue(true); + BankAccount currentAccount = new CurrentAccount(); + BankAccount savingsAccount = new CurrentAccount(); + assertTrue(currentAccount.getAccountNumber() / 10000000 >= 1); + assertEquals(0, currentAccount.getBalance()); + assertEquals(0, currentAccount.getTransactions().size()); } @Test public void withdrawTooMuchShouldFail() { From c5939d02da65d88db170e55946927c2d1bdfec53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 10:37:17 +0100 Subject: [PATCH 06/36] Populate BankAccount with dummy methods and implement constructor --- .../java/com/booleanuk/core/BankAccount.java | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/booleanuk/core/BankAccount.java b/src/main/java/com/booleanuk/core/BankAccount.java index 1f939a6ff..149a7141a 100644 --- a/src/main/java/com/booleanuk/core/BankAccount.java +++ b/src/main/java/com/booleanuk/core/BankAccount.java @@ -1,4 +1,42 @@ package com.booleanuk.core; -public class BankAccount { +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public abstract class BankAccount { + private final int accountNumber; + private final double balance; + private final List transactions; + + public BankAccount() { + Random random = new Random(); + this.accountNumber = random.nextInt(10000000, 99999999); + this.balance = 0; + this.transactions = new ArrayList<>(); + } + + public boolean withdraw(double amount) { + return true; + } + + public boolean deposit(double amount) { + return true; + } + + public String generateBankStatement() { + return ""; + } + + public int getAccountNumber() { + return accountNumber; + } + + public double getBalance() { + return balance; + } + + public List getTransactions() { + return transactions; + } } From 433d477a34e38b085b579ce40f584bc24303c58d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 10:38:42 +0100 Subject: [PATCH 07/36] Add test to verify withdrawing too much money --- src/test/java/com/booleanuk/core/TestBankAccount.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/booleanuk/core/TestBankAccount.java b/src/test/java/com/booleanuk/core/TestBankAccount.java index 07ba83a86..f2bf6cc52 100644 --- a/src/test/java/com/booleanuk/core/TestBankAccount.java +++ b/src/test/java/com/booleanuk/core/TestBankAccount.java @@ -14,7 +14,9 @@ public void newAccountInstancesAreValid() { } @Test public void withdrawTooMuchShouldFail() { - assertTrue(true); + BankAccount currentAccount = new CurrentAccount(); + double amount = 1000; + assertFalse(currentAccount.withdraw(amount)); } @Test From b0d7b4005425fea92286a2af9a501eec65451bfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 10:39:51 +0100 Subject: [PATCH 08/36] Add trivial implementation of withdraw method to pass test --- src/main/java/com/booleanuk/core/BankAccount.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/booleanuk/core/BankAccount.java b/src/main/java/com/booleanuk/core/BankAccount.java index 149a7141a..e17972d81 100644 --- a/src/main/java/com/booleanuk/core/BankAccount.java +++ b/src/main/java/com/booleanuk/core/BankAccount.java @@ -11,13 +11,14 @@ public abstract class BankAccount { public BankAccount() { Random random = new Random(); + // account nrs can technically have leading 0s, but i'm not allowing that here this.accountNumber = random.nextInt(10000000, 99999999); this.balance = 0; this.transactions = new ArrayList<>(); } public boolean withdraw(double amount) { - return true; + return false; } public boolean deposit(double amount) { From e5299d90ce8e9e9b8c9c8ee69a8b52bf58dbd82e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 10:41:07 +0100 Subject: [PATCH 09/36] Add more dummy tests --- src/test/java/com/booleanuk/core/TestBankAccount.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/test/java/com/booleanuk/core/TestBankAccount.java b/src/test/java/com/booleanuk/core/TestBankAccount.java index f2bf6cc52..be5bda748 100644 --- a/src/test/java/com/booleanuk/core/TestBankAccount.java +++ b/src/test/java/com/booleanuk/core/TestBankAccount.java @@ -24,11 +24,21 @@ public void canWithdrawWithinReason() { assertTrue(true); } + @Test + public void withdrawingRemovesMoneyOnlyIfValidAmount() { + assertTrue(true); + } + @Test public void depositAddsTheRightAmount() { assertTrue(true); } + @Test + public void transactionsAreStored() { + assertTrue(true); + } + @Test public void generateStatementOnNoTransactions() { assertTrue(true); From 5b11bfdfa9e6943d4f23e79828c92b8b8533314e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 10:44:45 +0100 Subject: [PATCH 10/36] Create test for depositing --- src/test/java/com/booleanuk/core/TestBankAccount.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/booleanuk/core/TestBankAccount.java b/src/test/java/com/booleanuk/core/TestBankAccount.java index be5bda748..1d1898375 100644 --- a/src/test/java/com/booleanuk/core/TestBankAccount.java +++ b/src/test/java/com/booleanuk/core/TestBankAccount.java @@ -31,7 +31,9 @@ public void withdrawingRemovesMoneyOnlyIfValidAmount() { @Test public void depositAddsTheRightAmount() { - assertTrue(true); + BankAccount account = new CurrentAccount(); + assertTrue(account.deposit(1000)); + assertEquals(1000, account.getBalance()); } @Test From f8e16646cf0e24014c56221ebe9b0f5b3d09bf7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 10:46:52 +0100 Subject: [PATCH 11/36] Implement deposit method to pass test --- src/main/java/com/booleanuk/core/BankAccount.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/booleanuk/core/BankAccount.java b/src/main/java/com/booleanuk/core/BankAccount.java index e17972d81..4f3b3b4a5 100644 --- a/src/main/java/com/booleanuk/core/BankAccount.java +++ b/src/main/java/com/booleanuk/core/BankAccount.java @@ -6,7 +6,7 @@ public abstract class BankAccount { private final int accountNumber; - private final double balance; + private double balance; private final List transactions; public BankAccount() { @@ -21,7 +21,9 @@ public boolean withdraw(double amount) { return false; } + // maybe can be void... or maybe consider overflow? public boolean deposit(double amount) { + balance += amount; return true; } From 1d3b815ff642eeb2cac99ad039f3d483c081e9c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 10:48:40 +0100 Subject: [PATCH 12/36] Implement test for withdrawing valid amounts --- src/test/java/com/booleanuk/core/TestBankAccount.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/booleanuk/core/TestBankAccount.java b/src/test/java/com/booleanuk/core/TestBankAccount.java index 1d1898375..a6def49c5 100644 --- a/src/test/java/com/booleanuk/core/TestBankAccount.java +++ b/src/test/java/com/booleanuk/core/TestBankAccount.java @@ -21,7 +21,9 @@ public void withdrawTooMuchShouldFail() { @Test public void canWithdrawWithinReason() { - assertTrue(true); + BankAccount account = new CurrentAccount(); + account.deposit(1000); + assertTrue(account.withdraw(500)); } @Test From 7f26d05840c99a15c87c0d812fc2ab70c1cf4891 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 10:49:32 +0100 Subject: [PATCH 13/36] Fix return value of withdraw --- src/main/java/com/booleanuk/core/BankAccount.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/booleanuk/core/BankAccount.java b/src/main/java/com/booleanuk/core/BankAccount.java index 4f3b3b4a5..f0c1e551f 100644 --- a/src/main/java/com/booleanuk/core/BankAccount.java +++ b/src/main/java/com/booleanuk/core/BankAccount.java @@ -18,7 +18,7 @@ public BankAccount() { } public boolean withdraw(double amount) { - return false; + return amount <= balance; } // maybe can be void... or maybe consider overflow? From e6c51fbdf4a4f16f6a7fc390ef3274dc57fe7ea7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 10:53:27 +0100 Subject: [PATCH 14/36] Add test to verify that withdrawing decreases balance --- .../java/com/booleanuk/core/TestBankAccount.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/booleanuk/core/TestBankAccount.java b/src/test/java/com/booleanuk/core/TestBankAccount.java index a6def49c5..e88e7408c 100644 --- a/src/test/java/com/booleanuk/core/TestBankAccount.java +++ b/src/test/java/com/booleanuk/core/TestBankAccount.java @@ -26,9 +26,21 @@ public void canWithdrawWithinReason() { assertTrue(account.withdraw(500)); } + @Test + public void withdrawingRemovesMoney() { + BankAccount account = new CurrentAccount(); + account.deposit(1000); + assertTrue(account.withdraw(500)); + assertEquals(500, account.getBalance()); + } @Test public void withdrawingRemovesMoneyOnlyIfValidAmount() { - assertTrue(true); + BankAccount account = new CurrentAccount(); + account.deposit(1000); + assertFalse(account.withdraw(2000)); + assertEquals(1000, account.getBalance()); + assertTrue(account.withdraw(500)); + assertEquals(500, account.getBalance()); } @Test From eac898587d3605db2cc3495c3ca521c0a6068538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 10:54:23 +0100 Subject: [PATCH 15/36] Make sure withdraw withdraws money --- src/main/java/com/booleanuk/core/BankAccount.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/booleanuk/core/BankAccount.java b/src/main/java/com/booleanuk/core/BankAccount.java index f0c1e551f..9988b4838 100644 --- a/src/main/java/com/booleanuk/core/BankAccount.java +++ b/src/main/java/com/booleanuk/core/BankAccount.java @@ -18,6 +18,7 @@ public BankAccount() { } public boolean withdraw(double amount) { + balance -= amount; return amount <= balance; } From 60283dc54325e24ce45d7253e72aff9e0d7c07f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 10:55:32 +0100 Subject: [PATCH 16/36] Make sure withdraw doesn't remove money if there isn't enough --- src/main/java/com/booleanuk/core/BankAccount.java | 4 +++- src/test/java/com/booleanuk/core/TestBankAccount.java | 2 -- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/booleanuk/core/BankAccount.java b/src/main/java/com/booleanuk/core/BankAccount.java index 9988b4838..72e1f255d 100644 --- a/src/main/java/com/booleanuk/core/BankAccount.java +++ b/src/main/java/com/booleanuk/core/BankAccount.java @@ -18,7 +18,9 @@ public BankAccount() { } public boolean withdraw(double amount) { - balance -= amount; + if (amount <= balance) { + balance -= amount; + } return amount <= balance; } diff --git a/src/test/java/com/booleanuk/core/TestBankAccount.java b/src/test/java/com/booleanuk/core/TestBankAccount.java index e88e7408c..6dda238f2 100644 --- a/src/test/java/com/booleanuk/core/TestBankAccount.java +++ b/src/test/java/com/booleanuk/core/TestBankAccount.java @@ -39,8 +39,6 @@ public void withdrawingRemovesMoneyOnlyIfValidAmount() { account.deposit(1000); assertFalse(account.withdraw(2000)); assertEquals(1000, account.getBalance()); - assertTrue(account.withdraw(500)); - assertEquals(500, account.getBalance()); } @Test From ce89a139930498dd335e501432afca7b2d24144a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 10:56:55 +0100 Subject: [PATCH 17/36] Add test to verify that transactions are stored --- src/test/java/com/booleanuk/core/TestBankAccount.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/booleanuk/core/TestBankAccount.java b/src/test/java/com/booleanuk/core/TestBankAccount.java index 6dda238f2..2a56f1ae1 100644 --- a/src/test/java/com/booleanuk/core/TestBankAccount.java +++ b/src/test/java/com/booleanuk/core/TestBankAccount.java @@ -50,7 +50,10 @@ public void depositAddsTheRightAmount() { @Test public void transactionsAreStored() { - assertTrue(true); + BankAccount account = new CurrentAccount(); + assertTrue(account.deposit(1000)); + assertTrue(account.withdraw(100)); + assertEquals(2, account.getTransactions().size()); } @Test From c4776cf76a94a9188a0baee0cc5409e8424dab6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 11:00:09 +0100 Subject: [PATCH 18/36] Store transactions in withdraw and deposit --- src/main/java/com/booleanuk/core/BankAccount.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/booleanuk/core/BankAccount.java b/src/main/java/com/booleanuk/core/BankAccount.java index 72e1f255d..d66218756 100644 --- a/src/main/java/com/booleanuk/core/BankAccount.java +++ b/src/main/java/com/booleanuk/core/BankAccount.java @@ -1,5 +1,6 @@ package com.booleanuk.core; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -19,6 +20,7 @@ public BankAccount() { public boolean withdraw(double amount) { if (amount <= balance) { + transactions.add(new Transaction(0, 0, LocalDateTime.now())); balance -= amount; } return amount <= balance; @@ -26,6 +28,7 @@ public boolean withdraw(double amount) { // maybe can be void... or maybe consider overflow? public boolean deposit(double amount) { + transactions.add(new Transaction(0, 0, LocalDateTime.now())); balance += amount; return true; } From 6043456d2d15b83b60e1f0002c491ab1fce56cb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 11:11:06 +0100 Subject: [PATCH 19/36] Create test for verifying correct transactions --- .../com/booleanuk/core/TestBankAccount.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/test/java/com/booleanuk/core/TestBankAccount.java b/src/test/java/com/booleanuk/core/TestBankAccount.java index 2a56f1ae1..b928a597f 100644 --- a/src/test/java/com/booleanuk/core/TestBankAccount.java +++ b/src/test/java/com/booleanuk/core/TestBankAccount.java @@ -3,6 +3,8 @@ import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; +import java.time.LocalDateTime; + public class TestBankAccount { @Test public void newAccountInstancesAreValid() { @@ -56,6 +58,35 @@ public void transactionsAreStored() { assertEquals(2, account.getTransactions().size()); } + @Test + public void transactionsAreStoredCorrectly() { + BankAccount account = new CurrentAccount(); + LocalDateTime ldt = LocalDateTime.now(); + assertTrue(account.deposit(1000)); + assertTrue(account.withdraw(100)); + assertEquals(2, account.getTransactions().size()); + LocalDateTime depTime = account.getTransactions().getFirst().getDateTime(); + LocalDateTime wdrTime = account.getTransactions().getLast().getDateTime(); + // deposit time correct within 1 s + assertEquals(ldt.toLocalDate(), depTime.toLocalDate()); + assertEquals(ldt.getHour(), depTime.getHour()); + assertEquals(ldt.getMinute(), depTime.getMinute()); + assertEquals(ldt.getSecond(), depTime.getSecond()); + // withdraw time correct within 1 s + assertEquals(ldt.toLocalDate(), wdrTime.toLocalDate()); + assertEquals(ldt.getHour(), wdrTime.getHour()); + assertEquals(ldt.getMinute(), wdrTime.getMinute()); + assertEquals(ldt.getSecond(), wdrTime.getSecond()); + // deposit amounts correct + Transaction dep = account.getTransactions().getFirst(); + assertEquals(1000, dep.getAmount()); + assertEquals(1000, dep.getCurrentBalance()); + // withdraw amounts correct + Transaction wdr = account.getTransactions().getLast(); + assertEquals(100, wdr.getAmount()); + assertEquals(900, wdr.getCurrentBalance()); + } + @Test public void generateStatementOnNoTransactions() { assertTrue(true); From e482b073139c8225e3b2a6e06ee8069c17a55857 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 11:12:32 +0100 Subject: [PATCH 20/36] Make sure transactions are created correctly --- src/main/java/com/booleanuk/core/BankAccount.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/booleanuk/core/BankAccount.java b/src/main/java/com/booleanuk/core/BankAccount.java index d66218756..fe15f070c 100644 --- a/src/main/java/com/booleanuk/core/BankAccount.java +++ b/src/main/java/com/booleanuk/core/BankAccount.java @@ -20,16 +20,16 @@ public BankAccount() { public boolean withdraw(double amount) { if (amount <= balance) { - transactions.add(new Transaction(0, 0, LocalDateTime.now())); balance -= amount; + transactions.add(new Transaction(amount, balance, LocalDateTime.now())); } return amount <= balance; } // maybe can be void... or maybe consider overflow? public boolean deposit(double amount) { - transactions.add(new Transaction(0, 0, LocalDateTime.now())); balance += amount; + transactions.add(new Transaction(amount, this.balance, LocalDateTime.now())); return true; } From 52b246f5edbb46a48ca8ee5e42009517734abdc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 11:19:38 +0100 Subject: [PATCH 21/36] Create test for empty bank statements --- src/test/java/com/booleanuk/core/TestBankAccount.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/booleanuk/core/TestBankAccount.java b/src/test/java/com/booleanuk/core/TestBankAccount.java index b928a597f..a2fcb011f 100644 --- a/src/test/java/com/booleanuk/core/TestBankAccount.java +++ b/src/test/java/com/booleanuk/core/TestBankAccount.java @@ -89,7 +89,10 @@ public void transactionsAreStoredCorrectly() { @Test public void generateStatementOnNoTransactions() { - assertTrue(true); + BankAccount account = new CurrentAccount(); + assertEquals( + "date\t||credit\t||debit\t||balance", + account.generateBankStatement()); } @Test From 8976487996290d523f3f0147eb15b857259d86e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 11:20:08 +0100 Subject: [PATCH 22/36] Implement generation of empty bank statements --- src/main/java/com/booleanuk/core/BankAccount.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/booleanuk/core/BankAccount.java b/src/main/java/com/booleanuk/core/BankAccount.java index fe15f070c..c23de49bb 100644 --- a/src/main/java/com/booleanuk/core/BankAccount.java +++ b/src/main/java/com/booleanuk/core/BankAccount.java @@ -34,7 +34,10 @@ public boolean deposit(double amount) { } public String generateBankStatement() { - return ""; + StringBuilder sb = new StringBuilder(); + sb.append("date\t||credit\t||debit\t||balance\n"); + + return sb.toString(); } public int getAccountNumber() { From 332e6c4df61cfebe26353bb717e6dd38eaef2042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 11:31:50 +0100 Subject: [PATCH 23/36] Add test for generating nonempty bank statements --- .../java/com/booleanuk/core/TestBankAccount.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/booleanuk/core/TestBankAccount.java b/src/test/java/com/booleanuk/core/TestBankAccount.java index a2fcb011f..aa7983a76 100644 --- a/src/test/java/com/booleanuk/core/TestBankAccount.java +++ b/src/test/java/com/booleanuk/core/TestBankAccount.java @@ -97,6 +97,19 @@ public void generateStatementOnNoTransactions() { @Test public void generateStatementOnSomeTransactions() { - assertTrue(true); + BankAccount account = new CurrentAccount(); + LocalDateTime ldt = LocalDateTime.now(); + account.deposit(1000); + account.withdraw(100); + account.withdraw(200); + + String sb = "date||credit||debit||balance" + + ldt.getDayOfMonth() + "/" + ldt.getMonthValue() + "/" + ldt.getYear() + + "||||200.00||700.00" + + ldt.getDayOfMonth() + "/" + ldt.getMonthValue() + "/" + ldt.getYear() + + "||||100.00||900.00" + + ldt.getDayOfMonth() + "/" + ldt.getMonthValue() + "/" + ldt.getYear() + + "||1000.00||||1000.00".replaceAll("\\s+",""); + assertEquals(sb, account.generateBankStatement().replaceAll("\\s+","")); } } From 7a08dcf757a890eebd98f7b604436be97ec3565d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 11:48:58 +0100 Subject: [PATCH 24/36] Fix failing tests --- src/main/java/com/booleanuk/core/BankAccount.java | 15 ++++++++++++++- .../java/com/booleanuk/core/TestBankAccount.java | 8 +++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/booleanuk/core/BankAccount.java b/src/main/java/com/booleanuk/core/BankAccount.java index c23de49bb..3083aeb2a 100644 --- a/src/main/java/com/booleanuk/core/BankAccount.java +++ b/src/main/java/com/booleanuk/core/BankAccount.java @@ -21,7 +21,7 @@ public BankAccount() { public boolean withdraw(double amount) { if (amount <= balance) { balance -= amount; - transactions.add(new Transaction(amount, balance, LocalDateTime.now())); + transactions.add(new Transaction(-amount, balance, LocalDateTime.now())); } return amount <= balance; } @@ -33,10 +33,23 @@ public boolean deposit(double amount) { return true; } + // TODO Fix formatting public String generateBankStatement() { StringBuilder sb = new StringBuilder(); sb.append("date\t||credit\t||debit\t||balance\n"); + for (Transaction t : transactions.reversed()) { + sb.append(t.getDateTime().getDayOfMonth()).append("/") + .append(t.getDateTime().getMonthValue()).append("/") + .append(t.getDateTime().getYear()).append("||"); + if (t.getAmount() > 0) { + sb.append(String.format("%.2f", Math.abs(t.getAmount()))).append("||\t"); + } else { + sb.append("\t||").append(String.format("%.2f", Math.abs(t.getAmount()))); + } + sb.append("||").append(String.format("%.2f", t.getCurrentBalance())).append("\n"); + } + return sb.toString(); } diff --git a/src/test/java/com/booleanuk/core/TestBankAccount.java b/src/test/java/com/booleanuk/core/TestBankAccount.java index aa7983a76..cb3e326de 100644 --- a/src/test/java/com/booleanuk/core/TestBankAccount.java +++ b/src/test/java/com/booleanuk/core/TestBankAccount.java @@ -83,7 +83,7 @@ public void transactionsAreStoredCorrectly() { assertEquals(1000, dep.getCurrentBalance()); // withdraw amounts correct Transaction wdr = account.getTransactions().getLast(); - assertEquals(100, wdr.getAmount()); + assertEquals(-100, wdr.getAmount()); assertEquals(900, wdr.getCurrentBalance()); } @@ -91,8 +91,8 @@ public void transactionsAreStoredCorrectly() { public void generateStatementOnNoTransactions() { BankAccount account = new CurrentAccount(); assertEquals( - "date\t||credit\t||debit\t||balance", - account.generateBankStatement()); + "date||credit||debit||balance", + account.generateBankStatement().replaceAll("\\s+","")); } @Test @@ -102,6 +102,7 @@ public void generateStatementOnSomeTransactions() { account.deposit(1000); account.withdraw(100); account.withdraw(200); +// System.out.println(account.generateBankStatement()); String sb = "date||credit||debit||balance" + ldt.getDayOfMonth() + "/" + ldt.getMonthValue() + "/" + ldt.getYear() + @@ -110,6 +111,7 @@ public void generateStatementOnSomeTransactions() { "||||100.00||900.00" + ldt.getDayOfMonth() + "/" + ldt.getMonthValue() + "/" + ldt.getYear() + "||1000.00||||1000.00".replaceAll("\\s+",""); + assertEquals(sb, account.generateBankStatement().replaceAll("\\s+","")); } } From 549bf54121635fe6718e0bcb6b44034478baada3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 11:49:09 +0100 Subject: [PATCH 25/36] Finalize class diagram --- bank_class_diagram.png | Bin 24325 -> 24691 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bank_class_diagram.png b/bank_class_diagram.png index b4c354c3d4377c7bf6747b427899112ea12cfe7c..dcecd3c41426f8478122dcee376596a38a42b7ff 100644 GIT binary patch literal 24691 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 Un&$}gwdb+hb8z=lOON>f0!GhWc>n+a From ab92f099bccfc7fb7a9f113607c8fed4064e429e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 12:06:19 +0100 Subject: [PATCH 26/36] Calculate balance through transaction history instead --- src/main/java/com/booleanuk/core/BankAccount.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/booleanuk/core/BankAccount.java b/src/main/java/com/booleanuk/core/BankAccount.java index 3083aeb2a..0e2b04b72 100644 --- a/src/main/java/com/booleanuk/core/BankAccount.java +++ b/src/main/java/com/booleanuk/core/BankAccount.java @@ -7,18 +7,17 @@ public abstract class BankAccount { private final int accountNumber; - private double balance; private final List transactions; public BankAccount() { Random random = new Random(); // account nrs can technically have leading 0s, but i'm not allowing that here this.accountNumber = random.nextInt(10000000, 99999999); - this.balance = 0; this.transactions = new ArrayList<>(); } public boolean withdraw(double amount) { + double balance = this.getBalance(); if (amount <= balance) { balance -= amount; transactions.add(new Transaction(-amount, balance, LocalDateTime.now())); @@ -28,8 +27,9 @@ public boolean withdraw(double amount) { // maybe can be void... or maybe consider overflow? public boolean deposit(double amount) { + double balance = this.getBalance(); balance += amount; - transactions.add(new Transaction(amount, this.balance, LocalDateTime.now())); + transactions.add(new Transaction(amount, balance, LocalDateTime.now())); return true; } @@ -58,6 +58,10 @@ public int getAccountNumber() { } public double getBalance() { + double balance = 0; + for (Transaction t : transactions) { + balance += t.getAmount(); + } return balance; } From 5588a500665647253f12a297462115edb2492f6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 13:44:44 +0100 Subject: [PATCH 27/36] Implement branch numbers and represent account and branch number with Strings --- .../java/com/booleanuk/core/BankAccount.java | 22 ++++++++++++++----- .../com/booleanuk/core/CurrentAccount.java | 7 ++++++ .../com/booleanuk/core/SavingsAccount.java | 3 +++ .../com/booleanuk/core/TestBankAccount.java | 6 ++--- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/booleanuk/core/BankAccount.java b/src/main/java/com/booleanuk/core/BankAccount.java index 0e2b04b72..ebba6d77b 100644 --- a/src/main/java/com/booleanuk/core/BankAccount.java +++ b/src/main/java/com/booleanuk/core/BankAccount.java @@ -6,13 +6,21 @@ import java.util.Random; public abstract class BankAccount { - private final int accountNumber; + private final String accountNumber; + private final String branchNumber; private final List transactions; - public BankAccount() { + public BankAccount(int branchNumber) { Random random = new Random(); - // account nrs can technically have leading 0s, but i'm not allowing that here - this.accountNumber = random.nextInt(10000000, 99999999); + int randomAccountNumber = random.nextInt(99999999); + this.accountNumber = "0".repeat((int) (8 - Math.ceil(Math.log10(randomAccountNumber)))) + randomAccountNumber; + if (branchNumber > 999999) { + System.out.println("Invalid branch code (must be 6 digit number). Branch code will be set to 0."); + branchNumber = 0; + } + this.branchNumber = "0".repeat((int) (6 - Math.ceil(Math.log10(branchNumber)))) + branchNumber; + System.out.println(this.accountNumber); + System.out.println(this.branchNumber); this.transactions = new ArrayList<>(); } @@ -53,7 +61,7 @@ public String generateBankStatement() { return sb.toString(); } - public int getAccountNumber() { + public String getAccountNumber() { return accountNumber; } @@ -68,4 +76,8 @@ public double getBalance() { public List getTransactions() { return transactions; } + + public String getBranchNumber() { + return branchNumber; + } } diff --git a/src/main/java/com/booleanuk/core/CurrentAccount.java b/src/main/java/com/booleanuk/core/CurrentAccount.java index 12ebeaec9..46fa2f528 100644 --- a/src/main/java/com/booleanuk/core/CurrentAccount.java +++ b/src/main/java/com/booleanuk/core/CurrentAccount.java @@ -1,4 +1,11 @@ package com.booleanuk.core; public class CurrentAccount extends BankAccount { + public CurrentAccount() { + super(1); + } + + public CurrentAccount(int branchNumber) { + super(branchNumber); + } } diff --git a/src/main/java/com/booleanuk/core/SavingsAccount.java b/src/main/java/com/booleanuk/core/SavingsAccount.java index 5229ffd4d..93e80b384 100644 --- a/src/main/java/com/booleanuk/core/SavingsAccount.java +++ b/src/main/java/com/booleanuk/core/SavingsAccount.java @@ -1,4 +1,7 @@ package com.booleanuk.core; public class SavingsAccount extends BankAccount { + public SavingsAccount(int branchNumber) { + super(branchNumber); + } } diff --git a/src/test/java/com/booleanuk/core/TestBankAccount.java b/src/test/java/com/booleanuk/core/TestBankAccount.java index cb3e326de..25b15547f 100644 --- a/src/test/java/com/booleanuk/core/TestBankAccount.java +++ b/src/test/java/com/booleanuk/core/TestBankAccount.java @@ -8,9 +8,9 @@ public class TestBankAccount { @Test public void newAccountInstancesAreValid() { - BankAccount currentAccount = new CurrentAccount(); - BankAccount savingsAccount = new CurrentAccount(); - assertTrue(currentAccount.getAccountNumber() / 10000000 >= 1); + BankAccount currentAccount = new CurrentAccount(999999); + assertEquals(8, currentAccount.getAccountNumber().length()); + assertEquals(6, currentAccount.getBranchNumber().length()); assertEquals(0, currentAccount.getBalance()); assertEquals(0, currentAccount.getTransactions().size()); } From ee5d6419cd19893b710fb3769cd2a2a76adc8346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 13:51:25 +0100 Subject: [PATCH 28/36] Overload deposit and withdraw to support externally providing LocalDateTime --- .../java/com/booleanuk/core/BankAccount.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/booleanuk/core/BankAccount.java b/src/main/java/com/booleanuk/core/BankAccount.java index ebba6d77b..067946aa1 100644 --- a/src/main/java/com/booleanuk/core/BankAccount.java +++ b/src/main/java/com/booleanuk/core/BankAccount.java @@ -24,23 +24,31 @@ public BankAccount(int branchNumber) { this.transactions = new ArrayList<>(); } - public boolean withdraw(double amount) { + public boolean withdraw(double amount, LocalDateTime dateTime) { double balance = this.getBalance(); if (amount <= balance) { balance -= amount; - transactions.add(new Transaction(-amount, balance, LocalDateTime.now())); + transactions.add(new Transaction(-amount, balance, dateTime)); } return amount <= balance; } + public boolean withdraw(double amount) { + return this.withdraw(amount, LocalDateTime.now()); + } + // maybe can be void... or maybe consider overflow? - public boolean deposit(double amount) { + public boolean deposit(double amount, LocalDateTime dateTime) { double balance = this.getBalance(); balance += amount; - transactions.add(new Transaction(amount, balance, LocalDateTime.now())); + transactions.add(new Transaction(amount, balance, dateTime)); return true; } + public boolean deposit(double amount) { + return this.deposit(amount, LocalDateTime.now()); + } + // TODO Fix formatting public String generateBankStatement() { StringBuilder sb = new StringBuilder(); From 12937c3f602f4925763b6beeb7c9a9ba753f5f21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 13:59:06 +0100 Subject: [PATCH 29/36] Update bank statement test to use manual date time --- .../java/com/booleanuk/core/BankAccount.java | 2 -- .../java/com/booleanuk/core/TestBankAccount.java | 16 +++++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/booleanuk/core/BankAccount.java b/src/main/java/com/booleanuk/core/BankAccount.java index 067946aa1..f1f6d653e 100644 --- a/src/main/java/com/booleanuk/core/BankAccount.java +++ b/src/main/java/com/booleanuk/core/BankAccount.java @@ -19,8 +19,6 @@ public BankAccount(int branchNumber) { branchNumber = 0; } this.branchNumber = "0".repeat((int) (6 - Math.ceil(Math.log10(branchNumber)))) + branchNumber; - System.out.println(this.accountNumber); - System.out.println(this.branchNumber); this.transactions = new ArrayList<>(); } diff --git a/src/test/java/com/booleanuk/core/TestBankAccount.java b/src/test/java/com/booleanuk/core/TestBankAccount.java index 25b15547f..ad0fb9807 100644 --- a/src/test/java/com/booleanuk/core/TestBankAccount.java +++ b/src/test/java/com/booleanuk/core/TestBankAccount.java @@ -98,18 +98,20 @@ public void generateStatementOnNoTransactions() { @Test public void generateStatementOnSomeTransactions() { BankAccount account = new CurrentAccount(); - LocalDateTime ldt = LocalDateTime.now(); - account.deposit(1000); - account.withdraw(100); - account.withdraw(200); + LocalDateTime ldt1 = LocalDateTime.of(2012, 1, 14, 13, 54); + LocalDateTime ldt2 = LocalDateTime.of(2012, 1, 13, 22, 18); + LocalDateTime ldt3 = LocalDateTime.of(2012, 1, 10, 11, 27); + account.deposit(1000, ldt3); + account.withdraw(100, ldt2); + account.withdraw(200, ldt1); // System.out.println(account.generateBankStatement()); String sb = "date||credit||debit||balance" + - ldt.getDayOfMonth() + "/" + ldt.getMonthValue() + "/" + ldt.getYear() + + "14/1/2012" + "||||200.00||700.00" + - ldt.getDayOfMonth() + "/" + ldt.getMonthValue() + "/" + ldt.getYear() + + "13/1/2012" + "||||100.00||900.00" + - ldt.getDayOfMonth() + "/" + ldt.getMonthValue() + "/" + ldt.getYear() + + "10/1/2012" + "||1000.00||||1000.00".replaceAll("\\s+",""); assertEquals(sb, account.generateBankStatement().replaceAll("\\s+","")); From 53d2a02c66bf2f260d2c8ba95b47e1241660f078 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 14:51:13 +0100 Subject: [PATCH 30/36] Add dummy methods for overdrafts in SavingsAccount --- .../java/com/booleanuk/core/SavingsAccount.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/com/booleanuk/core/SavingsAccount.java b/src/main/java/com/booleanuk/core/SavingsAccount.java index 93e80b384..e5ce8cc81 100644 --- a/src/main/java/com/booleanuk/core/SavingsAccount.java +++ b/src/main/java/com/booleanuk/core/SavingsAccount.java @@ -1,7 +1,22 @@ package com.booleanuk.core; public class SavingsAccount extends BankAccount { + private double maxOverdraft; + public SavingsAccount(int branchNumber) { super(branchNumber); + this.maxOverdraft = 0; + } + + public boolean hasOverdraft() { + return maxOverdraft > 0; + } + + public double getMaxOverdraft() { + return maxOverdraft; + } + + public boolean setMaxOverdraft(double maxOverdraft) { + return true; } } From 3e92526be09ee5c7a653f6e687271c62566f358c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 14:53:09 +0100 Subject: [PATCH 31/36] Add dummy methods and attributes for overdrafts --- .../java/com/booleanuk/core/BankSystem.java | 17 +++++++++++++ .../com/booleanuk/core/OverdraftRequest.java | 25 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 src/main/java/com/booleanuk/core/BankSystem.java create mode 100644 src/main/java/com/booleanuk/core/OverdraftRequest.java diff --git a/src/main/java/com/booleanuk/core/BankSystem.java b/src/main/java/com/booleanuk/core/BankSystem.java new file mode 100644 index 000000000..12478d704 --- /dev/null +++ b/src/main/java/com/booleanuk/core/BankSystem.java @@ -0,0 +1,17 @@ +package com.booleanuk.core; + +import java.util.List; +import java.util.Map; + +public class BankSystem { + Map bankAccounts; + List overdraftRequests; + + public Map getBankAccounts() { + return bankAccounts; + } + + public List getOverdraftRequests() { + return overdraftRequests; + } +} diff --git a/src/main/java/com/booleanuk/core/OverdraftRequest.java b/src/main/java/com/booleanuk/core/OverdraftRequest.java new file mode 100644 index 000000000..3d6c915d4 --- /dev/null +++ b/src/main/java/com/booleanuk/core/OverdraftRequest.java @@ -0,0 +1,25 @@ +package com.booleanuk.core; + +public class OverdraftRequest { + String accountNumber; + String branchNumber; + double amount; + + public OverdraftRequest(String accountNumber, String branchNumber, double amount) { + this.accountNumber = accountNumber; + this.branchNumber = branchNumber; + this.amount = amount; + } + + public String getAccountNumber() { + return accountNumber; + } + + public String getBranchNumber() { + return branchNumber; + } + + public double getAmount() { + return amount; + } +} From d2996d71e6c0af6a28e3678530f3b21f508ed478 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 14:56:01 +0100 Subject: [PATCH 32/36] Add test and implementation to verify that overdraft is valid --- src/main/java/com/booleanuk/core/SavingsAccount.java | 6 ++++++ src/test/java/com/booleanuk/core/TestBankAccount.java | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/main/java/com/booleanuk/core/SavingsAccount.java b/src/main/java/com/booleanuk/core/SavingsAccount.java index e5ce8cc81..b0d13dab6 100644 --- a/src/main/java/com/booleanuk/core/SavingsAccount.java +++ b/src/main/java/com/booleanuk/core/SavingsAccount.java @@ -8,6 +8,7 @@ public SavingsAccount(int branchNumber) { this.maxOverdraft = 0; } + // probably won't be used, but useful in theory public boolean hasOverdraft() { return maxOverdraft > 0; } @@ -17,6 +18,11 @@ public double getMaxOverdraft() { } public boolean setMaxOverdraft(double maxOverdraft) { + if (maxOverdraft < 0) { + System.out.println("Cannot set negative overdraft."); + return false; + } + this.maxOverdraft = maxOverdraft; return true; } } diff --git a/src/test/java/com/booleanuk/core/TestBankAccount.java b/src/test/java/com/booleanuk/core/TestBankAccount.java index ad0fb9807..b11d535bb 100644 --- a/src/test/java/com/booleanuk/core/TestBankAccount.java +++ b/src/test/java/com/booleanuk/core/TestBankAccount.java @@ -116,4 +116,10 @@ public void generateStatementOnSomeTransactions() { assertEquals(sb, account.generateBankStatement().replaceAll("\\s+","")); } + + @Test + public void overdraftNeedsToBePositive() { + SavingsAccount account = new SavingsAccount(523611); + assertFalse(account.setMaxOverdraft(-50)); + } } From b4d2b3b7e19d4c70a9844224eb7e64e195876084 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 15:08:18 +0100 Subject: [PATCH 33/36] Add dummy test for BankSystem --- .../com/booleanuk/core/TestBankSystem.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/test/java/com/booleanuk/core/TestBankSystem.java diff --git a/src/test/java/com/booleanuk/core/TestBankSystem.java b/src/test/java/com/booleanuk/core/TestBankSystem.java new file mode 100644 index 000000000..24d5ccef1 --- /dev/null +++ b/src/test/java/com/booleanuk/core/TestBankSystem.java @@ -0,0 +1,21 @@ +package com.booleanuk.core; + +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; + +public class TestBankSystem { + @Test + public void cannotGoBeyondOverdraftLimit() { + assertTrue(true); + } + + @Test + public void canHaveNegativeBalanceWithinOverdraft() { + assertTrue(true); + } + + @Test + public void approvingOverdraftRequestWorksCorrectly() { + assertTrue(true); + } +} From 1d5db7716e79c4acce876f5d7378366941d6bfd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 15:26:54 +0100 Subject: [PATCH 34/36] Write tests for handling overdrafts and requests --- .../java/com/booleanuk/core/BankAccount.java | 7 +++++++ .../java/com/booleanuk/core/BankSystem.java | 6 ++++++ .../java/com/booleanuk/core/SavingsAccount.java | 5 +++++ .../com/booleanuk/core/TestBankAccount.java | 17 +++++++++++++++++ .../java/com/booleanuk/core/TestBankSystem.java | 16 +++++----------- 5 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/booleanuk/core/BankAccount.java b/src/main/java/com/booleanuk/core/BankAccount.java index f1f6d653e..a7c818bf8 100644 --- a/src/main/java/com/booleanuk/core/BankAccount.java +++ b/src/main/java/com/booleanuk/core/BankAccount.java @@ -22,6 +22,13 @@ public BankAccount(int branchNumber) { this.transactions = new ArrayList<>(); } + public BankAccount(String accountNumber, String branchNumber) { + // todo: make sure numbers are OK length + this.accountNumber = accountNumber; + this.branchNumber = branchNumber; + this.transactions = new ArrayList<>(); + } + public boolean withdraw(double amount, LocalDateTime dateTime) { double balance = this.getBalance(); if (amount <= balance) { diff --git a/src/main/java/com/booleanuk/core/BankSystem.java b/src/main/java/com/booleanuk/core/BankSystem.java index 12478d704..0d3cf171a 100644 --- a/src/main/java/com/booleanuk/core/BankSystem.java +++ b/src/main/java/com/booleanuk/core/BankSystem.java @@ -6,6 +6,12 @@ public class BankSystem { Map bankAccounts; List overdraftRequests; + Map savingsAccounts; + + // maybe void? + public boolean approve(OverdraftRequest or) { + return savingsAccounts.get(or.accountNumber + or.branchNumber).setMaxOverdraft(or.getAmount()); + } public Map getBankAccounts() { return bankAccounts; diff --git a/src/main/java/com/booleanuk/core/SavingsAccount.java b/src/main/java/com/booleanuk/core/SavingsAccount.java index b0d13dab6..c2c0e0704 100644 --- a/src/main/java/com/booleanuk/core/SavingsAccount.java +++ b/src/main/java/com/booleanuk/core/SavingsAccount.java @@ -3,6 +3,11 @@ public class SavingsAccount extends BankAccount { private double maxOverdraft; + public SavingsAccount(String accountNumber, String branchNumber) { + super(accountNumber, branchNumber); + this.maxOverdraft = 0; + } + public SavingsAccount(int branchNumber) { super(branchNumber); this.maxOverdraft = 0; diff --git a/src/test/java/com/booleanuk/core/TestBankAccount.java b/src/test/java/com/booleanuk/core/TestBankAccount.java index b11d535bb..16debf23b 100644 --- a/src/test/java/com/booleanuk/core/TestBankAccount.java +++ b/src/test/java/com/booleanuk/core/TestBankAccount.java @@ -122,4 +122,21 @@ public void overdraftNeedsToBePositive() { SavingsAccount account = new SavingsAccount(523611); assertFalse(account.setMaxOverdraft(-50)); } + + @Test + public void cannotGoBeyondOverdraftLimit() { + SavingsAccount account = new SavingsAccount(123456); + account.deposit(100); + assertFalse(account.withdraw(200)); + assertEquals(100, account.getBalance()); + } + + @Test + public void canHaveNegativeBalanceWithinOverdraft() { + SavingsAccount account = new SavingsAccount(123456); + account.deposit(100); + account.setMaxOverdraft(200); + assertTrue(account.withdraw(200)); + assertEquals(-100, account.getBalance()); + } } diff --git a/src/test/java/com/booleanuk/core/TestBankSystem.java b/src/test/java/com/booleanuk/core/TestBankSystem.java index 24d5ccef1..b9e22e74d 100644 --- a/src/test/java/com/booleanuk/core/TestBankSystem.java +++ b/src/test/java/com/booleanuk/core/TestBankSystem.java @@ -4,18 +4,12 @@ import org.junit.jupiter.api.Test; public class TestBankSystem { - @Test - public void cannotGoBeyondOverdraftLimit() { - assertTrue(true); - } - - @Test - public void canHaveNegativeBalanceWithinOverdraft() { - assertTrue(true); - } - @Test public void approvingOverdraftRequestWorksCorrectly() { - assertTrue(true); + BankSystem bs = new BankSystem(); + SavingsAccount account = new SavingsAccount("12345678", "123456"); + OverdraftRequest or = new OverdraftRequest(account.getAccountNumber(), account.getBranchNumber(), 500); + bs.approve(or); + assertTrue(account.hasOverdraft()); } } From dfdededb1beb9f9bbf20192c9be94937e5480f4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 16:18:06 +0100 Subject: [PATCH 35/36] Fix handling of overdrafts and requests --- .../java/com/booleanuk/core/BankSystem.java | 24 ++++++++++++++++--- .../com/booleanuk/core/SavingsAccount.java | 16 +++++++++++++ .../com/booleanuk/core/TestBankSystem.java | 1 + 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/booleanuk/core/BankSystem.java b/src/main/java/com/booleanuk/core/BankSystem.java index 0d3cf171a..34fd687dd 100644 --- a/src/main/java/com/booleanuk/core/BankSystem.java +++ b/src/main/java/com/booleanuk/core/BankSystem.java @@ -1,19 +1,37 @@ package com.booleanuk.core; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; public class BankSystem { - Map bankAccounts; - List overdraftRequests; - Map savingsAccounts; + private List overdraftRequests; + private Map savingsAccounts; + private Map currentAccounts; + + public BankSystem() { + overdraftRequests = new ArrayList<>(); + savingsAccounts = new HashMap<>(); + currentAccounts = new HashMap<>(); + } // maybe void? public boolean approve(OverdraftRequest or) { return savingsAccounts.get(or.accountNumber + or.branchNumber).setMaxOverdraft(or.getAmount()); } + public void addCurrentAccount(CurrentAccount b) { + currentAccounts.put(b.getAccountNumber() + b.getBranchNumber(), b); + } + + public void addSavingsAccount(SavingsAccount b) { + savingsAccounts.put(b.getAccountNumber() + b.getBranchNumber(), b); + } + public Map getBankAccounts() { + Map bankAccounts = new HashMap<>(currentAccounts); + bankAccounts.putAll(savingsAccounts); return bankAccounts; } diff --git a/src/main/java/com/booleanuk/core/SavingsAccount.java b/src/main/java/com/booleanuk/core/SavingsAccount.java index c2c0e0704..e26dace9c 100644 --- a/src/main/java/com/booleanuk/core/SavingsAccount.java +++ b/src/main/java/com/booleanuk/core/SavingsAccount.java @@ -1,5 +1,7 @@ package com.booleanuk.core; +import java.time.LocalDateTime; + public class SavingsAccount extends BankAccount { private double maxOverdraft; @@ -13,6 +15,20 @@ public SavingsAccount(int branchNumber) { this.maxOverdraft = 0; } + @Override + public boolean withdraw(double amount, LocalDateTime dateTime) { + if (getBalance() - amount < - maxOverdraft) { + return false; + } + getTransactions().add(new Transaction(-amount, getBalance() - amount, dateTime)); + return true; + } + + @Override + public boolean withdraw(double amount) { + return this.withdraw(amount, LocalDateTime.now()); + } + // probably won't be used, but useful in theory public boolean hasOverdraft() { return maxOverdraft > 0; diff --git a/src/test/java/com/booleanuk/core/TestBankSystem.java b/src/test/java/com/booleanuk/core/TestBankSystem.java index b9e22e74d..2eba21a52 100644 --- a/src/test/java/com/booleanuk/core/TestBankSystem.java +++ b/src/test/java/com/booleanuk/core/TestBankSystem.java @@ -8,6 +8,7 @@ public class TestBankSystem { public void approvingOverdraftRequestWorksCorrectly() { BankSystem bs = new BankSystem(); SavingsAccount account = new SavingsAccount("12345678", "123456"); + bs.addSavingsAccount(account); OverdraftRequest or = new OverdraftRequest(account.getAccountNumber(), account.getBranchNumber(), 500); bs.approve(or); assertTrue(account.hasOverdraft()); From 0076cbe86fdd57be3079da1cc6d7ab4ae36a49c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20S=C3=B6nnergaard?= Date: Wed, 15 Jan 2025 16:26:10 +0100 Subject: [PATCH 36/36] Finalize class diagram --- bank_extension_class_diagram.png | Bin 0 -> 46514 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 bank_extension_class_diagram.png diff --git a/bank_extension_class_diagram.png b/bank_extension_class_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..fd0762dd2b3619bf8366e3ecb48c2b0d45dcf1ee GIT binary patch literal 46514 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 literal 0 HcmV?d00001