From 4cfaa8a466c9024b01f5d20267e7d1de61bdee8f Mon Sep 17 00:00:00 2001 From: kksaunders251 Date: Mon, 14 Apr 2025 13:43:08 +0000 Subject: [PATCH 1/4] Feat: tiktok content creator system --- .../tiktokvideosystem/TiktokVideo.java | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/tiktokvideosystem/TiktokVideo.java diff --git a/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/tiktokvideosystem/TiktokVideo.java b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/tiktokvideosystem/TiktokVideo.java new file mode 100644 index 000000000..0215912b6 --- /dev/null +++ b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/tiktokvideosystem/TiktokVideo.java @@ -0,0 +1,91 @@ +package com.codedifferently.lesson16.tiktokvideosystem; + +import java.util.ArrayList; + +public class TiktokVideo { + private String creatorName; + private int viewsCount; + private int likesCount; + private VideoCategory videoCategory; + private ArrayList commentsList; + + public enum VideoCategory { + DANCE, + COMEDY, + VLOG, + TUTORIAL + } + + public TiktokVideo( + String creatorName, int viewsCount, int likesCount, VideoCategory videoCategory) { + this.creatorName = creatorName; + this.viewsCount = viewsCount; + this.likesCount = likesCount; + this.videoCategory = videoCategory; + this.commentsList = new ArrayList<>(); + } + + // One function uses a conditional expression to check if the video has more than a specific + // number of views (e.g., 1 million views). + public void increaseViews(int amount) { + // Use a conditional to check if amount is positive + if (amount > 0) { + // If so, add amount to the views + this.viewsCount += amount; + } + // Else, either print a message or throw an exception + else { + throw new InvalidViewIncrementException("View increase amount must be positive."); + } + } + + public double likeToViewRatio() { + if (viewsCount == 0) { + return 0.0; + } + + int totalLikes = 0; + // used chat because I was not sure how to make a ratio within a for loop + for (int i = 0; i < likesCount; i++) { + totalLikes++; + } + + double ratio = (double) totalLikes / viewsCount; + return ratio; + } + + public void displayComments(ArrayList userComments) { + if (userComments == null) { + System.out.println("No comments yet. Be the first to comment!"); + } else { + for (int i = 0; i < userComments.size(); i++) { + System.out.println(userComments.get(i)); + } + } + } + + public void addComments(String comment) { + + commentsList.add(comment); + } + + public ArrayList getCommentsList() { + return commentsList; + } + + public String getCreator() { + return this.creatorName; + } + + public void setVideoCategory(VideoCategory videoType) { + this.videoCategory = videoType; + } + + public VideoCategory getVideoCategory() { + return this.videoCategory; + } + + public int getViewsCount() { + return this.viewsCount; + } +} From 581c616c35e1886a5b35f9f8d2fc49cb0762932e Mon Sep 17 00:00:00 2001 From: kksaunders251 Date: Mon, 14 Apr 2025 18:56:53 +0000 Subject: [PATCH 2/4] Feat: adds the currency convertor and audit log --- .../lesson17/bank/AuditLog.java | 15 +++++++++++++++ .../codedifferently/lesson17/bank/BankAtm.java | 17 +++++++++++++++-- .../lesson17/bank/CurrencyConverter.java | 18 ++++++++++++++++++ 3 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/AuditLog.java create mode 100644 lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CurrencyConverter.java diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/AuditLog.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/AuditLog.java new file mode 100644 index 000000000..40230bec2 --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/AuditLog.java @@ -0,0 +1,15 @@ +package com.codedifferently.lesson17.bank; + +public class AuditLog { + private final List entries = new ArrayList<>(); + + public void record(String message) { + entries.add(LocalDateTime.now() + " - " + message); + } + + public List getEntries() { + return entries; + } +} + + 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..bdb9fc3dd 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 @@ -1,17 +1,30 @@ package com.codedifferently.lesson17.bank; -import com.codedifferently.lesson17.bank.exceptions.AccountNotFoundException; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.UUID; +import com.codedifferently.lesson17.bank.exceptions.AccountNotFoundException; + /** Represents a bank ATM. */ public class BankAtm { + private final Map customerById = new HashMap<>(); private final Map accountByNumber = new HashMap<>(); + private final AuditLog auditLog(); + private final CurrencyConverter currencyConverter(); + + public BankAtm(AuditLog auditLog, CurrencyConverter currencyConverter){ + this.auditLog() = auditLog; + this.currencyConverter() = currencyConverter; + } + + + + } /** * Adds a checking account to the bank. * @@ -85,4 +98,4 @@ private CheckingAccount getAccountOrThrow(String accountNumber) { } return account; } -} + diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CurrencyConverter.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CurrencyConverter.java new file mode 100644 index 000000000..9d45944bb --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CurrencyConverter.java @@ -0,0 +1,18 @@ +package com.codedifferently.lesson17.bank; + +public class CurrencyConverter { + private final Map exchangeRates; + + public CurrencyConverter() { + exchangeRates = new HashMap<>(); + exchangeRates.put(Currency.USD, 1.0); + exchangeRates.put(Currency.EUR, 1.1); + exchangeRates.put(Currency.GBP, 1.3); + + } + + public double convert(double amount, Currency from, Currency to) { + double usd = amount / exchangeRates.get(from); + return usd * exchangeRates.get(to); + } +} From 97da979d329049dcf45bf813039e971861781bb0 Mon Sep 17 00:00:00 2001 From: kksaunders251 Date: Wed, 16 Apr 2025 18:59:33 +0000 Subject: [PATCH 3/4] feat: enhance BankAtm with money order support and multi-currency deposits - Modified BankAtm, AuditLog, and CurrencyConverter to support new features - Added MoneyOrder class for handling money order transactions - Implemented SimpleCurrencyConverter for basic currency conversion logic - Introduced CurrencyConverterException to handle conversion errors - Updated BankAtmTest with new test cases for added functionality --- .../lesson17/bank/AuditLog.java | 23 +++++--- .../lesson17/bank/BankAtm.java | 56 +++++++++++++------ .../lesson17/bank/CurrencyConverter.java | 17 +----- .../bank/CurrencyConverterException.java | 7 +++ .../lesson17/bank/MoneyOrder.java | 24 ++++++++ .../bank/SimpleCurrencyConverter.java | 25 +++++++++ .../lesson17/bank/BankAtmTest.java | 46 ++++++++++++++- 7 files changed, 156 insertions(+), 42 deletions(-) create mode 100644 lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CurrencyConverterException.java create mode 100644 lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/MoneyOrder.java create mode 100644 lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/SimpleCurrencyConverter.java diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/AuditLog.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/AuditLog.java index 40230bec2..387fd81ee 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/AuditLog.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/AuditLog.java @@ -1,15 +1,22 @@ package com.codedifferently.lesson17.bank; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + public class AuditLog { - private final List entries = new ArrayList<>(); - public void record(String message) { - entries.add(LocalDateTime.now() + " - " + message); - } + private final List entries = new ArrayList<>(); - public List getEntries() { - return entries; - } -} + public void record(String message) { + entries.add(LocalDateTime.now() + " - " + message); + } + public List getEntries() { + return entries; + } + public void printLog() { + entries.forEach(System.out::println); + } +} 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 bdb9fc3dd..a8b42b72f 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 @@ -1,30 +1,23 @@ package com.codedifferently.lesson17.bank; +import com.codedifferently.lesson17.bank.exceptions.AccountNotFoundException; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.UUID; -import com.codedifferently.lesson17.bank.exceptions.AccountNotFoundException; - /** Represents a bank ATM. */ public class BankAtm { - private final Map customerById = new HashMap<>(); private final Map accountByNumber = new HashMap<>(); - private final AuditLog auditLog(); - private final CurrencyConverter currencyConverter(); + private final AuditLog auditLog; - public BankAtm(AuditLog auditLog, CurrencyConverter currencyConverter){ + public BankAtm(AuditLog auditLog) { - this.auditLog() = auditLog; - this.currencyConverter() = currencyConverter; + this.auditLog = auditLog; } - - - } /** * Adds a checking account to the bank. * @@ -53,14 +46,35 @@ public Set findAccountsByCustomerId(UUID customerId) { } /** - * Deposits funds into an account. + * Deposits funds into the specified account. This method supports both cash (Double) and + * MoneyOrder objects as deposit sources. * - * @param accountNumber The account number. - * @param amount The amount to deposit. + * @param accountNumber the account to deposit into + * @param source the deposit source; must be a Double (cash) or MoneyOrder */ - public void depositFunds(String accountNumber, double amount) { - CheckingAccount account = getAccountOrThrow(accountNumber); - account.deposit(amount); + public void depositFunds(String accountNumber, Object source) { + // Retrieve the target account using the provided account number + CheckingAccount targetAccount = (CheckingAccount) accountByNumber.get(accountNumber); + + // If the deposit source is a MoneyOrder, extract the amount and deposit it + if (source instanceof MoneyOrder newMoneyOrder) { + if (targetAccount != null) { + double amount = newMoneyOrder.getAmount(); + targetAccount.deposit(amount); + auditLog.record("Deposited $" + amount + " via MoneyOrder to account " + accountNumber); + } + } + // If the deposit source is cash (Double), proceed with a standard deposit + else if (source instanceof Double amount) { + if (targetAccount != null) { + targetAccount.deposit(amount); + auditLog.record("Deposited $" + amount + " in cash to account " + accountNumber); + } + } + // If the source type is unsupported, throw an exception + else { + throw new IllegalArgumentException("Unsupported deposit type"); + } } /** @@ -72,6 +86,11 @@ public void depositFunds(String accountNumber, double amount) { public void depositFunds(String accountNumber, Check check) { CheckingAccount account = getAccountOrThrow(accountNumber); check.depositFunds(account); + auditLog.record("Deposited check" + check + "into account" + accountNumber); + } + + public void printAuditLog() { + auditLog.printLog(); } /** @@ -83,6 +102,7 @@ public void depositFunds(String accountNumber, Check check) { public void withdrawFunds(String accountNumber, double amount) { CheckingAccount account = getAccountOrThrow(accountNumber); account.withdraw(amount); + auditLog.record("Withdrew $" + amount + "from account" + accountNumber); } /** @@ -98,4 +118,4 @@ private CheckingAccount getAccountOrThrow(String accountNumber) { } return account; } - +} diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CurrencyConverter.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CurrencyConverter.java index 9d45944bb..0e8fa765c 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CurrencyConverter.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CurrencyConverter.java @@ -1,18 +1,5 @@ package com.codedifferently.lesson17.bank; -public class CurrencyConverter { - private final Map exchangeRates; - - public CurrencyConverter() { - exchangeRates = new HashMap<>(); - exchangeRates.put(Currency.USD, 1.0); - exchangeRates.put(Currency.EUR, 1.1); - exchangeRates.put(Currency.GBP, 1.3); - - } - - public double convert(double amount, Currency from, Currency to) { - double usd = amount / exchangeRates.get(from); - return usd * exchangeRates.get(to); - } +public interface CurrencyConverter { + double convert(double amount, String fromCurrency, String toCurrency); } diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CurrencyConverterException.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CurrencyConverterException.java new file mode 100644 index 000000000..ec7613d40 --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CurrencyConverterException.java @@ -0,0 +1,7 @@ +package com.codedifferently.lesson17.bank; + +public class CurrencyConverterException extends RuntimeException { + public CurrencyConverterException(String fromCurrency, String toCurrency) { + super("Unsupported conversion from " + fromCurrency + " to " + toCurrency); + } +} diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/MoneyOrder.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/MoneyOrder.java new file mode 100644 index 000000000..3fd57301e --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/MoneyOrder.java @@ -0,0 +1,24 @@ +package com.codedifferently.lesson17.bank; + +public class MoneyOrder { + private final double amount; + private final String sourceAccountNumber; + + public MoneyOrder(CheckingAccount sourceAccount, double amount) { + this.amount = amount; + this.sourceAccountNumber = sourceAccount.getAccountNumber(); + sourceAccount.withdraw(amount); // Withdraw immediately + } + + public double getAmount() { + return amount; + } + + public String getSourceAccountNumber() { + return sourceAccountNumber; + } + + public void depositTo(CheckingAccount destinationAccount) { + destinationAccount.deposit(amount); + } +} diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/SimpleCurrencyConverter.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/SimpleCurrencyConverter.java new file mode 100644 index 000000000..8ff847de4 --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/SimpleCurrencyConverter.java @@ -0,0 +1,25 @@ +package com.codedifferently.lesson17.bank; + +import java.util.Map; + +public class SimpleCurrencyConverter implements CurrencyConverter { + private final Map exchangeRates; + + public SimpleCurrencyConverter(Map exchangeRates) { + this.exchangeRates = exchangeRates; + } + + @Override + public double convert(double amount, String fromCurrency, String toCurrency) { + if (fromCurrency.equals(toCurrency)) return amount; + + String key = fromCurrency + "_TO_" + toCurrency; + Double rate = exchangeRates.get(key); + + if (rate == null) { + throw new CurrencyConverterException(fromCurrency, toCurrency); + } + + return amount * rate; + } +} 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..0c8ab6501 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 @@ -2,9 +2,13 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +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 com.codedifferently.lesson17.bank.exceptions.AccountNotFoundException; import com.codedifferently.lesson17.bank.exceptions.CheckVoidedException; +import java.util.Map; import java.util.Set; import java.util.UUID; import org.junit.jupiter.api.BeforeEach; @@ -18,16 +22,26 @@ class BankAtmTest { private Customer customer1; private Customer customer2; + Map rates = + Map.of( + "USD_TO_EUR", 0.85, + "EUR_TO_USD", 1.18); + SimpleCurrencyConverter converter = new SimpleCurrencyConverter(rates); + @BeforeEach void setUp() { - classUnderTest = new BankAtm(); + AuditLog auditLog = new AuditLog(); + classUnderTest = new BankAtm(auditLog); customer1 = new Customer(UUID.randomUUID(), "John Doe"); customer2 = new Customer(UUID.randomUUID(), "Jane Smith"); + account1 = new CheckingAccount("123456789", Set.of(customer1), 100.0); account2 = new CheckingAccount("987654321", Set.of(customer1, customer2), 200.0); + customer1.addAccount(account1); customer1.addAccount(account2); customer2.addAccount(account2); + classUnderTest.addAccount(account1); classUnderTest.addAccount(account2); } @@ -107,4 +121,34 @@ void testWithdrawFunds_AccountNotFound() { .isThrownBy(() -> classUnderTest.withdrawFunds(nonExistingAccountNumber, 50.0)) .withMessage("Account not found"); } + + @Test + void testDeposit_LogsToConsole() { + classUnderTest.depositFunds(account1.getAccountNumber(), 50.0); + + assertThat(account1.getBalance()).isEqualTo(150.0); + + System.out.println("🧾 Audit Log:"); + classUnderTest.printAuditLog(); + } + + @Test + public void testConvert_USDToEUR() { + double result = converter.convert(100.0, "USD", "EUR"); + assertEquals(85.0, result, 0.001); + } + + @Test + public void testConvert_SameCurrency() { + double result = converter.convert(100.0, "USD", "USD"); + assertEquals(100.0, result, 0.001); + } + + @Test + public void testUnsupportedConversion_ThrowsException() { + Exception exception = + assertThrows( + CurrencyConverterException.class, () -> converter.convert(100.0, "USD", "JPY")); + assertTrue(exception.getMessage().contains("Unsupported conversion")); + } } From 6955ac9aa84c529d61213aa82514644519886ddf Mon Sep 17 00:00:00 2001 From: kksaunders251 Date: Sat, 19 Apr 2025 23:57:33 +0000 Subject: [PATCH 4/4] feat: updating unit tests --- .../codedifferently/lesson17/bank/BankAtmTest.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) 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 0c8ab6501..df039983a 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 @@ -1,18 +1,19 @@ package com.codedifferently.lesson17.bank; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; 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 org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import com.codedifferently.lesson17.bank.exceptions.AccountNotFoundException; import com.codedifferently.lesson17.bank.exceptions.CheckVoidedException; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; class BankAtmTest { @@ -44,6 +45,7 @@ void setUp() { classUnderTest.addAccount(account1); classUnderTest.addAccount(account2); + } @Test