From 476f31ccbae000a6988bdf946aabe5721afce52f Mon Sep 17 00:00:00 2001 From: enyabuti Date: Mon, 14 Apr 2025 18:26:12 +0000 Subject: [PATCH 1/4] feat: implements bank account system with checking and savings accounts, including unit tests --- .../lesson17/bank/BankAccount.java | 43 +++++++++++++++++++ .../lesson17/bank/BankAtm.java | 16 +++++++ .../bank/BusinessCheckingAccount.java | 16 +++++++ .../lesson17/bank/CheckingAccount.java | 6 ++- .../lesson17/bank/SavingsAccount.java | 20 +++++++++ .../lesson17/bank/SavingsAccountTest.java | 40 +++++++++++++++++ 6 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAccount.java create mode 100644 lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BusinessCheckingAccount.java 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/SavingsAccountTest.java diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAccount.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAccount.java new file mode 100644 index 00000000..0f0a420c --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAccount.java @@ -0,0 +1,43 @@ +package com.codedifferently.lesson17.bank; + +import com.codedifferently.lesson17.bank.exceptions.InsufficientFundsException; +import java.util.Set; + +/** Base class for all bank accounts. */ +public abstract class BankAccount { + private String accountNumber; + private double balance; + private Set owners; + + public BankAccount(String accountNumber, Set owners, double initialBalance) { + this.accountNumber = accountNumber; + this.owners = owners; + this.balance = initialBalance; + } + + public String getAccountNumber() { + return accountNumber; + } + + public double getBalance() { + return balance; + } + + public Set getOwners() { + return owners; + } + + public void withdraw(double amount) throws InsufficientFundsException { + if (amount > balance) { + throw new InsufficientFundsException("Insufficient funds"); + } + balance -= amount; + } + + public void deposit(double amount) { + if (amount <= 0) { + throw new IllegalArgumentException("Deposit amount must be positive"); + } + balance += amount; + } +} 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 8cbcd3cc..daadac26 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 @@ -11,6 +11,7 @@ public class BankAtm { private final Map customerById = new HashMap<>(); private final Map accountByNumber = new HashMap<>(); + private final Map savingsAccountByNumber = new HashMap<>(); /** * Adds a checking account to the bank. @@ -27,6 +28,21 @@ public void addAccount(CheckingAccount account) { }); } + /** + * Adds a savings account to the bank. + * + * @param account The account to add. + */ + public void addAccount(SavingsAccount account) { + savingsAccountByNumber.put(account.getAccountNumber(), account); + account + .getOwners() + .forEach( + owner -> { + customerById.put(owner.getId(), owner); + }); + } + /** * Finds all accounts owned by a customer. * 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 00000000..005f8951 --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BusinessCheckingAccount.java @@ -0,0 +1,16 @@ +package com.codedifferently.lesson17.bank; + +import java.util.Set; + +/** Represents a business checking account. */ +public class BusinessCheckingAccount extends CheckingAccount { + public BusinessCheckingAccount( + String accountNumber, Set owners, double initialBalance) { + super(accountNumber, owners, initialBalance); + } + /** + * Gets the account number. + * + * @return The account number. + */ +} 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 5d8aeb74..854c0a1c 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,10 +1,11 @@ package com.codedifferently.lesson17.bank; -import com.codedifferently.lesson17.bank.exceptions.InsufficientFundsException; import java.util.Set; +import com.codedifferently.lesson17.bank.exceptions.InsufficientFundsException; + /** Represents a checking account. */ -public class CheckingAccount { +public class CheckingAccount extends BankAccount { private final Set owners; private final String accountNumber; @@ -19,6 +20,7 @@ public class CheckingAccount { * @param initialBalance The initial balance of the account. */ public CheckingAccount(String accountNumber, Set owners, double initialBalance) { + super(accountNumber, owners, initialBalance); this.accountNumber = accountNumber; this.owners = owners; this.balance = initialBalance; 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 00000000..b2916f69 --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/SavingsAccount.java @@ -0,0 +1,20 @@ +package com.codedifferently.lesson17.bank; + +import java.util.Set; + +/** Represents a savings account. */ +public class SavingsAccount extends CheckingAccount { + + public SavingsAccount(String accountNumber, Set owners, double initialBalance) { + super(accountNumber, owners, initialBalance); + } + + /** + * Gets the account number. + * + * @return The account number. + */ + public void depositFunds(Check check) { + throw new UnsupportedOperationException("Cannot deposit a check into a savings account"); + } +} diff --git a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingsAccountTest.java b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingsAccountTest.java new file mode 100644 index 00000000..fa82c36d --- /dev/null +++ b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingsAccountTest.java @@ -0,0 +1,40 @@ +package com.codedifferently.lesson17.bank; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.util.Set; +import org.junit.jupiter.api.Test; + +public class SavingsAccountTest { + @Test + public void testDepositFunds() { + // Create a customer + Customer customer = new Customer(null, "John Doe"); + + // Create a savings account + SavingsAccount savingsAccount = new SavingsAccount("123456789", Set.of(customer), 1000.0); + + // Deposit funds into the account + savingsAccount.deposit(500.0); + + // Assert that the balance is correct + assertEquals(1500.0, savingsAccount.getBalance()); + } + + @Test + public void testDepositCheck() { + // Create a customer + Customer customer = new Customer(null, "John Doe"); + + // Create a savings account + SavingsAccount savingsAccount = new SavingsAccount("123456789", Set.of(customer), 1000.0); + + // Attempt to deposit a check into the account + assertThrows( + UnsupportedOperationException.class, + () -> { + savingsAccount.depositFunds(new Check(null, 100.0, savingsAccount)); + }); + } +} From a02f3a81da7c1b0f03a63859db83453115bd9ef3 Mon Sep 17 00:00:00 2001 From: enyabuti Date: Mon, 14 Apr 2025 18:38:23 +0000 Subject: [PATCH 2/4] updated my savings account test to use the new constructor --- .../lesson17/bank/SavingsAccount.java | 4 +- .../lesson17/bank/SavingsAccountTest.java | 40 ------------------- 2 files changed, 2 insertions(+), 42 deletions(-) delete mode 100644 lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingsAccountTest.java 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 b2916f69..3c040ff4 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 @@ -3,7 +3,7 @@ import java.util.Set; /** Represents a savings account. */ -public class SavingsAccount extends CheckingAccount { +public class SavingsAccount extends BankAccount { public SavingsAccount(String accountNumber, Set owners, double initialBalance) { super(accountNumber, owners, initialBalance); @@ -15,6 +15,6 @@ public SavingsAccount(String accountNumber, Set owners, double initial * @return The account number. */ public void depositFunds(Check check) { - throw new UnsupportedOperationException("Cannot deposit a check into a savings account"); + throw new UnsupportedOperationException("Cannot withdraw from savings account."); } } diff --git a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingsAccountTest.java b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingsAccountTest.java deleted file mode 100644 index fa82c36d..00000000 --- a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingsAccountTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.codedifferently.lesson17.bank; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -import java.util.Set; -import org.junit.jupiter.api.Test; - -public class SavingsAccountTest { - @Test - public void testDepositFunds() { - // Create a customer - Customer customer = new Customer(null, "John Doe"); - - // Create a savings account - SavingsAccount savingsAccount = new SavingsAccount("123456789", Set.of(customer), 1000.0); - - // Deposit funds into the account - savingsAccount.deposit(500.0); - - // Assert that the balance is correct - assertEquals(1500.0, savingsAccount.getBalance()); - } - - @Test - public void testDepositCheck() { - // Create a customer - Customer customer = new Customer(null, "John Doe"); - - // Create a savings account - SavingsAccount savingsAccount = new SavingsAccount("123456789", Set.of(customer), 1000.0); - - // Attempt to deposit a check into the account - assertThrows( - UnsupportedOperationException.class, - () -> { - savingsAccount.depositFunds(new Check(null, 100.0, savingsAccount)); - }); - } -} From bf71953954e381c6eb79f8222575f9a0d9bb95ba Mon Sep 17 00:00:00 2001 From: enyabuti Date: Mon, 14 Apr 2025 18:47:55 +0000 Subject: [PATCH 3/4] made changes to the following files: --- .../lesson17/bank/BankAccount.java | 41 ++++++++++--------- .../lesson17/bank/CheckingAccount.java | 15 +------ .../lesson17/bank/SavingsAccount.java | 17 ++++++++ 3 files changed, 40 insertions(+), 33 deletions(-) diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAccount.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAccount.java index 0f0a420c..bdba5f67 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAccount.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAccount.java @@ -1,8 +1,9 @@ package com.codedifferently.lesson17.bank; -import com.codedifferently.lesson17.bank.exceptions.InsufficientFundsException; import java.util.Set; +import com.codedifferently.lesson17.bank.exceptions.InsufficientFundsException; + /** Base class for all bank accounts. */ public abstract class BankAccount { private String accountNumber; @@ -14,18 +15,11 @@ public BankAccount(String accountNumber, Set owners, double initialBal this.owners = owners; this.balance = initialBalance; } - - public String getAccountNumber() { - return accountNumber; - } - - public double getBalance() { - return balance; - } - - public Set getOwners() { - return owners; - } + /** + * Gets the account number. + * + * @return The account number. + */ public void withdraw(double amount) throws InsufficientFundsException { if (amount > balance) { @@ -34,10 +28,19 @@ public void withdraw(double amount) throws InsufficientFundsException { balance -= amount; } - public void deposit(double amount) { - if (amount <= 0) { - throw new IllegalArgumentException("Deposit amount must be positive"); - } - balance += amount; - } + /** + * 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; + } + protected abstract boolean isClosed(); } 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 854c0a1c..3ea54d04 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 @@ -45,20 +45,7 @@ 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. 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 3c040ff4..9d791d52 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 @@ -1,6 +1,7 @@ package com.codedifferently.lesson17.bank; import java.util.Set; +import java.util.UUID; /** Represents a savings account. */ public class SavingsAccount extends BankAccount { @@ -17,4 +18,20 @@ public SavingsAccount(String accountNumber, Set owners, double initial public void depositFunds(Check check) { throw new UnsupportedOperationException("Cannot withdraw from savings account."); } + + public String getAccountNumber() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getAccountNumber'"); + } + + public Map Date: Wed, 16 Apr 2025 15:18:23 +0000 Subject: [PATCH 4/4] feat: adds BusinessCheckingAccount and BankAccount classes, update tests and methods for account handling --- .../lesson17/bank/BankAccount.java | 67 +++++++++++++------ .../lesson17/bank/BankAtm.java | 2 +- .../bank/BusinessCheckingAccount.java | 15 +++-- .../codedifferently/lesson17/bank/Check.java | 4 ++ .../lesson17/bank/CheckingAccount.java | 60 +++++------------ .../lesson17/bank/Customer.java | 27 +++++--- .../lesson17/bank/SavingsAccount.java | 30 +++------ .../lesson17/bank/BankAccountTest.java | 48 +++++++++++++ .../lesson17/bank/BankAtmTest.java | 4 +- .../bank/BusinessCheckingAccountTest.java | 3 + .../lesson17/bank/SavingsAccountTest.java | 65 ++++++++++++++++++ 11 files changed, 221 insertions(+), 104 deletions(-) create mode 100644 lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BankAccountTest.java create mode 100644 lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BusinessCheckingAccountTest.java create mode 100644 lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingsAccountTest.java diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAccount.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAccount.java index bdba5f67..d4ba80ee 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAccount.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAccount.java @@ -1,29 +1,59 @@ package com.codedifferently.lesson17.bank; -import java.util.Set; - import com.codedifferently.lesson17.bank.exceptions.InsufficientFundsException; +import java.util.Set; -/** Base class for all bank accounts. */ +/** + * Checks if the account is closed + * + * @returns true if the account is closed, otherwise false + */ public abstract class BankAccount { private String accountNumber; - private double balance; + protected double balance; private Set owners; + private boolean isClosed; public BankAccount(String accountNumber, Set owners, double initialBalance) { this.accountNumber = accountNumber; this.owners = owners; this.balance = initialBalance; } - /** - * Gets the account number. - * - * @return The account number. - */ + public boolean isActive() { + return isClosed; + } + + /** + * Gets the owners of the account. + * + * @return The owners of the account. + */ + public Set getOwners() { + return owners; + } + + /** + * Gets the account number. + * + * @return The account number. + */ + public String getAccountNumber() { + return accountNumber; + } + + /** + * Withdraws funds from the account. + * + * @param amount + * @throws InsufficientFundsException + */ public void withdraw(double amount) throws InsufficientFundsException { - if (amount > balance) { - throw new InsufficientFundsException("Insufficient funds"); + 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; } @@ -34,13 +64,10 @@ public void withdraw(double amount) throws InsufficientFundsException { * @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; - } - protected abstract boolean isClosed(); + + if (amount <= 0) { + throw new IllegalArgumentException("Deposit amount must be positive"); + } + balance += amount; + } } 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 daadac26..30a3a7ae 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 @@ -49,7 +49,7 @@ public void addAccount(SavingsAccount 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(); 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 005f8951..031ff21e 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 @@ -3,14 +3,17 @@ import java.util.Set; /** Represents a business checking account. */ -public class BusinessCheckingAccount extends CheckingAccount { +public class BusinessCheckingAccount extends BankAccount { + + /** + * Creates a new business checking account. + * + * @param accountNumber The account 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); } - /** - * Gets the account number. - * - * @return The account number. - */ } 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 061fa4a5..673f1240 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 @@ -79,4 +79,8 @@ public String toString() { + account.getAccountNumber() + '}'; } + + public Object getAmount() { + throw new UnsupportedOperationException("Unimplemented method 'getAmount'"); + } } 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 3ea54d04..ad26f20f 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,13 +1,11 @@ package com.codedifferently.lesson17.bank; -import java.util.Set; - import com.codedifferently.lesson17.bank.exceptions.InsufficientFundsException; +import java.util.Set; /** Represents a checking account. */ public class CheckingAccount extends BankAccount { - private final Set owners; private final String accountNumber; private double balance; private boolean isActive; @@ -20,50 +18,10 @@ public class CheckingAccount extends BankAccount { * @param initialBalance The initial balance of the account. */ public CheckingAccount(String accountNumber, Set owners, double initialBalance) { - super(accountNumber, owners, initialBalance); + super(accountNumber, owners, 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; - } - - - - /** - * 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; + this.isActive = true; } /** @@ -92,6 +50,18 @@ public boolean isClosed() { return !isActive; } + @Override + public void withdraw(double amount) throws InsufficientFundsException { + super.withdraw(amount); + balance -= amount; + } + + @Override + public void deposit(double amount) { + super.deposit(amount); + balance += amount; + } + @Override public int hashCode() { return accountNumber.hashCode(); 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 af084713..19ea6e36 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 @@ -9,7 +9,7 @@ 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. @@ -43,10 +43,10 @@ public String getName() { /** * Adds a checking account to the customer. * - * @param account The account to add. + * @param account3 The account to add. */ - public void addAccount(CheckingAccount account) { - accounts.add(account); + public void addAccount(CheckingAccount account3) { + accounts.add(account3); } /** @@ -54,8 +54,13 @@ public void addAccount(CheckingAccount account) { * * @return The unique set of accounts owned by the customer. */ - public Set getAccounts() { - return accounts; + public Set getAccounts() { + return new HashSet<>(accounts); + } + + /** check if is business account */ + public boolean isBusinessAccount() { + return accounts.stream().anyMatch(BusinessCheckingAccount.class::isInstance); } @Override @@ -65,10 +70,14 @@ public int hashCode() { @Override public boolean equals(Object obj) { - if (obj instanceof Customer other) { - return id.equals(other.id); + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; } - return false; + Customer other = (Customer) obj; + return id.equals(other.id) && name.equals(other.name); } @Override 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 9d791d52..b5d2e917 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 @@ -1,37 +1,25 @@ package com.codedifferently.lesson17.bank; import java.util.Set; -import java.util.UUID; -/** Represents a savings account. */ +/** Represents a savings account that doesn't allow checks. */ public class SavingsAccount extends BankAccount { + private boolean isActive = true; public SavingsAccount(String accountNumber, Set owners, double initialBalance) { super(accountNumber, owners, initialBalance); } - /** - * Gets the account number. - * - * @return The account number. - */ - public void depositFunds(Check check) { - throw new UnsupportedOperationException("Cannot withdraw from savings account."); - } - - public String getAccountNumber() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'getAccountNumber'"); + protected boolean isClosed() { + throw new IllegalStateException("Cannot check if account is closed"); } - public Map owners = new HashSet<>(); + owners.add(new Customer(UUID.randomUUID(), "John Doe")); + BankAccount account = new CheckingAccount("123456789", owners, 100.0); + // Act + boolean isActive = account.isActive(); + // Assert + assertThat(!isActive).isTrue(); + } + + @Test + void testGetOwners() { + // Act + Set owners = new HashSet<>(); + owners.add(new Customer(UUID.randomUUID(), "John Doe")); + BankAccount account = new CheckingAccount("123456789", owners, 100.0); + // Assert + assertEquals(owners, account.getOwners()); + } + + @Test + void testWithdrawFunds() { + // Arrange + double initialBalance = 100.0; + double withdrawAmount = 50.0; + double expectedBalance = initialBalance - withdrawAmount; + + // Act + BankAccount account = new CheckingAccount("123456789", null, initialBalance); + account.withdraw(withdrawAmount); + + // Assert + assertThat(account.balance).isEqualTo(expectedBalance); + } +} 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 fa4a913a..325f2345 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/BusinessCheckingAccountTest.java b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BusinessCheckingAccountTest.java new file mode 100644 index 00000000..d33baa66 --- /dev/null +++ b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BusinessCheckingAccountTest.java @@ -0,0 +1,3 @@ +package com.codedifferently.lesson17.bank; + +public class BusinessCheckingAccountTest {} diff --git a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingsAccountTest.java b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingsAccountTest.java new file mode 100644 index 00000000..f8670c5a --- /dev/null +++ b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingsAccountTest.java @@ -0,0 +1,65 @@ +package com.codedifferently.lesson17.bank; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class SavingsAccountTest { + + private SavingsAccount classUnderTest; + private Set owners; + private double initialBalance = 100.0; + private String accountNumber = "123456789"; + + @BeforeEach + void setUp() { + owners = new HashSet<>(); + owners.add(new Customer(UUID.randomUUID(), "John Doe")); + classUnderTest = new SavingsAccount(accountNumber, owners, initialBalance); + } + + @Test + void testIsClosed() { + // Arrange + Set owners = new HashSet<>(); + owners.add(new Customer(UUID.randomUUID(), "Ezra Nyabuti")); + SavingsAccount account = new SavingsAccount(accountNumber, owners, initialBalance); + + // Act + IllegalStateException exception = + assertThrows(IllegalStateException.class, () -> account.isClosed()); + + // Assert + assertEquals( + "Cannot check if account is closed", exception.getMessage(), "Exception message mismatch"); + } + + @Test + void testIsActive() { + Set owners = new HashSet<>(); + owners.add(new Customer(UUID.randomUUID(), "Ezra Nyabuti")); + SavingsAccount account = new SavingsAccount(accountNumber, owners, initialBalance); + // ssert + assertTrue(account.isActive(), "Account should be active"); + } + + @Test + void testCloseAccount() { + // Arrange + Set owners = new HashSet<>(); + owners.add(new Customer(UUID.randomUUID(), "Ezra Nyabuti")); + + // Act + SavingsAccount account = new SavingsAccount(accountNumber, owners, initialBalance); + IllegalStateException exception = + assertThrows(IllegalStateException.class, () -> account.closeAccount()); + // Assert + assertEquals("Cannot close account with a positive balance", exception.getMessage()); + } +}