From c2c4ff60427509f4f77e1890a7467ad1253eb536 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 13 Aug 2025 10:34:24 +0200 Subject: [PATCH 01/10] user story 1 Red: Test --- .../java/com/booleanuk/core/BankTest.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/test/java/com/booleanuk/core/BankTest.java diff --git a/src/test/java/com/booleanuk/core/BankTest.java b/src/test/java/com/booleanuk/core/BankTest.java new file mode 100644 index 000000000..c526b4956 --- /dev/null +++ b/src/test/java/com/booleanuk/core/BankTest.java @@ -0,0 +1,22 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Test; +import java.util.List; +import static org.junit.jupiter.api.Assertions.*; + +public class BankTest { + + @Test + public void createCurrentAccount(){ + CurrentAccount account = new CurrentAccount(); + assertNotNull(account, "Account created"); + } + + @Test + public void newAccount_ShouldHaveNoTransactions(){ + CurrentAccount account = new CurrentAccount(); + List transactions = account.getTransactions(); + assertTrue(transactions.isEmpty(), "new account with no Transactions"); + + } +} From 956ac7143a9de0af5657b11c2955ae81ee168154 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 13 Aug 2025 10:34:58 +0200 Subject: [PATCH 02/10] user story 1 Green: Test passed --- .../java/com/booleanuk/core/CurrentAccount.java | 17 +++++++++++++++++ .../java/com/booleanuk/core/Transaction.java | 4 ++++ 2 files changed, 21 insertions(+) create mode 100644 src/main/java/com/booleanuk/core/CurrentAccount.java create mode 100644 src/main/java/com/booleanuk/core/Transaction.java 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..24d6a889c --- /dev/null +++ b/src/main/java/com/booleanuk/core/CurrentAccount.java @@ -0,0 +1,17 @@ +package com.booleanuk.core; + +import java.util.List; +import java.util.ArrayList; + +public class CurrentAccount { + private List transactions; + + public CurrentAccount(){ + this.transactions = new ArrayList<>(); + } + + public List getTransactions(){ + return transactions; + } + +} 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..a85f5696b --- /dev/null +++ b/src/main/java/com/booleanuk/core/Transaction.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class Transaction { +} From 28d440e7c33f6bec7950e7d6bbdeffe48cf0f21c Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 13 Aug 2025 10:52:28 +0200 Subject: [PATCH 03/10] user story 1 Refactor --- src/main/java/com/booleanuk/core/Account.java | 16 ++++++++++++++++ .../java/com/booleanuk/core/CurrentAccount.java | 13 +++---------- src/test/java/com/booleanuk/core/BankTest.java | 11 +++++++++-- 3 files changed, 28 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/booleanuk/core/Account.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..d2468f1df --- /dev/null +++ b/src/main/java/com/booleanuk/core/Account.java @@ -0,0 +1,16 @@ +package com.booleanuk.core; + +import java.util.ArrayList; +import java.util.List; + +public abstract class Account { + protected List transactions; + + public Account(){ + this.transactions = new ArrayList<>(); + } + + public List getTransactions(){ + return transactions; + } +} diff --git a/src/main/java/com/booleanuk/core/CurrentAccount.java b/src/main/java/com/booleanuk/core/CurrentAccount.java index 24d6a889c..e89c60da4 100644 --- a/src/main/java/com/booleanuk/core/CurrentAccount.java +++ b/src/main/java/com/booleanuk/core/CurrentAccount.java @@ -3,15 +3,8 @@ import java.util.List; import java.util.ArrayList; -public class CurrentAccount { - private List transactions; - - public CurrentAccount(){ - this.transactions = new ArrayList<>(); - } - - public List getTransactions(){ - return transactions; +public class CurrentAccount extends Account { + public CurrentAccount() { + super(); } - } diff --git a/src/test/java/com/booleanuk/core/BankTest.java b/src/test/java/com/booleanuk/core/BankTest.java index c526b4956..8e905f9a4 100644 --- a/src/test/java/com/booleanuk/core/BankTest.java +++ b/src/test/java/com/booleanuk/core/BankTest.java @@ -1,20 +1,27 @@ package com.booleanuk.core; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import java.util.List; import static org.junit.jupiter.api.Assertions.*; public class BankTest { + static CurrentAccount account; + @BeforeAll + static void beforeAll() { + account = new CurrentAccount(); + + } @Test public void createCurrentAccount(){ - CurrentAccount account = new CurrentAccount(); +// CurrentAccount account = new CurrentAccount(); assertNotNull(account, "Account created"); } @Test public void newAccount_ShouldHaveNoTransactions(){ - CurrentAccount account = new CurrentAccount(); + // CurrentAccount account = new CurrentAccount(); List transactions = account.getTransactions(); assertTrue(transactions.isEmpty(), "new account with no Transactions"); From 3123ceddd2ead9e0e4b27f697292bfab141d0207 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 13 Aug 2025 11:04:53 +0200 Subject: [PATCH 04/10] user story 2 Red : Test --- .../java/com/booleanuk/core/BankTest.java | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/test/java/com/booleanuk/core/BankTest.java b/src/test/java/com/booleanuk/core/BankTest.java index 8e905f9a4..2f399f89b 100644 --- a/src/test/java/com/booleanuk/core/BankTest.java +++ b/src/test/java/com/booleanuk/core/BankTest.java @@ -6,24 +6,34 @@ import static org.junit.jupiter.api.Assertions.*; public class BankTest { - static CurrentAccount account; + static CurrentAccount currentAccount; + static SavingsAccount savingsAccount; + @BeforeAll static void beforeAll() { - account = new CurrentAccount(); - + currentAccount = new CurrentAccount(); + savingsAccount = new SavingsAccount(); } @Test public void createCurrentAccount(){ -// CurrentAccount account = new CurrentAccount(); - assertNotNull(account, "Account created"); + assertNotNull(currentAccount, "Current account created"); } @Test - public void newAccount_ShouldHaveNoTransactions(){ - // CurrentAccount account = new CurrentAccount(); - List transactions = account.getTransactions(); - assertTrue(transactions.isEmpty(), "new account with no Transactions"); + public void newCurrentAccount_ShouldHaveNoTransactions(){ + List transactions = currentAccount.getTransactions(); + assertTrue(transactions.isEmpty(), "new current account with no Transactions"); + } + @Test + public void createSavingsAccount(){ + assertNotNull(savingsAccount, "Savings account created"); + } + + @Test + public void newSavingsAccount_ShouldHaveNoTransactions(){ + List transactions = savingsAccount.getTransactions(); + assertTrue(transactions.isEmpty(), "new savings account with no Transactions"); } } From 715e706f6c2675c460a2270aa0a62d1d7e444de8 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 13 Aug 2025 11:05:17 +0200 Subject: [PATCH 05/10] user story 2 Green : Test passed --- .../java/com/booleanuk/core/SavingsAccount.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/com/booleanuk/core/SavingsAccount.java 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..0234ccee6 --- /dev/null +++ b/src/main/java/com/booleanuk/core/SavingsAccount.java @@ -0,0 +1,16 @@ +package com.booleanuk.core; + +import java.util.ArrayList; +import java.util.List; + +public class SavingsAccount { + private List transactions; + + public SavingsAccount() { + this.transactions = new ArrayList<>(); + } + + public List getTransactions() { + return transactions; + } +} From cd735d3bd1b535fe2719f162a36dfb96bb9ad3ee Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 13 Aug 2025 11:08:15 +0200 Subject: [PATCH 06/10] user story 2 Refactor --- src/main/java/com/booleanuk/core/SavingsAccount.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/booleanuk/core/SavingsAccount.java b/src/main/java/com/booleanuk/core/SavingsAccount.java index 0234ccee6..b9353a10e 100644 --- a/src/main/java/com/booleanuk/core/SavingsAccount.java +++ b/src/main/java/com/booleanuk/core/SavingsAccount.java @@ -3,14 +3,9 @@ import java.util.ArrayList; import java.util.List; -public class SavingsAccount { - private List transactions; - - public SavingsAccount() { - this.transactions = new ArrayList<>(); +public class SavingsAccount extends Account{ + public SavingsAccount(){ + super(); } - public List getTransactions() { - return transactions; - } } From 924858d263fd70382acfb8caeb85e9047c7e23c8 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 13 Aug 2025 12:25:58 +0200 Subject: [PATCH 07/10] user story 3 Red: test --- .../java/com/booleanuk/core/BankTest.java | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/booleanuk/core/BankTest.java b/src/test/java/com/booleanuk/core/BankTest.java index 2f399f89b..4abc2dd83 100644 --- a/src/test/java/com/booleanuk/core/BankTest.java +++ b/src/test/java/com/booleanuk/core/BankTest.java @@ -4,13 +4,14 @@ import org.junit.jupiter.api.Test; import java.util.List; import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.BeforeEach; public class BankTest { - static CurrentAccount currentAccount; - static SavingsAccount savingsAccount; + CurrentAccount currentAccount; + SavingsAccount savingsAccount; - @BeforeAll - static void beforeAll() { + @BeforeEach + void setUp() { currentAccount = new CurrentAccount(); savingsAccount = new SavingsAccount(); } @@ -36,4 +37,34 @@ public void newSavingsAccount_ShouldHaveNoTransactions(){ List transactions = savingsAccount.getTransactions(); assertTrue(transactions.isEmpty(), "new savings account with no Transactions"); } + + @Test + public void savingsAccount_statement_ShouldDisplayAllTransactionsWithBalance(){ + savingsAccount.deposit(1000, "13/08/2025"); + savingsAccount.deposit(2000, "23/09/2025"); + savingsAccount.withdraw(1500, "25/09/2025"); + + List statement = savingsAccount.getStatement(); + + assertEquals("25/09/2025 || 1500.00 || 1500.00", statement.get(0)); + assertEquals("23/09/2025 || 2000.00 || 3000.00", statement.get(1)); + assertEquals("13/08/2025 || 1000.00 || 1000.00", statement.get(2)); + + } + + @Test + public void currentAccount_statement_ShouldDisplayAllTransactionsWithBalance(){ + currentAccount.deposit(10000, "12/08/2025"); + currentAccount.withdraw(1000, "13/08/2025"); + currentAccount.withdraw(2000, "23/09/2025"); + currentAccount.deposit(1500, "25/09/2025"); + + List statement2 = currentAccount.getStatement(); + + assertEquals("25/09/2025 || 1500.00 || 8500.00", statement2.get(0)); + assertEquals("23/09/2025 || 2000.00 || 7000.00", statement2.get(1)); + assertEquals("13/08/2025 || 1000.00 || 9000.00", statement2.get(2)); + assertEquals("12/08/2025 || 10000.00 || 10000.00", statement2.get(3)); + + } } From b3687b0a865b3eabde9ba5360fae912cfe1eb9c8 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 13 Aug 2025 13:34:15 +0200 Subject: [PATCH 08/10] user story 3 Green: test passed --- src/main/java/com/booleanuk/core/Account.java | 37 +++++++++++++++++++ .../java/com/booleanuk/core/Transaction.java | 21 +++++++++++ 2 files changed, 58 insertions(+) diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index d2468f1df..24bcfc9ae 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -2,15 +2,52 @@ import java.util.ArrayList; import java.util.List; +import java.util.Locale; public abstract class Account { protected List transactions; + protected double balance; public Account(){ this.transactions = new ArrayList<>(); + this.balance = 0; } public List getTransactions(){ return transactions; } + + public void deposit(double amount, String date){ + balance+= amount; + transactions.add(new Transaction(date, amount, "deposit")); + } + + public void withdraw(double amount, String date){ + balance -= amount; + transactions.add(new Transaction(date, amount, "withdraw")); + } + + public List getStatement() { + List statement = new ArrayList<>(); + double runningBalance = balance; + + for (int i = transactions.size() - 1; i >= 0; i--) { + Transaction t = transactions.get(i); + String line; + + if (t.getType().equals("deposit")) { + line = String.format(Locale.US, "%s || %.2f || %.2f", t.getDate(), t.getAmount(), runningBalance); + runningBalance -= t.getAmount(); + } else if (t.getType().equals("withdraw")) { + line = String.format(Locale.US, "%s || %.2f || %.2f", t.getDate(), t.getAmount(), runningBalance); + runningBalance += t.getAmount(); + } else { + continue; + } + statement.add(line); + } + + return statement; + } + } diff --git a/src/main/java/com/booleanuk/core/Transaction.java b/src/main/java/com/booleanuk/core/Transaction.java index a85f5696b..8cf8e597a 100644 --- a/src/main/java/com/booleanuk/core/Transaction.java +++ b/src/main/java/com/booleanuk/core/Transaction.java @@ -1,4 +1,25 @@ package com.booleanuk.core; public class Transaction { + private final String date; + private final double amount; + private final String type; + + public Transaction(String date, double amount, String type){ + this.date = date; + this.amount = amount; + this.type = type; + } + + public String getDate() { + return date; + } + + public double getAmount() { + return amount; + } + + public String getType() { + return type; + } } From a30a74ef7f5705173ab1499b6a413b5908116eed Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 13 Aug 2025 14:56:07 +0200 Subject: [PATCH 09/10] user story 3+4 refactor --- src/main/java/com/booleanuk/core/Account.java | 50 +++++++++---------- .../java/com/booleanuk/core/Transaction.java | 35 ++++++++++--- .../java/com/booleanuk/core/BankTest.java | 17 ++++--- 3 files changed, 61 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index 24bcfc9ae..861c65c89 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -2,12 +2,16 @@ import java.util.ArrayList; import java.util.List; -import java.util.Locale; +import java.util.Collections; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; public abstract class Account { protected List transactions; protected double balance; + private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); + public Account(){ this.transactions = new ArrayList<>(); this.balance = 0; @@ -17,37 +21,33 @@ public List getTransactions(){ return transactions; } - public void deposit(double amount, String date){ - balance+= amount; - transactions.add(new Transaction(date, amount, "deposit")); + public void deposit(double amount, LocalDate date) { + balance += amount; + transactions.add(new Transaction(date, amount, balance)); } - public void withdraw(double amount, String date){ + public void withdraw(double amount, LocalDate date) { balance -= amount; - transactions.add(new Transaction(date, amount, "withdraw")); + transactions.add(new Transaction(date, -amount, balance)); + } + + public void deposit(double amount) { + deposit(amount, LocalDate.now()); + } + + public void withdraw(double amount) { + withdraw(amount, LocalDate.now()); } public List getStatement() { - List statement = new ArrayList<>(); - double runningBalance = balance; - - for (int i = transactions.size() - 1; i >= 0; i--) { - Transaction t = transactions.get(i); - String line; - - if (t.getType().equals("deposit")) { - line = String.format(Locale.US, "%s || %.2f || %.2f", t.getDate(), t.getAmount(), runningBalance); - runningBalance -= t.getAmount(); - } else if (t.getType().equals("withdraw")) { - line = String.format(Locale.US, "%s || %.2f || %.2f", t.getDate(), t.getAmount(), runningBalance); - runningBalance += t.getAmount(); - } else { - continue; - } - statement.add(line); - } + List reversed = new ArrayList<>(transactions); + Collections.reverse(reversed); - return statement; + List statementLines = new ArrayList<>(); + for (Transaction t : reversed) { + statementLines.add(t.toString()); } + return statementLines; + } } diff --git a/src/main/java/com/booleanuk/core/Transaction.java b/src/main/java/com/booleanuk/core/Transaction.java index 8cf8e597a..c7addd84d 100644 --- a/src/main/java/com/booleanuk/core/Transaction.java +++ b/src/main/java/com/booleanuk/core/Transaction.java @@ -1,17 +1,23 @@ package com.booleanuk.core; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Locale; + public class Transaction { - private final String date; - private final double amount; - private final String type; + private LocalDate date; + private double amount; + private double balanceAfter; + + private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); - public Transaction(String date, double amount, String type){ + public Transaction(LocalDate date, double amount, double balanceAfter) { this.date = date; this.amount = amount; - this.type = type; + this.balanceAfter = balanceAfter; } - public String getDate() { + public LocalDate getDate() { return date; } @@ -19,7 +25,20 @@ public double getAmount() { return amount; } - public String getType() { - return type; + public double getBalanceAfter() { + return balanceAfter; + } + + @Override + public String toString() { + if (amount > 0) { + return date.format(formatter) + " || " + + String.format(Locale.US, "%.2f", amount) + " || " + + String.format(Locale.US, "%.2f", balanceAfter); + } else { + return date.format(formatter) + " || " + + String.format(Locale.US, "%.2f", Math.abs(amount)) + " || " + + String.format(Locale.US, "%.2f", balanceAfter); + } } } diff --git a/src/test/java/com/booleanuk/core/BankTest.java b/src/test/java/com/booleanuk/core/BankTest.java index 4abc2dd83..dd5424ba3 100644 --- a/src/test/java/com/booleanuk/core/BankTest.java +++ b/src/test/java/com/booleanuk/core/BankTest.java @@ -2,6 +2,8 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; + +import java.time.LocalDate; import java.util.List; import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.BeforeEach; @@ -40,9 +42,9 @@ public void newSavingsAccount_ShouldHaveNoTransactions(){ @Test public void savingsAccount_statement_ShouldDisplayAllTransactionsWithBalance(){ - savingsAccount.deposit(1000, "13/08/2025"); - savingsAccount.deposit(2000, "23/09/2025"); - savingsAccount.withdraw(1500, "25/09/2025"); + savingsAccount.deposit(1000, LocalDate.of(2025, 8, 13)); + savingsAccount.deposit(2000, LocalDate.of(2025, 9, 23)); + savingsAccount.withdraw(1500, LocalDate.of(2025, 9, 25)); List statement = savingsAccount.getStatement(); @@ -54,10 +56,10 @@ public void savingsAccount_statement_ShouldDisplayAllTransactionsWithBalance(){ @Test public void currentAccount_statement_ShouldDisplayAllTransactionsWithBalance(){ - currentAccount.deposit(10000, "12/08/2025"); - currentAccount.withdraw(1000, "13/08/2025"); - currentAccount.withdraw(2000, "23/09/2025"); - currentAccount.deposit(1500, "25/09/2025"); + currentAccount.deposit(10000, LocalDate.of(2025, 8, 12)); + currentAccount.withdraw(1000, LocalDate.of(2025, 8, 13)); + currentAccount.withdraw(2000, LocalDate.of(2025, 9, 23)); + currentAccount.deposit(1500, LocalDate.of(2025, 9, 25)); List statement2 = currentAccount.getStatement(); @@ -65,6 +67,5 @@ public void currentAccount_statement_ShouldDisplayAllTransactionsWithBalance(){ assertEquals("23/09/2025 || 2000.00 || 7000.00", statement2.get(1)); assertEquals("13/08/2025 || 1000.00 || 9000.00", statement2.get(2)); assertEquals("12/08/2025 || 10000.00 || 10000.00", statement2.get(3)); - } } From 134f92193b5725bee32a05ca2e0db054c1af9344 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 13 Aug 2025 16:06:04 +0200 Subject: [PATCH 10/10] domain model and class diagram --- domain.md | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 domain.md diff --git a/domain.md b/domain.md new file mode 100644 index 000000000..1b13cff49 --- /dev/null +++ b/domain.md @@ -0,0 +1,88 @@ +# Domain Model + +## Classes + +### Account (abstract) +- Variables: + - `balance: double` + - `transactions: List` +- Methods: + - `deposit(amount: double, date: LocalDate)` + - `withdraw(amount: double, date: LocalDate)` + - `getTransactions(): List` + - `getStatement(): List` + +### CurrentAccount (extends Account) +- Variables: - +- Methods: inherits everything from Account + +### SavingsAccount (extends Account) +- Variables: - +- Methods: inherits everything from Account + +### Transaction +- Variables: + - `date: LocalDate` + - `amount: double` + - `resultingBalance: double` +- Methods: + - `toString(): String` + +## Scenario + +1. A customer creates a `SavingsAccount`. +2. The customer deposits €1000 on 13/08/2025. +3. The customer deposits €2000 on 23/09/2025. +4. The customer withdraws €1500 on 25/09/2025. +5. The customer requests the account statement. + +## Output + +1. 25/09/2025 || 1500.00 || 1500.00 +2. 23/09/2025 || 2000.00 || 3000.00 +3. 13/08/2025 || 1000.00 || 1000.00 + + +# Class diagram + +``` +------------------ +| Account | <> +------------------ +| - balance: double +| - transactions: List +------------------ +| + deposit(amount: double, date: LocalDate) +| + withdraw(amount: double, date: LocalDate) +| + deposit(amount: double) +| + withdraw(amount: double) +| + getTransactions(): List +| + getStatement(): List +----------------- +--------------------- + +------------------ +| CurrentAccount | +------------------ +| (no extra) | +------------------ + +--------------------- + +------------------ +| SavingsAccount | +-----------------+ +| (no extra) | +------------------ + +--------------------- + +------------------ +| Transaction | +------------------ +| - date: LocalDate +| - amount: double +| - balance: double +------------------ +| + toString(): String +------------------