From 0e0ec6286c48f8b2697d69a363f0bfb1b9026b76 Mon Sep 17 00:00:00 2001 From: Evan Philakhong Date: Sat, 12 Apr 2025 02:31:37 -0400 Subject: [PATCH 1/7] feat: adds Account superclass for CheckingAccount --- .../lesson17/bank/Account.java | 100 +++++++++++++++ .../lesson17/bank/CheckingAccount.java | 117 ++---------------- 2 files changed, 110 insertions(+), 107 deletions(-) create mode 100644 lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Account.java diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Account.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Account.java new file mode 100644 index 000000000..938d86f14 --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Account.java @@ -0,0 +1,100 @@ +package com.codedifferently.lesson17.bank; + +import com.codedifferently.lesson17.bank.exceptions.InsufficientFundsException; + +import lombok.Getter; +import lombok.Setter; + +import java.util.Set; + +/** + * Abstract base class for all bank accounts. + */ +@Getter +@Setter +public abstract class Account { + private final Set owners; + private final String accountNumber; + private double balance; + private boolean isActive; + + /** + * Creates a new account. + * + * @param accountNumber The account number. + * @param owners The owners of the account. + * @param initalBalance The inital balance of the account. + */ + public Account(String accountNumber, Set owners, double initalBalance) { + this.accountNumber = accountNumber; + this.owners = owners; + this.balance = initalBalance; + this.isActive = true; + } + + /** + * Deposits funds into the account. + * + * @param amount The amount to deposit. + */ + public void deposit(double amount) throws IllegalStateException { + if (isClosed()) { + throw new IllegalStateException("Cannot deposit to a closed account"); + } + if (amount <= 0) { + throw new IllegalArgumentException("Deposit amount must be positive"); + } + balance += amount; + } + + /** + * Withdraws funds from the account. + * + * @param amount + * @throws InsufficientFundsException + */ + public void withdraw(double amount) throws InsufficientFundsException { + if (isClosed()) { + throw new IllegalStateException("Cannot withdraw from a closed account"); + } + if (amount <= 0) { + throw new IllegalStateException("Withdrawal amount must be positive"); + } + if (balance < amount) { + throw new InsufficientFundsException("Account does not have enough funds for withdrawal"); + } + balance -= amount; + } + + /** + * Closes the account. + */ + public void closeAccount() throws IllegalStateException { + if (balance > 0) { + throw new IllegalStateException("Cannot close account with a positive balance"); + } + isActive = false; + } + + /** + * Checks if the account is closed. + * + * @return True if the account is closed, otherwise false. + */ + public boolean isClosed() { + return !isActive; + } + + @Override + public int hashCode() { + return accountNumber.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof CheckingAccount other) { + return accountNumber.equals(other.getAccountNumber()); + } + return false; + } +} diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CheckingAccount.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CheckingAccount.java index 5d8aeb74d..d7f9c448a 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CheckingAccount.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CheckingAccount.java @@ -1,131 +1,34 @@ package com.codedifferently.lesson17.bank; -import com.codedifferently.lesson17.bank.exceptions.InsufficientFundsException; +import lombok.Getter; + import java.util.Set; /** Represents a checking account. */ -public class CheckingAccount { - - private final Set owners; - private final String accountNumber; - private double balance; - private boolean isActive; +@Getter +public class CheckingAccount extends Account { /** * Creates a new checking account. * - * @param accountNumber The account number. - * @param owners The owners of the account. + * @param accountNumber The account number. + * @param owners The owners of the account. * @param initialBalance The initial balance of the account. */ public CheckingAccount(String accountNumber, Set owners, double initialBalance) { - this.accountNumber = accountNumber; - this.owners = owners; - this.balance = initialBalance; - isActive = true; - } - - /** - * Gets the account number. - * - * @return The account number. - */ - public String getAccountNumber() { - return accountNumber; - } - - /** - * Gets the owners of the account. - * - * @return The owners of the account. - */ - public Set getOwners() { - return owners; - } - - /** - * Deposits funds into the account. - * - * @param amount The amount to deposit. - */ - public void deposit(double amount) throws IllegalStateException { - if (isClosed()) { - throw new IllegalStateException("Cannot deposit to a closed account"); - } - if (amount <= 0) { - throw new IllegalArgumentException("Deposit amount must be positive"); - } - balance += amount; - } - - /** - * Withdraws funds from the account. - * - * @param amount - * @throws InsufficientFundsException - */ - public void withdraw(double amount) throws InsufficientFundsException { - if (isClosed()) { - throw new IllegalStateException("Cannot withdraw from a closed account"); - } - if (amount <= 0) { - throw new IllegalStateException("Withdrawal amount must be positive"); - } - if (balance < amount) { - throw new InsufficientFundsException("Account does not have enough funds for withdrawal"); - } - balance -= amount; - } - - /** - * Gets the balance of the account. - * - * @return The balance of the account. - */ - public double getBalance() { - return balance; - } - - /** Closes the account. */ - public void closeAccount() throws IllegalStateException { - if (balance > 0) { - throw new IllegalStateException("Cannot close account with a positive balance"); - } - isActive = false; - } - - /** - * Checks if the account is closed. - * - * @return True if the account is closed, otherwise false. - */ - public boolean isClosed() { - return !isActive; - } - - @Override - public int hashCode() { - return accountNumber.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof CheckingAccount other) { - return accountNumber.equals(other.accountNumber); - } - return false; + super(accountNumber, owners, initialBalance); } @Override public String toString() { return "CheckingAccount{" + "accountNumber='" - + accountNumber + + getAccountNumber() + '\'' + ", balance=" - + balance + + getBalance() + ", isActive=" - + isActive + + isActive() + '}'; } } From 1f7acc318ce52bd98ed019317d256344fe2c0e30 Mon Sep 17 00:00:00 2001 From: Evan Philakhong Date: Mon, 14 Apr 2025 09:46:45 -0400 Subject: [PATCH 2/7] feat: immplements SavingsAccount class --- .../lesson17/bank/BankAtm.java | 27 +++++++++------- .../codedifferently/lesson17/bank/Check.java | 10 +++--- .../lesson17/bank/CheckingAccount.java | 3 -- .../lesson17/bank/Customer.java | 31 ++++++------------- .../lesson17/bank/SavingsAccount.java | 31 +++++++++++++++++++ .../lesson17/bank/SavingAccountTest.java | 17 ++++++++++ 6 files changed, 78 insertions(+), 41 deletions(-) create mode 100644 lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/SavingsAccount.java create mode 100644 lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingAccountTest.java diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAtm.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAtm.java index 8cbcd3cc0..27dbfbada 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAtm.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAtm.java @@ -10,14 +10,14 @@ public class BankAtm { private final Map customerById = new HashMap<>(); - private final Map accountByNumber = new HashMap<>(); + private final Map accountByNumber = new HashMap<>(); /** * Adds a checking account to the bank. * * @param account The account to add. */ - public void addAccount(CheckingAccount account) { + public void addAccount(Account account) { accountByNumber.put(account.getAccountNumber(), account); account .getOwners() @@ -33,7 +33,7 @@ public void addAccount(CheckingAccount account) { * @param customerId The ID of the customer. * @return The unique set of accounts owned by the customer. */ - public Set findAccountsByCustomerId(UUID customerId) { + public Set findAccountsByCustomerId(UUID customerId) { return customerById.containsKey(customerId) ? customerById.get(customerId).getAccounts() : Set.of(); @@ -43,10 +43,10 @@ public Set findAccountsByCustomerId(UUID customerId) { * Deposits funds into an account. * * @param accountNumber The account number. - * @param amount The amount to deposit. + * @param amount The amount to deposit. */ public void depositFunds(String accountNumber, double amount) { - CheckingAccount account = getAccountOrThrow(accountNumber); + Account account = getAccountOrThrow(accountNumber); account.deposit(amount); } @@ -54,11 +54,16 @@ public void depositFunds(String accountNumber, double amount) { * Deposits funds into an account using a check. * * @param accountNumber The account number. - * @param check The check to deposit. + * @param check The check to deposit. */ public void depositFunds(String accountNumber, Check check) { - CheckingAccount account = getAccountOrThrow(accountNumber); - check.depositFunds(account); + Account account = getAccountOrThrow(accountNumber); + + if (account instanceof CheckingAccount checkingAccount) { + check.depositFunds(checkingAccount); + } else if (account instanceof SavingsAccount) { + throw new IllegalStateException("Savings Accounts can't accept checks"); + } } /** @@ -68,7 +73,7 @@ public void depositFunds(String accountNumber, Check check) { * @param amount */ public void withdrawFunds(String accountNumber, double amount) { - CheckingAccount account = getAccountOrThrow(accountNumber); + Account account = getAccountOrThrow(accountNumber); account.withdraw(amount); } @@ -78,8 +83,8 @@ public void withdrawFunds(String accountNumber, double amount) { * @param accountNumber The account number. * @return The account. */ - private CheckingAccount getAccountOrThrow(String accountNumber) { - CheckingAccount account = accountByNumber.get(accountNumber); + private Account getAccountOrThrow(String accountNumber) { + Account account = accountByNumber.get(accountNumber); if (account == null || account.isClosed()) { throw new AccountNotFoundException("Account not found"); } diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Check.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Check.java index 061fa4a5c..b4bea73df 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Check.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Check.java @@ -7,17 +7,17 @@ public class Check { private final String checkNumber; private final double amount; - private final CheckingAccount account; + private final Account account; private boolean isVoided = false; /** * Creates a new check. * * @param checkNumber The check number. - * @param amount The amount of the check. - * @param account The account the check is drawn on. + * @param amount The amount of the check. + * @param account The account the check is drawn on. */ - public Check(String checkNumber, double amount, CheckingAccount account) { + public Check(String checkNumber, double amount, Account account) { if (amount < 0) { throw new IllegalArgumentException("Check amount must be positive"); } @@ -45,7 +45,7 @@ public void voidCheck() { * * @param toAccount The account to deposit the check into. */ - public void depositFunds(CheckingAccount toAccount) { + public void depositFunds(Account toAccount) { if (isVoided) { throw new CheckVoidedException("Check is voided"); } diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CheckingAccount.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CheckingAccount.java index d7f9c448a..8c488e1e4 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CheckingAccount.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CheckingAccount.java @@ -1,11 +1,8 @@ package com.codedifferently.lesson17.bank; -import lombok.Getter; - import java.util.Set; /** Represents a checking account. */ -@Getter public class CheckingAccount extends Account { /** diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java index af0847134..40a66a252 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java @@ -4,17 +4,22 @@ import java.util.Set; import java.util.UUID; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter /** Represents a customer of the bank. */ public class Customer { private final UUID id; private final String name; - private final Set accounts = new HashSet<>(); + private final Set accounts = new HashSet<>(); /** * Creates a new customer. * - * @param id The ID of the customer. + * @param id The ID of the customer. * @param name The name of the customer. */ public Customer(UUID id, String name) { @@ -22,30 +27,12 @@ public Customer(UUID id, String name) { this.name = name; } - /** - * Gets the ID of the customer. - * - * @return The ID of the customer. - */ - public UUID getId() { - return id; - } - - /** - * Gets the name of the customer. - * - * @return The name of the customer. - */ - public String getName() { - return name; - } - /** * Adds a checking account to the customer. * * @param account The account to add. */ - public void addAccount(CheckingAccount account) { + public void addAccount(Account account) { accounts.add(account); } @@ -54,7 +41,7 @@ public void addAccount(CheckingAccount account) { * * @return The unique set of accounts owned by the customer. */ - public Set getAccounts() { + public Set getAccounts() { return accounts; } diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/SavingsAccount.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/SavingsAccount.java new file mode 100644 index 000000000..9e41bfb99 --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/SavingsAccount.java @@ -0,0 +1,31 @@ +package com.codedifferently.lesson17.bank; + +import java.util.Set; + +/** Represents a savings account. */ +public class SavingsAccount extends Account { + + /** + * Creates a new sacings account. + * + * @param accountNumber The account number. + * @param owners The ownders of the account. + * @param initalBalance The inital balance of the account. + */ + public SavingsAccount(String accountNumber, Set owners, double initalBalance) { + super(accountNumber, owners, initalBalance); + } + + @Override + public String toString() { + return "SavingsAccount{" + + "accountNumber='" + + getAccountNumber() + + '\'' + + ", balance=" + + getBalance() + + ", isActive=" + + isActive() + + '}'; + } +} diff --git a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingAccountTest.java b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingAccountTest.java new file mode 100644 index 000000000..79d87bf35 --- /dev/null +++ b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingAccountTest.java @@ -0,0 +1,17 @@ +package com.codedifferently.lesson17.bank; + +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.codedifferently.lesson17.bank.exceptions.InsufficientFundsException; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class CheckingAccountTest { + +} From 8d69a4ec6a0f9fd6fdef562aea36532cfec0ffca Mon Sep 17 00:00:00 2001 From: Evan Philakhong Date: Mon, 14 Apr 2025 11:43:48 -0400 Subject: [PATCH 3/7] refactor: ran spotlessApply --- .../codedifferently/lesson17/bank/Account.java | 14 ++++---------- .../codedifferently/lesson17/bank/BankAtm.java | 4 ++-- .../com/codedifferently/lesson17/bank/Check.java | 4 ++-- .../lesson17/bank/CheckingAccount.java | 4 ++-- .../codedifferently/lesson17/bank/Customer.java | 8 +++++--- .../lesson17/bank/CustomerType.java | 6 ++++++ .../lesson17/bank/SavingsAccount.java | 2 +- .../lesson17/bank/SavingAccountTest.java | 16 +--------------- 8 files changed, 23 insertions(+), 35 deletions(-) create mode 100644 lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CustomerType.java diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Account.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Account.java index 938d86f14..92e67b7bb 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Account.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Account.java @@ -1,15 +1,11 @@ package com.codedifferently.lesson17.bank; import com.codedifferently.lesson17.bank.exceptions.InsufficientFundsException; - +import java.util.Set; import lombok.Getter; import lombok.Setter; -import java.util.Set; - -/** - * Abstract base class for all bank accounts. - */ +/** Abstract base class for all bank accounts. */ @Getter @Setter public abstract class Account { @@ -22,7 +18,7 @@ public abstract class Account { * Creates a new account. * * @param accountNumber The account number. - * @param owners The owners of the account. + * @param owners The owners of the account. * @param initalBalance The inital balance of the account. */ public Account(String accountNumber, Set owners, double initalBalance) { @@ -66,9 +62,7 @@ public void withdraw(double amount) throws InsufficientFundsException { balance -= amount; } - /** - * Closes the account. - */ + /** Closes the account. */ public void closeAccount() throws IllegalStateException { if (balance > 0) { throw new IllegalStateException("Cannot close account with a positive balance"); diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAtm.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAtm.java index 27dbfbada..ce0c55725 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAtm.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAtm.java @@ -43,7 +43,7 @@ public Set findAccountsByCustomerId(UUID customerId) { * Deposits funds into an account. * * @param accountNumber The account number. - * @param amount The amount to deposit. + * @param amount The amount to deposit. */ public void depositFunds(String accountNumber, double amount) { Account account = getAccountOrThrow(accountNumber); @@ -54,7 +54,7 @@ public void depositFunds(String accountNumber, double amount) { * Deposits funds into an account using a check. * * @param accountNumber The account number. - * @param check The check to deposit. + * @param check The check to deposit. */ public void depositFunds(String accountNumber, Check check) { Account account = getAccountOrThrow(accountNumber); diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Check.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Check.java index b4bea73df..ed813e90d 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Check.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Check.java @@ -14,8 +14,8 @@ public class Check { * Creates a new check. * * @param checkNumber The check number. - * @param amount The amount of the check. - * @param account The account the check is drawn on. + * @param amount The amount of the check. + * @param account The account the check is drawn on. */ public Check(String checkNumber, double amount, Account account) { if (amount < 0) { diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CheckingAccount.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CheckingAccount.java index 8c488e1e4..4adf04f71 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CheckingAccount.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CheckingAccount.java @@ -8,8 +8,8 @@ public class CheckingAccount extends Account { /** * Creates a new checking account. * - * @param accountNumber The account number. - * @param owners The owners of the account. + * @param accountNumber The account number. + * @param owners The owners of the account. * @param initialBalance The initial balance of the account. */ public CheckingAccount(String accountNumber, Set owners, double initialBalance) { diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java index 40a66a252..f95a50092 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java @@ -3,7 +3,6 @@ import java.util.HashSet; import java.util.Set; import java.util.UUID; - import lombok.Getter; import lombok.Setter; @@ -14,17 +13,20 @@ public class Customer { private final UUID id; private final String name; + private final CustomerType type; private final Set accounts = new HashSet<>(); /** * Creates a new customer. * - * @param id The ID of the customer. + * @param id The ID of the customer. * @param name The name of the customer. + * @param type The type of customer (individual or business) */ - public Customer(UUID id, String name) { + public Customer(UUID id, String name, CustomerType type) { this.id = id; this.name = name; + this.type = type; } /** diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CustomerType.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CustomerType.java new file mode 100644 index 000000000..30f05a33c --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CustomerType.java @@ -0,0 +1,6 @@ +package com.codedifferently.lesson17.bank; + +public enum CustomerType { + INDIVIDUAL, + BUSINESS +} diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/SavingsAccount.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/SavingsAccount.java index 9e41bfb99..411cf060d 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/SavingsAccount.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/SavingsAccount.java @@ -9,7 +9,7 @@ public class SavingsAccount extends Account { * Creates a new sacings account. * * @param accountNumber The account number. - * @param owners The ownders of the account. + * @param owners The ownders of the account. * @param initalBalance The inital balance of the account. */ public SavingsAccount(String accountNumber, Set owners, double initalBalance) { diff --git a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingAccountTest.java b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingAccountTest.java index 79d87bf35..fcf14b237 100644 --- a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingAccountTest.java +++ b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingAccountTest.java @@ -1,17 +1,3 @@ package com.codedifferently.lesson17.bank; -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import com.codedifferently.lesson17.bank.exceptions.InsufficientFundsException; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -class CheckingAccountTest { - -} +class CheckingAccountTest {} From 04be46f6996cd91b8047bef500f99721fceed2fe Mon Sep 17 00:00:00 2001 From: Evan Philakhong Date: Mon, 14 Apr 2025 15:30:28 -0400 Subject: [PATCH 4/7] feat: adds BusinessCheckingAccount class --- .../codedifferently/lesson17/bank/Customer.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java index f95a50092..62b9716f1 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java @@ -19,7 +19,7 @@ public class Customer { /** * Creates a new customer. * - * @param id The ID of the customer. + * @param id The ID of the customer. * @param name The name of the customer. * @param type The type of customer (individual or business) */ @@ -29,6 +29,19 @@ public Customer(UUID id, String name, CustomerType type) { this.type = type; } + /** + * Creates an new individual customer. + * + * @param id The ID of the customer. + * @param name The name of the customer. + * @param type The type of custimer (individual or business) + */ + public Customer(UUID id, String name, Customer type) { + this.id = id; + this.name = name; + this.type = CustomerType.INDIVIDUAL; + } + /** * Adds a checking account to the customer. * From a6f21fac4667ac1f96d9d727eb7f01552e94a60d Mon Sep 17 00:00:00 2001 From: Evan Philakhong Date: Wed, 16 Apr 2025 13:57:28 +0000 Subject: [PATCH 5/7] feat: adds SavingsAccount Tests --- .../bank/BusinessCheckingAccount.java | 32 +++++++++ .../codedifferently/lesson17/bank/Check.java | 4 +- .../lesson17/bank/Customer.java | 6 +- .../lesson17/bank/BankAtmTest.java | 4 +- .../lesson17/bank/SavingAccountTest.java | 66 ++++++++++++++++++- 5 files changed, 104 insertions(+), 8 deletions(-) create mode 100644 lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BusinessCheckingAccount.java diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BusinessCheckingAccount.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BusinessCheckingAccount.java new file mode 100644 index 000000000..eb922f18b --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BusinessCheckingAccount.java @@ -0,0 +1,32 @@ +package com.codedifferently.lesson17.bank; + +import java.util.Set; + +/** Represents a business checking account */ +public class BusinessCheckingAccount extends CheckingAccount { + + /** + * Creates a new business checking account + * + * @param accountNumber The accounnt number. + * @param owners The owners of the account. + * @param initialBalance The initial balance of the account. + */ + public BusinessCheckingAccount( + String accountNumber, Set owners, double initialBalance) { + super(accountNumber, owners, initialBalance); + } + + @Override + public String toString() { + return "BusinessCheckingAccount{" + + "accountNumber='" + + getAccountNumber() + + '\'' + + ", balance=" + + getBalance() + + ", isActive=" + + isActive() + + '}'; + } +} diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Check.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Check.java index ed813e90d..ff6115984 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Check.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Check.java @@ -7,7 +7,7 @@ public class Check { private final String checkNumber; private final double amount; - private final Account account; + private final CheckingAccount account; private boolean isVoided = false; /** @@ -17,7 +17,7 @@ public class Check { * @param amount The amount of the check. * @param account The account the check is drawn on. */ - public Check(String checkNumber, double amount, Account account) { + public Check(String checkNumber, double amount, CheckingAccount account) { if (amount < 0) { throw new IllegalArgumentException("Check amount must be positive"); } diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java index 62b9716f1..7b4906ff4 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java @@ -19,7 +19,7 @@ public class Customer { /** * Creates a new customer. * - * @param id The ID of the customer. + * @param id The ID of the customer. * @param name The name of the customer. * @param type The type of customer (individual or business) */ @@ -32,11 +32,11 @@ public Customer(UUID id, String name, CustomerType type) { /** * Creates an new individual customer. * - * @param id The ID of the customer. + * @param id The ID of the customer. * @param name The name of the customer. * @param type The type of custimer (individual or business) */ - public Customer(UUID id, String name, Customer type) { + public Customer(UUID id, String name) { this.id = id; this.name = name; this.type = CustomerType.INDIVIDUAL; diff --git a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BankAtmTest.java b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BankAtmTest.java index fa4a913a2..9f08e3170 100644 --- a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BankAtmTest.java +++ b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BankAtmTest.java @@ -43,14 +43,14 @@ void testAddAccount() { classUnderTest.addAccount(account3); // Assert - Set accounts = classUnderTest.findAccountsByCustomerId(customer3.getId()); + Set accounts = classUnderTest.findAccountsByCustomerId(customer3.getId()); assertThat(accounts).containsOnly(account3); } @Test void testFindAccountsByCustomerId() { // Act - Set accounts = classUnderTest.findAccountsByCustomerId(customer1.getId()); + Set accounts = classUnderTest.findAccountsByCustomerId(customer1.getId()); // Assert assertThat(accounts).containsOnly(account1, account2); diff --git a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingAccountTest.java b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingAccountTest.java index fcf14b237..501a20800 100644 --- a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingAccountTest.java +++ b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingAccountTest.java @@ -1,3 +1,67 @@ package com.codedifferently.lesson17.bank; -class CheckingAccountTest {} +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.codedifferently.lesson17.bank.exceptions.InsufficientFundsException; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class SavingsAccountTest { + + private SavingsAccount account; + private Set owners; + + @BeforeEach + void setUp() { + owners = new HashSet<>(); + owners.add(new Customer(UUID.randomUUID(), "Yuji Nishida")); + owners.add(new Customer(UUID.randomUUID(), "Masahiro Sekita")); + + account = new SavingsAccount("123456789", owners, 100.0); + } + + @Test + void deposit() { + account.deposit(100.0); + assertEquals(200.0, account.getBalance()); + } + + @Test + void withdraw() { + account.withdraw(25.0); + assertEquals(75.0, account.getBalance()); + } + + @Test + void withdraw_withNegativeAmount() { + assertThatExceptionOfType(IllegalStateException.class) + .isThrownBy(() -> account.withdraw(-25.0)) + .withMessage("Withdrawal amount must be positive"); + } + + @Test + void withdraw_withInsufficientBalance() { + assertThatExceptionOfType(InsufficientFundsException.class) + .isThrownBy(() -> account.withdraw(200.0)) + .withMessage("Account does not have enough funds for withdrawal"); + } + + @Test + void closeAccount_withPositiveBalance() { + assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> account.closeAccount()); + } + + @Test + void isClosed() { + assertFalse(account.isClosed()); + account.withdraw(100.0); + account.closeAccount(); + assertTrue(account.isClosed()); + } +} From 7d5637e8012dd3825d2aeb4e6497ff6261f38e51 Mon Sep 17 00:00:00 2001 From: Evan Philakhong Date: Wed, 16 Apr 2025 15:22:31 +0000 Subject: [PATCH 6/7] adds validateBusinessOwners method adds BusinessCheckingAccount Tests --- .../bank/BusinessCheckingAccount.java | 14 ++++++++++++ .../lesson17/bank/Customer.java | 9 ++++++++ .../bank/BusinessCheckingAccountTest.java | 22 +++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BusinessCheckingAccountTest.java diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BusinessCheckingAccount.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BusinessCheckingAccount.java index eb922f18b..5b8a3d688 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BusinessCheckingAccount.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BusinessCheckingAccount.java @@ -17,6 +17,20 @@ public BusinessCheckingAccount( super(accountNumber, owners, initialBalance); } + /** + * Checks if at least one owner is a business. + * + * @param owners The owers of the account. + * @throws IllegalArgumentEception If no business owner is found. + */ + private void validateBusinessOwner(Set owners) { + boolean hasBusinessOwner = owners.stream().anyMatch(Customer::isBusiness); + if (!hasBusinessOwner) { + throw new IllegalArgumentException( + "Business Checking Account must have at least one business owner"); + } + } + @Override public String toString() { return "BusinessCheckingAccount{" diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java index 7b4906ff4..e3ff7c5af 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java @@ -60,6 +60,15 @@ public Set getAccounts() { return accounts; } + /** + * Checks if the owner is a business. + * + * @return True if the customer is a business, false otherwise. + */ + public boolean isBusiness() { + return this.type == CustomerType.BUSINESS; + } + @Override public int hashCode() { return id.hashCode(); diff --git a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BusinessCheckingAccountTest.java b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BusinessCheckingAccountTest.java new file mode 100644 index 000000000..bedd169ad --- /dev/null +++ b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BusinessCheckingAccountTest.java @@ -0,0 +1,22 @@ +package com.codedifferently.lesson17.bank; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +import org.junit.jupiter.api.Test; + +public class BusinessCheckingAccountTest { + + @Test + void validateBusinessOwner_withBusinessOwner() { + Set owners = new HashSet<>(); + owners.add(new Customer(UUID.randomUUID(), "Elon Musk", CustomerType.BUSINESS)); + owners.add(new Customer(UUID.randomUUID(), "Elon Musk", CustomerType.BUSINESS)); + + BusinessCheckingAccount account = new BusinessCheckingAccount("123456789", owners, 1000.0); + assertThat(account).isNotNull(); + } +} From 9e3827628d29a4c035e02f364b4c11aff890c2f5 Mon Sep 17 00:00:00 2001 From: Evan Philakhong Date: Wed, 16 Apr 2025 15:31:02 +0000 Subject: [PATCH 7/7] adds BusinessCheckingAccount Tests --- .../lesson17/bank/BusinessCheckingAccountTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BusinessCheckingAccountTest.java b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BusinessCheckingAccountTest.java index bedd169ad..e88be2ed4 100644 --- a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BusinessCheckingAccountTest.java +++ b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BusinessCheckingAccountTest.java @@ -5,7 +5,6 @@ import java.util.HashSet; import java.util.Set; import java.util.UUID; - import org.junit.jupiter.api.Test; public class BusinessCheckingAccountTest {