From aee2588e3d5a6a97aa06306b7df2ffc2163974bd Mon Sep 17 00:00:00 2001 From: Marie Helene Hansen Date: Wed, 13 Aug 2025 10:15:30 +0200 Subject: [PATCH 01/10] Marie Helene Hansen --- src/main/java/com/booleanuk/core/Account.java | 49 +++++++++++++++++++ .../java/com/booleanuk/core/BankManager.java | 6 +++ .../com/booleanuk/core/CurrentAccount.java | 8 +++ .../com/booleanuk/core/SavingsAccount.java | 8 +++ .../java/com/booleanuk/core/domain-model.md | 16 ++++++ .../java/com/booleanuk/core/CoreTest.java | 33 +++++++++++++ 6 files changed, 120 insertions(+) create mode 100644 src/main/java/com/booleanuk/core/Account.java create mode 100644 src/main/java/com/booleanuk/core/BankManager.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/main/java/com/booleanuk/core/domain-model.md create mode 100644 src/test/java/com/booleanuk/core/CoreTest.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..118853934 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Account.java @@ -0,0 +1,49 @@ +package com.booleanuk.core; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.Map; + +abstract public class Account { + + private float balance; + private final int accountId; + private Map transactions; + + public Account(int accountNumber) { + this.accountId = accountNumber; + transactions = new HashMap<>(); + } + + public float getBalance() { + return this.balance; + } + + public int getAccountId() { + return this.accountId; + } + + public Map getTransactions() { + return this.transactions; + } + + public void deposit(float amount) { + // works, but in tests when I make deposit and withdraw the time is the same + // add something to wait in test?? + //transactions.put(dtFormatter(LocalDateTime.now()), amount); + transactions.put("Now", amount); + this.balance += amount; + } + + public void withdraw(float amount) { + //transactions.put(dtFormatter(LocalDateTime.now()), -amount); + transactions.put("Later", -amount); + this.balance -= amount; + } + + private String dtFormatter(LocalDateTime date) { + DateTimeFormatter dtForm = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss"); + return dtForm.format(date); + } +} diff --git a/src/main/java/com/booleanuk/core/BankManager.java b/src/main/java/com/booleanuk/core/BankManager.java new file mode 100644 index 000000000..9951b3b11 --- /dev/null +++ b/src/main/java/com/booleanuk/core/BankManager.java @@ -0,0 +1,6 @@ +package com.booleanuk.core; + +public class BankManager { + + +} 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..985004e70 --- /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(int accountNumber) { + super(accountNumber); + } +} 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..aef53d5fe --- /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(int accountNumber) { + super(accountNumber); + } +} diff --git a/src/main/java/com/booleanuk/core/domain-model.md b/src/main/java/com/booleanuk/core/domain-model.md new file mode 100644 index 000000000..d19fcec11 --- /dev/null +++ b/src/main/java/com/booleanuk/core/domain-model.md @@ -0,0 +1,16 @@ +| Classes | Members | Methods | Scenarios | Outputs | +|---------|----------------------------------------------------------------------|-------------------------------|---------------------|--------------------| +| Account | Map transactions, float balance, int accountId | deposit(float amount) | amount > 0 | balance += amount | +| | | | amount < 0 | nothing happens | +| | | withdraw(float amount) | amount < balance | balance -= amount | +| | | | amount > balance | nothing happens | +| | | getTransactions() | has transactions | List | +| | | | no transactions | null | +| | | getBalance() | | balance | +| | | getAccountId() | | accountId | +| | | dtFormatter(LocalDateTime dt) | dt is LocalDateTime | String | +| Manager | List accounts | overdraft(Account acc) | allow | true | +| | | | deny | false | + + + diff --git a/src/test/java/com/booleanuk/core/CoreTest.java b/src/test/java/com/booleanuk/core/CoreTest.java new file mode 100644 index 000000000..6174a0b1c --- /dev/null +++ b/src/test/java/com/booleanuk/core/CoreTest.java @@ -0,0 +1,33 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +public class CoreTest { + + // ACCOUNT + @Test + public void shouldGetBalance() { + Account a = new SavingsAccount(1); + a.deposit(100.0f); + a.withdraw(60.0f); + Assertions.assertEquals(40.0f, a.getBalance()); + } + + @Test + public void shouldGetAccountNumber() { + Account a = new CurrentAccount(2); + Assertions.assertEquals(2, a.getAccountId()); + } + + @Test + public void shouldGetTransactions() { + Account a = new SavingsAccount(1); + a.deposit(100.0f); + a.withdraw(50.0f); + Map map = a.getTransactions(); + Assertions.assertEquals(2, map.size()); + } +} From 1e6f2d89fa5cee644c3a4c67bcbc8db2e2265dfd Mon Sep 17 00:00:00 2001 From: Marie Helene Hansen Date: Wed, 13 Aug 2025 10:33:50 +0200 Subject: [PATCH 02/10] Marie Helene Hansen --- .../java/com/booleanuk/core/BankManager.java | 20 +++++++++++++ src/main/java/com/booleanuk/core/Branch.java | 17 +++++++++++ .../java/com/booleanuk/core/domain-model.md | 29 ++++++++++--------- .../java/com/booleanuk/core/CoreTest.java | 3 ++ 4 files changed, 56 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/booleanuk/core/Branch.java diff --git a/src/main/java/com/booleanuk/core/BankManager.java b/src/main/java/com/booleanuk/core/BankManager.java index 9951b3b11..3ee926314 100644 --- a/src/main/java/com/booleanuk/core/BankManager.java +++ b/src/main/java/com/booleanuk/core/BankManager.java @@ -1,6 +1,26 @@ package com.booleanuk.core; +import java.util.ArrayList; +import java.util.List; + public class BankManager { + // private List accounts; // needed? each branch has the list + private List branches; + + public BankManager() { + this.branches = new ArrayList<>(); + } + public List getAccounts(Branch branch) { + for (Branch b : branches) { + if (b.equals(branch) && !branch.getAccounts().isEmpty()) { + return branch.getAccounts(); + } + else { + System.out.println("Branch does not have any accounts."); + } + } + return null; + } } diff --git a/src/main/java/com/booleanuk/core/Branch.java b/src/main/java/com/booleanuk/core/Branch.java new file mode 100644 index 000000000..3ad34d989 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Branch.java @@ -0,0 +1,17 @@ +package com.booleanuk.core; + +import java.util.ArrayList; +import java.util.List; + +public class Branch { + + private List accounts; + + public Branch() { + this.accounts = new ArrayList<>(); + } + + public List getAccounts() { + return this.accounts; + } +} diff --git a/src/main/java/com/booleanuk/core/domain-model.md b/src/main/java/com/booleanuk/core/domain-model.md index d19fcec11..2c8bcefd4 100644 --- a/src/main/java/com/booleanuk/core/domain-model.md +++ b/src/main/java/com/booleanuk/core/domain-model.md @@ -1,16 +1,19 @@ -| Classes | Members | Methods | Scenarios | Outputs | -|---------|----------------------------------------------------------------------|-------------------------------|---------------------|--------------------| -| Account | Map transactions, float balance, int accountId | deposit(float amount) | amount > 0 | balance += amount | -| | | | amount < 0 | nothing happens | -| | | withdraw(float amount) | amount < balance | balance -= amount | -| | | | amount > balance | nothing happens | -| | | getTransactions() | has transactions | List | -| | | | no transactions | null | -| | | getBalance() | | balance | -| | | getAccountId() | | accountId | -| | | dtFormatter(LocalDateTime dt) | dt is LocalDateTime | String | -| Manager | List accounts | overdraft(Account acc) | allow | true | -| | | | deny | false | +| Classes | Members | Methods | Scenarios | Outputs | +|-------------|----------------------------------------------------------------------|-------------------------------|---------------------|--------------------| +| Account | Map transactions, float balance, int accountId | deposit(float amount) | amount > 0 | balance += amount | +| | | | amount < 0 | nothing happens | +| | | withdraw(float amount) | amount < balance | balance -= amount | +| | | | amount > balance | nothing happens | +| | | getTransactions() | has transactions | List | +| | | | no transactions | null | +| | | getBalance() | | balance | +| | | getAccountId() | | accountId | +| | | dtFormatter(LocalDateTime dt) | dt is LocalDateTime | String | +| BankManager | List branches | allowOverdraft(Account acc) | allow | true | +| | | | deny | false | +| | | getAccounts(Branch b) | b has accounts | b.getAccounts() | +| | | | b has no accounts | null | +| Branch | List accounts | getAccounts() | | accounts | diff --git a/src/test/java/com/booleanuk/core/CoreTest.java b/src/test/java/com/booleanuk/core/CoreTest.java index 6174a0b1c..937d084f2 100644 --- a/src/test/java/com/booleanuk/core/CoreTest.java +++ b/src/test/java/com/booleanuk/core/CoreTest.java @@ -30,4 +30,7 @@ public void shouldGetTransactions() { Map map = a.getTransactions(); Assertions.assertEquals(2, map.size()); } + + // BANK MANAGER + } From 0c28ebe0407e3b632d77d25a6a3810970df65b65 Mon Sep 17 00:00:00 2001 From: Marie Helene Hansen Date: Wed, 13 Aug 2025 10:42:19 +0200 Subject: [PATCH 03/10] Marie Helene Hansen --- .../java/com/booleanuk/core/BankManager.java | 8 +++++++ src/main/java/com/booleanuk/core/Branch.java | 4 ++++ .../java/com/booleanuk/core/CoreTest.java | 21 +++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/src/main/java/com/booleanuk/core/BankManager.java b/src/main/java/com/booleanuk/core/BankManager.java index 3ee926314..f8108d754 100644 --- a/src/main/java/com/booleanuk/core/BankManager.java +++ b/src/main/java/com/booleanuk/core/BankManager.java @@ -12,6 +12,14 @@ public BankManager() { this.branches = new ArrayList<>(); } + public void addBranch(Branch b) { + this.branches.add(b); + } + + public List getBranches() { + return this.branches; + } + public List getAccounts(Branch branch) { for (Branch b : branches) { if (b.equals(branch) && !branch.getAccounts().isEmpty()) { diff --git a/src/main/java/com/booleanuk/core/Branch.java b/src/main/java/com/booleanuk/core/Branch.java index 3ad34d989..19ee0af86 100644 --- a/src/main/java/com/booleanuk/core/Branch.java +++ b/src/main/java/com/booleanuk/core/Branch.java @@ -11,6 +11,10 @@ public Branch() { this.accounts = new ArrayList<>(); } + public void addAccount(Account a) { + this.accounts.add(a); + } + public List getAccounts() { return this.accounts; } diff --git a/src/test/java/com/booleanuk/core/CoreTest.java b/src/test/java/com/booleanuk/core/CoreTest.java index 937d084f2..c960631e0 100644 --- a/src/test/java/com/booleanuk/core/CoreTest.java +++ b/src/test/java/com/booleanuk/core/CoreTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.List; import java.util.Map; public class CoreTest { @@ -32,5 +33,25 @@ public void shouldGetTransactions() { } // BANK MANAGER + @Test + public void shouldHaveBranch() { + BankManager bm = new BankManager(); + Branch b = new Branch(); + Account sa = new SavingsAccount(1); + Account ca = new CurrentAccount(2); + bm.addBranch(b); + b.addAccount(sa); + b.addAccount(ca); + Assertions.assertEquals(List.of(sa, ca), bm.getAccounts(b)); + } + @Test + public void shouldGetBranches() { + BankManager bm = new BankManager(); + Branch b1 = new Branch(); + Branch b2 = new Branch(); + bm.addBranch(b1); + bm.addBranch(b2); + Assertions.assertEquals(List.of(b1, b2), bm.getBranches()); + } } From 38262b73a530eb9e980cdff45e03a02a95014853 Mon Sep 17 00:00:00 2001 From: Marie Helene Hansen Date: Wed, 13 Aug 2025 13:24:21 +0200 Subject: [PATCH 04/10] Marie Helene Hansen --- src/main/java/com/booleanuk/core/Account.java | 54 ++++++++++++++----- .../java/com/booleanuk/core/BankManager.java | 8 +++ .../java/com/booleanuk/core/Transaction.java | 38 +++++++++++++ .../java/com/booleanuk/core/CoreTest.java | 2 +- 4 files changed, 88 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/booleanuk/core/Transaction.java diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index 118853934..83478e3ed 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -1,6 +1,6 @@ package com.booleanuk.core; -import java.time.LocalDateTime; +import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.Map; @@ -9,7 +9,7 @@ abstract public class Account { private float balance; private final int accountId; - private Map transactions; + private Map transactions; // public Account(int accountNumber) { this.accountId = accountNumber; @@ -24,26 +24,54 @@ public int getAccountId() { return this.accountId; } - public Map getTransactions() { + public Map getTransactions() { return this.transactions; } public void deposit(float amount) { - // works, but in tests when I make deposit and withdraw the time is the same - // add something to wait in test?? - //transactions.put(dtFormatter(LocalDateTime.now()), amount); - transactions.put("Now", amount); - this.balance += amount; + try { + Thread.sleep(1000); + } + catch (InterruptedException e) { + e.printStackTrace(); + } + this.balance = this.balance + amount; + Transaction tr = new Transaction(dtFormatter(LocalDate.now()), amount, "credit"); + transactions.put(tr.getTransactionId(), tr); } public void withdraw(float amount) { - //transactions.put(dtFormatter(LocalDateTime.now()), -amount); - transactions.put("Later", -amount); - this.balance -= amount; + try { + Thread.sleep(1000); + } + catch (InterruptedException e) { + e.printStackTrace(); + } + this.balance = this.balance - amount; + Transaction tr = new Transaction(dtFormatter(LocalDate.now()), amount, "debit"); + transactions.put(tr.getTransactionId(), tr); } - private String dtFormatter(LocalDateTime date) { - DateTimeFormatter dtForm = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss"); + private String dtFormatter(LocalDate date) { + DateTimeFormatter dtForm = DateTimeFormatter.ofPattern("dd-MM-yyyy"); return dtForm.format(date); } + + public String toString() { + String str = ""; + str += String.format("%-15s || %-15s || %-15s || %s" , "date", "credit", "debit", "balance" ); + + for (Map.Entry entry : this.transactions.entrySet()) { + str += "\n"; + if (entry.getValue().getType().equals("credit")) { + str += String.format("%-15s || %-15s || %-15s || %s" , entry.getValue().getTime(), entry.getValue().getAmount(), " ", this.balance); + } + else if (entry.getValue().getType().equals("debit")) { + str += String.format("%-15s || %-15s || %-15s || %s" , entry.getValue().getTime(), " " , entry.getValue().getAmount() , this.balance); + } + else { break; } + } + + return str; + } } diff --git a/src/main/java/com/booleanuk/core/BankManager.java b/src/main/java/com/booleanuk/core/BankManager.java index f8108d754..518782b54 100644 --- a/src/main/java/com/booleanuk/core/BankManager.java +++ b/src/main/java/com/booleanuk/core/BankManager.java @@ -31,4 +31,12 @@ public List getAccounts(Branch branch) { } return null; } + + public static void main(String[] args) { + Account a = new CurrentAccount(1); + a.deposit(100); + a.deposit(200); + a.withdraw(40); + System.out.println(a.toString()); + } } 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..15a3578c3 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Transaction.java @@ -0,0 +1,38 @@ +package com.booleanuk.core; + +public class Transaction { + + private String time; + private float amount; + private String type; + private final int transactionId; // bad for testing ;( + private static int nextTransactionId = 1; + + public Transaction(String time, float amount, String type) { + this.time = time; + this.amount = amount; + this.type = type; + this.transactionId = nextTransactionId++; + } + + public String getType() { + return this.type; + } + + public float getAmount() { + return this.amount; + } + + public int getTransactionId() { + return this.transactionId; + } + + public String getTime() { + return this.time; + } + + @Override + public String toString() { + return ""; + } +} diff --git a/src/test/java/com/booleanuk/core/CoreTest.java b/src/test/java/com/booleanuk/core/CoreTest.java index c960631e0..c4f515737 100644 --- a/src/test/java/com/booleanuk/core/CoreTest.java +++ b/src/test/java/com/booleanuk/core/CoreTest.java @@ -28,7 +28,7 @@ public void shouldGetTransactions() { Account a = new SavingsAccount(1); a.deposit(100.0f); a.withdraw(50.0f); - Map map = a.getTransactions(); + Map map = a.getTransactions(); Assertions.assertEquals(2, map.size()); } From 7f189954351691fd33efc196e91061d02900baca Mon Sep 17 00:00:00 2001 From: Marie Helene Hansen Date: Wed, 13 Aug 2025 15:14:36 +0200 Subject: [PATCH 05/10] overdraft extension --- src/main/java/com/booleanuk/core/Account.java | 27 +++++++++--- .../java/com/booleanuk/core/BankManager.java | 20 ++++++--- .../java/com/booleanuk/core/Transaction.java | 11 ++--- .../java/com/booleanuk/core/domain-model.md | 42 ++++++++++++------- .../java/com/booleanuk/core/CoreTest.java | 1 + 5 files changed, 67 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index 83478e3ed..73e20e674 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -10,10 +10,12 @@ abstract public class Account { private float balance; private final int accountId; private Map transactions; // + private BankManager bm; public Account(int accountNumber) { this.accountId = accountNumber; transactions = new HashMap<>(); + this.bm = new BankManager(); } public float getBalance() { @@ -25,6 +27,9 @@ public int getAccountId() { } public Map getTransactions() { + for (Map.Entry entry : this.transactions.entrySet()) { + System.out.println(entry.getValue().getAmount()); + } return this.transactions; } @@ -35,9 +40,9 @@ public void deposit(float amount) { catch (InterruptedException e) { e.printStackTrace(); } - this.balance = this.balance + amount; + this.balance += amount; Transaction tr = new Transaction(dtFormatter(LocalDate.now()), amount, "credit"); - transactions.put(tr.getTransactionId(), tr); + this.transactions.put(tr.getTransactionId(), tr); } public void withdraw(float amount) { @@ -47,7 +52,14 @@ public void withdraw(float amount) { catch (InterruptedException e) { e.printStackTrace(); } - this.balance = this.balance - amount; + if (amount > this.balance && this.bm.approveOverdraft(this, amount)) { + this.balance -= amount; + } + else if (amount > this.getBalance() && this.bm.approveOverdraft(this, amount)) { + System.out.println("Not sufficient funds."); + return; + } + this.balance -= amount; Transaction tr = new Transaction(dtFormatter(LocalDate.now()), amount, "debit"); transactions.put(tr.getTransactionId(), tr); } @@ -58,16 +70,21 @@ private String dtFormatter(LocalDate date) { } public String toString() { + float b = 0; String str = ""; str += String.format("%-15s || %-15s || %-15s || %s" , "date", "credit", "debit", "balance" ); + str += "\n"; + str += String.format("%-15s || %-15s || %-15s || %s" , "-----------", "-----------", "-----------", "-----------" ); for (Map.Entry entry : this.transactions.entrySet()) { str += "\n"; if (entry.getValue().getType().equals("credit")) { - str += String.format("%-15s || %-15s || %-15s || %s" , entry.getValue().getTime(), entry.getValue().getAmount(), " ", this.balance); + b += entry.getValue().getAmount(); + str += String.format("%-15s || %-15s || %-15s || %s" , entry.getValue().getTime(), entry.getValue().getAmount(), " ", b); } else if (entry.getValue().getType().equals("debit")) { - str += String.format("%-15s || %-15s || %-15s || %s" , entry.getValue().getTime(), " " , entry.getValue().getAmount() , this.balance); + b -= entry.getValue().getAmount(); + str += String.format("%-15s || %-15s || %-15s || %s" , entry.getValue().getTime(), " " , entry.getValue().getAmount() , b); } else { break; } } diff --git a/src/main/java/com/booleanuk/core/BankManager.java b/src/main/java/com/booleanuk/core/BankManager.java index 518782b54..f50e7a028 100644 --- a/src/main/java/com/booleanuk/core/BankManager.java +++ b/src/main/java/com/booleanuk/core/BankManager.java @@ -32,11 +32,21 @@ public List getAccounts(Branch branch) { return null; } + public boolean approveOverdraft(Account account, float amount) { + if (account instanceof CurrentAccount && account.getBalance() - amount < 5000) { + return true; + } + return false; + } + public static void main(String[] args) { - Account a = new CurrentAccount(1); - a.deposit(100); - a.deposit(200); - a.withdraw(40); - System.out.println(a.toString()); + Account account = new CurrentAccount(1); + account.deposit(100000); + account.getTransactions(); + account.deposit(200); + account.getTransactions(); + account.withdraw(50); + account.getTransactions(); + System.out.println(account.toString()); } } diff --git a/src/main/java/com/booleanuk/core/Transaction.java b/src/main/java/com/booleanuk/core/Transaction.java index 15a3578c3..518026756 100644 --- a/src/main/java/com/booleanuk/core/Transaction.java +++ b/src/main/java/com/booleanuk/core/Transaction.java @@ -2,9 +2,9 @@ public class Transaction { - private String time; - private float amount; - private String type; + private final String time; + private final float amount; + private final String type; private final int transactionId; // bad for testing ;( private static int nextTransactionId = 1; @@ -30,9 +30,4 @@ public int getTransactionId() { public String getTime() { return this.time; } - - @Override - public String toString() { - return ""; - } } diff --git a/src/main/java/com/booleanuk/core/domain-model.md b/src/main/java/com/booleanuk/core/domain-model.md index 2c8bcefd4..cb15c210d 100644 --- a/src/main/java/com/booleanuk/core/domain-model.md +++ b/src/main/java/com/booleanuk/core/domain-model.md @@ -1,19 +1,29 @@ -| Classes | Members | Methods | Scenarios | Outputs | -|-------------|----------------------------------------------------------------------|-------------------------------|---------------------|--------------------| -| Account | Map transactions, float balance, int accountId | deposit(float amount) | amount > 0 | balance += amount | -| | | | amount < 0 | nothing happens | -| | | withdraw(float amount) | amount < balance | balance -= amount | -| | | | amount > balance | nothing happens | -| | | getTransactions() | has transactions | List | -| | | | no transactions | null | -| | | getBalance() | | balance | -| | | getAccountId() | | accountId | -| | | dtFormatter(LocalDateTime dt) | dt is LocalDateTime | String | -| BankManager | List branches | allowOverdraft(Account acc) | allow | true | -| | | | deny | false | -| | | getAccounts(Branch b) | b has accounts | b.getAccounts() | -| | | | b has no accounts | null | -| Branch | List accounts | getAccounts() | | accounts | +| Classes | Members | Methods | Scenarios | Outputs | +|----------------|----------------------------------------------------------------------|-------------------------------|---------------------|--------------------| +| Account | Map transactions, float balance, int accountId | deposit(float amount) | amount > 0 | balance += amount | +| | | | amount < 0 | nothing happens | +| | | withdraw(float amount) | amount < balance | balance -= amount | +| | | | amount > balance | nothing happens | +| | | getTransactions() | has transactions | List | +| | | | no transactions | null | +| | | getBalance() | | this.balance | +| | | getAccountId() | | this.accountId | +| | | dtFormatter(LocalDateTime dt) | dt is LocalDateTime | String | +| | | toString() | | this.toString() | +| SavingsAccount | | | | | +| CurrentAccount | | | | | +| BankManager | List branches | allowOverdraft(Account acc) | allow | true | +| | | | deny | false | +| | | getAccounts(Branch b) | b has accounts | b.getAccounts() | +| | | | b has no accounts | null | +| Branch | List accounts | getAccounts() | | this.accounts | +| | | addAccount(Account a) | | void | +| Transaction | String time, float amount, String type, int transactionId | getType() | | int | +| | | getAmount() | | float | +| | | getTransactionId() | | int | +| | | getTime() | | String | + + diff --git a/src/test/java/com/booleanuk/core/CoreTest.java b/src/test/java/com/booleanuk/core/CoreTest.java index c4f515737..220a637e2 100644 --- a/src/test/java/com/booleanuk/core/CoreTest.java +++ b/src/test/java/com/booleanuk/core/CoreTest.java @@ -8,6 +8,7 @@ public class CoreTest { + // ACCOUNT @Test public void shouldGetBalance() { From 99d1e91fd803004f2386feea4a176f9bd16bb178 Mon Sep 17 00:00:00 2001 From: mariehhansen Date: Wed, 13 Aug 2025 15:42:26 +0200 Subject: [PATCH 06/10] class diagram --- .../java/com/booleanuk/core/class-diagram.png | Bin 0 -> 74423 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/java/com/booleanuk/core/class-diagram.png diff --git a/src/main/java/com/booleanuk/core/class-diagram.png b/src/main/java/com/booleanuk/core/class-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..9e92f687f7cee9c68830280b418d9f376110fb45 GIT binary patch literal 74423 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ᶅtXWIllR~`5S{V&f!q&B!e72ovf3` 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 AQvd(} literal 0 HcmV?d00001 From 81e2dea1964ce544145fc29d2b4765211d90f9fe Mon Sep 17 00:00:00 2001 From: Marie Helene Hansen Date: Wed, 13 Aug 2025 16:02:28 +0200 Subject: [PATCH 07/10] testing --- .../java/com/booleanuk/core/BankManager.java | 1 - .../java/com/booleanuk/core/CoreTest.java | 83 +++++++++++++++---- 2 files changed, 67 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/booleanuk/core/BankManager.java b/src/main/java/com/booleanuk/core/BankManager.java index f50e7a028..697c21bf9 100644 --- a/src/main/java/com/booleanuk/core/BankManager.java +++ b/src/main/java/com/booleanuk/core/BankManager.java @@ -5,7 +5,6 @@ public class BankManager { - // private List accounts; // needed? each branch has the list private List branches; public BankManager() { diff --git a/src/test/java/com/booleanuk/core/CoreTest.java b/src/test/java/com/booleanuk/core/CoreTest.java index 220a637e2..c18e785ca 100644 --- a/src/test/java/com/booleanuk/core/CoreTest.java +++ b/src/test/java/com/booleanuk/core/CoreTest.java @@ -8,10 +8,18 @@ public class CoreTest { + // BRANCH + @Test + void addAndGetAccount() { + Account a = new SavingsAccount(1); + Branch b = new Branch(); + b.addAccount(a); + Assertions.assertEquals(List.of(a), b.getAccounts()); + } // ACCOUNT @Test - public void shouldGetBalance() { + public void getBalance() { Account a = new SavingsAccount(1); a.deposit(100.0f); a.withdraw(60.0f); @@ -19,13 +27,13 @@ public void shouldGetBalance() { } @Test - public void shouldGetAccountNumber() { + public void getAccountNumber() { Account a = new CurrentAccount(2); Assertions.assertEquals(2, a.getAccountId()); } @Test - public void shouldGetTransactions() { + public void getTransactionsAccount() { Account a = new SavingsAccount(1); a.deposit(100.0f); a.withdraw(50.0f); @@ -33,26 +41,69 @@ public void shouldGetTransactions() { Assertions.assertEquals(2, map.size()); } + @Test + void getAccountId() { + Account a = new SavingsAccount(1); + Assertions.assertEquals(1, a.getAccountId()); + } + + @Test + void deposit() { + Account a = new CurrentAccount(1); + a.deposit(100); + Assertions.assertEquals(100, a.getBalance()); + } + + @Test + void withdraw() { + Account a = new CurrentAccount(1); + a.deposit(100); + a.withdraw(1); + Assertions.assertEquals(99, a.getBalance()); + } + + @Test + void approveOverdraft() { + BankManager bm = new BankManager(); + Account a = new CurrentAccount(1); + a.deposit(100); + Assertions.assertFalse(bm.approveOverdraft(a, 100000)); + } + // BANK MANAGER @Test - public void shouldHaveBranch() { + public void addBranch() { BankManager bm = new BankManager(); Branch b = new Branch(); - Account sa = new SavingsAccount(1); - Account ca = new CurrentAccount(2); - bm.addBranch(b); - b.addAccount(sa); - b.addAccount(ca); - Assertions.assertEquals(List.of(sa, ca), bm.getAccounts(b)); + Assertions.assertEquals(List.of(b), bm.getBranches()); } @Test - public void shouldGetBranches() { + void getAccounts() { BankManager bm = new BankManager(); - Branch b1 = new Branch(); - Branch b2 = new Branch(); - bm.addBranch(b1); - bm.addBranch(b2); - Assertions.assertEquals(List.of(b1, b2), bm.getBranches()); + Branch b = new Branch(); + Account a = new SavingsAccount(1); + Assertions.assertEquals(List.of(a), bm.getAccounts(b)); + } + + // TRANSACTION + @Test + void getType() { + Transaction tr = new Transaction("123", 123, "credit"); + Assertions.assertEquals("123", tr.getTime()); + } + + @Test + void getAmount() { + Transaction tr = new Transaction("123", 123, "credit"); + Assertions.assertEquals(123, tr.getAmount()); + + } + + @Test + void getTransactionId() { + Transaction tr = new Transaction("123", 123, "credit"); + Assertions.assertEquals("credit", tr.getType()); + } } From e6dd85b6852bf4a852735c8175f1a54dde925769 Mon Sep 17 00:00:00 2001 From: Marie Helene Hansen Date: Wed, 13 Aug 2025 17:53:16 +0200 Subject: [PATCH 08/10] tests --- src/main/java/com/booleanuk/core/Account.java | 2 +- src/main/java/com/booleanuk/core/BankManager.java | 2 +- src/test/java/com/booleanuk/core/CoreTest.java | 13 ++++++++----- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index 73e20e674..76221e5d4 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -69,7 +69,7 @@ private String dtFormatter(LocalDate date) { return dtForm.format(date); } - public String toString() { + public String getTransactionStatement() { float b = 0; String str = ""; str += String.format("%-15s || %-15s || %-15s || %s" , "date", "credit", "debit", "balance" ); diff --git a/src/main/java/com/booleanuk/core/BankManager.java b/src/main/java/com/booleanuk/core/BankManager.java index 697c21bf9..3a1278e38 100644 --- a/src/main/java/com/booleanuk/core/BankManager.java +++ b/src/main/java/com/booleanuk/core/BankManager.java @@ -32,7 +32,7 @@ public List getAccounts(Branch branch) { } public boolean approveOverdraft(Account account, float amount) { - if (account instanceof CurrentAccount && account.getBalance() - amount < 5000) { + if (account instanceof CurrentAccount && (account.getBalance() - amount > 5000)) { return true; } return false; diff --git a/src/test/java/com/booleanuk/core/CoreTest.java b/src/test/java/com/booleanuk/core/CoreTest.java index c18e785ca..49747d41a 100644 --- a/src/test/java/com/booleanuk/core/CoreTest.java +++ b/src/test/java/com/booleanuk/core/CoreTest.java @@ -19,7 +19,7 @@ void addAndGetAccount() { // ACCOUNT @Test - public void getBalance() { + void getBalance() { Account a = new SavingsAccount(1); a.deposit(100.0f); a.withdraw(60.0f); @@ -27,13 +27,13 @@ public void getBalance() { } @Test - public void getAccountNumber() { + void getAccountNumber() { Account a = new CurrentAccount(2); Assertions.assertEquals(2, a.getAccountId()); } @Test - public void getTransactionsAccount() { + void getTransactionsAccount() { Account a = new SavingsAccount(1); a.deposit(100.0f); a.withdraw(50.0f); @@ -67,14 +67,15 @@ void approveOverdraft() { BankManager bm = new BankManager(); Account a = new CurrentAccount(1); a.deposit(100); - Assertions.assertFalse(bm.approveOverdraft(a, 100000)); + Assertions.assertFalse(bm.approveOverdraft(a, 10000)); } // BANK MANAGER @Test - public void addBranch() { + void addBranch() { BankManager bm = new BankManager(); Branch b = new Branch(); + bm.addBranch(b); Assertions.assertEquals(List.of(b), bm.getBranches()); } @@ -83,6 +84,8 @@ void getAccounts() { BankManager bm = new BankManager(); Branch b = new Branch(); Account a = new SavingsAccount(1); + b.addAccount(a); + bm.addBranch(b); Assertions.assertEquals(List.of(a), bm.getAccounts(b)); } From b8a0d2e46d1cdf038da0d53b5344206863c99db4 Mon Sep 17 00:00:00 2001 From: Marie Helene Hansen Date: Thu, 14 Aug 2025 08:25:25 +0200 Subject: [PATCH 09/10] remove print test in BankManager --- src/main/java/com/booleanuk/core/BankManager.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/main/java/com/booleanuk/core/BankManager.java b/src/main/java/com/booleanuk/core/BankManager.java index 3a1278e38..4589d0b0a 100644 --- a/src/main/java/com/booleanuk/core/BankManager.java +++ b/src/main/java/com/booleanuk/core/BankManager.java @@ -37,15 +37,4 @@ public boolean approveOverdraft(Account account, float amount) { } return false; } - - public static void main(String[] args) { - Account account = new CurrentAccount(1); - account.deposit(100000); - account.getTransactions(); - account.deposit(200); - account.getTransactions(); - account.withdraw(50); - account.getTransactions(); - System.out.println(account.toString()); - } } From 3169b6ab0fb13791e41475c4259aa3c706c302bc Mon Sep 17 00:00:00 2001 From: Marie Helene Hansen Date: Mon, 18 Aug 2025 08:18:43 +0200 Subject: [PATCH 10/10] remove Thread.sleep from deposit and withdraw --- src/main/java/com/booleanuk/core/Account.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index 76221e5d4..700c49d42 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -34,24 +34,12 @@ public Map getTransactions() { } public void deposit(float amount) { - try { - Thread.sleep(1000); - } - catch (InterruptedException e) { - e.printStackTrace(); - } this.balance += amount; Transaction tr = new Transaction(dtFormatter(LocalDate.now()), amount, "credit"); this.transactions.put(tr.getTransactionId(), tr); } public void withdraw(float amount) { - try { - Thread.sleep(1000); - } - catch (InterruptedException e) { - e.printStackTrace(); - } if (amount > this.balance && this.bm.approveOverdraft(this, amount)) { this.balance -= amount; }