From 4c6750cd92356a19d52279af0f744cbbbf664958 Mon Sep 17 00:00:00 2001 From: pawelsa Date: Wed, 25 Mar 2026 10:38:33 +0100 Subject: [PATCH 1/3] refactor(Portfolio): playerNetValue -> getNetWorth. Fix logic. --- .../java/edu/ntnu/idi/idatt/marked/Portfolio.java | 15 ++++++++------- .../edu/ntnu/idi/idatt/marked/PortfolioTest.java | 7 +++++-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/main/java/edu/ntnu/idi/idatt/marked/Portfolio.java b/src/main/java/edu/ntnu/idi/idatt/marked/Portfolio.java index 6fe32fd..e377d5f 100644 --- a/src/main/java/edu/ntnu/idi/idatt/marked/Portfolio.java +++ b/src/main/java/edu/ntnu/idi/idatt/marked/Portfolio.java @@ -5,6 +5,8 @@ import java.util.List; import java.util.stream.Collectors; +import edu.ntnu.idi.idatt.calculator.SaleCalculator; + /** * Portfolio class * @@ -70,15 +72,14 @@ public boolean contains(Share share) { } /** - * Method for getting the net value of the player. + * Method for getting the net value of the portfolio.. * - * @return - Net value of the players shares. + * @return - Net value of the portfolio. */ - public BigDecimal playerNetValue(){ - BigDecimal netValue = shares.stream() - .map(Share-> Share.getPurchasePrice().multiply(Share.getQuantity())) - .reduce(BigDecimal.ZERO, BigDecimal::add); - return netValue; + public BigDecimal getNetWorth() { + return shares.stream() + .map(s -> new SaleCalculator(s).calculateTotal()) + .reduce(BigDecimal.ZERO, BigDecimal::add); } } diff --git a/src/test/java/edu/ntnu/idi/idatt/marked/PortfolioTest.java b/src/test/java/edu/ntnu/idi/idatt/marked/PortfolioTest.java index a2de1de..e3a6898 100644 --- a/src/test/java/edu/ntnu/idi/idatt/marked/PortfolioTest.java +++ b/src/test/java/edu/ntnu/idi/idatt/marked/PortfolioTest.java @@ -11,6 +11,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import edu.ntnu.idi.idatt.calculator.SaleCalculator; + public class PortfolioTest { private Stock stock; @@ -82,12 +84,13 @@ void NTremoveShare() { * Positive test for finding net value of the players shares. */ @Test - void PTplayerNetValue(){ + void PTgetNetWorth() { Share share1 = new Share(stock, new BigDecimal("1"), new BigDecimal("135.8")); Share share2 = new Share(stock, new BigDecimal("2"), new BigDecimal("254")); portfolio.addShare(share1); portfolio.addShare(share2); - assertEquals(new BigDecimal("643.8"), portfolio.playerNetValue()); + assertEquals(new SaleCalculator(share1).calculateTotal().add(new SaleCalculator(share2).calculateTotal()), + portfolio.getNetWorth()); } } From d1ae6aed58174fb97fd6892474a917210376dcf0 Mon Sep 17 00:00:00 2001 From: pawelsa Date: Wed, 25 Mar 2026 10:48:44 +0100 Subject: [PATCH 2/3] feat(TransactionArchive): Implement TODO countDistinctWeeks() and corresponding tests. --- .../idi/idatt/transaction/TransactionArchive.java | 7 +++++-- .../idatt/transaction/TransactionArchiveTest.java | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/ntnu/idi/idatt/transaction/TransactionArchive.java b/src/main/java/edu/ntnu/idi/idatt/transaction/TransactionArchive.java index 0567591..e07e8c9 100644 --- a/src/main/java/edu/ntnu/idi/idatt/transaction/TransactionArchive.java +++ b/src/main/java/edu/ntnu/idi/idatt/transaction/TransactionArchive.java @@ -73,8 +73,11 @@ public List getSales(int week) { * * @return */ - public int countDistinctWeeks() { // TODO: HERE - return -1; + public int countDistinctWeeks() { + return (int) transactions.stream() + .map(Transaction::getWeek) + .distinct() + .count(); } } diff --git a/src/test/java/edu/ntnu/idi/idatt/transaction/TransactionArchiveTest.java b/src/test/java/edu/ntnu/idi/idatt/transaction/TransactionArchiveTest.java index 482a45c..74930fb 100644 --- a/src/test/java/edu/ntnu/idi/idatt/transaction/TransactionArchiveTest.java +++ b/src/test/java/edu/ntnu/idi/idatt/transaction/TransactionArchiveTest.java @@ -87,4 +87,18 @@ void PTgetTransactions() { } + /** + * Tests for countDistinctWeeks(). + */ + @Test + void PTcountDistinctWeeks() { + assertEquals(2, transactionArchive.countDistinctWeeks()); + } + + @Test + void NTcountDistinctWeeks() { + TransactionArchive tArchive = new TransactionArchive(); + assertEquals(0, tArchive.countDistinctWeeks()); + } + } From fe55a8eb0177f948428ad2b707f74e70b38e71bf Mon Sep 17 00:00:00 2001 From: pawelsa Date: Wed, 25 Mar 2026 11:10:47 +0100 Subject: [PATCH 3/3] feat(Player): Implement getNetWorth and getStatus. Add corresponding tests. --- src/main/java/edu/ntnu/idi/idatt/Player.java | 37 ++++++++++++++ .../java/edu/ntnu/idi/idatt/PlayerTest.java | 50 +++++++++++++++++++ 2 files changed, 87 insertions(+) diff --git a/src/main/java/edu/ntnu/idi/idatt/Player.java b/src/main/java/edu/ntnu/idi/idatt/Player.java index 3a5e61d..8f798e7 100644 --- a/src/main/java/edu/ntnu/idi/idatt/Player.java +++ b/src/main/java/edu/ntnu/idi/idatt/Player.java @@ -4,6 +4,8 @@ import edu.ntnu.idi.idatt.transaction.TransactionArchive; import java.math.BigDecimal; +import java.util.HashSet; +import java.util.Map; public class Player { @@ -54,4 +56,39 @@ public void addMoney(BigDecimal amount) { public void withdrawMoney(BigDecimal amount) { this.money = this.money.subtract(amount); } + + /** + * Method for obtaining players net worth. + * + * @return players net worth. + */ + public BigDecimal getNetWorth() { + return money.add(portfolio.getNetWorth()); + } + + /** + * Method for obtaining players trading status. + * + *

+ * A symbolic title/rank that describes the way the + * players trading career has been going. + *

+ * + * @return String of corresponding title. TODO: Change to ENUM!!! + */ + public String getStatus() { + int tradingWeeks = transactionArchive.countDistinctWeeks(); + BigDecimal netWorth = this.getNetWorth().divide(this.startingMoney); + + if (tradingWeeks >= 20 && netWorth.compareTo(new BigDecimal("2")) >= 0) { + return "Speculator"; + } + + if (tradingWeeks >= 10 && netWorth.compareTo(new BigDecimal("1.2")) >= 0) { + return "Investor"; + } + + return "Novice"; + } + } diff --git a/src/test/java/edu/ntnu/idi/idatt/PlayerTest.java b/src/test/java/edu/ntnu/idi/idatt/PlayerTest.java index cd6df5d..e292971 100644 --- a/src/test/java/edu/ntnu/idi/idatt/PlayerTest.java +++ b/src/test/java/edu/ntnu/idi/idatt/PlayerTest.java @@ -4,10 +4,15 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import java.math.BigDecimal; +import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import edu.ntnu.idi.idatt.marked.Share; +import edu.ntnu.idi.idatt.marked.Stock; +import edu.ntnu.idi.idatt.transaction.Purchase; + class PlayerTest { private Player player; @@ -41,4 +46,49 @@ void PTwithdrawMoney() { assertEquals(new BigDecimal("300"), player.getMoney()); } + @Test + void PTgetNetWorth() { + assertEquals(player.getNetWorth(), new BigDecimal("500")); + + // Add to player portfolio + Stock stock = new Stock("A", "A", List.of(new BigDecimal("20"))); + Share share = new Share(stock, new BigDecimal("3.5"), new BigDecimal("30")); + player.getPortfolio().addShare(share); + + BigDecimal sum = player.getMoney().add(player.getPortfolio().getNetWorth()); + assertEquals(sum, player.getNetWorth()); + + } + + @Test + void PTgetStatus() { + assertEquals("Novice", player.getStatus()); + + // Simulate progress + Stock stock = new Stock("A", "A", List.of(new BigDecimal("20"))); + Share share = new Share(stock, new BigDecimal("3.5"), new BigDecimal("30")); + + for (int i = 0; i <= 20; i++) { + player.getTransactionArchive().add(new Purchase(share, i)); + } + + // Check different ifs + player.addMoney(new BigDecimal("90")); // 18% + assertEquals("Novice", player.getStatus()); + player.addMoney(new BigDecimal("10")); // 20% + assertEquals("Investor", player.getStatus()); + player.addMoney(new BigDecimal("400")); // 100% + assertEquals("Speculator", player.getStatus()); + + // new Player to check if Speculator dont happen week < 20 + Player plr = new Player("plr", new BigDecimal("500")); + + for (int i = 0; i <= 15; i++) { + plr.getTransactionArchive().add(new Purchase(share, i)); + } + plr.addMoney(new BigDecimal("600")); // 120% + assertEquals("Investor", plr.getStatus()); + + } + }