From 4c658bf864e8e68aec8ab94e8a43993c663b2d19 Mon Sep 17 00:00:00 2001 From: Magnus-droid Date: Wed, 15 Jan 2025 09:46:12 +0100 Subject: [PATCH 01/12] Added class diagram and a working Transaction class + tests --- .../core/BankChallengeClassDiagram.png | Bin 0 -> 95862 bytes .../java/com/booleanuk/core/Transaction.java | 58 ++++++++++++++++++ .../com/booleanuk/core/TransactionTest.java | 42 +++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 src/main/java/com/booleanuk/core/BankChallengeClassDiagram.png create mode 100644 src/main/java/com/booleanuk/core/Transaction.java create mode 100644 src/test/java/com/booleanuk/core/TransactionTest.java diff --git a/src/main/java/com/booleanuk/core/BankChallengeClassDiagram.png b/src/main/java/com/booleanuk/core/BankChallengeClassDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..be428f2f6d49213f34c881405e17ceeaa66c6f52 GIT binary patch literal 95862 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 Date: Wed, 15 Jan 2025 10:12:04 +0100 Subject: [PATCH 02/12] Created different account classes + test for account creation --- src/main/java/com/booleanuk/core/Account.java | 48 +++++++++++++++++++ .../com/booleanuk/core/CurrentAccount.java | 9 ++++ .../com/booleanuk/core/SavingsAccount.java | 8 ++++ .../java/com/booleanuk/core/AccountTest.java | 27 +++++++++++ 4 files changed, 92 insertions(+) create mode 100644 src/main/java/com/booleanuk/core/Account.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/AccountTest.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..bcc10cb18 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Account.java @@ -0,0 +1,48 @@ +package com.booleanuk.core; + +import java.util.ArrayList; +import java.util.Random; + +public class Account { + //Extension: need a branch ID) + private double balance; + private ArrayList transactions; + private final int accountNumber; + + public Account(int accountNumber) { + this.accountNumber = accountNumber; + this.balance = 0.0; + this.transactions = new ArrayList<>(); + } + + public Account() { + Random rand = new Random(); + //account numbers can't start with 0, but I also think that's the case IRL + this.accountNumber = rand.nextInt(10000000, 99999999); + this.balance = 0.0; + this.transactions = new ArrayList<>(); + } + + public void makeTransaction(double amount) { + + } + + public String generateStatement() { + return ""; + } + + public ArrayList getTransactions() { + return this.transactions; + } + + public double getBalance() { + return this.balance; + } + + public int getAccountNumber() { + return this.accountNumber; + } + + + +} 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..7eecf383c --- /dev/null +++ b/src/main/java/com/booleanuk/core/CurrentAccount.java @@ -0,0 +1,9 @@ +package com.booleanuk.core; + +public class CurrentAccount extends Account { + public CurrentAccount(int accountNumber) { + super(accountNumber); + } +//can have overdraft + +} 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..c01ed3651 --- /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); + } +//cant have overdraft +} diff --git a/src/test/java/com/booleanuk/core/AccountTest.java b/src/test/java/com/booleanuk/core/AccountTest.java new file mode 100644 index 000000000..a89f4ac99 --- /dev/null +++ b/src/test/java/com/booleanuk/core/AccountTest.java @@ -0,0 +1,27 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; + +public class AccountTest { + + @Test + public void createAccountWithGivenNumber() { + //Check if an account is created correctly with default values + Account accountWithGivenNumber = new Account(12345678); + Assertions.assertEquals(12345678, accountWithGivenNumber.getAccountNumber()); + Assertions.assertEquals(0.0, accountWithGivenNumber.getBalance()); + Assertions.assertEquals(new ArrayList(), accountWithGivenNumber.getTransactions()); + } + + @Test + public void createAccountWithoutGivenNumber() { + Account accountWithoutGivenNumber = new Account(); + Assertions.assertEquals(0.0, accountWithoutGivenNumber.getBalance()); + Assertions.assertEquals(new ArrayList(), accountWithoutGivenNumber.getTransactions()); + Assertions.assertTrue(accountWithoutGivenNumber.getAccountNumber() >= 10000000); + Assertions.assertTrue(accountWithoutGivenNumber.getAccountNumber() < 99999999); + } +} From 701841d9335450b88bccf8ed1f041aac4cf0be27 Mon Sep 17 00:00:00 2001 From: Magnus-droid Date: Wed, 15 Jan 2025 10:27:26 +0100 Subject: [PATCH 03/12] added transaction tests --- .../java/com/booleanuk/core/AccountTest.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/booleanuk/core/AccountTest.java b/src/test/java/com/booleanuk/core/AccountTest.java index a89f4ac99..299ddf6be 100644 --- a/src/test/java/com/booleanuk/core/AccountTest.java +++ b/src/test/java/com/booleanuk/core/AccountTest.java @@ -9,7 +9,7 @@ public class AccountTest { @Test public void createAccountWithGivenNumber() { - //Check if an account is created correctly with default values + //Check if an account is created correctly with default values with given number Account accountWithGivenNumber = new Account(12345678); Assertions.assertEquals(12345678, accountWithGivenNumber.getAccountNumber()); Assertions.assertEquals(0.0, accountWithGivenNumber.getBalance()); @@ -18,10 +18,34 @@ public void createAccountWithGivenNumber() { @Test public void createAccountWithoutGivenNumber() { + //Check if an account is created correctly with default values without given number Account accountWithoutGivenNumber = new Account(); Assertions.assertEquals(0.0, accountWithoutGivenNumber.getBalance()); Assertions.assertEquals(new ArrayList(), accountWithoutGivenNumber.getTransactions()); Assertions.assertTrue(accountWithoutGivenNumber.getAccountNumber() >= 10000000); Assertions.assertTrue(accountWithoutGivenNumber.getAccountNumber() < 99999999); } + + @Test + public void testMakeTransactionDeposit() { + Account account = new Account(12345678); + account.makeTransaction(100.0); + Assertions.assertEquals(100.0, account.getBalance()); + Assertions.assertEquals("deposit", account.getTransactions().getFirst().getType()); + } + + @Test + public void testMakeTransactionWithdrawal() { + Account account = new Account(12345678); + account.makeTransaction(500.0); + account.makeTransaction(-100.0); + Assertions.assertEquals(400.0, account.getBalance()); + Assertions.assertEquals("withdrawal", account.getTransactions().getFirst().getType()); + } + + + + + + } From 9bb21f6f0300f4506b06608e7a97ce6525fe2076 Mon Sep 17 00:00:00 2001 From: Magnus-droid Date: Wed, 15 Jan 2025 11:02:46 +0100 Subject: [PATCH 04/12] Changed return type of GenerateStatement and added tests for it --- src/main/java/com/booleanuk/core/Account.java | 12 +++++++---- .../java/com/booleanuk/core/AccountTest.java | 20 ++++++++++++++++++- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index bcc10cb18..9056ff9ae 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -6,7 +6,7 @@ public class Account { //Extension: need a branch ID) private double balance; - private ArrayList transactions; + private final ArrayList transactions; private final int accountNumber; public Account(int accountNumber) { @@ -15,6 +15,7 @@ public Account(int accountNumber) { this.transactions = new ArrayList<>(); } + //Allows the creation of accounts without providing a number as well public Account() { Random rand = new Random(); //account numbers can't start with 0, but I also think that's the case IRL @@ -24,11 +25,14 @@ public Account() { } public void makeTransaction(double amount) { - + if (this.balance + amount > 0) { + this.balance += amount; + this.transactions.add(new Transaction(amount)); + } } - public String generateStatement() { - return ""; + public StringBuilder generateStatement() { + return new StringBuilder(); } public ArrayList getTransactions() { diff --git a/src/test/java/com/booleanuk/core/AccountTest.java b/src/test/java/com/booleanuk/core/AccountTest.java index 299ddf6be..a92a30c2a 100644 --- a/src/test/java/com/booleanuk/core/AccountTest.java +++ b/src/test/java/com/booleanuk/core/AccountTest.java @@ -3,7 +3,9 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Calendar; public class AccountTest { @@ -40,9 +42,25 @@ public void testMakeTransactionWithdrawal() { account.makeTransaction(500.0); account.makeTransaction(-100.0); Assertions.assertEquals(400.0, account.getBalance()); - Assertions.assertEquals("withdrawal", account.getTransactions().getFirst().getType()); + Assertions.assertEquals("withdrawal", account.getTransactions().get(1).getType()); } + @Test + public void testStatementGeneration() { + Account account = new Account(12345678); + account.makeTransaction(500.0); + account.makeTransaction(-100.0); + account.makeTransaction(150.0); + String date = new SimpleDateFormat("yyyy.MM.dd HH:mm z").format(Calendar.getInstance().getTime()); + StringBuilder stringbuilder = new StringBuilder(); + stringbuilder.append(String.format("%21s || %10s || %8s || %8s\n", "Date", "Withdrawal", "Deposit", "Balance")); + stringbuilder.append(String.format("%21s || %10s || %8s || %8s\n", date, " ", "500.0", "500.0")); + stringbuilder.append(String.format("%21s || %10s || %8s || %8s\n", date, "100.0", " ", "400.0")); + stringbuilder.append(String.format("%21s || %10s || %8s || %8s\n", date, " ", "150.0", "550.0")); + Assertions.assertEquals(0, stringbuilder.compareTo(account.generateStatement())); + } + + From 208c821af99a5f1cdc42dacb731f86d089bb1d35 Mon Sep 17 00:00:00 2001 From: Magnus-droid Date: Wed, 15 Jan 2025 11:27:49 +0100 Subject: [PATCH 05/12] Implemented generateStatement method, finished core! --- src/main/java/com/booleanuk/core/Account.java | 13 +++++++++++-- src/main/java/com/booleanuk/core/Transaction.java | 4 ++-- src/test/java/com/booleanuk/core/AccountTest.java | 1 + 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index 9056ff9ae..a2738b923 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -8,11 +8,13 @@ public class Account { private double balance; private final ArrayList transactions; private final int accountNumber; + private StringBuilder stringbuilder = new StringBuilder(); public Account(int accountNumber) { this.accountNumber = accountNumber; this.balance = 0.0; this.transactions = new ArrayList<>(); + this.stringbuilder.insert(0, String.format("%21s || %10s || %8s || %8s\n", "Date", "Withdrawal", "Deposit", "Balance")); } //Allows the creation of accounts without providing a number as well @@ -22,17 +24,24 @@ public Account() { this.accountNumber = rand.nextInt(10000000, 99999999); this.balance = 0.0; this.transactions = new ArrayList<>(); + this.stringbuilder.insert(0, String.format("%21s || %10s || %8s || %8s\n", "Date", "Withdrawal", "Deposit", "Balance")); } public void makeTransaction(double amount) { if (this.balance + amount > 0) { this.balance += amount; - this.transactions.add(new Transaction(amount)); + Transaction transaction = new Transaction(amount); + this.transactions.add(transaction); + //It might seem a bit odd to already start generating the statement here, but the only alternative I can think of + //is that Transaction gets to know about the balance of the account despite it just being a record class. + //Looping over the transaction list after every transaction has been completed only gives the final balance, not the balance after each transaction + this.stringbuilder.append(String.format(transaction + "%8s\n", this.balance)); } + } public StringBuilder generateStatement() { - return new StringBuilder(); + return this.stringbuilder; } public ArrayList getTransactions() { diff --git a/src/main/java/com/booleanuk/core/Transaction.java b/src/main/java/com/booleanuk/core/Transaction.java index 1ac9c9a3d..08e4c813c 100644 --- a/src/main/java/com/booleanuk/core/Transaction.java +++ b/src/main/java/com/booleanuk/core/Transaction.java @@ -48,9 +48,9 @@ public UUID getUid() { @Override public String toString() { if (this.type.equals("withdrawal")) { - return String.format("%s || %8s || %8s ||", this.date, this.amount, " "); + return String.format("%21s || %10s || %8s || ", this.date, this.amount, " "); } else { - return String.format("%s || %8s || %8s ||", this.date, " ", this.amount); + return String.format("%21s || %10s || %8s || ", this.date, " ", this.amount); } } diff --git a/src/test/java/com/booleanuk/core/AccountTest.java b/src/test/java/com/booleanuk/core/AccountTest.java index a92a30c2a..be499562d 100644 --- a/src/test/java/com/booleanuk/core/AccountTest.java +++ b/src/test/java/com/booleanuk/core/AccountTest.java @@ -58,6 +58,7 @@ public void testStatementGeneration() { stringbuilder.append(String.format("%21s || %10s || %8s || %8s\n", date, "100.0", " ", "400.0")); stringbuilder.append(String.format("%21s || %10s || %8s || %8s\n", date, " ", "150.0", "550.0")); Assertions.assertEquals(0, stringbuilder.compareTo(account.generateStatement())); + } From 7fa7b79b956687a6421ffdf5bc88246d52a1e1de Mon Sep 17 00:00:00 2001 From: Magnus-droid Date: Wed, 15 Jan 2025 11:35:58 +0100 Subject: [PATCH 06/12] Fixed some whitespace bugs in TransactionTest --- src/test/java/com/booleanuk/core/TransactionTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/booleanuk/core/TransactionTest.java b/src/test/java/com/booleanuk/core/TransactionTest.java index c5be868e9..772643d13 100644 --- a/src/test/java/com/booleanuk/core/TransactionTest.java +++ b/src/test/java/com/booleanuk/core/TransactionTest.java @@ -27,7 +27,7 @@ public void testSetType() { public void testFormattingDeposit() { Transaction deposit = new Transaction(100.0); String date = new SimpleDateFormat("yyyy.MM.dd HH:mm z").format(Calendar.getInstance().getTime()); - String testString = String.format("%s || %8s || %8s ||", date, " ", 100.0); + String testString = String.format("%21s || %10s || %8s || ", date, " ", 100.0); Assertions.assertEquals(testString, deposit.toString()); } @@ -35,7 +35,7 @@ public void testFormattingDeposit() { public void testFormattingWithdrawal() { Transaction withdrawal = new Transaction(-100.0); String date = new SimpleDateFormat("yyyy.MM.dd HH:mm z").format(Calendar.getInstance().getTime()); - String testString = String.format("%s || %8s || %8s ||", date, 100.0, " "); + String testString = String.format("%21s || %10s || %8s || ", date, 100.0, " "); Assertions.assertEquals(testString, withdrawal.toString()); } From c6016bd05f4e9edb2315b70b5dad82a7a87e9461 Mon Sep 17 00:00:00 2001 From: Magnus-droid Date: Wed, 15 Jan 2025 11:46:18 +0100 Subject: [PATCH 07/12] Changed getBalance to calculate balance based on transaction history --- src/main/java/com/booleanuk/core/Account.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index a2738b923..5d3734e89 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -49,7 +49,15 @@ public ArrayList getTransactions() { } public double getBalance() { - return this.balance; + double total = 0.0; + for (Transaction transaction: this.transactions) { + if (transaction.getType().equals("deposit")) { + total += transaction.getAmount(); + } else { + total -= transaction.getAmount(); + } + } + return total; } public int getAccountNumber() { From de4894dbd10e04e75d7a39e4015f2a0409d90e29 Mon Sep 17 00:00:00 2001 From: Magnus-droid Date: Wed, 15 Jan 2025 11:52:40 +0100 Subject: [PATCH 08/12] Removed balance --- src/main/java/com/booleanuk/core/Account.java | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index 5d3734e89..b829be79b 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -5,14 +5,12 @@ public class Account { //Extension: need a branch ID) - private double balance; private final ArrayList transactions; private final int accountNumber; private StringBuilder stringbuilder = new StringBuilder(); public Account(int accountNumber) { this.accountNumber = accountNumber; - this.balance = 0.0; this.transactions = new ArrayList<>(); this.stringbuilder.insert(0, String.format("%21s || %10s || %8s || %8s\n", "Date", "Withdrawal", "Deposit", "Balance")); } @@ -21,22 +19,18 @@ public Account(int accountNumber) { public Account() { Random rand = new Random(); //account numbers can't start with 0, but I also think that's the case IRL - this.accountNumber = rand.nextInt(10000000, 99999999); - this.balance = 0.0; + this.accountNumber = rand.nextInt(10000000, 99999999);; this.transactions = new ArrayList<>(); this.stringbuilder.insert(0, String.format("%21s || %10s || %8s || %8s\n", "Date", "Withdrawal", "Deposit", "Balance")); } public void makeTransaction(double amount) { - if (this.balance + amount > 0) { - this.balance += amount; - Transaction transaction = new Transaction(amount); - this.transactions.add(transaction); - //It might seem a bit odd to already start generating the statement here, but the only alternative I can think of - //is that Transaction gets to know about the balance of the account despite it just being a record class. - //Looping over the transaction list after every transaction has been completed only gives the final balance, not the balance after each transaction - this.stringbuilder.append(String.format(transaction + "%8s\n", this.balance)); - } + Transaction transaction = new Transaction(amount); + this.transactions.add(transaction); + //It might seem a bit odd to already start generating the statement here, but the only alternative I can think of + //is that Transaction gets to know about the balance of the account despite it just being a record class. + //Looping over the transaction list after every transaction has been completed only gives the final balance, not the balance after each transaction + this.stringbuilder.append(String.format(transaction + "%8s\n", getBalance())); } @@ -54,7 +48,9 @@ public double getBalance() { if (transaction.getType().equals("deposit")) { total += transaction.getAmount(); } else { - total -= transaction.getAmount(); + if (total - transaction.getAmount() > 0) { + total -= transaction.getAmount(); + } } } return total; From f3c11d226e580c6d36512b375363e35c93ba26d5 Mon Sep 17 00:00:00 2001 From: Magnus-droid Date: Wed, 15 Jan 2025 16:34:50 +0100 Subject: [PATCH 09/12] Added domain model for branch and request extension --- .../booleanuk/core/Extension-domain-model.md | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/main/java/com/booleanuk/core/Extension-domain-model.md diff --git a/src/main/java/com/booleanuk/core/Extension-domain-model.md b/src/main/java/com/booleanuk/core/Extension-domain-model.md new file mode 100644 index 000000000..eecdadc9a --- /dev/null +++ b/src/main/java/com/booleanuk/core/Extension-domain-model.md @@ -0,0 +1,43 @@ +I have no idea if it's a good idea to use interfaces for this, but I still decided to use interfaces for practice. + +# Interface: Branch + +| Members | Methods | +|-----------|-----------------------------------------------------------------| +| enum Type | void createAndAddAccount((int accountNumber, Type accountType) | +| | boolean handleOverdraftRequest(double amount, Account account) | + + +# Class: NorwayBranch + +| Implements interface | Members | Methods | Scenario | Result/Output | +|----------------------|------------------------------|----------------------------------------------------------------|----------------------------------------------------|-----------------------------------------------------------------------| +| Branch | ArrayList\ accounts | void createAndAddAccount(int accountNumber, Type accountType) | | account gets created with norwayPrefix and added to the accounts-list | +| | int norwayPrefix | boolean handleOverdraftRequest(double amount, Account account) | account type == SavingsAccount | return false (deny) | +| | | | account type == CurrentAccount, but amount > 1000 | return false (deny) | +| | | | account type == CurrentAccount, and amount <= 1000 | return true (grant) | + + + +# Class: SwedenBranch + +| Implements interface | Members | Methods | Scenario | Result/Output | +|----------------------|------------------------------|----------------------------------------------------------------|---------------------------------------------------|-----------------------------------------------------------------------| +| Branch | ArrayList\ accounts | void createAndAddAccount(int accountNumber, Type accountType) | | account gets created with swedenPrefix and added to the accounts-list | +| | int swedenPrefix | boolean handleOverdraftRequest(double amount, Account account) | account type == SavingsAccount | return false (deny) | +| | | | account type == CurrentAccount, but amount > 982 | return false (deny) | +| | | | account type == CurrentAccount, and amount <= 982 | return true (grant) | + + + +# Class: UKBranch + +| Implements interface | Members | Methods | Scenario | Result/Output | +|----------------------|------------------------------|----------------------------------------------------------------|--------------------------------------------------|-------------------------------------------------------------------| +| Branch | ArrayList\ accounts | void createAndAddAccount(int accountNumber, Type accountType) | | account gets created with ukPrefix and added to the accounts-list | +| | int ukPrefix | boolean handleOverdraftRequest(double amount, Account account) | account type == SavingsAccount | return false (deny) | +| | | | account type == CurrentAccount, but amount > 72 | return false (deny) | +| | | | account type == CurrentAccount, and amount <= 72 | return true (grant) | + + + From 8c4259c777d5012027460b5039c15ac198c6957a Mon Sep 17 00:00:00 2001 From: Magnus-droid Date: Thu, 16 Jan 2025 11:35:36 +0100 Subject: [PATCH 10/12] Added branch interface and Norway, Sweden and UK branch classes --- src/main/java/com/booleanuk/core/Account.java | 30 ++++++++--------- src/main/java/com/booleanuk/core/Branch.java | 11 +++++++ .../java/com/booleanuk/core/NorwayBranch.java | 33 +++++++++++++++++++ .../java/com/booleanuk/core/SwedenBranch.java | 32 ++++++++++++++++++ .../java/com/booleanuk/core/UKBranch.java | 31 +++++++++++++++++ .../java/com/booleanuk/core/AccountTest.java | 18 +++------- .../com/booleanuk/core/NorwayBranchTest.java | 16 +++++++++ .../com/booleanuk/core/SwedenBranchTest.java | 16 +++++++++ .../java/com/booleanuk/core/UKBranchTest.java | 16 +++++++++ 9 files changed, 173 insertions(+), 30 deletions(-) create mode 100644 src/main/java/com/booleanuk/core/Branch.java create mode 100644 src/main/java/com/booleanuk/core/NorwayBranch.java create mode 100644 src/main/java/com/booleanuk/core/SwedenBranch.java create mode 100644 src/main/java/com/booleanuk/core/UKBranch.java create mode 100644 src/test/java/com/booleanuk/core/NorwayBranchTest.java create mode 100644 src/test/java/com/booleanuk/core/SwedenBranchTest.java create mode 100644 src/test/java/com/booleanuk/core/UKBranchTest.java diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index b829be79b..851f01199 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -1,27 +1,19 @@ package com.booleanuk.core; import java.util.ArrayList; -import java.util.Random; public class Account { - //Extension: need a branch ID) + private final ArrayList transactions; private final int accountNumber; - private StringBuilder stringbuilder = new StringBuilder(); + private StringBuilder stringBuilder = new StringBuilder(); + private int prefix; - public Account(int accountNumber) { + public Account(int prefix, int accountNumber) { this.accountNumber = accountNumber; this.transactions = new ArrayList<>(); - this.stringbuilder.insert(0, String.format("%21s || %10s || %8s || %8s\n", "Date", "Withdrawal", "Deposit", "Balance")); - } - - //Allows the creation of accounts without providing a number as well - public Account() { - Random rand = new Random(); - //account numbers can't start with 0, but I also think that's the case IRL - this.accountNumber = rand.nextInt(10000000, 99999999);; - this.transactions = new ArrayList<>(); - this.stringbuilder.insert(0, String.format("%21s || %10s || %8s || %8s\n", "Date", "Withdrawal", "Deposit", "Balance")); + this.stringBuilder.insert(0, String.format("%21s || %10s || %8s || %8s\n", "Date", "Withdrawal", "Deposit", "Balance")); + this.prefix = prefix; } public void makeTransaction(double amount) { @@ -30,12 +22,12 @@ public void makeTransaction(double amount) { //It might seem a bit odd to already start generating the statement here, but the only alternative I can think of //is that Transaction gets to know about the balance of the account despite it just being a record class. //Looping over the transaction list after every transaction has been completed only gives the final balance, not the balance after each transaction - this.stringbuilder.append(String.format(transaction + "%8s\n", getBalance())); + this.stringBuilder.append(String.format(transaction + "%8s\n", getBalance())); } public StringBuilder generateStatement() { - return this.stringbuilder; + return this.stringBuilder; } public ArrayList getTransactions() { @@ -60,6 +52,12 @@ public int getAccountNumber() { return this.accountNumber; } + public int getPrefix() { + return this.prefix; + } + + + } 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..e110e37e7 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Branch.java @@ -0,0 +1,11 @@ +package com.booleanuk.core; + +import java.util.ArrayList; + +public interface Branch { + enum Type {SAVINGS, CURRENT}; + void handleOverdraftRequest(double amountInCurrency, Account account); + void createAndAddAccount(int accountNumber, Type type); + + +} diff --git a/src/main/java/com/booleanuk/core/NorwayBranch.java b/src/main/java/com/booleanuk/core/NorwayBranch.java new file mode 100644 index 000000000..fbde1694c --- /dev/null +++ b/src/main/java/com/booleanuk/core/NorwayBranch.java @@ -0,0 +1,33 @@ +package com.booleanuk.core; + +import java.util.ArrayList; + +public class NorwayBranch implements Branch { + + private final ArrayList accounts = new ArrayList<>(); + private final int prefix = 1; + + + @Override + public void handleOverdraftRequest(double amountInKroner, Account account) { + + //Want the limit to be 1000 + } + + @Override + public void createAndAddAccount(int accountNumber, Type type) { + if (type.equals(Type.SAVINGS)) { + this.accounts.add(new SavingsAccount(this.prefix, accountNumber)); + } else if (type.equals(Type.CURRENT)) { + this.accounts.add(new CurrentAccount(this.prefix, accountNumber)); + } else { + System.out.println("Invalid account type!"); + } + } + + public ArrayList getAccounts() { + return this.accounts; + } + + +} diff --git a/src/main/java/com/booleanuk/core/SwedenBranch.java b/src/main/java/com/booleanuk/core/SwedenBranch.java new file mode 100644 index 000000000..3b7b2d67c --- /dev/null +++ b/src/main/java/com/booleanuk/core/SwedenBranch.java @@ -0,0 +1,32 @@ +package com.booleanuk.core; + + +import java.util.ArrayList; + +public class SwedenBranch implements Branch { + + private final ArrayList accounts = new ArrayList<>(); + private final int prefix = 2; + + @Override + public void handleOverdraftRequest(double amountInKrona, Account account) { + + } + + @Override + public void createAndAddAccount(int accountNumber, Type type) { + if (type.equals(Type.SAVINGS)) { + this.accounts.add(new SavingsAccount(this.prefix, accountNumber)); + } else if (type.equals(Type.CURRENT)) { + this.accounts.add(new CurrentAccount(this.prefix, accountNumber)); + } else { + System.out.println("Invalid account type!"); + } + } + + + public ArrayList getAccounts() { + return this.accounts; + } + +} diff --git a/src/main/java/com/booleanuk/core/UKBranch.java b/src/main/java/com/booleanuk/core/UKBranch.java new file mode 100644 index 000000000..70c961f75 --- /dev/null +++ b/src/main/java/com/booleanuk/core/UKBranch.java @@ -0,0 +1,31 @@ +package com.booleanuk.core; + + +import java.util.ArrayList; + +public class UKBranch implements Branch { + + private final ArrayList accounts = new ArrayList<>(); + private final int prefix = 3; + + @Override + public void handleOverdraftRequest(double amountInPounds, Account account) { + + } + + @Override + public void createAndAddAccount(int accountNumber, Type type) { + if (type.equals(Type.SAVINGS)) { + this.accounts.add(new SavingsAccount(this.prefix, accountNumber)); + } else if (type.equals(Type.CURRENT)) { + this.accounts.add(new CurrentAccount(this.prefix, accountNumber)); + } else { + System.out.println("Invalid account type!"); + } + } + + public ArrayList getAccounts() { + return this.accounts; + } + +} diff --git a/src/test/java/com/booleanuk/core/AccountTest.java b/src/test/java/com/booleanuk/core/AccountTest.java index be499562d..1d21b62fb 100644 --- a/src/test/java/com/booleanuk/core/AccountTest.java +++ b/src/test/java/com/booleanuk/core/AccountTest.java @@ -12,25 +12,15 @@ public class AccountTest { @Test public void createAccountWithGivenNumber() { //Check if an account is created correctly with default values with given number - Account accountWithGivenNumber = new Account(12345678); + Account accountWithGivenNumber = new Account(1, 12345678); Assertions.assertEquals(12345678, accountWithGivenNumber.getAccountNumber()); Assertions.assertEquals(0.0, accountWithGivenNumber.getBalance()); Assertions.assertEquals(new ArrayList(), accountWithGivenNumber.getTransactions()); } - @Test - public void createAccountWithoutGivenNumber() { - //Check if an account is created correctly with default values without given number - Account accountWithoutGivenNumber = new Account(); - Assertions.assertEquals(0.0, accountWithoutGivenNumber.getBalance()); - Assertions.assertEquals(new ArrayList(), accountWithoutGivenNumber.getTransactions()); - Assertions.assertTrue(accountWithoutGivenNumber.getAccountNumber() >= 10000000); - Assertions.assertTrue(accountWithoutGivenNumber.getAccountNumber() < 99999999); - } - @Test public void testMakeTransactionDeposit() { - Account account = new Account(12345678); + Account account = new Account(1, 12345678); account.makeTransaction(100.0); Assertions.assertEquals(100.0, account.getBalance()); Assertions.assertEquals("deposit", account.getTransactions().getFirst().getType()); @@ -38,7 +28,7 @@ public void testMakeTransactionDeposit() { @Test public void testMakeTransactionWithdrawal() { - Account account = new Account(12345678); + Account account = new Account( 1, 12345678); account.makeTransaction(500.0); account.makeTransaction(-100.0); Assertions.assertEquals(400.0, account.getBalance()); @@ -47,7 +37,7 @@ public void testMakeTransactionWithdrawal() { @Test public void testStatementGeneration() { - Account account = new Account(12345678); + Account account = new Account( 1, 12345678); account.makeTransaction(500.0); account.makeTransaction(-100.0); account.makeTransaction(150.0); diff --git a/src/test/java/com/booleanuk/core/NorwayBranchTest.java b/src/test/java/com/booleanuk/core/NorwayBranchTest.java new file mode 100644 index 000000000..d720a1e23 --- /dev/null +++ b/src/test/java/com/booleanuk/core/NorwayBranchTest.java @@ -0,0 +1,16 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class NorwayBranchTest { + + @Test + public void testAccountCreation() { + NorwayBranch norway = new NorwayBranch(); + norway.createAndAddAccount(12345678, Branch.Type.CURRENT); + Assertions.assertEquals(1, norway.getAccounts().getFirst().getPrefix()); + Assertions.assertEquals(12345678, norway.getAccounts().getFirst().getAccountNumber()); + Assertions.assertInstanceOf(CurrentAccount.class, norway.getAccounts().getFirst()); + } +} diff --git a/src/test/java/com/booleanuk/core/SwedenBranchTest.java b/src/test/java/com/booleanuk/core/SwedenBranchTest.java new file mode 100644 index 000000000..bf39e18f4 --- /dev/null +++ b/src/test/java/com/booleanuk/core/SwedenBranchTest.java @@ -0,0 +1,16 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class SwedenBranchTest { + + @Test + public void testAccountCreation() { + SwedenBranch sweden = new SwedenBranch(); + sweden.createAndAddAccount(12345678, Branch.Type.CURRENT); + Assertions.assertEquals(2, sweden.getAccounts().getFirst().getPrefix()); + Assertions.assertEquals(12345678, sweden.getAccounts().getFirst().getAccountNumber()); + Assertions.assertInstanceOf(CurrentAccount.class, sweden.getAccounts().getFirst()); + } +} diff --git a/src/test/java/com/booleanuk/core/UKBranchTest.java b/src/test/java/com/booleanuk/core/UKBranchTest.java new file mode 100644 index 000000000..962eb2f3a --- /dev/null +++ b/src/test/java/com/booleanuk/core/UKBranchTest.java @@ -0,0 +1,16 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class UKBranchTest { + + @Test + public void testAccountCreation() { + UKBranch uk = new UKBranch(); + uk.createAndAddAccount(12345678, Branch.Type.CURRENT); + Assertions.assertEquals(3, uk.getAccounts().getFirst().getPrefix()); + Assertions.assertEquals(12345678, uk.getAccounts().getFirst().getAccountNumber()); + Assertions.assertInstanceOf(CurrentAccount.class, uk.getAccounts().getFirst()); + } +} From 5cd73f3320103f194e135925948d06e85a7c0039 Mon Sep 17 00:00:00 2001 From: Magnus-droid Date: Thu, 16 Jan 2025 13:21:56 +0100 Subject: [PATCH 11/12] Finished branches and their tests --- .../java/com/booleanuk/core/NorwayBranch.java | 8 ++-- .../java/com/booleanuk/core/SwedenBranch.java | 7 +++- .../java/com/booleanuk/core/UKBranch.java | 7 +++- .../com/booleanuk/core/NorwayBranchTest.java | 38 ++++++++++++++++++ .../com/booleanuk/core/SwedenBranchTest.java | 38 ++++++++++++++++++ .../java/com/booleanuk/core/UKBranchTest.java | 39 +++++++++++++++++++ 6 files changed, 129 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/booleanuk/core/NorwayBranch.java b/src/main/java/com/booleanuk/core/NorwayBranch.java index fbde1694c..f1cd71f06 100644 --- a/src/main/java/com/booleanuk/core/NorwayBranch.java +++ b/src/main/java/com/booleanuk/core/NorwayBranch.java @@ -6,12 +6,14 @@ public class NorwayBranch implements Branch { private final ArrayList accounts = new ArrayList<>(); private final int prefix = 1; + private double overdraftLimit = 1000.0; @Override public void handleOverdraftRequest(double amountInKroner, Account account) { - - //Want the limit to be 1000 + if (account instanceof CurrentAccount && account.getRequestStatus() && amountInKroner <= this.overdraftLimit) { + account.changeLimit(); + } } @Override @@ -28,6 +30,4 @@ public void createAndAddAccount(int accountNumber, Type type) { public ArrayList getAccounts() { return this.accounts; } - - } diff --git a/src/main/java/com/booleanuk/core/SwedenBranch.java b/src/main/java/com/booleanuk/core/SwedenBranch.java index 3b7b2d67c..3c042257d 100644 --- a/src/main/java/com/booleanuk/core/SwedenBranch.java +++ b/src/main/java/com/booleanuk/core/SwedenBranch.java @@ -7,10 +7,13 @@ public class SwedenBranch implements Branch { private final ArrayList accounts = new ArrayList<>(); private final int prefix = 2; + private double overdraftLimit = 982.0; @Override - public void handleOverdraftRequest(double amountInKrona, Account account) { - + public void handleOverdraftRequest(double amountInKroner, Account account) { + if (account instanceof CurrentAccount && account.getRequestStatus() && amountInKroner <= this.overdraftLimit) { + account.changeLimit(); + } } @Override diff --git a/src/main/java/com/booleanuk/core/UKBranch.java b/src/main/java/com/booleanuk/core/UKBranch.java index 70c961f75..513548e3b 100644 --- a/src/main/java/com/booleanuk/core/UKBranch.java +++ b/src/main/java/com/booleanuk/core/UKBranch.java @@ -7,10 +7,13 @@ public class UKBranch implements Branch { private final ArrayList accounts = new ArrayList<>(); private final int prefix = 3; + private double overdraftLimit = 72.0; @Override - public void handleOverdraftRequest(double amountInPounds, Account account) { - + public void handleOverdraftRequest(double amountInKroner, Account account) { + if (account instanceof CurrentAccount && account.getRequestStatus() && amountInKroner <= this.overdraftLimit) { + account.changeLimit(); + } } @Override diff --git a/src/test/java/com/booleanuk/core/NorwayBranchTest.java b/src/test/java/com/booleanuk/core/NorwayBranchTest.java index d720a1e23..951acca6c 100644 --- a/src/test/java/com/booleanuk/core/NorwayBranchTest.java +++ b/src/test/java/com/booleanuk/core/NorwayBranchTest.java @@ -13,4 +13,42 @@ public void testAccountCreation() { Assertions.assertEquals(12345678, norway.getAccounts().getFirst().getAccountNumber()); Assertions.assertInstanceOf(CurrentAccount.class, norway.getAccounts().getFirst()); } + + @Test + public void testValidOverdraftRequestCurrent() { + NorwayBranch norway = new NorwayBranch(); + norway.createAndAddAccount(12345678, Branch.Type.CURRENT); + norway.getAccounts().getFirst().requestOverdraft(500.0); + norway.handleOverdraftRequest(500.0, norway.getAccounts().getFirst()); + Assertions.assertEquals(-500.0, norway.getAccounts().getFirst().getLimit()); + //also check if that account now can actually use the overdraft + norway.getAccounts().getFirst().makeTransaction(-400.0); + Assertions.assertEquals(-400.0, norway.getAccounts().getFirst().getBalance()); + } + + @Test + public void testInvalidOverdraftRequest() { + NorwayBranch norway = new NorwayBranch(); + norway.createAndAddAccount(12345678, Branch.Type.CURRENT); + norway.getAccounts().getFirst().requestOverdraft(1001.0); + norway.handleOverdraftRequest(1001.0, norway.getAccounts().getFirst()); + //Limit should not have changed since 1001 > 1000 + Assertions.assertEquals(0.0, norway.getAccounts().getFirst().getLimit()); + //also check if that account can't use the overdraft + norway.getAccounts().getFirst().makeTransaction(-400.0); + Assertions.assertEquals(0.0, norway.getAccounts().getFirst().getBalance()); + + } + + @Test + public void testOverdraftRequestSavings() { + NorwayBranch norway = new NorwayBranch(); + norway.createAndAddAccount(12345678, Branch.Type.SAVINGS); + norway.getAccounts().getFirst().requestOverdraft(500.0); + norway.handleOverdraftRequest(500.0, norway.getAccounts().getFirst()); + Assertions.assertEquals(0.0, norway.getAccounts().getFirst().getLimit()); + //also check if that account still can't use the overdraft + norway.getAccounts().getFirst().makeTransaction(-400.0); + Assertions.assertEquals(0.0, norway.getAccounts().getFirst().getBalance()); + } } diff --git a/src/test/java/com/booleanuk/core/SwedenBranchTest.java b/src/test/java/com/booleanuk/core/SwedenBranchTest.java index bf39e18f4..fdda10c9e 100644 --- a/src/test/java/com/booleanuk/core/SwedenBranchTest.java +++ b/src/test/java/com/booleanuk/core/SwedenBranchTest.java @@ -13,4 +13,42 @@ public void testAccountCreation() { Assertions.assertEquals(12345678, sweden.getAccounts().getFirst().getAccountNumber()); Assertions.assertInstanceOf(CurrentAccount.class, sweden.getAccounts().getFirst()); } + + @Test + public void testValidOverdraftRequestCurrent() { + SwedenBranch sweden = new SwedenBranch(); + sweden.createAndAddAccount(12345678, Branch.Type.CURRENT); + sweden.getAccounts().getFirst().requestOverdraft(50.0); + sweden.handleOverdraftRequest(50.0, sweden.getAccounts().getFirst()); + Assertions.assertEquals(-50.0, sweden.getAccounts().getFirst().getLimit()); + //also check if that account now can actually use the overdraft + sweden.getAccounts().getFirst().makeTransaction(-40.0); + Assertions.assertEquals(-40.0, sweden.getAccounts().getFirst().getBalance()); + } + + @Test + public void testInvalidOverdraftRequest() { + SwedenBranch sweden = new SwedenBranch(); + sweden.createAndAddAccount(12345678, Branch.Type.CURRENT); + sweden.getAccounts().getFirst().requestOverdraft(1001.0); + sweden.handleOverdraftRequest(1001.0, sweden.getAccounts().getFirst()); + //Limit should not have changed since 1001 > 1000 + Assertions.assertEquals(0.0, sweden.getAccounts().getFirst().getLimit()); + //also check if that account can't use the overdraft + sweden.getAccounts().getFirst().makeTransaction(-400.0); + Assertions.assertEquals(0.0, sweden.getAccounts().getFirst().getBalance()); + + } + + @Test + public void testOverdraftRequestSavings() { + SwedenBranch sweden = new SwedenBranch(); + sweden.createAndAddAccount(12345678, Branch.Type.SAVINGS); + sweden.getAccounts().getFirst().requestOverdraft(50.0); + sweden.handleOverdraftRequest(50.0, sweden.getAccounts().getFirst()); + Assertions.assertEquals(0.0, sweden.getAccounts().getFirst().getLimit()); + //also check if that account still can't use the overdraft + sweden.getAccounts().getFirst().makeTransaction(-40.0); + Assertions.assertEquals(0.0, sweden.getAccounts().getFirst().getBalance()); + } } diff --git a/src/test/java/com/booleanuk/core/UKBranchTest.java b/src/test/java/com/booleanuk/core/UKBranchTest.java index 962eb2f3a..35280e9fa 100644 --- a/src/test/java/com/booleanuk/core/UKBranchTest.java +++ b/src/test/java/com/booleanuk/core/UKBranchTest.java @@ -13,4 +13,43 @@ public void testAccountCreation() { Assertions.assertEquals(12345678, uk.getAccounts().getFirst().getAccountNumber()); Assertions.assertInstanceOf(CurrentAccount.class, uk.getAccounts().getFirst()); } + + @Test + public void testValidOverdraftRequestCurrent() { + UKBranch uk = new UKBranch(); + uk.createAndAddAccount(12345678, Branch.Type.CURRENT); + uk.getAccounts().getFirst().requestOverdraft(50.0); + uk.handleOverdraftRequest(50.0, uk.getAccounts().getFirst()); + Assertions.assertEquals(-50.0, uk.getAccounts().getFirst().getLimit()); + //also check if that account now can actually use the overdraft + uk.getAccounts().getFirst().makeTransaction(-40.0); + Assertions.assertEquals(-40.0, uk.getAccounts().getFirst().getBalance()); + } + + @Test + public void testInvalidOverdraftRequest() { + UKBranch uk = new UKBranch(); + uk.createAndAddAccount(12345678, Branch.Type.CURRENT); + uk.getAccounts().getFirst().requestOverdraft(1001.0); + uk.handleOverdraftRequest(1001.0, uk.getAccounts().getFirst()); + //Limit should not have changed since 1001 > 1000 + Assertions.assertEquals(0.0, uk.getAccounts().getFirst().getLimit()); + //also check if that account can't use the overdraft + uk.getAccounts().getFirst().makeTransaction(-400.0); + Assertions.assertEquals(0.0, uk.getAccounts().getFirst().getBalance()); + + } + + @Test + public void testOverdraftRequestSavings() { + UKBranch uk = new UKBranch(); + uk.createAndAddAccount(12345678, Branch.Type.SAVINGS); + uk.getAccounts().getFirst().requestOverdraft(50.0); + uk.handleOverdraftRequest(50.0, uk.getAccounts().getFirst()); + Assertions.assertEquals(0.0, uk.getAccounts().getFirst().getLimit()); + //also check if that account still can't use the overdraft + uk.getAccounts().getFirst().makeTransaction(-40.0); + Assertions.assertEquals(0.0, uk.getAccounts().getFirst().getBalance()); + } + } From b7869e52adda3e789576ae0aa49d7fc36e4473ad Mon Sep 17 00:00:00 2001 From: Magnus-droid Date: Thu, 16 Jan 2025 13:42:24 +0100 Subject: [PATCH 12/12] Updated the Account class to match what is expected of it in the branches --- src/main/java/com/booleanuk/core/Account.java | 27 +++++++++++- .../com/booleanuk/core/CurrentAccount.java | 12 +++-- .../booleanuk/core/Extension-domain-model.md | 44 +++++++++---------- .../com/booleanuk/core/SavingsAccount.java | 4 +- .../java/com/booleanuk/core/Transaction.java | 15 ++++--- .../java/com/booleanuk/core/AccountTest.java | 4 +- .../com/booleanuk/core/TransactionTest.java | 7 ++- 7 files changed, 73 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java index 851f01199..84c0c48dc 100644 --- a/src/main/java/com/booleanuk/core/Account.java +++ b/src/main/java/com/booleanuk/core/Account.java @@ -8,12 +8,19 @@ public class Account { private final int accountNumber; private StringBuilder stringBuilder = new StringBuilder(); private int prefix; + private double limit; + private boolean overDraftRequested; + private double requestedLimit; + public Account(int prefix, int accountNumber) { this.accountNumber = accountNumber; this.transactions = new ArrayList<>(); this.stringBuilder.insert(0, String.format("%21s || %10s || %8s || %8s\n", "Date", "Withdrawal", "Deposit", "Balance")); this.prefix = prefix; + this.limit = 0.0; + this.requestedLimit = 0.0; + this.overDraftRequested = false; } public void makeTransaction(double amount) { @@ -37,10 +44,10 @@ public ArrayList getTransactions() { public double getBalance() { double total = 0.0; for (Transaction transaction: this.transactions) { - if (transaction.getType().equals("deposit")) { + if (transaction.getType().equals(Transaction.Type.DEPOSIT)) { total += transaction.getAmount(); } else { - if (total - transaction.getAmount() > 0) { + if (total - transaction.getAmount() > this.limit) { total -= transaction.getAmount(); } } @@ -56,8 +63,24 @@ public int getPrefix() { return this.prefix; } + public double getLimit() { + return this.limit; + } + + public void requestOverdraft(double amount) { + this.overDraftRequested = true; + this.requestedLimit = amount; + } + public void changeLimit() { + this.limit -= this.requestedLimit; + this.overDraftRequested = false; + this.requestedLimit = 0.0; + } + public boolean getRequestStatus() { + return this.overDraftRequested; + } } diff --git a/src/main/java/com/booleanuk/core/CurrentAccount.java b/src/main/java/com/booleanuk/core/CurrentAccount.java index 7eecf383c..c81d4a7c1 100644 --- a/src/main/java/com/booleanuk/core/CurrentAccount.java +++ b/src/main/java/com/booleanuk/core/CurrentAccount.java @@ -1,9 +1,15 @@ package com.booleanuk.core; public class CurrentAccount extends Account { - public CurrentAccount(int accountNumber) { - super(accountNumber); + private boolean overDraftRequested; + private double limit; + private double requestedLimit; + + public CurrentAccount(int prefix, int accountNumber) { + super(prefix, accountNumber); + this.limit = 0.0; + this.requestedLimit = 0.0; + this.overDraftRequested = false; } -//can have overdraft } diff --git a/src/main/java/com/booleanuk/core/Extension-domain-model.md b/src/main/java/com/booleanuk/core/Extension-domain-model.md index eecdadc9a..5dbdfefff 100644 --- a/src/main/java/com/booleanuk/core/Extension-domain-model.md +++ b/src/main/java/com/booleanuk/core/Extension-domain-model.md @@ -2,42 +2,42 @@ I have no idea if it's a good idea to use interfaces for this, but I still decid # Interface: Branch -| Members | Methods | -|-----------|-----------------------------------------------------------------| -| enum Type | void createAndAddAccount((int accountNumber, Type accountType) | -| | boolean handleOverdraftRequest(double amount, Account account) | +| Members | Methods | +|-----------|----------------------------------------------------------------| +| enum Type | void createAndAddAccount((int accountNumber, Type accountType) | +| | void handleOverdraftRequest(double amount, Account account) | # Class: NorwayBranch -| Implements interface | Members | Methods | Scenario | Result/Output | -|----------------------|------------------------------|----------------------------------------------------------------|----------------------------------------------------|-----------------------------------------------------------------------| -| Branch | ArrayList\ accounts | void createAndAddAccount(int accountNumber, Type accountType) | | account gets created with norwayPrefix and added to the accounts-list | -| | int norwayPrefix | boolean handleOverdraftRequest(double amount, Account account) | account type == SavingsAccount | return false (deny) | -| | | | account type == CurrentAccount, but amount > 1000 | return false (deny) | -| | | | account type == CurrentAccount, and amount <= 1000 | return true (grant) | +| Implements interface | Members | Methods | Scenario | Result/Output | +|----------------------|------------------------------|---------------------------------------------------------------|----------------------------------------------------|-----------------------------------------------------------------------| +| Branch | ArrayList\ accounts | void createAndAddAccount(int accountNumber, Type accountType) | | account gets created with norwayPrefix and added to the accounts-list | +| | int norwayPrefix | void handleOverdraftRequest(double amount, Account account) | account type == SavingsAccount | Deny (do nothing) | +| | | | account type == CurrentAccount, but amount > 1000 | Deny (do nothing) | +| | | | account type == CurrentAccount, and amount <= 1000 | Accept (update the lower limit) | # Class: SwedenBranch -| Implements interface | Members | Methods | Scenario | Result/Output | -|----------------------|------------------------------|----------------------------------------------------------------|---------------------------------------------------|-----------------------------------------------------------------------| -| Branch | ArrayList\ accounts | void createAndAddAccount(int accountNumber, Type accountType) | | account gets created with swedenPrefix and added to the accounts-list | -| | int swedenPrefix | boolean handleOverdraftRequest(double amount, Account account) | account type == SavingsAccount | return false (deny) | -| | | | account type == CurrentAccount, but amount > 982 | return false (deny) | -| | | | account type == CurrentAccount, and amount <= 982 | return true (grant) | +| Implements interface | Members | Methods | Scenario | Result/Output | +|----------------------|------------------------------|---------------------------------------------------------------|---------------------------------------------------|-----------------------------------------------------------------------| +| Branch | ArrayList\ accounts | void createAndAddAccount(int accountNumber, Type accountType) | | account gets created with swedenPrefix and added to the accounts-list | +| | int swedenPrefix | void handleOverdraftRequest(double amount, Account account) | account type == SavingsAccount | Deny (do nothing) | +| | | | account type == CurrentAccount, but amount > 982 | Deny (do nothing) | +| | | | account type == CurrentAccount, and amount <= 982 | Accept (update the lower limit) | # Class: UKBranch -| Implements interface | Members | Methods | Scenario | Result/Output | -|----------------------|------------------------------|----------------------------------------------------------------|--------------------------------------------------|-------------------------------------------------------------------| -| Branch | ArrayList\ accounts | void createAndAddAccount(int accountNumber, Type accountType) | | account gets created with ukPrefix and added to the accounts-list | -| | int ukPrefix | boolean handleOverdraftRequest(double amount, Account account) | account type == SavingsAccount | return false (deny) | -| | | | account type == CurrentAccount, but amount > 72 | return false (deny) | -| | | | account type == CurrentAccount, and amount <= 72 | return true (grant) | +| Implements interface | Members | Methods | Scenario | Result/Output | +|----------------------|------------------------------|---------------------------------------------------------------|--------------------------------------------------|-------------------------------------------------------------------| +| Branch | ArrayList\ accounts | void createAndAddAccount(int accountNumber, Type accountType) | | account gets created with ukPrefix and added to the accounts-list | +| | int ukPrefix | void handleOverdraftRequest(double amount, Account account) | account type == SavingsAccount | Deny (do nothing) | +| | | | account type == CurrentAccount, but amount > 72 | Deny (do nothing) | +| | | | account type == CurrentAccount, and amount <= 72 | Accept (update the lower limit) | diff --git a/src/main/java/com/booleanuk/core/SavingsAccount.java b/src/main/java/com/booleanuk/core/SavingsAccount.java index c01ed3651..8f332057c 100644 --- a/src/main/java/com/booleanuk/core/SavingsAccount.java +++ b/src/main/java/com/booleanuk/core/SavingsAccount.java @@ -1,8 +1,8 @@ package com.booleanuk.core; public class SavingsAccount extends Account { - public SavingsAccount(int accountNumber) { - super(accountNumber); + public SavingsAccount(int prefix, int accountNumber) { + super(prefix, accountNumber); } //cant have overdraft } diff --git a/src/main/java/com/booleanuk/core/Transaction.java b/src/main/java/com/booleanuk/core/Transaction.java index 08e4c813c..1c51a95df 100644 --- a/src/main/java/com/booleanuk/core/Transaction.java +++ b/src/main/java/com/booleanuk/core/Transaction.java @@ -8,7 +8,8 @@ public class Transaction { private final String date; //needs time as well!! private double amount; - private final String type; + enum Type {WITHDRAWAL, DEPOSIT}; + private final Type type; private final UUID uid; public Transaction(double amount){ @@ -24,12 +25,12 @@ public String getDate() { //Don't want other classes to be able to set the type so this is done internally //This means that even if a negative transaction amount is passed in, the behaviour is still expected. - private String setType() { + private Type setType() { if (this.amount < 0.0) { this.amount *= -1; - return "withdrawal"; + return Type.WITHDRAWAL; } else { - return "deposit"; + return Type.DEPOSIT; } } @@ -37,8 +38,8 @@ public double getAmount() { return amount; } - public String getType() { - return type; + public Type getType() { + return this.type; } public UUID getUid() { @@ -47,7 +48,7 @@ public UUID getUid() { @Override public String toString() { - if (this.type.equals("withdrawal")) { + if (this.type.equals(Type.WITHDRAWAL)) { return String.format("%21s || %10s || %8s || ", this.date, this.amount, " "); } else { return String.format("%21s || %10s || %8s || ", this.date, " ", this.amount); diff --git a/src/test/java/com/booleanuk/core/AccountTest.java b/src/test/java/com/booleanuk/core/AccountTest.java index 1d21b62fb..30be9630d 100644 --- a/src/test/java/com/booleanuk/core/AccountTest.java +++ b/src/test/java/com/booleanuk/core/AccountTest.java @@ -23,7 +23,7 @@ public void testMakeTransactionDeposit() { Account account = new Account(1, 12345678); account.makeTransaction(100.0); Assertions.assertEquals(100.0, account.getBalance()); - Assertions.assertEquals("deposit", account.getTransactions().getFirst().getType()); + Assertions.assertEquals(Transaction.Type.DEPOSIT, account.getTransactions().getFirst().getType()); } @Test @@ -32,7 +32,7 @@ public void testMakeTransactionWithdrawal() { account.makeTransaction(500.0); account.makeTransaction(-100.0); Assertions.assertEquals(400.0, account.getBalance()); - Assertions.assertEquals("withdrawal", account.getTransactions().get(1).getType()); + Assertions.assertEquals(Transaction.Type.WITHDRAWAL, account.getTransactions().get(1).getType()); } @Test diff --git a/src/test/java/com/booleanuk/core/TransactionTest.java b/src/test/java/com/booleanuk/core/TransactionTest.java index 772643d13..502a821ca 100644 --- a/src/test/java/com/booleanuk/core/TransactionTest.java +++ b/src/test/java/com/booleanuk/core/TransactionTest.java @@ -1,6 +1,7 @@ package com.booleanuk.core; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.text.SimpleDateFormat; @@ -8,6 +9,8 @@ public class TransactionTest { + + @Test public void testDate() { Transaction transaction = new Transaction(100); @@ -16,10 +19,10 @@ public void testDate() { @Test public void testSetType() { Transaction deposit = new Transaction(100.0); - Assertions.assertEquals("deposit", deposit.getType()); + Assertions.assertEquals(Transaction.Type.DEPOSIT, deposit.getType()); Assertions.assertEquals(100.0, deposit.getAmount()); Transaction withdrawal = new Transaction((-100.0)); - Assertions.assertEquals("withdrawal", withdrawal.getType()); + Assertions.assertEquals(Transaction.Type.WITHDRAWAL, withdrawal.getType()); Assertions.assertEquals(100.0, deposit.getAmount()); }