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..d43990435 --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BusinessCheckingAccount.java @@ -0,0 +1,29 @@ +package com.codedifferently.lesson17.bank; + +import java.util.Set; + +public class BusinessCheckingAccount extends CheckingAccount { + public BusinessCheckingAccount(String accountNumber, Set owners, double balance) { + super(accountNumber, owners, balance); + if (!hasBusinessOwner(owners)) { + throw new IllegalArgumentException("requires at least one business owner."); + } + } + + private boolean hasBusinessOwner(Set owners) { + return owners.stream().anyMatch(Customer::isBusiness); + } + + @Override + public String toString() { + return "BusinessCheckingAccount{" + + "accountNumber='" + + accountNumber + + '\'' + + ", balance=" + + balance + + ", isActive=" + + isActive + + '}'; + } +} diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BusinessOwner.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BusinessOwner.java new file mode 100644 index 000000000..8e7eae7b5 --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BusinessOwner.java @@ -0,0 +1,22 @@ +package com.codedifferently.lesson17.bank; + +import java.util.UUID; + +public class BusinessOwner extends Customer { + + private final String businessName; + + public BusinessOwner(UUID id, String name, String businessName) { + super(id, name); + this.businessName = businessName; + } + + public String businessName() { + return businessName; + } + + @Override + public boolean isBusiness() { + return true; + } +} 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..ea449167d 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 @@ -21,6 +21,9 @@ public Check(String checkNumber, double amount, CheckingAccount account) { if (amount < 0) { throw new IllegalArgumentException("Check amount must be positive"); } + if (account instanceof SavingsAccount) { + throw new UnsupportedOperationException("Cannot issue checks from a savings account."); + } this.checkNumber = checkNumber; this.amount = amount; this.account = account; 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..42632cc20 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 @@ -7,9 +7,9 @@ public class CheckingAccount { private final Set owners; - private final String accountNumber; - private double balance; - private boolean isActive; + public final String accountNumber; + protected double balance; + protected boolean isActive; /** * Creates a new checking 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..5fc5cbe17 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 @@ -58,6 +58,11 @@ public Set getAccounts() { return accounts; } + // defaults accounts to non-business Owners. + public boolean isBusiness() { + return false; + } + @Override public int hashCode() { return id.hashCode(); 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..a289f2ce9 --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/SavingsAccount.java @@ -0,0 +1,24 @@ +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 balance) { + super(accountNumber, owners, balance); + } + + @Override + public String toString() { + return "SavingsAccount{" + + "accountNumber='" + + accountNumber + + '\'' + + ", balance=" + + balance + + ", isActive=" + + isActive + + '}'; + } +} 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..7450c30d2 --- /dev/null +++ b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BusinessCheckingAccountTest.java @@ -0,0 +1,36 @@ +package com.codedifferently.lesson17.bank; + +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 BusinessCheckingAccountTest { + private Customer regularCustomer; + private BusinessOwner BusinessCustomer; + private Set owners; + + @BeforeEach + void setUp() { + regularCustomer = new Customer(UUID.randomUUID(), "james"); + BusinessCustomer = new BusinessOwner(UUID.randomUUID(), "john", "long johns"); + owners = new HashSet<>(); + } + + @Test + void hasBusinessOwnerTest() { + owners.add(regularCustomer); + + IllegalArgumentException thrown = + assertThrows( + IllegalArgumentException.class, + () -> new BusinessCheckingAccount("12354", owners, 100.00), + "Expect Constructor to throw but did not"); + + assertTrue(thrown.getMessage().contains("requires at least one business owner")); + } +} 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 000000000..d07b93a04 --- /dev/null +++ b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/SavingsAccountTest.java @@ -0,0 +1,31 @@ +package com.codedifferently.lesson17.bank; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +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; + + @BeforeEach + void setUp() { + owners = new HashSet<>(); + owners.add(new Customer(UUID.randomUUID(), "John Doe")); + owners.add(new Customer(UUID.randomUUID(), "Jane Smith")); + classUnderTest = new SavingsAccount("123456789", owners, 100.0); + } + + @Test + void toStringTest() { + // arrange + String expected = "SavingsAccount{accountNumber='123456789', balance=100.0, isActive=true}"; + + // assert + assertEquals(expected, classUnderTest.toString()); + } +}