Skip to content

Commit da8f725

Browse files
initial commit
1 parent 61847f3 commit da8f725

File tree

7 files changed

+390
-2
lines changed

7 files changed

+390
-2
lines changed

lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAtm.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package com.codedifferently.lesson17.bank;
22

3-
import com.codedifferently.lesson17.bank.exceptions.AccountNotFoundException;
43
import java.util.HashMap;
54
import java.util.Map;
65
import java.util.Set;
76
import java.util.UUID;
87

8+
import com.codedifferently.lesson17.bank.exceptions.AccountNotFoundException;
9+
910
/** Represents a bank ATM. */
1011
public class BankAtm {
1112

lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CheckingAccount.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package com.codedifferently.lesson17.bank;
22

3-
import com.codedifferently.lesson17.bank.exceptions.InsufficientFundsException;
43
import java.util.Set;
54

5+
import com.codedifferently.lesson17.bank.exceptions.InsufficientFundsException;
6+
67
/** Represents a checking account. */
78
public class CheckingAccount {
89

@@ -86,6 +87,10 @@ public double getBalance() {
8687
return balance;
8788
}
8889

90+
public boolean getStatus() {
91+
return isActive;
92+
}
93+
8994
/** Closes the account. */
9095
public void closeAccount() throws IllegalStateException {
9196
if (balance > 0) {
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package main.java.com.codedifferently.lesson17.bank;
2+
3+
import com.codedifferently.lesson17.bank.exceptions.MoneyOrderVoidedException;
4+
5+
/** Represents a moneyorder. */
6+
public class MoneyOrder {
7+
8+
private final String moneyOrderNumber;
9+
private final double amount;
10+
private final CheckingAccount account;
11+
private boolean isVoided = false;
12+
13+
/**
14+
* Creates a new moneyorder.
15+
*
16+
* @param moneyOrderNumber The moneyorder number.
17+
* @param amount The amount of the moneyorder.
18+
* @param account The account the moneyorder is drawn on.
19+
*/
20+
public MoneyOrder(String moneyOrderNumber, double amount, CheckingAccount account) {
21+
if (amount < 0) {
22+
throw new IllegalArgumentException("MoneyOrder amount must be positive");
23+
}
24+
account.withdraw(amount);
25+
this.moneyOrderNumber = moneyOrderNumber;
26+
this.amount = amount;
27+
this.account = account;
28+
}
29+
30+
/**
31+
* Gets the moneyorder number.
32+
*
33+
* @return The moneyorder number
34+
*/
35+
public String getMoneyOrderNumber() {
36+
return moneyOrderNumber;
37+
}
38+
39+
/**
40+
* Gets the amount given for the moneyorder.
41+
*
42+
* @return The amount.
43+
*/
44+
public double getAmount() {
45+
return amount;
46+
}
47+
48+
/**
49+
* Gets the account from the moneyordering account.
50+
*
51+
* @return The account in this instance.
52+
*/
53+
public CheckingAccount getAccount() {
54+
return account;
55+
}
56+
57+
/**
58+
* Gets the voided status of the moneyorder.
59+
*
60+
* @return True if the moneyorder is voided, and false otherwise.
61+
*/
62+
public boolean getIsVoided() {
63+
return isVoided;
64+
}
65+
66+
/** Voids the moneyorder. */
67+
public void voidMoneyOrder() {
68+
isVoided = true;
69+
}
70+
71+
/**
72+
* Deposits the moneyorder into an account.
73+
*
74+
* @param toAccount The account to deposit the moneyorder into.
75+
*/
76+
public void depositFunds(CheckingAccount toAccount) {
77+
if (isVoided) {
78+
throw new MoneyOrderVoidedException("MoneyOrder is voided");
79+
}
80+
account.withdraw(amount);
81+
toAccount.deposit(amount);
82+
voidMoneyOrder();
83+
}
84+
85+
@Override
86+
public int hashCode() {
87+
return moneyOrderNumber.hashCode();
88+
}
89+
90+
@Override
91+
public boolean equals(Object obj) {
92+
if (obj instanceof MoneyOrder other) {
93+
return moneyOrderNumber.equals(other.moneyOrderNumber);
94+
}
95+
return false;
96+
}
97+
98+
@Override
99+
public String toString() {
100+
return "MoneyOrder{"
101+
+ "moneyOrderNumber='"
102+
+ moneyOrderNumber
103+
+ '\''
104+
+ ", amount="
105+
+ amount
106+
+ ", account="
107+
+ account.getAccountNumber()
108+
+ '}';
109+
}
110+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package main.java.com.codedifferently.lesson17.bank;
2+
3+
import java.util.Set;
4+
5+
import org.assertj.core.api.ThrowableAssertAlternative;
6+
7+
import com.codedifferently.lesson17.bank.Customer;
8+
9+
public class SavingsAccount extends CheckingAccount {
10+
public SavingsAccount(String accountNumber, Set<Customer> owners, double initialBalance) {
11+
super(accountNumber, owners, initialBalance);
12+
}
13+
14+
public SavingsAccount(String string, Set<Customer> owners, double d) {
15+
throw new UnsupportedOperationException("Not supported yet.");
16+
}
17+
18+
@Override
19+
public int hashCode() {
20+
return getAccountNumber().hashCode();
21+
}
22+
23+
@Override
24+
public boolean equals(Object obj) {
25+
if (obj instanceof SavingsAccount other) {
26+
return this.getAccountNumber().equals(other.getAccountNumber());
27+
}
28+
return false;
29+
}
30+
31+
@Override
32+
public String toString() {
33+
return "SavingsAccount{"
34+
+ "accountNumber='"
35+
+ getAccountNumber()
36+
+ '\''
37+
+ ", balance="
38+
+ getBalance()
39+
+ ", isActive="
40+
+ getStatus()
41+
+ '}';
42+
}
43+
44+
public Object getAccountNumber() {
45+
throw new UnsupportedOperationException("Not supported yet.");
46+
}
47+
48+
public Object getOwners() {
49+
throw new UnsupportedOperationException("Not supported yet.");
50+
}
51+
52+
public void deposit(double d) {
53+
throw new UnsupportedOperationException("Not supported yet.");
54+
}
55+
56+
public double getBalance() {
57+
throw new UnsupportedOperationException("Not supported yet.");
58+
}
59+
60+
public void withdraw(double d) {
61+
throw new UnsupportedOperationException("Not supported yet.");
62+
}
63+
64+
public ThrowableAssertAlternative<IllegalStateException> closeAccount() {
65+
throw new UnsupportedOperationException("Not supported yet.");
66+
}
67+
68+
public boolean isClosed() {
69+
throw new UnsupportedOperationException("Not supported yet.");
70+
}
71+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package main.java.com.codedifferently.lesson17.bank.exceptions;
2+
3+
public class MoneyOrderVoidedException extends RuntimeException {
4+
5+
public MoneyOrderVoidedException() {}
6+
7+
public MoneyOrderVoidedException(String message) {
8+
super(message);
9+
}
10+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package test.java.com.codedifferently.lesson17.bank;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
5+
import org.junit.jupiter.api.BeforeEach;
6+
import org.junit.jupiter.api.Test;
7+
8+
import com.codedifferently.lesson17.bank.CheckingAccount;
9+
10+
import main.java.com.codedifferently.lesson17.bank.MoneyOrder;
11+
import main.java.com.codedifferently.lesson17.bank.exceptions.MoneyOrderVoidedException;
12+
13+
class MoneyOrderTest {
14+
private CheckingAccount account1;
15+
private CheckingAccount account2;
16+
private MoneyOrder classUnderTest;
17+
18+
@BeforeEach
19+
void setUp() {
20+
account1 = new CheckingAccount("123456789", null, 100.0);
21+
account2 = new CheckingAccount("987654321", null, 200.0);
22+
classUnderTest = new MoneyOrder("123456789", 50.0, account1);
23+
}
24+
25+
@Test
26+
void testDepositFunds() {
27+
// Act
28+
classUnderTest.depositFunds(account2);
29+
// Assert
30+
assertThat(account1.getBalance()).isEqualTo(0.0);
31+
assertThat(account2.getBalance()).isEqualTo(250.0);
32+
}
33+
34+
@Test
35+
void testDepositFunds_MoneyOrderVoided() {
36+
// Arrange
37+
classUnderTest.voidMoneyOrder();
38+
39+
// Act & Assert
40+
assertThatExceptionOfType(MoneyOrderVoidedException.class)
41+
.isThrownBy(() -> classUnderTest.depositFunds(account2))
42+
.withMessage("MoneyOrder is voided");
43+
}
44+
45+
@Test
46+
void testConstructor_CantCreateMoneyOrderWithNegativeAmount() {
47+
// Act & Assert
48+
assertThatExceptionOfType(IllegalArgumentException.class)
49+
.isThrownBy(() -> new MoneyOrder("123456789", -50.0, account1))
50+
.withMessage("MoneyOrder amount must be positive");
51+
}
52+
53+
@Test
54+
void testHashCode() {
55+
// Arrange
56+
MoneyOrder otherMoneyOrder = new MoneyOrder("123456789", 50.0, account1);
57+
58+
// Assert
59+
assertThat(classUnderTest.hashCode()).isEqualTo(otherMoneyOrder.hashCode());
60+
}
61+
62+
@Test
63+
void testEquals() {
64+
// Arrange
65+
MoneyOrder otherMoneyOrder = new MoneyOrder("123456789", 50.0, account1);
66+
MoneyOrder differentMoneyOrder = new MoneyOrder("987654321", 100.0, account2);
67+
68+
// Assert
69+
assertThat(classUnderTest.equals(otherMoneyOrder)).isTrue();
70+
assertThat(classUnderTest.equals(differentMoneyOrder)).isFalse();
71+
}
72+
73+
@Test
74+
void testToString() {
75+
// Assert
76+
assertThat(classUnderTest.toString())
77+
.isEqualTo("MoneyOrder{moneyOrderNumber='123456789', amount=50.0, account=123456789}");
78+
}
79+
}

0 commit comments

Comments
 (0)